编者按:本文来自微信公众号“魔铁的世界”(ID:jiangpeiyu0916),作者:魔铁,36氪经授权发布。
去年底,有中国开发者已经开发出文言文编程语言,并在GitHub上摘得了5500星,在国内引起不小反响。这件事给普通人的印象是,科技发展日新月异,电脑CPU太厉害,都能读懂文言文了!
CPU真的能看懂文言文代码吗?答案是CPU既看不懂文言文代码,也看不懂英文代码。
现在的CPU晶体管数量动辄几十亿个,结构非常复杂,但内部传输的信号只有两种:高电压和低电压,分别代表数字信号“1”和“0”(也有相反的),因此CPU唯一能看懂的就是由“1”和“0”组成的代码。
由于程序(代码)存储在电脑硬盘中时,也是“1”和“0”的形式,是否就意味着,只要程序存到硬盘中,CPU就能认识呢?
答案是CPU仍然看不懂这些程序,因为以“1”和“0”位模式存储的程序和以“1”和“0”写成的机器语言完全是两回事,简单说,两者的区别类似于汉语书和英语书都用纸和油墨印制,但依然是两种不同的语言,不会英语的依然看不懂英语书。
机器语言是CPU唯一能看懂的语言,也是第一代编程语言。
早期的计算机程序员使用机器语言编程,将用0和1数字编成的程序代码打在纸带或卡片上(打孔代表1,不打孔代表0),再将它通过纸带机或卡片机输入计算机,进行运算。
机器语言的最大特点是面向计算机硬件编程,简单说就是程序员需要通晓计算机硬件知识,写的程序要真实表示数据是如何被计算机操纵的。对程序员来说这就比较头大,一方面不仅需要通晓计算机硬件知识,另一方面如果计算机使用了不同的硬件,那么就得重新编程。
毕竟上得了“厅堂”(搞掂硬件)下得了“厨房”(玩得转软件),只有少数大神能做到,加上机器语言纯用“0”和“1”序列组成,非常单调枯燥,不仅扼杀了编程的趣味,而且对视力也是一种考验,稍微一眼花,看错1或0的排列位置,就会制造一个大BUG。
于是,有一帮人开始琢磨了:能不能将计算机硬件从编程中分离出来,让硬件知识小白也能编程?
最先开窍的是蓝色巨人IBM,它在其System/360计算机中引入了ISA(Instruction Set Architecture)概念,将编程所需要了解的硬件信息从硬件中抽象出来,这样编程人员就可以面向ISA编程。由于ISA是用来描述编程时用到的抽象机器(不是具体的电脑CPU),包括了一套指令集和一些寄存器,因此,程序员只要知道ISA,不需要了解具体的硬件知识,就可以编写程序,在ISA相同的电脑上运行。
这样一来,就出现了汇编语言,但汇编语言用符号写成,还是不够接地气儿,于是高级语言就诞生了。高级语言的诞生,使程序员将精力从复杂的计算机结构转移到要解决的问题,从而可以专心烹调程序大餐。
由此也可以看出,现在的程序员并不都是了解计算机硬件的,所以妹子们不要指望自己的程序员男朋友给你DIY电脑,或者电脑坏了,他能给你省下一笔修理费。他说不会修,那就是真的不会修。
自从高级语言出现后,人类开始了在编程语言上的放飞自我,经过数十年的发明创造,现在的高级编程语言已超过2500种,像比较知名的C++和Java等,都属于高级语言。
极客漫画《编程语言之战》,展示的是高级编程语言之间的市场竞争,也揭示了高级编程语言多如牛毛。
但问题出现了,CPU能理解的机器语言还是那个机器语言,几十年来没有变化,让它读懂高级语言那是不可能的。
怎么办?
其实,早在高级语言出现之前的汇编语言时代,聪明的计算机研发人员就开发出了专门的程序,用来将汇编语言和高级语言翻译成机器语言,其过程相当于将英语名著翻译成汉语著作。
说白了,这种翻译程序相当于人类中的翻译家。
翻译程序有两种工作方法:编译和解释,相应的程序名称是编译器和解释器。两者的区别是,编译是在执行前把整个源程序(高级语言程序)翻译成目标程序(机器语言程序),而解释是一次只翻译和执行源程序中的一行。
打个形象的比方,解释器相当于发布会的实时翻译,演讲的嘉宾说一句,实时翻译马上翻译一句。编译器则相当于著作翻译家,整本翻译完成后,再让出版社印刷上市。
经过翻译程序的努力,现在CPU能看懂程序员写的程序了。当然,用开头提到的文言文编程语言编写的程序想要让CPU看懂,还得多一道翻译步骤,即要么翻译成Javascript,要么翻译成Python。多转了一圈,不知道程序执行效率如何。
由于CPU不能直接理解用高级语言写成的代码,必须依赖翻译程序翻译成机器语言,因此翻译程序可以极大地影响甚至决定处理器性能的发挥。如果没有一个好的翻译程序,那么CPU的性能再强大,也好比茶壶装的饺子,倒不出来。
正因为如此,谷歌在安卓4.4之后,抛弃了Dalvik虚拟机,改为ART,实际是将翻译程序从解释器切换到编译器,发挥了芯片的性能,提高了程序运行效率。
现在,手机大厂包括华为、OPPO和vivo都开始重视编译器开发,说到底就是为了发挥芯片性能,让它不再成为倒不出饺子的茶壶。
最后总结一下,用翻译程序把程序员编写的程序翻译成二进制代码的机器语言后,CPU就能看懂代码了,而且翻译程序的优劣可以影响乃至决定CPU性能发挥。