编译原理读书笔记

来源:互联网 发布:二手车交易平台源码 编辑:程序博客网 时间:2024/04/30 11:16

编辑器的前驱和后继

源程序可能被分成模块存储在不同的文件中。把存储在不同文件中的程序模块集成为一个完整的源程序这个任务由预处理器完成。

预处理器也能够把源程序中成为宏的缩写语句展开为原始语句加入到源程序中。

预处理器
产生编译器的输入
1.宏处理 预处理允许用户在源程序中定义宏。宏是经常被使用的较长结构的缩写
2.文件包含 预编译器把头文件包含到程序正文中
3“理性预处理”吧现代流合数据结构化机制添加到比较老式的语言中。
例如某一种语言没有while和if这样的控制结构,理性预处理可以用内部宏定义向用户提供这类控制结构
4语言填充 通过大量的内部宏定义类增强语言的能力

宏处理器
处理两种类型的语句:宏定义和宏引用。
宏定义由具有唯一性的字符或者关键字来标识,如define 或 macro

汇编器
汇编代码是机器代码的容易记忆的形式,使用名称而不是二进制代码来标识操作

最简单地汇编器对输入汇编程序文件进行两遍扫描,每遍读输入文件一次。
在第一遍扫描中,标识存储单元的所有标识符都被识别出来并存入符号表
一个标示符的存储单元是在它第一次被遇到时分配的。
在第二遍扫描中,汇编器再一次从头扫描输入文件。它将每个操作符翻译成机器语言中代表相应操作的二进制位序列,将代表存储单元的每个标识符翻译成符号表中该标识符的地址
第二遍扫描输出的时刻重定位的机器代码,可重定位指的是装入的其实地址可以使任意的内存单元L,也就说,如果将L加到代码的所有地址上,整个程序对所有存储地址的存储引用都正确。

装配器和连接编辑器
装配器完成程序的装入和连接编辑两项功能。
装入过程包括读入可重定位机器代码,修改课重定位地址,并将修改后的指令和数据放到内存中适当位置
链接编辑器允许我们将多个可重定位机器代码的文件组装成一个程序。这些课重定位机器代码的文件可以使多次编译的结果,其中一个或多个可能是库程序文件
库程序文件是由系统提供的,可以被任何程序使用

如果这些课重定位机器代码的文件以某种有用的方式组合在一起使用,则就可能出现外部引用,即一个文件中的代码引用另一个文件中的存储单元。可重定位的机器代码文件必须把每个外部引用的数据单元或者指令标号的信息都存在符号表中。由于实现不知道哪些信息将被外部引用,所以,世上必须将汇编器的整个符号表作为课重定位机器代码的一部分

编译器的若干个阶段通常是以一遍来实现的,每遍赌一次输入文件,产生一个输出文件。


编译步骤

将高级语言转换成低级语言

  1. 词法分析
    定义符(for to) 标识符(变量 k) 分界符()= 运算符(+ *) 常数
  2. 语法分析
    变量 常数 运算结果都是表达式
    赋值语句 常量:=表达式
    多个赋值语句构成语句块
    表达式可作为循环的初值和终值
    简单数值变量可作为循环的控制变量
  3. 中间代码生成
    块嵌套不可交叉,块嵌套控制变量不可重名

    四元式 ( op _ _ 结果)

  4. 代码优化
  5. 目标代码生成
    将中间代码变换成特定机器上得低级代码

编译和链接

编译:
将代码源文件编译成中间文件,windows:obj UNIX:o

由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,对于编译很不方便,所以给中间目标文件打包,

windows下叫 库文件 Library File .lib
UNIX Archive File .a

编译时 编译器只检测程序语法 和 函数 变量是否被声明
如果函数未被声明,编译器会给出一个警告,但可以生成object file

而在链接程序时,连接器会在所有的object file中找寻函数的实现,如果找不到,就会报链接错误


有限自动机(DFA)

一个有限自动机(DFA)M是一个五元式 M = {S,Σ,δ,s0,F}
1. S是一个有限集,它的每个元素称为一个状态
2. 是一个有穷字母表,它的每个元素称为一个输入字符
3. 是一个从S*Σ至S的单值部分映射,δ(s,a)=s’意味着:当先行状态为S,输入字符位a时,将转换到下一状态s’。我们称s’为s的一个后继状态
4. s0属于S是唯一的初态
5. F是S的一个子集合是一个终态集(可空)

0 0
原创粉丝点击