竹笋

首页 » 问答 » 常识 » 为什么现在会有这么多种编程语言
TUhjnbcbe - 2023/6/17 20:25:00
早期白癜风症状 http://pf.39.net/bdfyy/zjft/170705/5515726.html

在计算机还全都是些庞然大物的石器时代,写程序是靠「机器语言」。虽然名字叫做「语言」,实际上用到的就真的只有两个数字0和1(考虑到三进制计算机[1]的话,也许还要算上-1)而已。一些特定的数字组合,对于计算机来说有特定的意义,会让计算机做出特定的动作——其实我们甚至不该叫它们「数字」,因为它们并不代表任何「数量」,而是代表「模式」(pattern)的信号。这是什么意思呢?就好比你伸出一只手去按钢琴键盘的同一部分,缩起来的指头记作0,伸开来的指头记作1,和按出来的声音是不一样的,计算机接受的数字组合与之类似。000这个指令输入一块小芯片的时候,芯片里面有八坨晶体管组成的小装置被「按下」了,其中第二个被通上高电压,另外七个则是低电压,而这个组合会继而引发更多的、由芯片工程师所预先设计的一系列连锁反应。无数这样的模式数字接踵而至,才最终让你面前的屏幕上出现一些能被人理解的图案来。

用纯数字的机器语言编程的难度可想而知,所以从数字到助记符号的转译很快随之出现,称作汇编语言。比如若是一组数字000可以让芯片把内部的一个存储单位,称作「寄存器X」,加上一个值Y,那么不妨就把这组数字和助记符「ADD」对应起来,上面的指令就可以写作「ADDX,Y」这样。一条条类似的指令写成一串,就是一个对于程序的描述。相对于纯数字来说,这是个质的飞跃——终于不必去扳开关了不是吗?而这样的一串字符,可以由专用的小程序来「翻译」成二进制的机器码,也就是真正可以输入处理器去按下晶体管的程序电子信号。当然,每种处理器的汇编语言仍旧是不同的。

机器语言、汇编语言的优点在于,每一条指令都几乎对应于芯片能做的一件事,比如一条指令把一个数字从内存转入寄存器,另一条指令给它加上一,第三条指令将它写回内存去——直接对于一块芯片下命令,效率非常高。相应的缺点则是,如果你只是想把一个数字加一,却每次都要连续写三条指令,时间一长非常痛苦。而且既然不同芯片支持的指令集不同,就意味着这块芯片上需要三条命令完成的事情,另一块芯片可能需要不太一样的五条命令。假如能将一部分固定出现的操作,像连续技一样一次性施放,每次只需要打一个指令,却能够在不同结构的芯片上都做同样的事该有多好?换句话说,如果能有一种更倾向于描述需要解决的问题(给一个数字加一)而不是描述计算机具体进行何种操作(读数,加数,写数)的语言,来封装那些不需要关心的细节,把细小步骤想要达成的意图抽象出来,该有多好?

所谓「高级」计算机语言就是为了这一目的而出现的。最古老的高级语言有FORTRAN、ALGOL和COBOL,以及一种同样古老但是来源迥异的LISP(严格来说,LISP是先作为一种形式语言发明出来,继而人们发现它可以用汇编语言转写给机器执行,后来甚至有专门运行LISTP的机器出现[2])。这些都是二十世纪五六十年代出现的语言。所以题目中的说法其实某种程度上并没有错:你可以说目前流行的一切计算机语言,几乎全都是上述四种古老语言的综合演进,而且如果看看TIOBE的流行语言榜[3],你会发现这四种语言都好端端地活在它的徒子徒孙中间,LISP甚至名列第十五,FORTRAN、COBOL也都没有掉出前五十。就如同芯片从一开始就有很多种类,这些彼此不尽相同的高级语言也都是几乎同时出现——一定要追寻个中原因的话,也许就是「自由市场经济」吧,每个人都有可能(也有资源)去自由地按照自己的想法开发一种语言,不会有(也不应该有)外界的权威从一开始就去限制、整合它们的差异。

六十年代到七十年代,人们开始将这几种当时还很年轻的、主要针对科研(除COBOL是针对商业)领域的计算机语言加以修饰、扩展和融合。其动机和幅度,主要取决于程序员的实际需求。与当初「不想记住数字」导致汇编语言的出现、「不想重复劳动」导致宏(macro)/过程(procedure)的出现类似,因为「想要把数据和操作数据的动作组织到一起」,导致语言增添原生支持物件导向(objectorientation)的数据类型和语法;「能方便地把一小块功能隔离/独立出来,便于维护/分享使用」的需求,导致语言的模块化支持(比如Python的import);「方便干净地在局部处理突发意外状况」的需求,导致异常处理(try…catch…finally)机制的出现;「免于手动管理内存」的需求,导致垃圾收集的出现;「将运算(

1
查看完整版本: 为什么现在会有这么多种编程语言