1.编译简介
编译器:
源程序——【编译器】-(错误信息)——目标程序
一种语言的处理系统:
源程序梗概——【预处理器】——源程序——【编译器】——目标汇编程序——【汇编器】——可充定位机器代码——【装载器/链接—编辑器】+(库、可重定位目标程序)——绝对机器代码
源程序分析:过程分三阶段;
第一阶段:线性分析(词法分析||扫描);
第二阶段:层次分析(语法分析);
程序的层次结构通常通过【递归规则】来表达:
*任何一个标识符、任何一个数、或者混合搭配的 都是表达式
第三阶段:语义分析;
作用:语义错误;类型检查;
在机器内部,相同数值整数和实数是两种不同的二进制表示形式;
文本格式器的分析:
文本格式器输入的内容(水平排列),字符和词分组成为盒子,没有“空白”(空格|换行)
隔开的连续字符串被识别为一个词。
水平排列、垂直排列、平方(sub上标 sup下标),盒子大小和位置需要由EQN文本语法结构来确定。
编辑器的各个阶段(逻辑组织):
符号表管理:快速找到每个标识符的记录。
标识符属性包括:存储位置、类型、作用域等信息。
错误检测与报告:
发现错误后,必须以恰当的方式及进行处理,使得编译器继续运行,以检测出源程序中更多的错误。
发现错误立即停止运行的编辑器不是一个好的编辑器!
各分析阶段:
1.词法分析器:读入源程序的字符,并将这些字符分组形成记号流,每个记号流表示一个逻辑上相关的字符序列。形成有个记号的字符序列成为该记号的词素。
2.语法分析器,在记号流上建立一个层次结构(典型:语法树);每个数据树内街店是一个记录,每个记录具有三个域,一个存储操作符,另外两个域存储指左、右子节点的指针。
3.语义分析器
中间代码生成(表示):
重要性质:1.易于产生;2.易于翻译成目标程序;
有多种形式:例如:“三地址码”,由指令序列组成,每个指令最多有三个操作符:temp1...;temp2...;temo3...;
代码优化:该阶段视图改进中间代码,以产生执行速度较快的机器代码,有些编译器就几乎没有进行代码优化。能够很大程度优化的编译器称为“优化编译器”。
代码生成:编译最后阶段目标代码生成,生成课重定位的机器代码或汇编代码,编译器为源程序定义和使用的变量选择储存单元,并把中间指令翻译成完成相同任务的机器代码指令序列,关键问题————寄存器分配。
编译器的伙伴:
编译器的输入可能由一个或者多个预处理器产生,编译器的输出也可能进一步加工处理才能成为可执行的机器代码。
预处理器:预处理器产生编译器的输入,一般具有一下功能:
1.宏处理(宏:经常使用的较长的机构的缩写);2.文件包含(把文件包含在程序正文中);3.“理性”预处理器(现代没有的控制结构【没有while...if】理性预存理器可用内部宏定义的向用户提供这类【比计较老式语言】控制结构);4.语言扩充(增强语言的能力);
宏处理器处理两种类型的语句:1.宏定义(唯一字符||关键字来识别);2.宏引用
汇编器:
某些编译器产生汇编代码,汇编代码需要交个汇编器来处理;也有些编译器能完成汇编器工作,产生可重定位的机器代码,交给装配器||链接器处理。
汇编代码是机器代码的容易记忆的形式,汇编代码使用名称而不是二进制代码来操作,存储地址也用名称表示。
两遍汇编:
第一遍扫描:存储单元中的所有表示符都被识别出来并存入符号表(汇编器符号表和编译器的符号表分开你);【识别出表示内存位置的表示符并为他们分配存储地址】
第二遍扫描:将每个操作符翻译成机器语言中代表相应操作的二进制位序列,将代表存储单元的每个标识符翻译成符号哦表中的该标识符的地址。【用地址代替标识符】
装配器和链接编辑器:
通常,装配器完成程序的装入和链接编辑两项功能;
编译器各阶段的分组:
前端与后端 两大阶段;
前端,包括依赖于源语言并在很大程度上独立于目标机器的某些阶段的某些部分;
后端,包括编译器中依赖于目标机器的阶段的某些部分;依赖于中间语言;
编译器的遍,编译的若干阶段通常是以一遍来实现的,每遍读一次输入文件,产生一个输出文件。
减少编译的变数,预留空白位置,使用“回填”技术。
编译器的构造工具:
分析器生成器、扫描器生成器、语法制导翻译引擎,数据流引擎、自动代码生成器..
所有语言的词法分析器除了对特殊的关键词和字符号的识别以外基本都一样;
2.简单的一遍编译器:
Page33
纯属个人观点,仅供参考!