编译器和汇编器之间有什么真正的区别?


15

两者之间有什么区别吗?根据Ullman的书,编译器将一种语言转换为另一种(通常是低级)语言,汇编器也是如此。两者有何不同?


1
汇编器执行一组特定任务的编译器。在实践中,这些术语有所不同,但是“编译器”(在语言之间翻译)的基本定义适用。
拉斐尔

所有汇编器都是(简单)编译器,因为它们将一种语言转换为另一种语言。并非所有的编译器都是汇编程序。
user253751

Answers:


16

汇编程序将汇编代码转换为机器代码。翻译是机械的,只能以一种方式完成。相反,编译器在编译相关的编程语言时具有更大的自由度-例如,它可以优化,甚至非优化的编译器也可以生成不同的代码。同样,可以通过将“前端”(对应于编程语言)和“后端”(对应于计算机体系结构)分开的方式来编写编译器,而对于汇编程序,两者始终是相同的。


2
为什么只能以一种方式完成翻译?这是否意味着不能为给定的机器代码(和目标体系结构)生成原始的asm代码?这听起来与我的直觉相反。因为如果给定的机器代码指令可以映射到多个asm指令,那么机器如何决定执行哪个指令?我想念什么吗?
Utku 2015年

3
一种Ť一种一种

谢谢,我也看到在厄尔曼的书中,编译器具有前端和后端。如果我是正确的,那么后端将以一种中间语言执行优化,生成机器代码并优化机器代码,并且可以通过多种方式来完成这三个任务中的每一项。后端部分是汇编程序吗?中间语言是汇编语言吗?我想是的,但是您的答复提到汇编程序仅以一种方式完成其工作。
蒂姆(Tim)


中间语言通常是指与机器无关的语言。
Yuval Filmus

11

最重要的是,它更有趣编写编译器比汇编器。汇编语言通常被设计为几乎不容易解析和类型检查,并且往往涉及许多表驱动的生成器(“用于添加的操作码为01110”,“对于加载指令,目标操作数寄存器由位17至21指定。 ”)。通常,汇编器中最有趣的部分是将符号标签解析为数字的部分。

然而,大多数汇编程序可以执行少量算术运算(例如,将带有小常数的符号标签加在一起),并且大多数汇编程序都具有或集成有宏处理工具。(在大多数Unix系统上,宏功能实际上是通过在汇编程序上运行C预处理程序,然后再将其传递给适当的汇编程序来提供的。)

MIPS汇编器必须走得更远,并做出一些有趣的代码生成决策并进行少量优化。 例如,MIPS机器语言需要不同的代码序列来加载不同的常量,因此,汇编器必须在构造常量之后选择代码序列。此外,MIPS机器代码具有延迟槽的概念,但是汇编程序有责任将这些程序抽象化,并向编译器提供一种更“正常”的抽象汇编语言。因此,MIPS汇编器需要执行一些本地指令调度。

诺曼·拉姆齐Norman Ramsey)的一些作品,尤其是他的C-便携式汇编语言,进一步区别了这一区别。(相关论文是Ramsey和Peyton Jones,“一种支持异常的多种实现的单一中间语言”,Prog。Lang。Impl。and Dsgn。,(PLDI-21):285-298,2000年。)最后,那里也是David Walker和Greg Morrisett 的类型化汇编语言,带有可保证内存安全的汇编程序。


0

这里有点简化的答案,现实更加复杂。我希望汇编器(A)与编译器(C)之间的区别是:

  1. 一行源代码直接与一个CPU操作码有关(A)(不是)
  2. 高度依赖于实际的CPU(A)或与计算机无关的(C)

我们倾向于将汇编语言称为“低级”,而编译器可以将源语言称为“高级”(这是总的简化,但仍然如此)。

例如,在汇编语言中,您可以说一句添加操作:

  • 添加a,b(用于一个特定的CPU)
  • 添加R5,R6(用于不同的CPU)
  • 加(A5),D2(用于不同的CPU)

您可以使用高级语言编写:

  • x = y + z;

根据多种情况,这可能会导致一条指令或数百条指令,一种就是编译器为其创建指令的CPU。

如您所见,汇编源语言是最常见的:(A)一行源代码提供一行CPU操作码,这在很大程度上取决于您所针对的CPU。高级语言(C)编译器为您处理所有这些详细信息-一行源代码可能变为零,一个或多个CPU操作码,而编译器处理CPU可以执行的操作的详细信息。

今天的编译器通常包含几个不同的阶段。它们可能被命名为frontend / backend或beeing被称为其他事物。我通常将它们视为四个阶段:

  1. 第一阶段读取实际的源代码并创建内部表示。这个阶段知道实际的源语言。
  2. 第二阶段着眼于内部表示并进行了许多优化。如今,编译器通常会寻求使程序更快,并且在程序变大时不再关心。优化是在内部表示上完成的。有趣的是,对于几种不同的语言,部分内容可能是通用的。
  3. 第三阶段采用内部表示,并为所选的CPU创建实际代码。此阶段可能有几种不同的版本,针对不同的CPU。实际上,您可以编写一次源代码,然后针对不同的CPUS-s对其进行编译。
  4. “打包”程序的最终准备工作(此阶段可能是链接程序)。

编写优秀的编译器是一项高技能的职业-制作玩具语言的编译器可以由业余爱好者在下午进行(或者更长一点)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.