目录
第七章.程序设计语言与语言程序处理程序基础
ps:正规式每次都会考到、表达式偶尔会考察到、传值与传址考察频率比较高,其它了解即可。
第一节.编译过程
编程语言从执行原理上可分为编译型语言和解释型语言。比如常见的C语言、C++等都是编译型语言,Java、Python等都是解释型语言。
计算机不能直接理解机器语言以外的语言,因此需要将我们写的代码编译成机器语言,然后再交给计算机去执行。
具有把其他语言翻译为机器语言的功能的,称为编译器。
编译器翻译语言的方式有两种:
- 编译型
- 解释型
二者区别在于翻译时间点不同。那么到底什么是解释型语言和编译型语言呢?
- 编译型语言
编译型语言是指程序在执行之前需要一个专门的编译过程,把程序源文件编译为机器语言的文件,运行时不需要重新编译,执行效率高,但缺点是,编译型语言依赖编译器,跨平台性差。
举例:比如C语言程序的执行过程,要先将后缀为.c的源文件通过编译、链接为后缀为.exe的可执行文件,才能运行。 - 解释型语言
解释型语言是指源代码不需要预先进行编译,在运行时,要先进行解释再运行。解释型语言执行效率低,但跨平台性好。
举例:比如Java程序执行过程,我们写好代码,直接运行即可(运行前有解释的过程)。
编译过程
图注
- 程序员编写的源程序首先进行词法分析,就是检查语言的关键字是否出现词法错误。
- 语法分析,词法正确,检查词法连接成的语法是否出现语法错误。
- 语义分析,往往只能分析出一部分错误,有些错误是无法通过机械化方式分析出来。这也是一些程序的bug始终是难以杜绝的通过机器检查的方式难以发现。
- 代码优化,具体操作是如何匹配相应的系统使整个代码的效率提高。
- 目标代码的生成需要转化成目标程序。
- 目标代码往往指可执行的代码,涉及到底层硬件的一些东西,相当于转换成机器可执行的东西。
- 当然有些语言不需要编译就能直接在操作系统上执行的代码,而是转换成一种中间代码,比如说JAVA等就是走的这种体系,它们要有专用的虚拟机来支持它们的运行。当然这样子做是好处的,它们可以屏蔽不同的操作系统不同的硬件带来的程序目标代码的差异,从而实现跨平台特性。
第二节.文法定义
一个形式文法是一个有序四元组 G = ( V , T , S , P ) \mathbf{G}=(\mathbf{V}, \mathbf{T}, \mathbf{S}, \mathbf{P}) G=(V,T,S,P), 其中:
- V: 非终结符。不是语言组成部分, 不是最终结果, 可理解为占位符。
- T: 终结符。是语言的组成部分, 是最终结果。 V ∩ T = ∅ V \cap T=\varnothing V∩T=∅
- S: 起始符。是语言的开始符号。
- P: 产生式。用终结符替代非终结符的规则。形如 α → β \alpha \rightarrow \beta α→β
文法的类型分为0型、1型、2型、3型。
- 0型文法又称短语文法。
- 1型文法又称上下文有关文法。
- 2型文法又称上下文无关文法。
- 3型文法又称正规文法。
语法推导树
用来进行语法规则的推导,通过推导树,我们可以了解到一种语法能够表达的串以及能够构造的句型是什么样子。
例 : 文法 G = ( { a , b } , { S , A } , S , P ) ,其中: S → a A S ∣ a ; A → S b A ∣ S S ∣ b a 。 请 构 造 句 型 a a b A a 的 推 导 树 。 \color{red}{例:} \\ \begin{aligned} \text { 文法 } \mathrm{G} &=(\{\mathrm{a}, \mathrm{b}\},\{\mathrm{S}, \mathrm{A}\}, \mathrm{S}, \mathrm{P}) \text { ,其中: } \\ \mathrm{S} & \rightarrow \mathrm{aAS} \mid \mathrm{a} ; \\ \mathrm{A} & \rightarrow \mathrm{SbA}|\mathrm{SS}| \mathrm{b} \mathrm{a} \text { 。 } \end{aligned}\\ 请构造句型 a a b A a 的推导树。 例: 文法 GSA=({a,b},{S,A},S,P) ,其中: →aAS∣a;→SbA∣SS∣ba 。 请构造句型aabAa的推导树。
文法G中{a,b}表示终结符,一般为小写字母。{S,A}表示非终结符,该种符号能够推导出其它符号。S就是其实符,P就是文法的产生式,即题目中形如 α → β \alpha \rightarrow \beta α→β这类式子。
先将题目中文法的产生式分解出来
S
→
a
A
S
;
S
→
a
;
A
→
S
b
A
;
A
→
S
S
;
A
→
b
a
\mathrm{S} \rightarrow \mathrm{aAS} ; \quad \mathrm{S} \rightarrow \mathrm{a} ; \quad \mathrm{A} \rightarrow \mathrm{SbA} ; \quad \mathrm{A} \rightarrow \mathrm{SS} ; \quad \mathrm{A} \rightarrow \mathrm{ba}
S→aAS;S→a;A→SbA;A→SS;A→ba
推导树就是类二叉树,最终取得的树的叶子节点需要符合aabAa就行了。
通过文法的产生式构成推导树,根的标记是S。
第三节.有限自动机
图注
δ
(
S
,
0
)
=
B
\delta(S, 0)=B
δ(S,0)=B表示S到B的权值为0。S表示初态,f表示终态,终态有两个圈。
给你一个图,为你能不能解析出01字符串。
做法就是能不能从起点找到一条到达终点的路,然后用路上的权值组成一个字符串。
考察方式:两个圈是终点,一个全是起点,顺着选项路径判断是否能从起点到终点。
有限自动机例题
解:将给出的编号输入到有限自动机中,能不能从起点找到一条到达终点的路,如果可以就说明自动机可以识别。故选择C。
正规式
正规式是有限自动机的另一种表达形式。正规式是描述程序语言单词的表达式。
解
“|” 表达的是或关系,能够解析成a或者b。“*” 表示循环多次,当然循环范围是从0到无穷大。
所以
(
a
∣
b
)
∗
(a|b)^{*}
(a∣b)∗表达的串可以是空串,a,aa,ba,aaa,bbbb等等。
(1)A选项,通过文法进行推算
S
→
a
A
→
a
b
S \rightarrow aA \rightarrow ab
S→aA→ab;B选项,
S
→
b
B
→
a
S \rightarrow bB \rightarrow a
S→bB→a;C选项,
S
→
a
A
→
a
b
S
→
a
b
b
B
→
a
b
b
a
S
→
a
b
b
a
a
A
→
a
b
b
a
a
b
S \rightarrow aA \rightarrow abS \rightarrow abbB \rightarrow abbaS \rightarrow abbaaA \rightarrow abbaab
S→aA→abS→abbB→abbaS→abbaaA→abbaab;D选项,
S
→
b
B
→
b
a
S
→
b
a
b
B
S \rightarrow bB \rightarrow baS \rightarrow babB
S→bB→baS→babB无法得到选项中的值。
(2)文法与正规式是等价关系的。我们可以使用代入法进行操作,很明显A选项范围很大所以不选,B选项构不成第一问的BC选项,C选项可以构成第一问的ABC选项,D选项不能构成第一问的ABC选项。
第四节.程序语言基础——表达式
通过树的遍历来求前中后缀表达式。前中后序遍历分别对应前中后缀表达式。
用栈存储树的遍历。
解:选择D。
如果说没有括号,情况是不一样的,构造的树是不一样的。
就像这个表达式
a
−
b
×
c
+
5
a - b \times c + 5
a−b×c+5构造的树就不一样的。
第五节.函数调用——传值与传址
传递方式 | 主要特点 |
---|---|
传值调用 | 形参取的是实参的值,形参的改变不会导致调用点所传的实值发生改变 |
引用 ( 传址 )调用 | 形参取的是实参的地址,即相当于实参存储单元的地址引用因此其值的改变同时就改变了实参的值 |
第六节.程序设计语言的种类、特点及适用范围
- Fortran语言(适用于科学计算,执行效率高)
- Pascal语言 (为教学而开发的, 表达能力强,引申出了Delphi )
- C语言 (指针操作能力强,高效 )
- Lisp语言 (函数式程序语言,符号处理,应用于 人工智能 )
- C++ 语言 (面向对象,高效 )
- Java语言 (面向对象,中间代码,跨平台 )
- C#语言 (面向对象,中间代码,.Net )
- Prologi语言 (适用于逻辑推理,简洁性,表达能力,数据库和专家系统 )
程序语言的基本类型和特点
逻辑式语言是一类以形式逻辑为基础的语言。
函数式语言以补演算为基础。
命令式语言是基于动作的语言,在这种语言中,计算会被看成是动作的序例。