一,语言处理器
1)一个集成的软件开发环境,其中包括很多种类的语言处理器,比如编译器、解释器、汇编器、连接器、加载器、调试器以及程序概要提取工具。
2)编译器:把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快; 包括编译器,反编译器,交叉编译器
3)解释器:能够执行用其他计算机语言编写的程序的系统软件,它是一种翻译程序。它的执行方式是一边翻译一边执行,因此其执行效率一般偏低,但是解释器的实现较为简单,而且编写源程序的高级语言可以使用更加灵活和富于表现力的语法
编译器产生的机器语言目标程序,比解释器快很多。解释器的错误诊断通常比编译器更好。
4)汇编器:是将汇编语言翻译为机器语言的程序。一般而言,汇编生成的是目标代码,需要经链接器(Linker)生成可执行代码才可以执行
5)连接器:链接函数和全局变量,所以,我们可以使用编译器生成的中间目标文件(O文件或是OBJ文 件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给 中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件
6)加载器:把所有可执行目标文件放到内存中执行
7)调试器:工作原理是基于中央处理器的异常机制,并由操作系统的异常分发\事件分发的子系统(或模块)负责将其封装处理后,以比较友好的方式与调试器进行实时交互
二,一个编译器的结构
1)编译器能把源程序映射为在语义上等价的目标程序。此映射过程由两部分组成:分析部分和综合部分
2)分析部分(编译器前端):把源程序分解成多个组成要素,并在这些要素之上加上语法结构,然后它使用这个结构来创建该源程序的一个中间表示。如果检查出源程序语法或语义有误,则提供有用信息告知用户。分析部分还手机有关源程序的信息,并把信息放到一个称为符号表的数据结构中。
3)综合部分(编译器后端):根据中间部分和符号表中的信息来构造用户期待的目标程序。
4)词法分析:词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。词法分析程序实现这个任务。词法分析程序可以使用Lex等工具自动生成。
5)语法分析:语法分析是编译过程的一个逻辑阶段。语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确。源程序的结构由上下文无关文法描述。
6)语义分析:语义分析是编译过程的一个逻辑阶段. 语义分析的任务是对结构上正确的源程序进行上下文有关性质的审查。例如重要的是进行类型审查,数组下标必须是整数,
例如一个C程序片断:
int arr[2],b;
b = arr * 10;
源程序的结构是正确的.
语义分析将审查类型并报告错误:不能在表达式中使用一个数组变量,赋值语句的右端和左端的类型不匹配。
7)中间代码生成:在进行了语法分析和语义分析阶段的工作之后,有的编译程序将源程序变成一种内部表示形式,这种内部表示形式叫做中间语言或中间表示或中间代码。所谓“中间代码”是一种结构简单、含义明确的记号系统,这种记号系统复杂性介于源程序语言和机器语言之间,容易将它翻译成目标代码。另外,还可以在中间代码一级进行与机器无关的优化。产生中间代码的过程叫中间代码生成。
8)代码优化:程序代码进行等价(指不改变程序的运行结果)变换。程序代码可以是中间代码(如四元式代码),也可以是目标代码。等价的含义是使得变换后的代码运行结果与变换前代码运行结果相同。优化的含义是最终生成的目标代码短(运行时间更短、占用空间更小),时空效率优化。原则上,优化可以再编译的各个阶段进行,但最主要的一类是对中间代码进行优化,这类优化不依赖于具体的计算机。
9)代码生成:代码生成器,以源程序的中间代码表示作为输入,并把它映射到目标语言。如果目标语言为机器语言,则必须为程序使用的每个变量指明寄存器或内存位置,然后中间指令翻译成能完成相同任务的机器指令序列。代码生成的至关重要的方面是合理分配寄存器
10)符号表管理:
在编译过程中,编译程序用来记录源程序中各种名字的特性信息, 所以也称为名字特性表。
名 字: 程序名、过程名、函数名、用户定义类型名、变量名、常量名、枚举值名、标号名等。
特性信息: 上述名字的种类、类型、维数、参数个数、数值及目标地址(存储单元地址)等。
填表:当分析到程序中的说明或定义语句时,应将说明或定义的名字,以及与之有关的信息填入符号表中。
例:Procedure P( )
查表:(1) 填表前查表,检查在程序的同一作用域内名字是否重复定义;
(2) 检查名字的种类是否与说明一致;
(3) 对于强类型语言,要检查表达式中各变量的类型是否一致;
(4) 生成目标指令时,要取得所需要的地址。
三,编译技术的应用
1)编译时间也是运行开销的一部分,一个常用的技术就是只编译和优化那些经常运行的程序片段。
2)针对计算机体系结构的优化:并行(指令并行,多个运算并行,在处理器层次:同一应用的不同线程并行)
内存层次结构(内存由几层不同速度和大小的存储器组成,离处理器最近的层速度最快但是容量小)
3)新计算机体系结构的设计
RISC(Reduced Instruction-Set Computer)精简指令系统
CISC(Complex Instruction-Set Computer)复杂指令系统:使汇编程序更容易
ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特点。适用于多种领域,比如嵌入控制、消费/教育类多媒体、DSP和移动式应用等
X86 Intel首先开发制造的一种微处理器体系结构的泛称
四,程序设计语言基础
1)环境:名字和内存位置(变量)的映射
状态:内存位置到它们的值得映射 C中成把左值映射为右值
2)标识符:一个字符串,指向一个实体(数据对象、过程、类、类型)。所有标识符都是名字,但并不是所有名字都是标识符比如 x.y 表示x结构中y字段
变量:指向存储中的某个特定的位置
3)声明:int a 定义:a=2;
4)动态作用域:一个作用域依赖于一个或多个只有在程序执行时刻才能知道的因素,他就是动态的
5)参数传递机制:1>值调用 传递指针或数组会改变原来 值
2>引用调用 实在参数的地址 作为形参。被调用的代码中沿着指针找到调用者指明的内存位置,改变形参就像改变实在参数
3>名调用 弃用