编译原理 chapter01 编译程序

一.编译程序:简而意之就是把一门语言转化为另一门语言(如java语言转化为机器语言);
二.机器语言:就是由0和1组成的一长串数据,能被机器识别且不需要经过编译,可以直接执行;
汇编语言:就是通过一些助记符来标识这些机器指令,如add标识相加功能;都需要通过编译程序编译成机器语言)
高级程序设计语言:为了更符合人们的生活习惯;(都需要通过编译程序编译成机器语言)
三.程序设计语言的原理:分为两个部分,第一部分为前端,后一部分为后端;
①.第一部分主要是做源代码进,语法树出,前端主要是分析,用于分析源代码结构是否正确,比如英语翻译成汉语,即主要是识别英语的语法结构;
②第二部分主要是语法树进,目标代码出,后端主要是生成中间代码和目标代码,根据语法树生成中间代码和目标代码;
编译原理 chapter01 编译程序
三.前端的主要工作:
①词法分析器: 通过把源代码拆解成一个个的单词(token),然后通过正则表达式和有限状态自动机来判断是否正确
编译原理 chapter01 编译程序
② 语法分析器:利用上方得到的token把它做成语法树,通过上下文无关法判断是否符合语法,主要有两类:自顶向下以及自底向上产生语法树。
编译原理 chapter01 编译程序
③查看是否符合语义
编译原理 chapter01 编译程序
四.后端:
①:生成中间代码,为什么要生成中间代码?而不直接生成目标代码?
因为是为了统一标准,减少翻译量,比如源代码有x种,目标代码有y种,如果不生成中间代码,直接生成目标代码这样就有进行x*y次翻译,而生成了中间代码就只需要进行x+y种方法
编译原理 chapter01 编译程序
②:目标代码,因为CPU的指令和寄存器都是有限的,所以要保证生成目标代码而不会改变其语法、语义,优化代码也要注意。编译原理 chapter01 编译程序
五.列子:通过C语言代码如何一步步生成目标代码:
编译原理 chapter01 编译程序
编译原理 chapter01 编译程序
解答:首先通过词法分析器把C代码分解成一个个token,然后再通过语法分析器把这些token生成语法树,语法正确了还要分析其语义是否正确,然后再通过优化代码等等生成中间代码以及目标代码。
①下面是一个个token,左括号和右括号分别是一个token,引号内部包括引号是一个token;
编译原理 chapter01 编译程序
②词法分析以及语法、语义分析
此法即判断是否代码是否正确,语法即判断运算规则是否正确,语义则是判断是否是相同类型,相同类型才能想运算;
编译原理 chapter01 编译程序
③后端的生成中间代码、优化代码、目标代码;
中国代码通过四元式的形式来表达,优化代码则把不必要的代码删除,最后再生成目标代码。
编译原理 chapter01 编译程序

问题:典型的编译程序可以划分为几个主要部分?各部分的主要功能是什么?
①.词法分析器:通过把源代码拆解成一个个的单词(token),然后通过正则表达式和有限状态自动机来判断是否正确;

②.语法分析器:利用上方得到的token把它做成语法树,通过上下文无关法判断是否符合语法,主要有两类:自顶向下以及自底向上产生语法树。

③.语义分析:语义分析利用语法分析阶段确定的语法树来识别表达式和语句中的语句是否符合语义;

④.生成中间代码:把符合前端词法语法语义的源程序通过四元式来求得中间代码;

⑤.优化代码:把上方的中间代码中不必要的步骤进行优化,提高机器效率;

⑥.生成目标代码:通过优化的代码生成目标代码,即机器能识别的代码;

⑦.表格和表格管理:编译程序在工作过程中需要保持一系列的表格,以登记源程序的各类信息和编译各阶段的进展情况,简而意之的就是分工明确,各个时期做自己的事情;

⑧.出错处理:一旦在哪个环节出现问题,就会通过出错处理才回馈给程序员,重新修改代码再编译。