一、概念
低级语言:机器语言(0-1二进制)、汇编语言
高级语言:开发语言
1、编译与解释
|
编译型语言 |
解释型语言 | ||
|
共同点 |
语言 |
高级程序语言 | |
|
过程 |
有词法分析,语法分析,语义分析的过程 | ||
|
不同点 |
翻译程序 |
编译器 |
解释器 |
|
是否生成目标代码 |
会生成 |
不会生成 | |
|
目标程序直接运行 |
目标程序直接执行 |
边解释边执行 | |
|
翻译程序参与执行 |
编译器不参与执行 |
解释器参与执行 | |
|
执行效率 |
效率高 |
效率低 | |
|
灵活性与可移植性 |
灵活性与可移植性差 |
灵活性与可移植性高 | |

2、特点
1.Fortran(早期):科学计算,执行效率高
2.Pascal:为教学而开发,表达能力强
3.C:编译型,指针操作能力强,高效
4.Lisp:函数式程序语言,符号处理,人工智能
5.C++:面向对象,高效
6.Java:面向对象,中间代码,跨平台
7.C#:面向对象,中间代码,.Net
8.Prolog:逻辑推理,简洁性,表达能力,数据库和专家系统
9.Python:面向对象,解释性,胶水语言
3、基本成分
(1):常见的数据类型
1.数字数据类型
2.布尔类型
3.字符类型
4.枚举类型
5.指针类型
(2):控制结构
顺序结构、选择结构(if、else)、循环结构(for ···)
4、函数调用
|
传递方式 |
主要特点 |
|
传值调用 |
形参取得是实参的值,形参的改变不会导致调用点所传的实参的值发生改变 |
|
传址调用 |
形参取的是实参的地址,即相当于实参存储单元的地址引用,因此其值的改变同时,就改变了实参的值 |
|
引用调用 |
在程序调用过程中,系统用 栈 实现嵌套调用(递归调用)函数的正确选择(入栈、出栈)
二、编译原理
1、编译过程

1.词法分析(检查字符)
从左到右逐个扫描源程序中的字符,识别其中如关键字、标识符、常数、运算符及分隔符
输入源程序,输出记号流
2.语法分析(检查结构)
根据语法规则,将单词符号分解成各类语法单位,并分析源程序是否有语法上的错误。包括语言结构出错,if ··· end if 不匹配,缺少分号、括号不匹配,表达式缺少操作数等,输入记号流
自顶向下(自上而下)分析法
字底向上(移进-规约)分析法
输入记号流,输出语法树(分析树)
3.语义分析(检查用途)
进行类型分析和检查,主要检查源程序是否存在静态语义错误。包括运算符合运算类型不符合(如取余时用浮点数)
|
动态错误 |
发生在程序运行时 |
|
动态语义错误 | |
|
选入死循环、除0、角标越界、空指针等 | |
|
静态错误 |
发生在编译时 |
|
分为语法错误和静态语义错误 | |
|
语法错误:单词错误、符号错误、表达式缺少操作数,括号不匹配等有关语言结构上的错误 | |
|
静态语义错误:运算符和运算对象类型不合法 |
2、文法
(1):概念
一个形式文法是一个有序四元组G = {V, T, S, P},流程为S =》P =》V(可以不经过)=》T
V:非终结符。不是语言组成部分,不是最终结果,可理解为占位符(一般是大写字母)
T:终结符。语言组成部分,是最终结果(一般是小写字母)
S:启始符。是语言的开发符号
P:产生式。用终结符替换非终结符的规则
正则闭包:A+(A1开始)
闭包:A*(A0开始)
|
类型 |
别称 |
对应自动机 |
|
0型 |
短语文法 |
图灵机 |
|
1型 |
上下文有关文法 |
线性界线自动机 |
|
2型 |
上下文无关文法(程序设计语言大多数语法现象可用其描述) |
非确定的下推自动机 |
|
3型 |
正规文法 |
有限自动机 |
(2):语法推导树
1.特征
>每个节点都有一个标记,此标记是V的一个符号
>根的标记是S
>若一节点n至少有一个他自己除外的子节点,并且有标记A,则A肯定在Vn中
>如果节点n的直接子节点,从左到右的次序是节点n1,n2,······,nk,其标记A1,A2,······,Ak,那么此标记一定是P中的一个产生式
设:文法G = ({a, b}, {S, A}, S, P)
其中推导式:S => aAS|a,A => SbA|SS|ba(|表示或),由此可以得出 1.S => aAS,2.S => a,3.A => SbA,4.A =>SS,5.A => ba
构造aabAa推导树:
第一步:已知S位起始符,所以从起始符开始,寻找非终结符(字母大写)的推导式开始推导(即:S => aAS)

第二步:选择A推导式(3.A => SbA,4.A =>SS,5.A => ba),已知推导式第二个字母非终结符(aabAa小写a),所以应该选择3号推导式A => SbA,再由推导式(SbA)中S推导出a

第三步:此时已推导出推导式的前四个字母(aabA),最后一个a用S推导式推导出a即可

2.例题

由上述推导式可以分解出:E => T、E => E+T、T => F、T => T*F、F => -F、F => N、N => 0~9
解:思路,其中加减等符号也算一位符号
A:两减号--在一起没有可以推导的表达式,所以排除
B:E+T => E+T*F => E+-F*F => E+-F*N,符合文法
C:未发现()符号,所以排除
D:E => T => T*F 至此无法再往下推导,所以排除
3、正规式与正规集
正规集:正规文法字符串的集合
正规式:正规文法的集合规律表达式
|
正规式 |
正规集 |
举例 |
|
ab |
字符串ab构成集合 |
{ab} |
|
a|b |
字符串a、b构成集合 |
{a,b} |
|
a* |
由0或多个a构成的集合 |
{空, a, aa, aaa, ······, a(n个a)} |
|
(a|b)* |
所有字符a和b构成的集合 |
{空, a, b, ab, aab, baa, aba, ······} |
|
a(a|b)* |
以a为首字母的a、b字符串集合 |
{a, aa, aab, ab, abb, ······} |
|
(a|b)*abb |
以abb结尾的a、b字符串集合 |
{abb, aabb, babb, ababb, bababb, ······} |
4、有限自动机
状态转换机,验证单词
S为初始状态,f为终止状态

(S, 0) = B、(S, 1) = A、(A, 0) = f、(A, 1) = C、(B, 0) = C、(B, 1) = f、(C, 0) = f、(C, 1) = f
5、后缀表达式

前缀:+ab
中缀:a+b
后缀(逆波兰式):ab+
最顶部在最上方,利用栈进行求值
软件设计师核心笔记(10)设计语言与程序基础&spm=1001.2101.3001.5002&articleId=163874269&d=1&t=3&u=3490f0bc64e1449e84a21523123b43ab)
36万+

被折叠的 条评论
为什么被折叠?



