编译器和汇编程序都将一个人类可读的文本转换成特定格式的二进制对象。
-
在编译器中,细节来自上面,来自它所针对的编程语言。
摘要
从某种意义上说,它们设计时考虑了一个抽象的机器,因此它们隐藏了硬件细节。
在汇编程序中,细节来自下面,来自
ISA
混凝土
(非100%混凝土,见
Pseudo-instructions
例如),它是特定CPU操作码的助记符。
-
复杂性
高级语言有一个类似于英语的复杂语法,编译器要做的解析和映射相当复杂。
lexer/tokenizer和
a parser
创建一个
AST
它用于相应地生成机器代码,这需要在树的节点之间保持上下文。
我们还期望编译器优化AST和生成的代码。
没有复杂的状态管理。
实际上没有空间进行优化,也没有花哨的、难以实现的特性映射到机器代码中,实际上映射是很简单的,就像程序员已经完成的那样。
Bot编译器和汇编器需要支持某些对象和执行文件格式,因此会带来一些复杂性。
-
目标
编译器是一个实现从用户那里抽象出硬件细节的工具,我们想要编写一个源代码,当重新编译时,可以在任何硬件中运行。
当一个人不想把硬件抽象出来,而是想充分利用它的特性时,汇编程序是一种方便的工具。
因此,汇编程序将公开一组编译器试图隐藏的低级细节(例如段)。
我们可以把一个编译者想象成一个遵循烹饪收据的人,当收据上写着“混合牛奶”时,这个人必须实际使用正确的工具(木勺?),把它放进牛奶中,做一个旋转运动。
这是一件复杂的事情。
一个装配工就像一个孩子,他不会理解“混合牛奶”,我们必须告诉他“从左边画的木勺上取木勺,它就像一根木头做成的长棍,有一个凸出的端部”,然后,“用手握住容器不动”,“把木勺放在牛奶里4-5英寸深”,“做一个圆圈,平稳,不要太快,顺时针”,“重复20秒”。
这些都是更容易解析的指令,同时允许教师对整个操作有更多的控制,例如,如果他们想改变勺子的深度。
那为什么我们有汇编程序呢?
因为我们需要一种生成机器指令的方法
所以我们把它们分开:汇编程序的简单结构,编译器的复杂语法。