软件设计基础:4. 程序设计语言基础与语言处理程序
1.程序设计语言概述
1.1编译程序与解释程序
语言分两种,所谓语言就是我们平常开发说的C#,java,c等等。我们目前接触到较多的,大部分都是编译型语言。
- 编译型语言:顾名思义,就是写好代码,生成软件,放到设备上运行。
- 编译型语言的处理过程:
- 源代码:程序员编写的源代码。
- 预处理:预处理器对源代码进行预处理,如宏替换、头文件包含等。
- 编译:编译器将预处理后的源代码转换为汇编代码。
- 汇编:汇编器将汇编代码转换为机器代码,也就是目标文件。
- 链接:链接器将多个目标文件以及库文件链接为一个可执行文件。
- 执行:操作系统加载可执行文件到内存,然后CPU执行。
- 相对的就是解释型语言:不生成软件,边解释边运行。
- 解释型语言的处理过程:
- 源代码:程序员编写的源代码。
- 解释:解释器逐行读取源代码,然后解释执行。这种方式不需要生成中间代码或者机器代码,所以可以在任何支持该解释器的平台上运行。
- 执行:解释器在解释的同时,也在执行源代码。每读取一行源代码就执行一行,如果源代码有错误,解释器会立即停止并报错。
总结:编译型语言在程序执行前,需要经过预处理、编译、汇编和链接等步骤,生成机器代码,运行速度快;解释型语言无需预先转换,由解释器边解释边执行,便于调试,但运行速度相对较慢。
语言类型 | 编译型语言 | 解释型语言 |
---|---|---|
解释程序 | 编译器 | 解释器 |
生成目标代码 | 是 | 否 |
执行 | 目标程序直接执行 | 边解释边执行 |
参与执行 | 编译器不参与执行 | 解释器参与执行 |
执行效率 | 高 | 低 |
灵活性 | 差 | 强 |
可以移植性 | 差 | 强 |
1.2常见程序设计语言的特点
以下几种是比较有代表型的语言
- Fortran语言(第一个高级程序设计语言,科学计算,执行效率高)
- Pascal语言(结构化程序设计语言,为教学而开发,表达能力强,Delphi)
- C语言(通用、结构化程序设计语言,指针操作能力强,高效)
- Lisp语言(函数式程序语言,符号处理,人工智能)
- C++语言(C语言基础上增加了类机制,面向对象,高效,与C兼容)
- Java语言(面向对象,中间代码,跨平台,通用的程序设计语言)
- Python(面向对象,解释型程序设计语言,胶水语言,通用的脚本语言)
- PHP(服务器端脚本语言,制作动态网页)
- Ruby(简单快捷、面向对象、脚本语言)
- Delphi(快速应用程序开发工具,可视化编程环境)
- COBOL(数据处理领域最为广泛的程序设计语言,高级编程语言)
- XML(可扩展标记语言,标准通用标记语言的子集 )
- PROLOG(逻辑式语言,间接性,表达能力强,建造希赛网系统、数据库、自然语言理解、智能知识库等)
1.3程序设计语言的基本成分
程序设计语言的基本成分,名字看上去很专业,但是会开发的工程师都比较清楚,实际上就是:数据成分、运算成分、控制成分、函数。
- 数据成分:就是我们正常理解的变量,比如用户名,密码,系统名字等等。
- 运算成分:软件的功能,就是对数据的操作,比如判断用户名是否正确,1+1等于多少等等。
- 控制成分:主要是顺序、选择和循环三种控制结构。说得直白一点,就是正常按照代码顺序运行程序、if/else运行程序(类似的还有switch等)、while/for循环运行。
- 函数:就是一个方法。这个是一个非常基础的知识,比如 public login(string user,string password){}。这个就是函数。
有个规律:函数>控制成分>运算成分>数据成分
1.4函数调用方式
- 传值调用
- 引用调用
2.语言处理程序
2.1编译过程概述
-
词法分析:顾名思义,是对词语的分析。以二元组的方式输出,即单词种别和单词自身的值。输出是记号流。词法分析的任务是把源程序的字符串转换成单词符号序列。词法分析器的任务就是读入源程序,对其进行一定的切分,得到记号流。
-
语法分析:输入是记号流语法分析基于词法分析,组词成句。词法分析和语法分析是对源程序的结构进行分析。
-
语义分析:组词成句之后对其意义进行分析,检查源程序是否包含静态语义错误,并收集类型信息供后面的代码生成阶段使用。只有语法和语义分析都正确的源程序才能翻译成正确的目标代码。
-
中间代码生成:语义分析正常之后就生成中间代码。例如“三地址码”。
-
代码优化:代码优化过程可以在中间代码生成阶段进行,也可以在目标代码生成阶段进行。
-
目标代码生成:目标代码生成阶段是编译器工作的最后一个阶段。这一阶段的任务是把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码。这个阶段的工作与具体的机器密切相关。
2.2文法
G=(V,T,P,S)
V:非终结符(Variable )集
每个非终结符称为一个语法变量(成分)——代表某个语言的各种子结构。
T:终结符(Terminal)集。
语言的句子中出现的字符,V∩T = 空集
S:开始符号(Start Symbol),S∈V
代表文法所定义的语言,至少在产生式左侧出现一次。
P:产生式(Product)集合。
- 0型:短语文法,典型代表图灵机
- 1型:上下有关文法,线性界限自动机
- 2型:上下文无关文法,非确定的下推自动机
- 3型:正规文法——有限自动机
2.3正规式与正规集
- ab字符串ab构成的集合
- a|b字符串a、b构成的集合
- a*由0或多个a构成的字符串集合
- (a|b)*所有字符串a和b构成的串的集合
文法G[S]的分析如下:
第一个问题:
针对A选项:S→aA丨bB,可以推出aA;A→bS丨b,可以推出abS;S→aA丨bB,可以推出abaA;A→bS丨b,可以推出ababS,以此类推可以发现这样的正规式是一个以ab循环多次的字符串,即可以推出ababab。
针对B选项:S→aA丨bB,可以推出bB;B→aS丨a,可以推出baS;S→aA丨bB,可以推出babB;B→aS丨a,可以推出babaS;以此类推可以发现这样的正规式是一个以ba循环多次的字符串,即可以推出bababa。
针对C选项:S→aA丨bB,可以推出aA;A→bS丨b,可以推出abS;S→aA丨bB,可以推出abbB;B→aS丨a,可以推出abbaS;S→aA丨bB,可以推出abbaaA;A→bS丨b,以此类推可以推出abbaab。
针对D选项:S→aA丨bB,可以推出bB;B→aS丨a,可以推出baS;S→aA丨bB,可以推出babB;此时根据B→aS丨a,无法推出babb,所以D选项是错误的
第二个问题:即求正规式。
2.4有限自动机
由于A是初态,C是终态。代入验证四个选项中哪一个可以由初态走到终态
A选项:0000,A-0-B-0-B,接下来只能在B循环,所以0000无法识别。
B选项:1111,A-1-A-1-A,接下来只能在A循环,所以1111无法识别。
C选项:0101,A-0-B-1-C-0-B-1-C,整个过程就是0101,所以0101可以识别。
D选项:1010,A-1-A-0-B-1-C-0-B,未到达终态C,1010无法识别。
2.5表达式
- 前缀表达式:
- 中缀表达式:正常加减乘除
- 后缀表达式(逆波兰式):从树结构来说,就是后续算法。树结构其实就是中缀表达式。
常见的表达式考核方法:
-
给你前缀表达式让你求结果
解答方法:从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。
例如前缀表达式“- × + 3 4 5 6”:
(1) 从右至左扫描,将6、5、4、3压入堆栈;
(2) 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈;
(3) 接下来是×运算符,因此弹出7和5,计算出7×5=35,将35入栈;
(4) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。
可以看出,用计算机计算前缀表达式的值是很容易的。 -
给你后缀表达式让你求结果
解答方法:与前缀表达式类似,只是顺序是从左至右:
从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。
例如后缀表达式“3 4 + 5 × 6 -”:
(1) 从左至右扫描,将3和4压入堆栈;
(2) 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素,注意与前缀表达式做比较),计算出3+4的值,得7,再将7入栈;
(3) 将5入栈;
(4) 接下来是×运算符,因此弹出5和7,计算出7×5=35,将35入栈;
(5) 将6入栈;
(6) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。 -
给你中缀表达式让你求其前缀表达式
-
给你中缀表达式让你求其后缀表达式
3.其它
今天的文章程序设计语言的语言处理程序是一种什么软件_程序设计语言有三类分别是[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/79876.html