Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

高级语言:再加一层

复习

  • 用汇编语言指挥计算机:用助记符代替难读的二进制机器指令
  • 名字、标签与地址:用名字和标签引用数据与跳转目标,不再手工数地址
  • 汇编器:通过两遍扫描,把符号汇编成机器码

TL;DR

  • 汇编仍然在“指挥机器”:寄存器、地址、每一步都要人安排
  • 高级语言换了个角度:只描述“要解决什么问题”,不管“机器怎么一步步做”
  • 变量、表达式、判断、循环、函数,让人更像在陈述问题本身
  • 从机器到汇编,再到高级语言,是一层层加上去的抽象

正文

  一路走来,我们让机器越来越“听话”:先是 0 和 1,然后是助记符,再是名字。可你有没有发现,我们始终在做同一件事—— 替机器操心

  写汇编时,脑子里装的不是“我要算什么”,而是“先读哪个地址、放进哪个寄存器、结果写到哪”。程序稍微一长,这种操心就变成了负担。

  于是有人想:能不能让程序员只管描述问题,把“怎么控制机器”这件事,交给另一个程序去办?

两种说法

  同样是“求两个数的平均值”,我们用两种方式各说一遍。

  汇编是“怎么做”:

      LOAD  A, [x]
      LOAD  B, [y]
      ADD   R, A, B
      STORE [t], R
      ; 再想办法把 t 除以 2,然后存回 average

  高级语言是“要什么”:

average = (x + y) / 2

  第二行几乎就是一句数学式子。它没提任何寄存器、地址,也没有说先读谁、后读谁——这些细节,交给翻译它的程序去安排。

高级语言多了什么

  所谓“高级”,是指它离机器远、离人近。它给我们添了几样东西:

  • 变量 :用有意义的名字表示数据,比如 averagescore
  • 表达式 :像 (x + y) / 2 这样直接书写算式
  • 控制结构 :用 ifwhile 这样的写法描述判断和重复,而不必手写跳转
  • 函数 :把一段工作命名、打包,反复使用

  更重要的是,它多半 与具体机器无关 。同一段高级语言程序,经过不同的翻译程序,就能在不同的 CPU 上运行——为一种机器写的汇编,换个 CPU 常常要重写,而高级语言不必。

又加了一层

  这就是我们反复提到的那件事: 在计算机科学里,没有什么问题是加一层解决不了的。

高级语言   ← 人在这里描述问题
   ↓ 翻译
汇编语言   ← 贴近机器
   ↓ 汇编器
机器码     ← 机器唯一认得的东西

  人写得越来越轻松,机器那一端却一点没变:它执行的,仍然是取指、译码、执行、写回。多出来的每一层,都在替人把“机器的细节”藏起来。

代价

  加层不是没有代价的:

  • 翻译出来的程序,不一定比手写汇编更省、更快
  • 抽象偶尔会“泄漏”——底层出了问题,上层的人也得懂一点下面的事

  可换个角度想:如果用高级语言能一天写完的程序,用汇编要写一个月,那点性能差距往往非常划算。 把精力花在解决问题上,而不是伺候机器,这才是加这一层的意义。

  那么,高级语言里的变量、表达式、判断、循环、函数,究竟是怎么一步步落到我们那台只会读指令、做加减、存数据的机器上的?接下来几章,我们一层层把它们拆开。先从最常见的东西说起:变量、类型和表达式。

思考题

  高级语言让你“不必关心寄存器”,可它最终还是要落到寄存器上。那这层抽象是“取消”了寄存器,还是“隐藏”了寄存器?

小结

知识点

  • 高级语言从“控制机器”转向“描述问题”
  • 变量、表达式、控制结构、函数
  • 高级语言与具体机器无关,可移植性更好
  • 抽象是多加的一层,也是多层之一

参考资料

  1. Wikipedia(zh):高级语言:高级语言的概念
  2. Wikipedia(zh):编译器:把高级语言翻译成机器语言
  3. Wikipedia(zh):抽象:计算机科学中的层次抽象

思考题答案(仅供参考)

  是“隐藏”,不是“取消”。高级语言可以不管寄存器,是因为有翻译程序替你把变量安排到寄存器或内存里;寄存器该用还得用,只是不再由你亲自操心。抽象并没有消灭底层,它只是把底层遮起来,让你在需要时可以不管它。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