1. 编译与解释
1.1低级语言
低级语言 | 概念 | 例子 |
---|---|---|
机器语言 | 由0、1组成的机器指令序列集合 | 0101000111 |
汇编语言 | 由符号表示组成的汇编指令的集合 | ADD x,1 ; MOV x,2 ;(其中x表示寄存器)(可以没有操作数,不能没有操作码) |
汇编语言编写的源程序----->汇编程序----->翻译成目标程序
1.2高级语言
1.脚本语言属于动态语言,其程序结构可以在运行中改变,一般通过脚本引擎解释执行,不产生独立保存的目标程序,脚本语言有:PHP、JavaScript、html、python(脚本语言都是动态语言,动态语言都是解释型语言)
脚本语言编程时也会使用变量以及定义和调用函数,采用解释方式实现
2.标记语言:HTML、XML、WML(Mark标记M)
标记语言常用于描述格式化和链接
高级语言 | |
---|---|
C/C++ | 常用于系统级软件的开发 |
Lisp | 函数式编程语言 |
JAVA | 面向对象编程语言(即时编译、对象在堆空间分配和自动垃圾回收处理) |
Python | 编写独立程序和快速脚本的语言,属于弱类型语言(指不需要进行变量的声明),支持过程式编程也支持面向对象编程,动态编程,跨平台、开源,解释型语言。其中列表是一种可变的、有序列结构,元素可以重复。Matplotlib不支持深度学习模型。 |
C# | |
JavaScript | |
PHP | 用于进行动态网页处理的动态脚本语言 |
Pascal | |
Prolog | 逻辑式程序语言 |
某高级语言编写的源程序----->对应解释程序或编译程序----->翻译成目标程序
1.解释程序:翻译源程序时不生成独立的目标程序,直接解释执行源程序,或将源程序翻译成中间代码,解释程序和源程序都要参与到程序的运行中。(脚本语言:python、php、JavaScript等语言编写的源程序都需要通过解释程序翻译)
2.编译程序:将源程序翻译成目标程序,编译程序和源程序都不再程序的运行。(编译型语言的执行效率高)
3.java是编译型和解释型语言的结合。
4.反编译是编译的逆过程,通常不能把可执行的文件还原成高级语言源代码,只能转换成功能上等价的汇编程序
5.编译过程中为变量分配存储单元所用的地址是逻辑地址,程序运行时再映射为物理地址
2.程序基础
1.程序控制结构:顺序结构、选择结构、循环结构
2.程序中数据类型的作用:便于为数据合理分配单元
便于检查表达式中对运算的应用是否正确
便于规定数据对象的取值范围及能够进行的计算
便于编译程序在基础机器中完成对值得布局
3.短路计算:无须对表达式中所有操作数或运算符进行计算就可以确定表达式的值
4.左结合:从左向右计算
右结合:从右向左计算,赋值和not
5.传值调用和传址调用
函数调用 | 概念 | 特点 |
---|---|---|
传值调用 | 形参值的改变不会影响实参值 | 实参传到形参,实参可以是变量或常量或数组元素或表达式) |
传址调用(引用调用) | 若形参取的是实参的地址,即相当于实参存储单元地址的引用,则其值的改变就会影响实参 | 形参和实参间可以实现数据的双向传递,形参和实参必须有地址 |
6.程序运行时用户的内存空间一般划分为代码区、静态数据区、栈区、堆区,全局变量的存储空间在静态数据区。栈是局部变量以及每次函数调用时所需要保存的信息的存储区域。堆是一块动态存储区域,由程序员在程序中进行分配和释放,c语言中malloc向系统动态申请存储空间存储数据,free释放存储空间。
3.编译过程和解释过程
用C/C++语言为某个应用编写的程序,经过预处理、编译、汇编、链接后形成可执行程序。
高级语言编写的源程序要通过编译程序或解释程序翻译才能运行,编译程序和解释程序又该如何处理源程序呢?
3.1编译过程
编译器的工作过程
源程序----->词法分析------>语法分析----->语义分析---->中间代码的生成----->代码优化----->目标代码的生成
其中中间代码的生成和代码优化不是必要的,可有可无。
词法分析、语法分析、语义分析顺序不可变乱
3.2解释过程
解释器的工作过程
源程序----->词法分析------>语法分析----->语义分析
解释器参与运行控制,程序执行的速度慢
3.3符号表
不断收集、记录和使用源程序中一些相关符号的类型和特征等信息,并将其放入符号表中,记录源程序中各个字符的必要信息,以辅助语义的正确性检查和代码生成。
可执行语句翻译成中间代码或目标代码
3.4词法分析
对基本字符构成的符号(单词)进行分析依据语言词法规则去判断是否出现非法字符,如标识符、关键字是否正确等。
输入:源程序
输出:记号流
3.5语法分析
对各条语句的结构进行合法性分析,分析程序中句子结构是否正确。如语句是否缺分号,左右括号的配对、变量是否定义(或声明)等。
语法分析阶段可以发现程序中所有语法错误
输入:记号流
输出:语法树(分析树)
语法分析方法分为自上而下分析法(递归下降分析法、预测分析分析法)和自下而上分析法(移进-归约分析法、算符优先分析法、LR分析法)。
3.6语义分析
进行类型分析和检查,如整数取余运算符后只能跟整数,若跟浮点数则认为是类型不匹配的错误、变量的值是否正确、循环条件是否正确
语义分析阶段不能发现程序中所有语义错误,只能发现静态语义错误,不能发现动态语义错误(死循环、除数为0),动态语义错误只有在运行时才能发现。
输入:语法树(分析树)
语法制导翻译是一种静态语义分析的方法
3.7中间代码的生成
与具体的机器无关(不依赖具体的机器),可以将不同的高级程序语言翻译成同一种中间代码,中间代码可以跨平台。中间代码有利于进行与机器无关的优化处理和提高编译程序的可移植性。
常见的中间代码有:后缀式(逆波兰记号)、三地址码、四元式、树(图)等。
3.8目标代码的生成
目标代码生成阶段的工作与具体的机器密切相关,寄存器的分配工作处于该阶段。
4阶段的具体实现
4.1正规式(词法分析)
正规式:语言基本字符集上的字符串的一个子集,描述程序语言单词的表达式
正规式与正规集:
正规式 | 正规集 |
---|---|
ab | 字符串ab构成的集合 |
a|b | 字符串a或b构成的集合 |
a* | 由0个或多个a构成的集合 |
(a|b)* | 所有a和b构成的串的字符串的集合 |
a(a|b)* | 以a为首字母的a、b字符串的集合 |
(a|b)*abb | 以abb结尾的a、b字符串的集合 |
正规式无非要么为空,要么由字母、或、连接、闭包运算符组成,优先级:*、 。 、|
仅由字符a、b构成的所有字符串包括:a、b、aa、aab、baa、.......
4.2有限自动机(词法分析)
正确地识别正规集
有限自动机 | 概念 |
---|---|
DFA(确定的有限自动机) | 对每一个状态来说识别字符后转移的状态是唯一的 |
NFA(不确定的有限自动机) | 对每一个状态来说识别字符后转移的状态是不确定的 |
状态分为初态和终态,识别字符必须从初态出发终态结束。一个状态可以是初态也可以是终态。
显然NFA是DFA的一个特例。
正规集可以用正规集描述,用有限自动机识别
4.3上下文无关文法
1.上下文无关文法被广泛地用于表示各种程序设计语言的语法规则
大写字母表示非终结符,小写字母表示终结符
上下文无关文法G=(N, T, P, S)表示,其中N是非终结符号的集合,T是终结符号的集合,P是产生式集合,S是开始符号,V = N U T,则从S出发推导的、仅包含T中符号的符号串 。
2.分析树(语法树):语句的推导
4.4后缀式(逆波兰记号)
优先级相同,从右向左。
1.中缀式根据优先级可以求出后缀式,后缀表达式可以用栈来求中缀表达式。
2.根据语法树推导中缀式和后缀式。
3.用括号法求后缀式。