目录
一、程序设计语言概述
1.低级语言与高级语言
低级语言:机器语言和汇编语言
高级语言:Fortran、Java、C、C++、PHP、Python、Delphi、PASCAL等(即除了两种低级语言的其它语言)
2.程序设计语言发展概述
Fortran(Formula Translation) :第一个被广泛用来进行科学和工程计算的高级语言。由一个主程序和若干子程序组成。
ALGOL(ALGOrithmic Language) :诞生于晶体管计算机年代,主导了20世纪60年代程序语言的发展。Algol60引入许多新概念,如局部性概念、动态、递归等。
PASCAL :一种过程式、结构化程序设计语言,从ALGOL60衍生而来,曾在高校计算机软件教学在处于主导地位。
C :UNIX操作系统及其上的许多软件都是用C编写的,兼顾了高级语言和汇编语言的特点。允许程序员直接访问操作系统和底层硬件,因此在系统级应用和实时处理应用开发中成为主要语言。
C++ :在C的基础上于上世纪80年代发展起来的,于C兼容,但比C多了封装和抽象,增加的类机制使C++成为一种面向对象的程序设计语言。
C#(C Sharp):面向对象的、运行于.NET Framework的高级程序设计语言。
Java : (面向对象)初始用途是开发网络浏览器的小应用程序。
PHP :是一种在服务器端执行的、嵌入HTML文档的脚本语言。可以快速地执行动态网页。PHP支持几乎所有流行的数据库以及操作系统。
Python :面向对象的解释型程序设计语言(弱类型,无需进行变量/对象类型声明),可用于编写独立程序、快速脚本和复杂应有的原型。也是一种脚本语言,支持对操作系统的底层访问,还可用C、C++和Java扩展,因此可以用它开发任何类型的程序。
Delphi : 一种可视化开发工具,在Window环境下使用,其主要特征为基于窗体和面向对象的方法,采用面向对象的编程语言 Obiect Pascal 和基于构件的开发结构框架。
Visual Basic.NET是基于微软.NET Framework的面向对象的编程语言。用.NET语言开发的程序源代码需先编译成中间代码MSIL,然后通过.NET Framework 的通用语言(CIR)来执行。
LISP : 函数式编程语言
3.程序设计语言杂论
1)命令式和结构化
命令式 | Fortran , PASCAL , C |
结构化 | C , PASCAL |
2)面向对象
面向对象 | C++ ,C# ,Java , Smalltalk ,python |
3)脚本语言是动态语言,以文本(如ASCII)保存,涉及函数与变量,只在被调用时进行编译或解释(主要为解释),常用来描述格式化和链接,编译效率不如编译型语言。
4.程序设计语言的基本成分
(包括数据、运算、控制和传输等)
数据
1)常量和变量
2)全局量和局部量(全局量的存储空间不改变,局部量的存储单元动态改变)C语言中全局变量在静态数据区,栈和堆存储动态数据。
3)数据类型(基本类型、用户定义类型、构造类型等)
控制
1)顺序结构
2)选择结构(if-else, switch)
3)循环结构 (while, do-while , for)
5.函数
1)函数定义
两部分:函数首部和函数体
(不允许函数嵌套定义)
2)函数声明
函数应该先声明后引用
3)函数调用
调用时实参和形参间交换信息的方法有值调用和引用调用
值调用:将实参的值传给形参,形参的改变不影响实参
引用调用:将实参的地址传给形参,形参的改变影响实参
二、汇编、编译、解释
1.汇编程序基本原理
1.1汇编语言
1)包含三类语句
指令语句:能被CPU直接识别并执行的;
伪指令语句:伪指令语句指示汇编程序在汇编源程序时完成某些工作,汇编后不产生机器代码;
宏指令语句:允许用户多次重复使用的程序段定义为宏;
1.2汇编程序一般需要两次扫描源程序才能完成翻译操作
第一次扫描:定义符号的值并创建一个符号表ST
第二次扫描:产生目标程序,除了使用ST还需使用机器指令表MOT2。将可执行汇编语句翻译成对应二进制代码机器指令。
2.编译程序基本原理
编译过程
1)词法分析:将源程序看成一个多行字符串,逐个字符扫描,识别一个个”单词“符号。输出记号流。
2)语法分析:将单词符号序列分解成各类语法单位,如表达式、语句和程序等。括号匹配、单词拼写、标点符号错、表达式确实操作数等均为语法分析。
3)语义分析:静态语义检查,只有语法和语义都正确的源程序才能翻译成正确的目标代码。
4)中间代码生成:一种简单且含义明确的记号系统,常用三地址码,其实现方式常采用四元式。中间代码与具体机器无关,使用中间代码可以提高编译程序的可移植性,有利于进行优化处理
5)代码优化
6)目标代码生成:将中间代码变换成特定机器上的绝对指令代码、可重定位指令代码或汇编指令代码,这个阶段与机器密切相关。
(中间代码生成和代码优化不是必须的)
3.解释程序基本原理
如图所示三种实现方式
1)解释程序不产生源程序的目标程序(与编译程序的主要区别)
2)不一定有中间代码(A路径)
3)解释脚本语言,如PHP,Python,Js
4.编译与解释比较
编译 | 解释 | |
效率 | 效率更高 | 需要反复扫描源程序,效率较低 |
灵活性 | 由于需反复检查源程序,所以比编译方式更灵活 | |
可移植性 | 可以 | 可以 |
运行情况 | 机器上运行的是与源程序等价的目标程序,源程序和目标程序都不再参与目标程序的执行过程 | 解释程序和源程序要参与到程序的运行过程中,运行程序的控制权在解释程序 |
目标程序 | 将源程序翻译成独立的目标程序 | 不产生目标程序 |
词法分析、语法分析、语义分析 | 不可省略 | 不可省略 |
中间代码生成和代码优化 | 可省 | 可省 |
三、文法分析
1.正规式
2.有限自动机
1)词法分析的一个工具,能正确地识别正规集
2)一个圈的是初态,两个圈的是终态
3)对于字符串1100 最终停留在q0所以不合法,对于字符串0101最终停留在q1所以合法
确定的有限自动机(DFA):对每一个状态来说识别字符后转移的状态是唯一的
如下图,对每一个0/1只有唯一转移路径
不确定的有限自动机(NFA):对每一个状态来说识别字符后转移的状态是不唯一的
如下图,S0处对于1有两种转移路径
分析下图
对于字符串aab,q0->q1->q0->q1 不在终态,所以不合法
:空 无条件转移
3.上下文无关文法
如下图范例(规则题目会给,不用记):
4.后缀表达式
优先级:1、( )2、 ×/÷ 3、+/-
1)中缀 ——>后缀
变换规则: a?b -> ab?
例如:
1-2×(3+4)/5
第一步:1-2×34+/5(接下来将34+看成一个整体)
第二步:1-2×34+5/ (×和/优先级相同,优先级相同,从右往左)
第三步:1-234+5/×
最后:1234+5/×- 得到后缀表达式
2)后缀 ——>中缀
1234+5/×-
利用栈,从左往右扫描
数字直接入栈,遇到符号出栈
5.其他
语法分析方法根据语法树的方向可分为自底向上和自顶向下两类
自底向上:算符优先分析法、LR分析法
自顶向下:递归下降分析法、预测分析法
标签:中级,编译,语言,面向对象,目标程序,程序语言,程序设计,设计师,源程序 From: https://blog.csdn.net/2401_83540407/article/details/141989496