关于高级编程语言的一点思考

作为从unix C一路走过来的从业者,使用过c/c++ java  python  golang 等,慢慢的从对新语言的恐惧,到坦然面对,今天不谈具体的东西,就谈点简单的对语言的胡思乱想,今天的写的不是从严肃的计算机科学角度,而是从编程者的主观认知角度。


所谓的高级语言就是提供更丰富的语法糖,编译器,运行时和库等;有自己的类型系统,编程模式,最好有垃圾回收,并发支持等等额外特性;从本质上讲,编程语言就是以一种约定的语法糖来进行编码。除了汇编能一条条的和机器指令对应,我们日常接触到的语言都摆脱不了语言的编译器和运行时的影响,从根本上讲,我们写的代码不叫程序,我们仅仅写了一部分语法糖的片段,通过编译器的编译,编译器添加的很多其他东西进去,最终才形成了可执行程序。这个可执行程序以os认可的可执行程序格式(PE或者ELF)存放,最后被OS执行和调度(其运行起来就是OS的进程或者线程)。

从这个角度看,所有的高级语言编程,就是语法糖片段的书写,说白了,就是高级语言本身已经定义了一整套工作框架,你说做的只是按照这门语言的约定,撰写语法糖片段,按照约定填空而已(所以不要轻易的说自己精通什么什么语言,其实你只是个熟练的填空工人而已),只是这个填空不是简单的填空,而是给了你很大的空间来去发挥,只要不违反语言的规范。有些语法糖比较直观好理解,有些语法糖的抽象性更高,更大,让你感到陌生而已。一般来说,语言越高级,提供的语法糖越多,编译器帮你做的工作越多,你干的事情越少,同时你也越不接地气。


举几个比较高级的语法糖的示例:
比如异常处理,表明上是try  cache之类的语法糖,异常处理怎么那么简单,一个try cache就搞定了,其实你想简单了,实际上语言的编译器帮你干了很多的工作,它在发现你使用try cache的地方,额外的添加了许多其他代码,帮你干了很多擦屁股的事情,让你的才能那么优雅的撸代码(这个机制比较复杂,牵涉到程序的调用栈帧,OS的异常处理机制等:当异常发生时,将产生中断,然后控制权转移给操作系统。操作系统调用异常处理器,它将从产生异常的函数开始检查函数调用堆栈,然后执行栈展开,并转移控制权,高级语言的编译器在生成的栈帧上添加了额外的注册异常的代码帮我们处理了异常)
  比如说golang 的go语法糖,这个语法糖的实现更是golang这门语言的核心,他的实现机制更复杂:简单来说它在os多个进程/线程上层再实现一层封装和调度,一个叫协程的东西,并且语言的运行时负责go协程的调度,通讯等。
        所有的高级语言的程序最后编译出来一个可执行程序,撸到最后,运行起来就是os的进程或者线程;有的语言牛逼点,带个虚拟机,你写的那个程序只能被虚拟器玩来玩去,更牛逼的语言可能有协程支持的运行时,你不需要显示的创建线程或者进程,使用协程就能很好的并发量;屌丝的语言有可能就是个单进程语言运行时(解释器);再朝下就是OS对进程的调度了;再朝下其实就是一串机器码(顺序+跳转),寄存器和内存不停的压栈出栈,苦逼的CPU在不停的跑,暗无天日。如果你有刚才说说的那些认知,你自己称自己工程师还勉强可以(看到太多把自己吹嘘的牛逼的一塌糊涂,其实只是会玩完语法糖的小朋友)。
ok ,现在来谈谈高级语言的好处:那就是把通用的,重复性的东西让编译器和运行时帮你解决,避免在语法细节和实现细节上重复性的浪费时间,并减少错误(在相同的出错概率下,干的越多,错误的越多),减轻程序员的心智负担;但是如果你仅仅能使用语言就认为够了,那是远远不够的,高级语言会同时让你离底层,离问题的本质越来越远;使用高级语言不是说让你放弃了解底层,放弃代码以下的运行时和编译器的动作,忘记操作系统等基础软件的支撑等等,
相反你更需要时间去你去了解,去学习这门语言背后的东西,你学习的越深入,越透彻,你对语言的驾驭能力就越强,你的价值才越高;
高级语言只是帮你提升工作效率,帮你减少代码书写,帮你避免常见的错误,帮你从繁杂的错误和异常中解脱出来,帮你从重复性的体力劳动中解脱;
它仅仅是帮你做,但是你要懂得感恩,要清楚它帮你做了哪些,它怎么帮你做的,它的机制是什么,要学会如何更好的使用它的特性、它的设计思想来帮我干活;出了问题我能够在这个语言的问题域里给解决掉。

高级语言不是让你停止思考,不是让你停止学习下层知识,他帮你省去很多时间,同时你要怀有感恩的心,认识到他帮你干的事情,在心里记住他的好,并且了解清楚他的脾气,你才能驾驭他。


任何时候,你想作为一个顶尖的软件工程师,都离不开下层建筑的支撑(os,网络,DB等等);不要再傻逼的争论哪个语言好,哪个语言有前途的问题,每个语言针对每个不同的问题域,都有它的特长的处理领域。当然作为公司作为盈利机构,我们在选用语言或者解决方案时是同时要考虑人才市场供应,人力成本,公司的历史传承和技术积累等等很多因素;综合考虑选用合适的技术解决方案,既要着眼于眼前,快速解决问题;也要着眼于未来,规划好技术堆栈和人才培养梯队。








你可能感兴趣的:(程序员人生)