2021-11-12 , 3386 , 101 , 159
编译原理 龙书 Compiler, Dragon Book-3:第一章:引论
编程语言是用于向人和机器描述计算的符号。我们所知道的世界取决于编程语言,因为在所有计算机上运行的所有软件都是用某种编程语言编写的。但是,在程序运行之前,它首先必须被翻译成计算机可以执行的形式。
进行这种翻译的软件系统称为编译器。这本书是关于如何设计和实现编译器的。我们将发现一些基本思想可用于为多种语言和机器构建翻译器。除了编译器之外,编译器设计的原则和技术还适用于许多其他领域,以至于在计算机科学家的职业生涯中,它们很可能会被多次重用。编译器编写的研究涉及编程语言、机器架构、语言理论、算法和软件工程。
在这个预备章节中,我们介绍了不同形式的语言翻译器,对典型编译器的结构进行了高层次的概述,并讨论了正在塑造编译器的编程语言和机器架构的趋势。我们对编译器设计和计算机科学理论之间的关系进行了一些观察,并概述了编译器技术在编译之外的应用。我们以
我们研究编译器所需的关键编程语言概念的简要概述。
1.1 语言处理器
简而言之,编译器就是可以读取一种语言的程序的程序。源语言 |并将其翻译成另一种语言的等效程序|目标语言;见图 1.1。编译器的一个重要作用是报告它在翻译过程中检测到的源程序中的任何错误。
编译器生成的机器语言目标程序在将输入映射到输出时通常比解释器快得多。 然而,解释器通常可以提供比编译器更好的错误诊断,因为它逐条语句执行源程序。
例 1.1:Java 语言处理器结合编译和解释,如图 1.4 所示。 Java 源程序可能首先被编译成称为字节码的中间形式。 然后由虚拟机解释字节码。 这种安排的一个好处是在一台机器上编译的字节码可以在另一台机器上解释,也许通过网络解释。
为了更快地处理输入到输出,一些 Java 编译器(称为即时编译器)在运行中间程序以处理输入之前立即将字节码翻译成机器语言。
除了编译器之外,可能还需要其他几个程序来创建一个可执行的目标程序,如图 1.5 所示。一个源程序可以被分成存储在不同文件中的模块。收集源程序的任务有时委托给一个单独的程序,称为预处理器。预处理器还可以将速记(称为宏)扩展为源语言语句。
UfqiLong
然后将修改后的源程序提供给编译器。编译器可能会生成汇编语言程序作为其输出,因为汇编语言更容易生成为输出并且更易于调试。然后,汇编语言由称为汇编程序的程序进行处理,该程序生成可重定位的机器代码作为其输出。
大型程序通常是分段编译的,因此可重定位的机器代码可能必须与其他可重定位的对象文件和库文件一起链接到实际在机器上运行的代码中。链接器解析外部存储器地址,其中一个文件中的代码可能引用另一个文件中的位置。然后加载器将所有可执行目标文件放在一起执行。
1.1.1 1.1节练习
练习 1.1.1:编译器和解释器的区别是什么?
练习 1.1.2:(a)编译器优于解释器(b)解释器优于编译器的优点是什么?
练习 1.1.3:编译器生成汇编语言而不是机器语言的语言处理系统有什么优势?
练习 1.1.4:将一种高级语言翻译成另一种高级语言的编译器称为源到源翻译器。使用 C 作为编译器的目标语言有什么优势?
练习 1.1.5:描述汇编器需要执行的一些任务。
🔗 连载目录
🤖 智能推荐