【梳理】编译原理与实践 第一章 引言(docx)

编译原理知 识 梳 理(第一版) 建议先修课程:离散数学、C / C++、数据结构、汇编语言、计算机组成原理。配套教材:Kenneth C. Louden Compiler Construction: Principles and Practice链接:https://pan.baidu.com/s/16rZnr6V14BRR5tXx8o8LqQ提取码:0000一 引言编译器(compiler)是将一种语言翻译为另一种语言的计算机程序。编译器将源语言(source lang
摘要由CSDN通过智能技术生成

编译原理

知 识 梳 理

(第一版)

建议先修课程:离散数学、C / C++、数据结构、汇编语言、计算机组成原理。
配套教材:
Kenneth C. Louden Compiler Construction: Principles and Practice


链接:https://pan.baidu.com/s/16rZnr6V14BRR5tXx8o8LqQ
提取码:0000


一 引言
编译器(compiler)是将一种语言翻译为另一种语言的计算机程序。编译器将源语言(source language)编写的程序作为输入,产生用目标语言(target language)编写的等价程序。一般地,源程序为高级语言(high-level language),如C或C++;而目标语言则是目标机器的目标代码(object code)或称机器代码(machine code),也就是使用目标计算机的机器指令编写的代码,目标代码将在该计算机上运行。
编译器是相当复杂的,其代码长度可从10 000行到1 000 000行不等。编写甚至读懂这样的一个程序都非易事,大多数的计算机行业人员也从未编写过一个完整的编译器。但尽管如此,几乎所有形式的计算都需要编译器,任何与计算机打交道的人员都应掌握编译器的基本结构和操作。此外,计算机应用中,经常需要开发命令解释器和界面。这样的程序比编译器要小,但却使用相同的技术。因此,掌握编译器涉及的技术具有非常重要的实际意义。
1.1 为何要使用编译器?
1940年代,在John von Neumann的牵头之下,可以存储程序的计算机问世了。这之后,人们开始为计算机编写代码,令计算机执行特定的计算任务。最初,计算机代码都是使用机器语言(machine language)编写的。比如
C7 06 0000 0002
在使用Intel 8x86的IBM PC上,代表将数字2移动到0000h。显然,编写这样的代码工作量极大,且冗长而枯燥。很快,汇编语言(assembly language)替代了机器语言。汇编语言使用符号表示指令和内存位置。例如
mov x,2
代表将数字2移动到内存位置x。汇编器(assembler)将这些符号代码与内存位置翻译成相应的机器指令。
汇编语言极大提升了编程速率与准确度,至今仍在被使用,尤其是在一些性能要求极高的场合,依然需要对编写的代码进行汇编级优化。然而,汇编语言具有许多缺点:它仍旧不易编写,并且理解起来很困难。此外,汇编语言高度依赖特定的平台。针对一类机器编写的汇编语言在另一类机器上往往不能被正确执行,而需要重新编写程序。很明显,编程技术发展的下一步应当是:让代码能够以更接近数学记号和自然语言的方式被简洁地编写出来,而且独立于特定的机器,当然也需要借助专门的程序将它翻译为可执行代码。例如,
x = 2
这样的代码就是平台无关的。最初,人们担心这或许根本不可能实现,又或者说,用这样的方式生成目标代码效率不高,因而没有使用价值。
1954到1957年,John Backus带领IBM的一个团队发明了Fortran语言及其编译器。这充分证明了上述的担心都是多余的。尽管如此,Fortran及其编译器的成功背后,也有着巨大的付出,这是因为涉及到翻译编程语言的许多过程在当时不能被理解。
在第一个编译器被发明出来的同时,Noam Chomsky开始了对自然语言的结构的研究。他的研究成果大大简化了编译器的构建,甚至能够支持一部分自动化。Chomsky的研究将语言按照语法复杂度和理解这些语言的算法要求的高低将语言分为4类:0型(type 0)、1型、2型和3型,这就是Chomsky层次性(Chomsky hierarchy)。2型又称上下文无关语法(context-free grammar),是最为有用的一类编程语言,迄今依然被作为编程语言结构的标准代表。对语法分析(parsing)问题的研究在1960到1970年代蓬勃发展,针对此类问题的完整解决方案就是在这一段时间产生的,并成为了今天的编译器理论的一个标准部分。
与上下文无关语法高度相关内容是:有限自动机(finite automata)和正则表达式(regular expressions),与3型语法有关。对这些领域的研究与Chomsky的工作产生于同一个时代,促成了编程语言的单词(word),或称标记(token)结构表达的符号化方法。
更复杂的内容则是生成高效目标代码的方法,这些方法从第一个编译器被发明直到如今都在不断产生。它们经常被错误地称为最优化技术(optimization techniques):其实更应当被叫做代码改进技术(code improvement techniques),因为它们并不产生最优的目标代码,而只是提升代码效率。
在语法分析问题被非常透彻地研究以后,人们为编译器开发的这一部分的自动化做了大量的工作。这些程序最初被称为编译器的编译器(compiler-compilers),但后来它们有了一个更恰当的名称:语法分析程序生成器(parser generators),因为它们只自动化了语法分析部分。这样的程序中,最著名的一个是Yacc,是由Steve Johnson在1975年为Unix系统编写的。对有限自动机的研究使得另一类工具——扫描程序生成器(scanner generator)也被发明出来,最著名的便是Lex。
在1970年代末1980年代初,大量工程致力于将编译器的其它部分的生成自动化,包括代码生成。这些尝试就没有那么多成功案例了,这也许是因为这样的操作天然的复杂性,并且我们并没有把它们完美理解。
20世纪90年代以后,编译器设计具有了更多的进展,这包括针对推理、简化程序包含的信息的复杂算法的应用。在这样的条件下,更复杂的编程语言也被发明出来了。Hindley-Milner类型检查的统一算法被用于函数语言的编译。编译器也与编辑器、链接器、调试器和项目管理器一起,成为了基于窗口的交互开发环境(interactive development environment,IDE)的一部分。不过,编译器设计的基础知识与原理并没有改变很多,它们也自然而然地成为了计算机科学课程的必备核心。
1.2 与编译器有关的程序
解释器(interpreter)也是类似于编译器的一种语言翻译工具。与编译器不同,解释器在读取源程序代码的过程中将代码立即执行,而不是等待目标代码生成完毕再执行。从原理上说,任何一门编程语言可以是编译的也可以是解释的。在有的情况下&#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值