中央处理器@CPU是怎么看懂代码的?


备注:这是我问答内容的一个精编版 , 增加了一些内容 , 所以和原内容略有不同 。
去年底 , 有中国开发者已经开发出文言文编程语言 , 并在GitHub上摘得了5500星 , 在国内引起不小反响 。 这件事给普通人的印象是 , 科技发展日新月异 , 电脑CPU太厉害 , 都能读懂文言文了!
CPU真的能看懂文言文代码吗?答案是CPU既看不懂文言文代码 , 也看不懂英文代码 。
现在的CPU晶体管数量动辄几十亿个 , 结构非常复杂 , 但内部传输的信号只有两种:高电压和低电压 , 分别代表数字信号“1”和“0”(也有相反的) , 因此CPU唯一能看懂的就是由“1”和“0”组成的代码 。
由于程序(代码)存储在电脑硬盘中时 , 也是“1”和“0”的形式 , 是否就意味着 , 只要程序存到硬盘中 , CPU就能认识呢?
答案是CPU仍然看不懂这些程序 , 因为以“1”和“0”位模式存储的程序和以“1”和“0”写成的机器语言完全是两回事 , 简单说 , 两者的区别类似于汉语书和英语书都用纸和油墨印制 , 但依然是两种不同的语言 , 不会英语的依然看不懂英语书 。
机器语言是CPU唯一能看懂的语言 , 也是第一代编程语言 。

中央处理器@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能理解的机器语言还是那个机器语言 , 几十年来没有变化 , 让它读懂高级语言那是不可能的 。分页标题
怎么办?
其实 , 早在高级语言出现之前的汇编语言时代 , 聪明的计算机研发人员就开发出了专门的程序 , 用来将汇编语言和高级语言翻译成机器语言 , 其过程相当于将英语名著翻译成汉语著作 。
说白了 , 这种翻译程序相当于人类中的翻译家 。
翻译程序有两种工作方法:编译和解释 , 相应的程序名称是编译器和解释器 。 两者的区别是 , 编译是在执行前把整个源程序(高级语言程序)翻译成目标程序(机器语言程序) , 而解释是一次只翻译和执行源程序中的一行 。

中央处理器@CPU是怎么看懂代码的?
本文插图
打个形象的比方 , 解释器相当于发布会的实时翻译 , 演讲的嘉宾说一句 , 实时翻译马上翻译一句 。 编译器则相当于著作翻译家 , 整本翻译完成后 , 再让出版社印刷上市 。
经过翻译程序的努力 , 现在CPU能看懂程序员写的程序了 。 当然 , 用开头提到的文言文编程语言编写的程序想要让CPU看懂 , 还得多一道翻译步骤 , 即要么翻译成Javascript , 要么翻译成Python 。 多转了一圈 , 不知道程序执行效率如何 。
由于CPU不能直接理解用高级语言写成的代码 , 必须依赖翻译程序翻译成机器语言 , 因此翻译程序可以极大地影响甚至决定处理器性能的发挥 。 如果没有一个好的翻译程序 , 那么CPU的性能再强大 , 也好比茶壶装的饺子 , 倒不出来 。
正因为如此 , 谷歌在安卓4.4之后 , 抛弃了Dalvik虚拟机 , 改为ART , 实际是将翻译程序从解释器切换到编译器 , 发挥了芯片的性能 , 提高了程序运行效率 。
现在 , 手机大厂包括华为、OPPO和vivo都开始重视编译器开发 , 说到底就是为了发挥芯片性能 , 让它不再成为倒不出饺子的茶壶 。
最后总结一下 , 用翻译程序把程序员编写的程序翻译成二进制代码的机器语言后 , CPU就能看懂代码了 , 而且翻译程序的优劣可以影响乃至决定CPU性能发挥 。
图片源自网络 , 版权归图片作者所有 。