浅谈各类编程语言之间的差异

浏览各大编程相关的网站, 总是能看到有关于编程语言的争论, 这些争论使得想要学习编程的人变得疑惑。 总会让人陷入到底什么是最好的编程语言, 我该学什么, 这样的疑问中。 我曾经也陷入过这样的疑惑中, 入行做“码农”大概也有一年半的时间了, 借着2018的过去, 2019的开始, 尝试总结一下这类问题, 给过去的疑问一个交代, 给新人一份细微帮助(但愿)。

机器码编程(汇编语言)

汇编语言是机器码的直接翻译, 最早的汇编是机器助记符(伪指令之类不是机器的直接指令集), 汇编级别的编程是寄存器级别的编程, 直接操作硬件抽象出来的各类寄存器, 各种机器的寄存器数量、 种类和地址宽度各不相同。计算机的特定指令都有固定的寄存器依赖,所以需要程序员控制从内存的某个位置读入到具体的寄存器完成操作。由于以上原因,汇编语言难以移植,且程序员负担大,现在除了某些特定的场景(往往这类场景使用通用计算的方式需要花费大量的时间), 如硬件提供某种特性(比如intel的SSE系列指令), 可以使得某些特定的任务在很短的时间周期内完成, 一般不会直接使用汇编语言。

C/C++等native语言

——题外话,提到C就必须提一下UNIX类系统, 学习C语言, 我建议在UNIX类(如LINUX)环境下进行学习, 很多C语言的设计和这类系统的运行环境是很有关系的。

C语言的本质是内存级别的抽象,按照冯洛伊曼结构可以将计算机单纯的抽象为储存器和逻辑运算器(带控制器), 将各种机器都有的基本逻辑运算和数值运算抽象为逻辑运算器, 将各类机器至少含有一类的储存器(储存器很多种RAM, ROM)抽象成储存设备, 得出来的基础设计成为编程语言(后称这类基础运算为通用计算逻辑), 就是C语言这类语言的基础。C语言相对与汇编语言不需要关心寄存器的各种细节, 所以大大的提升了通用计算逻辑的程序编写速度, C语言在通用计算逻辑上几乎是直接翻译成汇编(编译器会做适当的优化), 在通用计算逻辑上C语言和汇编几乎是等效的, 说C语言比汇编慢的人多半是只C语言本身无法利用特殊的机器(某些指令集或芯片的特有特性)指令来达到对应的加速效果,在C语言中使用内联汇编弥补这类抽象缺失(需要直接利用机器特性加速的场合可以包装成库)。但由于C语言只是单纯的抽象通用计算机, 所以在后期的工程实践中发现了一些问题, 如C语言需要自己手工管理各种计算机资源, 而且C语言函数变量名缺少有效的隔离, 难以组织超大型软件工程等,在继承了C的特性下(通用计算逻辑零代价), 发展出了C++这种编程语言, 在C语言的基础上增加了重要的资源管理(RAII语意), 结构化抽象(面向对象编程), 增加编码速度的函数式编程(C++11后), 改进部分难以理解的语法(增加了模版函数)。C++的意图是在C之上提供更高级的抽象, 给编译器和程序库作者更多的优化空间, 并保留C的特性以便在需要的时候做一些指定的逻辑(有时候高级语法会让编译器迷惑,给出的解并不一定是最优解)。虽然C++继承了C的绝大部分语法, 但是在语言的设计上, C++并不是C的超集。除了C/C++以外,我只看过Rust语言,除了语法上的不一致, 语言的本质差不多。

虚拟机语言

这类语言中, 我长期使用并看过底层部分实现的只有lua, 写过TS(js),接触过Python, 了解过JAVA。这类编程语言并不是直接编译成汇编代码执行在硬件上的, 而是语言运行环境本身有一套虚拟的硬件系统。所有的代码都有这套虚拟硬件逻辑流程的软件来执行,由于并非直接执行在硬件上, 在做运算和逻辑处理时会带上大量的运行时类型检查, 加上类型描述字段导致数据内存体积增大破坏计算机的高速缓存指令流水,所以会比直接编译成硬件码的执行速度慢很多。这类语言往往伴随着各类框架,或者成熟的库供人使用, 在特定的框架中, 可以通过技术手段使这类虚拟机语言运行期出错的范围影响被减小(native语言出错往往会使软件停止工作, 因为设计时候难以考虑所有的错误条件), 以适应工程需求, 这就使得软件开发成本下降, 人员招募上可以降低要求(这也是语言鄙视链的由来)。 虚拟机语言中的动态语言出错往往比静态编译型语言出错更加难以查找, 因为只能在运行期查错, 缺少静态编译类型检查的环节。 虚拟机本身往往都是native语言完成, 在需要提升某些特定任务处理速度的场合, 需要使用对应虚拟机提供的方法来使用native语言实现。

写在最后

最喜欢被各种讨论的也就是语言之间的效率问题, 和学哪个语言好这类问题。学习的话建议看一看某种机器的汇编, 深入学习一门native语言(最起码得了解内部的内存模型, 语法的大致汇编实现, C++我建议如果不了解实现的高级特性就不要用)。 至于虚拟机类型的语言, 哪个提供的框架(库)好就用哪个, 反正用来也大概不会很复杂, 都使用这种语言来实现业务了, 多半也不会在乎性能了。 效率问题, 我能给出的答案是C(C++的性能上限和C基本一致)在汇编的基础上损失了某些机器的加速汇编指令, 但是由于C语言的垄断性, 硬件提供商一般都会有C的库文件提供。虚拟机语言相对于C增加了大量的运行期判断, 且内存数据过大导致计算机缓存失效(当前的计算机高效运算非常依赖缓存), 部分语言的高级结构大量使用哈希表(查找成员比直接内存指针偏移地址要慢), 导致效率不可避免的降低。 本质上都是计算机发展上出现的不同解决方案, 并没有什么值得比较高低的部分, 一般使用虚拟机语言的地方, 往往都是有一套比较完善的框架和库且并不特别在乎性能。

 

没有更多推荐了,返回首页