陈火旺:程序设计语言编译原理
Ch1:
编译程序--把源语言转换成目标语言
源语言,高级语言,C/C++等;目标语言,低级语言,ASM等.
编译与解释.
编译程序的分类. 宿主机,目标机
交叉编译程序: 产生不同于其宿主机的机器代码.
可变目标编译程序
编译过程 通常步奏:
1.识别出每个单词 --词法分析
2.分析句子的语法结构 --语法分析
3.根据句子的含义进行初步翻译 --语义分析与中间代码生成
4.对译文进行修饰 --优化
5.写出最后的译文 --目标代码生成
编译程序的结构 词法分析器:扫描器,输入源程序,进行词法分析,输出单词符号
语法分析器:分析器,对单词符号串进行语法分析,识别出各类语法单位,最终判断输入串是否构成语法上正确的"程序".
语义分析与中间代码生成器:按照语义规则把语法分析器推导出来的语法单位进行语义分析并把它们翻译成一定形式的中间代码.有的编译器在识别出各种语法单位后,会构造出1棵语法树,然后根据语法树来分析语义.
优化器:
目标代码生成器:
除了以上5个模块外,还有表格管理和出错处理.
表格管理:
编译程序在工作过程中会创建一系列表格,登记源程序各类信息和进展状态. 表格中最重要的是符号表.扫描器识别出1个名字时,会把该名字填入符号表.但这是不能完全确定该名字的属性,要在后续各阶段填入.
出错处理
1个好的编译程序,要能最大限度地识别出源程序中的错误.自动矫正错误那就更好,但代价很高.
"遍" 具体实现时,往往将编译程序分成若干遍.
"遍"就是从头到尾扫描一遍.一个编译程序分成几遍,难以统一认定.遍数多,编译程序逻辑结构会更清晰,但耗时久.一般还是遍数少点好.
编译前端&编译后端
编译前端:与源程序有关但与目标机无关的部分.包括词法分析,语法分析,语义分析与中间代码生成,有时候还有代码优化.
编译后端:与目标机有关的部分.与目标机有关的代码优化和目标代码生成.不依赖于源语言,只依赖于中间语言.
为了实现编译程序可以改变目标机,通常需要一种定义良好的中间语言支持.比如Java环境下的字节码--Bytecode
编译程序与程序设计环境
程序设计环境包括编译器,连接器,编辑器,调试器等一整套工具.
在一台机器上为某种语言构造一个编译程序,需要掌握:
1.
源语言.要深刻理解其语法结构和语义.
2.
目标语言.通常是机器语言,就要充分掌握硬件的系统结构和操作系统的功能
3.
编译方法.把一种语言程序翻译成另一种语言程序方法很多,需要准确掌握一二.
任何程序都是字母表上的有限序列.
什么样的字符串才算是一个合适的程序呢
单词符号:语言中具有独立意义的最基本结构.单词符号由词法规则定义.
词法规则:是指单词符号的形成规则,即
规定了字母表中什么样的字符串是一个单词符号.
语法规则:是指语法单位的形成规则,即
规定了如何从单词符号形成更大的结构--语法单位.
对一个语言,不仅要给出词法,语法规则,还要定义词法单位,语法单位的含义.
语义规则:
定义一个程序的意义. 阐明语义比阐明语法难得多. 目前大多数编译系统采用一种接近形式化的系统,基于属性文法的语法指导翻译方法.
一个程序一般包括:
程序--子程序--语句--数据引用,运算符,函数调用
高级语言的一般特性
强制式语言(过程式语言),特点是命令驱动,面向语句. C, Fortran, Pascal
函数式语言,更注重程序表达的功能,而不是一个语句接着一个语句的执行. LISP
基于规则的语言 LISP
面向对象语言 C++ JAVA
* 鉴于本人基础薄弱(非CS科班出身,没学过编译原理),精力有限。停止对编译原理理论知识的学习,转向PLY,Bison, Flex的学习。
阅读(1699) | 评论(2) | 转发(0) |