汇编器和编译器之间的区别

dev*_*per 1 assembly compilation mips

我试图学习 MIPS 汇编语言,以更好地理解计算机是如何工作的。我通常编写 Java 和 JS,并且我知道 Java 使用编译器来执行我的代码。当我学习 MIPS 时,我遇到了汇编器这个词。

他们的工作方式有何不同?

Mar*_*oom 6

编译器和汇编器都采用人类可读的文本并将其转换为特定格式的二进制对象。

区别主要在于:

  1. 具体来自的方向。
    在编译器中,细节来自上面,来自它所针对的编程语言。
    高级语言是抽象的,因为它们是在设计时考虑到抽象机器的,它们隐藏了硬件细节。
    编译器必须将抽象机中的操作映射到目标机器(真实机器)中的操作。

    在汇编器中,细节来自下面,来自它所针对的ISA
    汇编是具体的(不是 100% 具体,例如参见伪指令),它是特定 CPU 操作码的助记符。
    汇编器必须允许程序员像使用操作码一样使用助记符,因为目标是直接指示 CPU,因此汇编指令和机器指令之间存在紧密的 1:1 映射。

  2. 复杂性
    高级语言具有与英语相似的复杂语法,编译器必须执行的解析和映射相当复杂。需要
    词法分析器/分词器和解析器来创建用于相应生成机器代码的AST,这需要在树的节点之间保留上下文。
    我们还期望编译器优化 AST 和生成的代码。

    汇编具有基于行的语法,词法分析器和解析器一次仅限于一行,并且通常可以通过智能表查找来组合和完成。
    没有复杂的状态管理。
    实际上没有优化的空间,也没有花哨的、难以实现的功能来映射到机器代码中,实际上映射很简单,因为它已经由程序员完成了。

    机器人编译器和汇编器需要支持某些对象和执行文件格式,因此会出现一些复杂性。

  3. 目标
    编译器是一个工具,它实现了从用户那里抽象硬件细节的目标,我们希望编写一个源代码,在重新编译时可以在任何硬件中理想地运行。

    当人们不想抽象硬件而是想要充分利用其功能时,汇编器是一种派上用场的工具。

    因此,汇编器将公开一组低级细节(例如段),而编译器将尝试隐藏这些细节。

我们可以将编译器视为遵循烹饪收据的人,当它说“混合牛奶”时,人类必须实际拿起正确的工具(木勺?),将其放入牛奶中并进行旋转运动。
这是一件复杂的事情。
汇编器就像一个孩子,它不会理解“混合牛奶”,我们必须告诉它“从左边画出的木勺子,它就像一根带有凸端的木头制成的长棍”,然后,“用手握住容器不动”,“将木勺放入牛奶中 4-5 英寸深”,“顺时针转一圈,稳定但不要太快”,“重复 20 秒”。
这些指令更容易解析,同时允许讲师对整个操作有更多的控制,例如,如果他们想要改变勺子的深度。

那么为什么我们有汇编器呢?因为我们需要一种精确
生成机器指令的方法,所以我们可以使用特定语言的编译器来实现这一点,但由于低级指令列表的结构比抽象操作要少得多,因此最终结果将是一个美化的汇编程序(或多或少就像使用 Git 这样的版本控制软件只是为了提交一个充满复制粘贴备份的工作目录)。 因此,我们将它们分开:汇编器的简单结构,编译器的复杂语法。