当前位置: 首页 > 科技观察

编程语言翻译家族的历史

时间:2023-03-22 17:15:29 科技观察

我是编程语言翻译家族的一员。我们家最重要的工作就是把用一种语言描述的源程序翻译成用另一种语言描述的目标程序。听起来有点抽象,简单的说就是把你coder写的源代码变成可执行程序。可以说,我们这个家庭是随着计算机的发展而不断壮大的,现在已经成为计算机软件系统中不可或缺的一部分。回顾这个家族的历史,还是蛮有意思的。1、机器语言听说计算机刚发明时,人们摆弄各种开关,操作各种电缆,将程序“输入”到计算机中。这个所谓的程序真的是0110000111这样的二进制,真的很佩服这些程序的设计者和操作者,太不可思议了。这种原始的方法也决定了超大型程序的制作难度很大,因为它太过复杂,远远超出了人脑的极限。后来人们做了一些改进,把程序打在穿孔纸带上,让机器直接读取穿孔纸带。现在好多了,终于不用再去拨弄开关了。但是,程序的本质没有改变,仍然使用二进制编程。如果这种情况持续下去,估计这个世界上的程序员会很少了:编程的门槛太高了。比如你要记住这样的指令:0000表示从内存中加载数据到CPU寄存器中0001表示将CPU寄存器的值写入内存中0010表示将两个寄存器的值相加你要记住每个寄存器的二进制表示:1000表示寄存器A,1001表示寄存器B,组合起来是这样的:00001000000000000001表示将编号为1的内存中的值加载到寄存器A中。001010001001的意思就是把寄存器A和寄存器B的值相加,放到寄存器A里。整天生活在这样的世界里,脑子里全是0和1,要是猜到我就郁闷了。那时候程序员跟pandas一样少,不,肯定比pandas少,都得用二进制写程序,更不需要我们翻译族。2.既然汇编语言的二进制这么难记,人们很快就会想:能不能给这些指令起个好听的名字呢?0000:LOAD0001:STORE0010:ADD寄存器是一样的:1000:AX1001:BX这里更容易阅读:ADDAXBX人们给这些有助于记忆的助记符起了一个名字:汇编语言。但是计算机不能执行汇编语言,因为愚蠢的计算机只能识别二进制,所以必须翻译。于是,我们家族的重要成员:组装机隆重登场。他负责将用汇编语言编写的程序翻译成机器语言。翻译过程比较简单,几乎是一对一的关系。汇编语言解放了人的一部分脑力,可以将更多的精力集中在程序逻辑上。越来越多的人学会了用汇编编程,并编写了很多很棒的软件。汇编的优点是离机器近,运行效率极高,缺点是离机器太近,直接操作内存和CPU寄存器,不能结构化编程。每次调用函数时,都必须手动管理栈帧。程序员太难了!我的祖先把穿孔纸带和汇编语言都称为低级语言,把这个时代称为机器语言编程时代。生活在这个时代的先人很幸福,因为翻译的工作很简单。但是现在写汇编程序的人还是太少了,找我们做翻译的人也很少,翻译一族就是温饱而已。3、高级语言人类的欲望是无止境的,一直在探索用高级语言编写程序的可能性。这种高级语言应该由人类编写和阅读,而不是由机器执行。人类想要的高级语言是这样的:声明各种类型的变量来表示数据,而不是使用寄存器。例如:intvalue=100可以用复杂的表达式告诉计算机自己的意图:salary=1000+salary*12可以用各种控制语句来控制流程:if..else,while(....)....你也可以定义一个函数来封装和复用一段业务逻辑:intget_primes(intmax){.....}但是高级语言和低级语言之间有巨大的差距,如何将高级语言翻译成可执行的机器语言是一个非常难的问题!人类在黑暗中摸索了许久,才迎来了曙光。1957年,第一个高级语言编译器在IBM704机上成功运行。更重要的是,乔姆斯基对自然语言结构的研究将语言语法分为Type0语法、Type1语法、Type2语法和Type3语法,一下子为我们的翻译工作打下了坚实的基础。理论基础。由于翻译的复杂性,除了汇编人员之外,还有很多新成员的加入,我们这个大家庭迅速壮大,甚至形成了专门的翻译流水线。这条管道的家族成员共同努力,将高级语言翻译成低级语言。我做的主要工作是词法分析的第一步。大家经常跟我开玩笑:你这是在拿大刀砍源程序的脑袋。这其实很形象。比如某高级语言的源程序是这样的:total=1000+salary*12我拿了一把“大刀”,把他们一个个砍成碎片。每一块称为Token。1.标识符总计2。赋值符号=3。编号10004。加号+5。标识符salary6.乘号*7。Number12程序中的空格被我无情的删掉了,我会建立一个符号表给后面的人用:接下来我二叔接手。他很厉害,可以做语法分析。据说他使用了一种叫做上下文无关文法的理论。然后三叔会做语法分析。他会检查这些标识符的类型,范围是否正确,操作是否合法,取值范围是否有问题等等。舅舅的工作是重中之重,他承包了中间代码生成、代码优化、最终代码生成。比如大叔根据语法树生成的中间代码如下:temp1=id2*12temp2=1000+temp1id1=temp2(注意:id2是salary,id1是total)然后他优化一下:temp1=id2*12id1=1000+temp1然后转换为汇编:MOVid2AXMUL12AXADD1000AXMOVAXid1非常接近工作!但是等等,id1(total),id2(salary)这两个符号而已,计算机根本不知道它们是什么东西,计算机只关心内存和寄存器,所以你得给这两个家伙分配空间,搞定他们的地址。如果这两个变量定义在其他文件中,则需要做一件特殊的事情:链接!通过链接得到变量的真实地址,然后修改上面的id1,id2,这样就形成了可以执行的程序。在翻译的过程中,如果有哪一步出错了,我们会通知程序员,告诉他哪里错了,改正后重新开始。这是我们家族的工作,非常重要,没有我们的翻译工作,人类就无法使用高级语言来编程,语言如C,C++,Pascal,C#,Java,像有影响力的语言,不会出现,今天的软件编程行业也不会这么繁荣。我们家和操作系统、数据库、网络协议栈等软件一起,成为了计算机世界最底层的基础软件。其实我们都明白,所谓的高级语言一点都不高级,只有训练有素的专业人员才能使用。也许在未来,程序将完全用自然语言编写。到那时我们的家庭会是什么样子?天才知道。【本文为专栏作家“刘欣”原创稿件,转载请通过作者微信获取授权公众号coderising】点此查看该作者更多好文