Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

第三十九章:高级语言:再加一层

复习

  • 汇编器会把助记词、寄存器和标签翻译为机器码。
  • 汇编语言仍要求程序员直接安排每一步机器动作。

TL;DR

  • 高级语言让人用更接近问题本身的方式描述程序。
  • 一条高级语言语句常会变成多条机器指令。
  • 这多出来的一层由编译器或解释器负责连接。

正文

  如果目标只是把两个数相加,汇编语言尚且清楚。可想象要统计一万笔账、显示一个窗口,或处理一张照片:程序员若始终盯着寄存器编号和跳转地址,绝大部分精力都会花在安排机器细节上。

  因此,人们又加了一层语言。例如,同一件“求和”的事可以写成:

total = apples + pears

  这行文字没有说明 total 位于哪个地址,没有指定使用哪个寄存器,也没有要求先写入 A 再写入 B。它描述的是我们关心的结果。C、Python、Java 等都属于这一大类更接近人类表达的高级语言,虽然它们的具体写法和能力各不相同。

  “高级”并不是说它比汇编语言更强大,而是说它把更多机器细节藏到下层。翻译工具需要把一行 total = apples + pears 展开成读数、运算、存回结果等动作;CPU 最后仍执行机器指令。层次只是改变了谁处理细节。

人的想法
   ↓
高级语言程序
   ↓ 翻译工具
汇编语言 / 机器码
   ↓
CPU 的电路动作

  这种抽象让一份程序更容易迁移。只要有适合目标机器的翻译工具,同一份高级语言源代码可以在不同处理器上生成不同的机器码。当然,硬件差异并没有消失,只是通常由语言实现和工具替程序员处理。

  从这里起,我们暂不拘泥于某一种真实语言,而用一种接近常见编程语言的写法讨论程序。第一件要弄清的事是:applestotal 到底是什么,+ 又如何形成结果?

思考题

高级语言程序能被 CPU 直接读懂吗?

小结

知识点

  • 高级语言优先表达问题和规则,而非寄存器与地址。
  • 高级语言需要翻译成机器可执行的形式。
  • 抽象减少了重复的机器细节,并不取消底层硬件。

参考资料

  • Brian Kernighan、Dennis Ritchie,《C 程序设计语言》
  • Harold Abelson、Gerald Sussman,《计算机程序的构造和解释》

思考题答案(仅供参考)

  不能。CPU 只执行自己的机器指令;高级语言需要经过翻译,或在运行时由另一段程序逐步处理。

协议

本文采用 CC BY-NC-SA 4.0 协议发布。