编译原理简明综述笔记

1.1编译相关名词
编译程序:源语言为“高级语言”,目标语言为“低级语言”的翻译程序
宿主机:运行编译程序的计算机
目标机:运行编译程序所产生目标代码的计算机


从功能上分
诊断编译程序(Diagnostic Compiler):专于帮助程序开发和调试的编译程序
优化编译程序(Optimizing Compiler):着重于提高目标代码效率的编译程序
交叉编译程序(Cross Compiler):一个编译程序产生不同于其宿主机的机器代码
可变目标编译程序(Retargetable Compiler):不需重写编译程序中与机器无关的部分就能改变目标机

1.2编译大体过程
高级语言程序的处理过程:
需预处理的源程序——>【预处理程序】——>源程序——>【编译程序】——>目标汇编程序——>【汇编程序】——>可再装配的机器代码——>【装配/连接编辑程序】(可再装配目标文件)——>绝对机器代码
ps:预处理程序的作用:一个源程序有时可能被分成几个模块存放再不同的文件里,将这些源程序汇集在一起的任务

编译程序工作划分:(五阶段)
词法分析,语法分析,语义分析与中间代码生成,代码优化,目标代码生成
(ps:5阶段只是一个典型。
若对优化无要求,可省去优化阶段。
为了加快编译速度,中间代码生成也可以去掉。
一些最简单的编译程序在语法分析的同时产生中间代码。)
1.2.1词法分析
一种线性分析(不可用于识别递归定义的语法成分)

意:从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词。
(比如划分 标识符、保留字、算符、界符等等)
单词符号是语言的基本组成部分
依循:词法规则(构词规则)
描述词法规则的有效工具:正则式和有限自动机


1.2.2语法分析
一种层次结构分析(可用于识别递归定义的语法成分)
(程序结构通常由递归规则表示,语法规则通常用上下文无关文法描述)

意:在词法分析的基础上把单词符号串分解成各类语法单位(如”子句“”程序段“”程序“等)
(语法单位也称语法短语,可表示成语法树)
语法树:

依循:语法规则(描述程序结构的规则)

1.2.3语义分析与中间代码生成
意:对语法分析所识别出的各类语法范畴,分析其含义,并进行初步翻译(产生中间代码)
1.2.3.1语义分析
意:审查源程序中有无语义错误(比如,类型审查等;又如一个float+int,在语法树新增一个”语义分析阶段“将int->float),为代码生成阶段收集类型信息
1.2.3.2中间代码生成
中间代码(又名中间语言,一种内部表示形式):一种结构简单、含义明确的记号系统
这种记号系统可以设计成各种形式,设计原则:1.容易生成;2.容易将它翻译成目标代码
常用中间代码:
    ”四元式“(算符;左操作数;右操作数;结果)
    还有”三元式“”间接三元式“”逆波兰式“”树形“等


1.2.4代码优化
意:对前一阶段产生的中间代码进行加工变换,以期在最后阶段能产生出更为高效(省时间和空间)的目标代码
常用手段:公共子表达式的提取,循环优化,强度削弱,删除无用代码、并行化处理(便于”并行运算“)
依循:等价变换原则


1.2.5目标代码生成
意:把中间代码(或经优化处理之后的代码)变换成特定机器上的低级语言代码。
有赖于硬件系统结构和机器指令含义。涉及硬件系统功能部件的运用,机器指令的选择,各种数据类型变量的存储空间分配,以及寄存器和后援寄存器的调度等。

目标代码的形式
    1.绝对指令代码(可立即执行)
    2.可重定位的指令代码(运行前必须借助于一个连接装配程序把各个目标模块(包括系统提供的库模块)连接在一起,确定程序变量(或常量)在内存中的位置,然后装入内存中指定的起始地址,使之成为一个可以运行的绝对指令代码程序)
    3.汇编代码(需汇编器汇编后运行)。

1.3编译程序的结构
1.3.1编译程序总框架
1.3.1.1. 词法分析器(扫描器)(源程序->单词符号)输入源程序,进行词法分析,输出单词符号
1.3.1.2. 语法分析器(分析器)(单词符号->语法单位)对单词符号进行语法分析(根据语法规则进行推导或归约),识别出各类语法单位,最终判断输入串是否构成语法上的正确”程序“
1.3.1.3. 语义分析与中间代码产生器(语法单位->中间代码)按照语义规则对语法分析器推导出(或归约出)的语法单位进行语义分析,并翻译成一定形式的中间代码(有的是识别语法单位后构造输出一棵语法树,然后根据语法树进行语义分析和中间代码生成)
(ps:扫描器、分析器、中间代码产生器相互穿插,并非截然分开)
1.3.1.4. 优化器 :(中间代码->中间代码)对中间代码进行优化处理
1.3.1.5. 目标代码生成器 :(中间代码->目标代码)把中间代码翻译成目标程序
表格管理 (贯穿五项始终)
出错处理 (贯穿五项始终)

