编辑: You—灰機 2019-07-04

60 1.2 编译器结构 语法分析把词法记号流依照语言的语法结构按层次分组,以形成语法短语.实例: position = initial + rate *

60 的语法分析树 * 1.2 编译器结构 语法分析表达式、语句等程序层次结构通常由递归的规则表示实例:表达式任何一个标识符都是表达式;

任何一个数都是表达式;

如果e1和e2都是表达式,那么e1+ e

2、e1* e

2、(e1)、(e2)也都是表达式. * 1.2 编译器结构 语法分析表达式、语句等程序层次结构通常由递归的规则表示实例:语句如果identifier是标识符,expression是表达式,那么 identifier := expression是语句.如果 expression 是表达式,statement是语句,那么 while (expression) do statement if (expression) then statement 也都是语句. * 1.2 编译器结构 语法分析把词法记号流依照语言的语法结构按层次分组,以形成语法短语.实例:position = initial + rate *

60 的语法树 * 1.2 编译器结构 语义分析检查程序的语义正确性,以保证程序各部分能有意义地结合在一起,为后面代码生成阶段收集类型信息.类型转换类型检查语法制导翻译 real型*1.2 编译器结构 中间代码生成中间代码位于高级编程语言和机器语言(目标程序)之间后缀表示: 9+5-2 ? 95+2-抽象语法树: 三地址码 * 1.2 编译器结构 代码优化改进代码,以产生执行较快的机器代码. * 1.2 编译器结构 目标代码生成生成可重定位的机器代码或汇编码为源程序所用的每个变量选择存储单元,并且把中间代码翻译成等价的机器指令序列.关键问题是寄存器分配. * 1.2 编译器结构 符号表管理编译器的一项重要工作是记录源程序中使用的标识符,并收集每个标识符的各种属性.这些属性提供标识符的存储分配、类型和作用域信息.如果是过程标识符,还有参数的个数和类型、参数传递方式和返回值类型.符号表是为每个标识符保存一个记录的数据结构,记录的域是标识符的属性.该数据结构允许我们迅速地找到一个标识符的记录,在此记录中存储和读取数据. * 1.2 编译器结构 符号表管理实例 语句 position = initial + rate * 60词法分析器发现源程序的标识符时,把该标识符填入符号表.但是,词法分析期间不能确定一个标识符的属性.例如:其余的阶段把标识符的信息填入符号表,然后以不同的方式使用这些信息 * 1.2 编译器结构 出错管理每个阶段都可能发现源程序的错误.发现错误后,该阶段必须处理此错误,使得编译可以继续进行,以便进一步发现源程序的其他错误.词法分析:当前被扫描的字符串不能形成语言的词法记号.语法分析:记号流违反语言的语法规则.语义分析:编译器试图找出语法正确但对所含的操作来说是无意义的结构,如相加的两个标识符,其一是数组名,另一个是过程名. * 1.3 编译系统 除了编译器外,还需要一些其他工具的帮助,才能得到可执行的目标程序,这些工具包括预处理器、汇编器和连接器等C语言的编译系统Java语言的编译系统 * 1.3 编译系统 C语言的编译系统一个语言处理系统:图1.5设有两个文件main.cswap.cgccCvCo swap main.c swap.c-v 可以输出该编译系统各步骤执行的命令和执行结果-o 指示生成的可执行文件的名字 * 1.3 编译系统 C语言的编译系统预处理器实现文件包含#include 实现宏展开#define pi 3.1415926条件编译#if 、#ifdef * 1.3 编译系统 C语言的编译系统汇编器:对输入进行两遍扫描第一遍,汇编器扫描输入,将表示存储单元的所有标识符都存入符号表,并分配地址.第二遍,汇编器再次扫描输入,把每个操作码翻译成机器语言中代表那个操作的位串,并把代表存储单元的每个标识符翻译成符号表中为这个标识符分配的地址.gcc CS main.cas Co main.o main.s * 1.3 编译系统 C语言的编译系统连接器:收集、组织程序所需的不同代码和数据静态连接器:将多个可重定位目标文件组成一个可执行目标文件(也可以组成一个可重定位目标文件)动态连接器:支持在内存中的可执行程序在执行时与共享目标文件进行动态的连接. * 1.3 编译系统 Java语言的编译系统一般的高级语言程序如果要在不同的平台上运行,至少需要编译成不同的目标代码.Java虚拟机技术是实现Java平台无关性特点的关键.Java虚拟机语言(简称JVML)JVML程序只需要与虚拟机交互,不需要关心底层的硬件和操作系统. * 1.3 编译系统 Java语言的编译系统 * 1.4 程序设计语言发展历程(1.3) 程序设计语言发展历程机器语言(第一代): 20世纪40年代汇编语言(第二代) :20世纪50年代早期高级语言 :20世纪50年代晚期+通用(第三代): Fortran、Cobol、C、C++、C#、Java专用(第四代):SQL、Postscript逻辑(第五代):Prolog、LISP * 1.4 程序设计语言发展历程 C语言的产生The Development of the C Language:C history C Written by Dennis RitchieBCPL ? B语言 ? New B语言 ? C语言 Ken Thompson (left) with Dennis Ritchie DEC PDP-7, as used for initial work on C and Unix * 1.4 程序设计语言发展历程 第一届(1966年)图灵奖得主:Alan J.Perlis贡献领域:高级程序设计技巧,编译器构造 * 1.4 程序设计语言发展历程 1983年图灵奖得主:Ken Thompson, Dennis Ritchie贡献领域:C语言和Unix操作系统 * 1.4 程序设计语言发展历程 2006年图灵奖得主:Frances E. Allen贡献领域:优化编译器 * 1.4 程序设计语言发展历程 编译性语言、解释性语言和脚本语言高级语言翻译成机器语言,计算机才能执行高级语言编写的程序.翻译有两种方式编译:一次性编译成机器语言文件,不用重新编译,效率高解释:每个语句都是执行的时候才翻译,每执行一次就翻译一次,效率比较低脚本语言一种解释性语言:JavaScript,ASP,PHP,PERLJava语言既要编译,又要解释;

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题