两者之间有什么区别吗?根据Ullman的书,编译器将一种语言转换为另一种(通常是低级)语言,汇编器也是如此。两者有何不同?
两者之间有什么区别吗?根据Ullman的书,编译器将一种语言转换为另一种(通常是低级)语言,汇编器也是如此。两者有何不同?
Answers:
汇编程序将汇编代码转换为机器代码。翻译是机械的,只能以一种方式完成。相反,编译器在编译相关的编程语言时具有更大的自由度-例如,它可以优化,甚至非优化的编译器也可以生成不同的代码。同样,可以通过将“前端”(对应于编程语言)和“后端”(对应于计算机体系结构)分开的方式来编写编译器,而对于汇编程序,两者始终是相同的。
最重要的是,它更有趣编写编译器比汇编器。汇编语言通常被设计为几乎不容易解析和类型检查,并且往往涉及许多表驱动的生成器(“用于添加的操作码为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 的类型化汇编语言,带有可保证内存安全的汇编程序。
这里有点简化的答案,现实更加复杂。我希望汇编器(A)与编译器(C)之间的区别是:
我们倾向于将汇编语言称为“低级”,而编译器可以将源语言称为“高级”(这是总的简化,但仍然如此)。
例如,在汇编语言中,您可以说一句添加操作:
您可以使用高级语言编写:
根据多种情况,这可能会导致一条指令或数百条指令,一种就是编译器为其创建指令的CPU。
如您所见,汇编源语言是最常见的:(A)一行源代码提供一行CPU操作码,这在很大程度上取决于您所针对的CPU。高级语言(C)编译器为您处理所有这些详细信息-一行源代码可能变为零,一个或多个CPU操作码,而编译器处理CPU可以执行的操作的详细信息。
今天的编译器通常包含几个不同的阶段。它们可能被命名为frontend / backend或beeing被称为其他事物。我通常将它们视为四个阶段:
编写优秀的编译器是一项高技能的职业-制作玩具语言的编译器可以由业余爱好者在下午进行(或者更长一点)。