1.3.2表格与表格管理
表格记录:1.源程序的各类信息;2.编译各阶段的进展状况。
(最重要)符号表:登记源程序中出现的每个名字以及名字的各种属性(类型、所占内存大小、地址等)
                (ps:各属性各阶段入表:1.扫描器识别名字->入符号表;2.词义分析时确定类型->入表;3.目标代码生成阶段确认地址->入表)
1.3.3出错处理
依靠:出错处理程序
自动校正错误的代价非常高
绝大多错误前三阶段检测出来
分类:语法错误、语义错误
    语法错误:词法分析或语法分析时检测(”括号不匹配“等)
    语义错误:不符合语义规则的错误,语义分析检测、或运行时检测出来(”说明错误“”作用域错误“”类型不一致“等)
1.3.4遍
因各种限制,将编译程序组织为若干遍(Pass)
”遍“:对源程序的中间结果从头到尾扫描一次,并作有关的加工处理,生成新的中间结果或目标程序
每遍工作由从外存上获得的前一遍的中间结果开始(第一遍,取源程序)完成它所含的有关工作后结果纪录保存于外存。
既可以不同阶段合为一遍,也可一个阶段分为多遍(例:1.为便于处理,语法分析、语义分析、中间代码产生合为一遍2.优化要求高时,优化阶段分若干遍)
一遍中含多阶段时,内之各极端可穿插进行。
遍数的多时,优:整个编译程序的逻辑结构清晰;缺:增加输入输出所消耗的时间
一般情况遍数要求尽可能少一点
1.3.5编译前端和后端
前端:与源语言有关与目标机无关的那部分(词法分析、语法分析、语义分析与中间代码产生)(部分代码优化也可在前端)
后端:与目标机有关的代码优化和目标代码生成等(不依赖于源程序,仅依赖中间语言)
设想:将几种源语言编译成相同的中间语言,然后为不同的前端配上相同的后端->同一台机器生成不同语言的编译程序
Java语言的操作平台无关性:定义一种虚拟机代码--Bytecode,实际使用的操作平台上实现执行Bytecode的Java解释器,即可执行各种Java程序

1.4解释程序和程序设计语言范型
1.4.1解释程序
编译程序:把高级语言程序翻译成某个机器的汇编或二进制代码程序,编译和运行独立分开
解释程序:逐个获取、分析并执行源程序语句(允许执行时修改程序)
解释程序案例:
                BASIC语言解释程序;LISP语言解释程序;
                UNIX命令语言(Shell)解释程序;数据库查询语言SQL解释程序
                Java语言环境中的Bytecode解释程序

内存内容存放问题:
        编译程序:编译阶段:源程序(中间形式)和目标代码,各种表格(如符号表)
                        运行阶段:目标代码和数据,表格可有可无
        翻译程序:源程序、符号表等始终存放于主存储区(允许在执行用户程序时修改用户程序)(存放格式要设计易于使用和修改)

程序解释速度十分慢,空间开销也比较大

某些语言既有编译程序也有解释程序:BASIC、LISP、Pascal等(Java在运行环境的Java虚拟机同时拥有“解释程序”“即时编译程序”)

1.4.2程序设计语言范型
(ps :高级语言常识:FORTRON多用于数值计算;COBOL多用于事务处理;LISP用于人工智能;PROLOG用于自然语言处理;C用于书写系统程序;Ada用于大型嵌入式实时处理程序
1.4.2.1强制(命令)式语言(imperative language)
又称面向过程式语言,面向于动作
由一系列的语句组成,顺序执行

1.4.2.2函数式语言(functional language)
注重程序表示的功能
执行一个个函数施用在数据上的变换,最终得到结果

1.4.2.3基于规则(逻辑)的语言
检查一定的使能条件,当它满足时,则执行适当动作

1.4.2.4面向对象语言
提供抽象数据类型,支持封装型、继承型、多态型

1.5编译程序的生成
    三法:
    1.移植
        即利用A机器上已有的高级语言L编写一个能够在B机器上运行的高级语言L的编译程序
        步骤:
            1.用L编写在A上运行的 产生B机器代码的 L编译程序源程序
            2.把该程序经过A上的L编译程序编译
            3.用这个编译程序再一次编译步骤1的源程序->能在B上运行的能产生B机器代码的编译程序
    2.自编译
        对语言的核心部分构造一个小的编译程序(可用低级语言实现),再以它为工具构造一个能够编译更多语言成分的较大的编译程序。不断滚雪球,最后形成所期望的整个编译程序。
    3.编译工具

要在某一台机器上为某种语言构造一个编译程序,必须掌握的三大内容
    1.源语言,对被编译的源语言,深刻理解其结构(语法)和含义(语义)
    2.目标语言,比如机器语言,必须知晓硬件的系统结构和操作系统的功能
    3.编译方法,多种
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值