编译原理学习(一)--编译以及编译过程

 

【龙书】编译原理(第二版)学习与理解:

1.也许我们这辈子都不会去实现一个编译器,但是我们至少要知道编译器是什么?为什么会需要编译器?

 ①编译器首先也是一种电脑程序。它会将用某种编程语言写成的源代码(原始语言),转换成另一种编程语言(目标语言)。

②高级计算机语言便于人编写,阅读,维护。低阶机器语言是计算机能直接解读、运行的。编译器主要的目的是将便于人编写,阅读,维护的高级计算机语言所写作的源代码,翻译为计算机能解读、运行的低阶机器语言的程序。编译器将原始程序(Source program)作为输入,翻译产生使用目标语言(Target language)的等价程序。源代码一般为高阶语言 (High-level language), 如 Pascal、C、C++、C# 、Java 等,而目标语言则是汇编语言或目标机器的目标代码(Object code),有时也称作机器代码(Machine code)。

 

2.编译器的各步骤

 

一开始看比较容易被各种词法,语法等弄得头大。其实计算机的所谓语法,类比一下自然语言,无非也一样是语言的结构方式。包括词的构成和变化﹐词组和句子的组织。无外乎主谓宾这样的一些规则或者结构来表达一个意思。为了后续学习的顺利性,这里有必要先把各种术语搞清楚。

1.词法分析

            编译器的第一个步骤称为词法分析或扫描。词法分析器读入组成源程序的字符流,并将其组成有意义的词素的序列。形如<token-name, attribute-value>这样的词法单元。(token-name是由语法分析使用的抽象符号,attribute-value是指向符号表中关于这个词法单元的条目,符号表条目的信息会被语义分析和代码生成步骤使用)

例如源程序包含如下赋值语句:position = initial + rate * 60

对其进行词法分析:

抽象符号

词素

标识符 idposition
赋值运算符 ==
标识符 idinitial
加法运算符 ++
标识符 idrate
乘法运算符 **
整数 6060
空格(分析器直接忽略)

经过词法分析之后,赋值语句的词法单元序列:<id, 1>  < = > <id, 2> < + > <id, 3> < * > <60>

 

图1-1 一个赋值语句的翻译

①.语法是语言学的一个分支,研究按确定用法来运用的词类、词的屈折变化或表示相互关系的其他手段以及词在句中的功能和关系。包含词的构词、构形的规则和组词成句的规则。

举个例子:我是人;他学习汉语;你爬山...........这样的句子有千千万万。那么人们会总结出来:主语+谓语+宾语 这样的语法规则来。

由于计算机的特殊性,因此计算机的语法逻辑性更强,更注重算术和表达式等。所以就没有那么简单的“主谓宾”,我们看的更多的可能类似 x = y + 1,等;

 

②.文法:自然语言汉语中的意思1.法制;法规。 2.文章的作法。 3.语法。语言的结构方式。包括词的构成和变化﹐词组和句子的组织。文法即文章的书写法规,一般用来指以文字、词语、短句、句子的编排而组成的完整语句和文章的合理性组织。

文法即语言中的每个句子可以用严格定义的规则来构造.

2.语法分析

           编译的第2个步骤称为语法分析或解析。语法分析器使用由词法分析器生成的各词法单元的第一个分量来创建树形的中间表示。该中间表示给出了词法分析产生的词法单元的语法结构。常用的表示方法是语法树,树中每个内部节点表示一个运算,而该节点的子节点表示运算的分量。

以上赋值语句表示成语法树:

3.语义分析

(数据的含义就是语义。简单的说,数据就是符号。数据本身没有任何意义,只有被赋予含义的数据才能够被使用,这时候数据就转化为了信息,而数据的含义就是语义)          

           语义分析器使用语法树和符号表中的信息来检查源程序是否和语言定义的语义一致 。它同时收集类型信息,并存放在语法树或符号表中,以便在中间代码生成过程使用。

语义分析的一个重要部分就是类型检查。比如很多语言要求数组下标必须为整数,如果使用浮点数作为下标,编译器就必须报错。再比如,很多语言允许某些类型转换,称为自动类型转换。

           图1-1中显示了一个这样的自动类型转换,假设position,initial和rate已经被声明为浮点型,而词素60是一个整数。语义分析器输出中有一个inttofloat的额外节点,明确的把60转换为一个浮点数。

 

4.中间代码生成

          在源程序翻译成目标代码的过程中,一个编译器可能构造出一个或多个中间表示。这些中间表示可以有多种形式。语法树是一种中间表示形式,它们通常在语法分析和语义分析中使用。

           在源程序的语法分析和语义分析完成之后(也会生成中间表示,区别语法树),很多编译器生成一个明确的低级的或类机器语言的中间表示。该中间表示有两个重要的性质:1.易于生成;2.能够轻松地翻译为目标机器上的语言。

 

5.代码优化

          代码优化试图改进中间代码,以便生成更好的目标代码。即更快(省时),更短(省空间)或能耗更低。

 

6.代码生成

           代码生成以中间表示形式作为输入,并把它映射为目标语言。如果目标语言是机器代码,则必须为每个变量选择寄存器或内存位置,中间指令则被翻译为能够完成相同任务的机器指令序列。

            代码生成的一个至关重要的方面是合理分配寄存器以存放变量的值。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值