• 注册
  • 高中年级 高中年级 关注:35 内容:245

    童年科普:CPU是怎么看懂代码的?

  • 查看作者
  • 打赏作者
    • L28
      童年科普专栏编辑

      去年底,有中国开发者已经开发出文言文编程语言,并在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看懂,还得多一道翻译步骤,即要么翻译成Javascript,要么翻译成Python。多转了一圈,不知道程序执行效率如何。

      由于CPU不能直接理解用高级语言写成的代码,必须依赖翻译程序翻译成机器语言,因此翻译程序可以极大地影响甚至决定处理器性能的发挥。如果没有一个好的翻译程序,那么CPU的性能再强大,也好比茶壶装的饺子,倒不出来。

      正因为如此,谷歌在安卓4.4之后,抛弃了Dalvik虚拟机,改为ART,实际是将翻译程序从解释器切换到编译器,发挥了芯片的性能,提高了程序运行效率。

      现在,手机大厂包括华为、OPPO和vivo都开始重视编译器开发,说到底就是为了发挥芯片性能,让它不再成为倒不出饺子的茶壶。

      最后总结一下,用翻译程序把程序员编写的程序翻译成二进制代码的机器语言后,CPU就能看懂代码了,而且翻译程序的优劣可以影响乃至决定CPU性能发挥。

      编辑
      L82
      VIP2
      巡查检视
      打赏了20童年币

      有事请留言,一般在两三小时内回复!

      回复
      L83
      童年作家
      c++真是入门就入土 [s-57]

      折骨成诗.

    • serman你好厉害啊 [s-10]
      拉黑 3年前 电脑端回复
    • 朱策现在要么学java,要么学Python,或者PHP,C++太老了啊!
      拉黑 3年前 手机端回复
    • 折骨.@朱策 hhh真实,不过我Python是自己学的,应该不是太精 [s-54]
      拉黑 3年前 手机端回复
    • 朱策@沈怀安. 你这么牛啊!我只是学了一下就放弃了,还没有提起兴趣。
      拉黑 3年前 手机端回复
    • 折骨.@朱策 [s-11] [s-11] [s-11] 那倒没有,我只是觉得挺有意思的哈哈哈
      拉黑 3年前 手机端回复
    • 回复

      请登录之后再进行评论

      登录
      • 编辑
      • 小编
    • 巡视员
      巡视员
      有事请留言,一般在两三小时内回复!
    • 童小蜜
      童小蜜
      其实我没有离线!有事请留言,一般在两三小时内回复!
    • 暂没有数据

      • 回帖总排行
      • 采纳总排行
    • 朱策
      朱策
      874次回帖
    • 招来风
      招来风
      580次回帖
    • 巡视员
      巡视员
      472次回帖
    • 折骨.
      折骨.
      375次回帖
    • 雅典娜的布灵诊所
    • 墨儿
      墨儿
      222次回帖
    • 昭昭暮兮
      昭昭暮兮
      210次回帖
    • 祁絮
      祁絮
      205次回帖
    • 举一桐
      举一桐
      199次回帖
    • 怪而无才
      怪而无才
      187次回帖
    • 秦岭小娃
      秦岭小娃
      151次回帖
    • 股尾前科
      股尾前科
      135次回帖
    • LQM
      LQM
      126次回帖
    • 森屿
      森屿
      120次回帖
    • 将离~
      将离~
      112次回帖
    • 童小蜜
      童小蜜
      108次回帖
    • 祁絮
      祁絮
      1次被采纳
    • 王大大
      王大大
      1次被采纳
    • 招来风
      招来风
      1次被采纳
    • 朱策
      朱策
      1次被采纳
    • 怪而无才
      怪而无才
      1次被采纳
    • 把本页链接发给外网好友获得童年币:

    • 任务
    • AI聊天
    • 客服
    • 偏好
    • 到底部
    • 帖子间隔 侧栏位置: