编译器产生的机器语言目标程序一般比解释器快不少,代码的优化效果也比解释器好。可是利用解释器逐句执行的特色,解释器更容易进行错误诊断,与用户的交互效果也比编译器好。前端
一个编译器能够分为前端和后端,前端包括词法分析,语法分析,语义分析,中间代码生成。后端包括中间代码优化,代码生成,机器相关代码优化等。sql
2.1词法分析数据库
输入:源程序字符流 输出:词法单元和符号表信息
词法分析读入组成源程序的字符流,并将它们组织成有意义的词素序列。对于每一个词素,词法分析其产生词法单元做为输出。<token-name,attribute-value>其中token-name是有语法分析步骤使用的抽象符号,attribute-value指向符号表中关于这个词法单元的条目。后端
2.2语法分析函数
输入:词法单元和符号表 输出:语法树
语法分析器利用token来产生语法树。以后会讲到利用上下文无关文法来设计语言,而且检测某次输入是否符合语法规范。工具
2.3语义分析布局
输入:语法树和符号表 输出:通过类型检查和自动类型转换的语法树
语义分析器:使用语法树和符号表中的信息来检查源程序是否和语言定义的语义一致。学习
2.4中间代码生成优化
输入:具与正确语义的语法树和符号表 输出:三地址代码
三地址代码知足几点规范:右部最多只有一个运算符,运算份量小于或等于三个。spa
2.5代码优化
与机器无关代码优化:优化中间代码 与机器有关代码优化:优化机器码
2.6代码生成
输入:通过优化的三地址代码 输出:机器码(目标语言)
针对地算计体系结构的优化:
并行性:指令集并行和多处理器并行,前者经过流水线等技术将多条指令同时执行以加快程序的执行速度,后者经过在多处理器机器中分发计算任务加快程序的执行速度 内存层次结构:现代计算系统都是由几层不一样速度和大小的存储器构成的,利用编译器能够改变数据的布局或数据访问代码顺序来提升内存层次结构的效率。
综上就是经过编译技术加快程序的执行速度。
程序翻译
二进制翻译:不一样平台间机器代码的转换 硬件合成:实现高级硬件描述语言 数据查询解释器:将sql等数据库查询语言编译为可执行代码 编译而后模拟:....?
软件生产率工具:利用编译技术制做类型检查,边界检查,内存管理工具等。
4.1环境与状态
环境其实就是名字到存储位置的映射,一个相同的名字,在不一样的环境下的指向不一样的存储区域。
状态就是位置到值的映射,在程序运行过程当中,一个位置不可能老是相同的值,有可能由于数据的删除和更新致使相同位置的值发生改变。
4.2静态做用域和块结构
静态做用域:一种在词法分析阶段就能够判断出来的做用域类型,一个声明的做用域由该声明在程序中出现的位置来肯定,静态做用域与块结构密切相关。每一个块结构都有本身的做用域,块结构的相互嵌套构成了一个程序的静态做用域。
4.2.1名字,标识符和变量
名字:表明一个内存位置的符号 变量:名字在运行时刻所指的内存位置。 标识符:指向一个实体,好比数据对象,过程,类,全部标识符都是名字,可是不是全部名字都是标识符,好比x.y就是名字不是标识符,由于它是复合的,标识符知识但单一的整个实体。
4.2.2过程,函数和方法
函数:是指能够有返回值的一段在一块儿的、能够作某一件事儿的程序 过程:没有返回值的函数 方法:仅限于面向对象的程序设计语言,存在于对象中的函数属性。
4.2.3声明和定义
声明:说明事物的类型,好比int a 定义:给事物赋值,好比a=1
4.3动态做用域
动态做用域一般指一下策略:对一个名字x的使用指向的是最近被调用(从函数栈顶端往下的的第一个)但尚未终止声明了x的过程当中的这个声明。 例子:
var a = 2 function foo(){ console.log(a); } function bar(){ var a=3 foo(); } bar(); //静态输出2 //动态输出3
4.4参数传递机制
4.5别名
别名指两个变量表明同一个数据对象、过程或者类。能够是变量a与b指向同一块地址,能够是变量a与b指向不一样的地址,可是这个地址都保存同一个的对象的引用。