目录
6.1基本概念
6.2编译与解释
6.3文法
6.4有限自动机
6.5正规式
6.6 表达式
6.7 传值与引用
6.8 数据类型与程序控制结构
6.9 程序语言特点
6.10 Java程序设计
6.11 C++
6.12 python
6.1基本概念
-
语句:高级程序设计语言中描述程序的运算步骤、控制结构、数据传输
-
语义:表示不同语法结构的含义,程序语言中按语法规则构成的各个语法成分的含义,分为静态、动态语义
-
语用:表示构成语言的各个记号和使用者的关系,涉及符号来源、使用、影响
-
语境:理解和实现程序设计语言的环境,包括编译环境、运行环境
-
语法:
-
由程序设计语言的基本符号组成程序中各个语法成分的一组规则。① 词法规则:由基本字符构成的符号书写规则 ② 语法规则:由符号构成语法成分的规则
-
程序语言的语法可通过形式语言描述。给出语言的语法意味着给出语句、声明、其他语言结构的书写规则。在程序语言手册中,语言的描述围绕语法结构展开。先给出各种语句结构的语法,然后给出对应该结构的语义以描述内在含义
-
6.2编译与解释
-
编译与解释
-
编译程序:
① 用高级语言书写的源程序翻译成与之等价的目标程序(机器语言程序/汇编形式及其代码形式),在计算机上运行目标程序。编译过程有词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成六阶段,实际编译器可能会将其中某些阶段结合在一起处理,编译正确的程序不含语法错误
② 反编译是编译逆过程,通常不能把可执行文件还原成高级语言源代码,可转换成功能等价的汇编程序
-
解释程序:
① 一种语言处理程序,在词法、语法、语义分析方面与编译程序工作原理基本相同
② 解释程序不产生目标程序,运行用户程序时,直接执行源程序/源程序的内部形式(中间代码)
-
-
编译过程
-
词法分析:
① 对源程序从前到后/从左到右逐字符扫描,识别出一个个“单词”符号,称为记号。“单词”符号是程序设计语言的基本语法单位,如关键字、标识符等,处理非法字符、单词拼写错误等
② 主要作用:分析构成程序的字符及由字符按照构造规则构成的符号是否符合程序语言规定;有限自动机(NFA / DFA)是进行词法分析的适当工具
-
语法分析:
① 根据语言语法规则将记号/单词符号序列分解成各类语法单位,如表达式、语句、程序等,通过语法分析确定整个输入串是否构成一个语法正确的程序。词法、语法分析本质上都是对源程序结构进行分析
② 语法分析器以单词符号为输入,分析单词符号是否形成符合语法规则的语法单位,如表达式、赋值、循环等,按语法规则分析检查每条语句是否有正确的逻辑结构
③ 处理静态错误:编译时发现,标点符号、表达式中缺少操作数、括号不匹配等有关语言结构上的错误
a. 自上而下分析方法:递归下降分析法、预测分析法
b. 自下而上分析方法:算符优先分析法、LR分析法、移进-归约分析法
-
语义分析:
① 类型分析和检查,分析各语法结构的含义,收集类型信息供后面代码生成阶段使用。只有语法、语义都正确的源程序才能翻译成正确的目标代码
② 处理静态错误: 静态语义错误,运算符与运算对象类型不合法、类型检查、除数是否为零、赋值语句左右端类型不匹配
③ 语法制导翻译是一种静态语义分析方法,编译过程中的语义分析都是静态语义,运行时才有动态语义
④ 确认源程序语法、语义后,可进行翻译并给出源程序内部表示。对于声明语句,需记录源程序各个符号必要信息,进行符号表填查工作,辅助语义正确性检查、代码生成;对于可执行语句,需翻译成中间代码/目标代码
(决策表:用于测试;广义表:针对数据结构表示;索引表:数据库中指示逻辑-物理记录的对应关系)
-
中间代码生成:
① 根据语义分析输出生成中间代码,可提高编译程序的可移植性,中间代码生成依据语义规则
② 中间代码:后缀式/逆波兰记号、三元式、四元式、三地址码、树(非语法树)
(正规表达式:由一个/多个字符型文字/元字符组成,是描述程序语言单词的表达式,不属于中间代码)
-
代码优化:变换改造中间代码,使生成的目标代码更高效,节省时间空间,有利于与机器无关的优化处理
-
目标代码生成(执行阶段):
① 把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码、汇编指令代码。编译的最后阶段,与具体机器密切相关
② 处理动态语义错误:发生在程序运行时,源程序中的逻辑错误,包括陷入死循环、变量取零时做除数、引用数组元素下标越界等
补充:
-
符号表:编译过程中需对符号表进行快速有效地査找、插入、修改、删除等操作。 符号表建立可以始于词法分析,也可以放到语法分析、语义分析,但符号表的使用有时会延续到目标代码的运行阶段
-
编译过程中为变量分配存储单元所用地址是逻辑地址,程序运行时再映射为物理地址
-
6.3文法
-
基本概念
-
一个文法的语言是该文法能产生的句子集合,一个文法产生的句子从开始符号推导出的所有终结符号串
-
正则闭包:A+ = A1 U A2 U A3 U...U An U.. (即所有幂的组合)
-
闭包:A* = A0 U A+ (正则闭包基础上加上A0 = {ε} )
如:a* = {a, aa, aaa, ..., ε} ,(ab)* = {ab, abab, ababab,...,ε}
-
-
定义:一个形式文法是一个有序四元组G = (V,T,S,P)
-
V:非终结符。不是语言组成部分,不是最终结果,可理解为占位符
-
T:终结符。语言组成部分,是最终结果。V∩T=Ø
-
S:起始符。语言开始符号
-
P:产生式。用终结符替代非终结符的规则。形如α→β
-
-
形式语言理论
-
0型:短语文法,图灵机,G的每条产生式α→β满足α属于V的正则闭包且至少含有一个非终结符,而β属于V的闭包
-
1型:上下文有关文法,线性界限自动机,G的任何产生式α→β满足|α|<=|β|,仅仅S→ε例外,但S不得出现在任何产生式右部
-
2型:
① 上下文无关文法,非确定的下推自动机,G的任何产生式为A→P,A为非终结符,β为V的闭包
② 大多数程序设计语言的语法规则用( 上下文无关文法)描述,拥有足够强的表达力、足够简单,可以构造有效的分析算法检验一个给定字串是否是由某个上下文无关文法产生的
-
3型:正规文法,有限自动机,G的任何产生式为A→αB或A→α,α属于非终结符的闭包,A、B都属于非终结符
-
-
语法推导树:一棵语法树应具有以下特征
-
每个结点都有一个标记,此标记是V的一个符号
-
根的标记是S
-
若一结点n至少有一个它自己除外的子孙,并且有标记A,则A肯定在Vn中
-
如果结点n的直接子孙,从左到右的次序是结点n1,n2..nk,其标记分别是A1,A2,…,Ak,那么A>A1,A2…Ak,一定是P中的一个产生式
例:文法G=({a,b},{S,A},S,P),其中: S→aAS l a;A→SbA l SS l ba。请构造句型aabAa的推导树
S→ aAS;S→a;A→SbA;A→SS;A→ba
-
6.4有限自动机
-
定
M = (S.Σ.ð.S0.Z)
① S:一个有限集,每个元素为一个状态
② ∑:一个有穷字母表,每个元素为一个输入字符
③ ð:转换函数,是一个单值对照
④ S0:属于S,是其唯一的初态
⑤ Z:一个终态集(可空)
有限状态自动机可以形象地用状态转换图表示,设有限状态自动机:DFA = ({S, A, B, C,f}, {1, 0}, ð , 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
6.5正规式
-
定义:有限自动机的另一种表达形式。正规式是描述程序语言单词的表达式,对于字母Σ,其上的正规式及其表示的正规集可以递归定义如下:
-
ε是一个正规式,它表示集合L(ε) = {ε}
-
若a是Σ上的字符,则a是一个正则式,它所表示的正规L(a) = {a}
-
若正规式r和s分别表示正规集L(r) = L(s),则
① r l s是正规式,表示集合L(r) U L(s)
② r · s是正规式,表示集合L(r)L(s)
③ r*是正规式,表示集合(L(r))*
④ (r)是正规式,表示集合L(r)
仅由有限次地使用上述三个步骤定义的表达式才是Σ上的正规式。即正规式要么为空,要么由字母、或、连接、闭包运算符组成。闭包运算符“*”优先级最高,连接运算优先级次高,或运算符“|"优先级最低
-
6.6 表达式
-
分类:前缀表达式(+ab)、中缀表达式(a+b)、后缀表达式/逆波兰式(ab+)
-
方法:① 构造二叉树通过前中后序遍历 ② 简便方法,加括号-移符号-去括号
例:表达式(a - b) * (c + 5)后缀式:ab-c5+*
6.7 传值与引用
-
传值调用:形参取实参的值,改变形参不会改变实参的值。实参可以是表达式、常量、变量、数组,信息单方向传递,形参不能再将值传回给实参
-
引用/传址调用:形参取实参的地址,即实参存储单元地址的引用,改变形参会改变实参的值。实参必须是数组名、数组元素等变量,不能是表达式、常量,可以实现数据双向传递
6.8 数据类型与程序控制结构
-
常见数据类型:数字类型、布尔类型、字符类型、枚举类型、指针类型
-
程序控制结构:顺序结构、选择结构、循环结构
6.9 程序语言特点
-
标准
-
OGSA 标准:
① 开放网络服务框架,Web service、Grid技术结合的产物,已成为网络基础框架的标准。它提供一组遵守特定的约定并定义明确的接口,是实体间产生、管理、交换信息的机制
② 它利用Web Service标准接口定义机制、多协议绑定、本地与远端的透明性,利用网格服务语义、可靠性、安全模型、生命周期管理、发现和其他服务,以及多主机/运行环境来建构自己的框架
③ 为使服务的思想更加明确具体,OGSA定义了网格服务 Grid services 概念,它是一种Web service,由于Web service提供的都是永久服务,而网格应用环境需要大量临时性的短暂服务,因此OGSA结合Web Service提出网格服务,解决发现服务、创建动态服务、管理服务生命周期等与临时服务有关的问题
④ OGSA的基本前提是所有一切都描述为服务,即计算资源、存储资源、网络、程序、数据库等都是服务
-
Web Service:
① 是一系列标准且还正在发展中,由W3C万维网协会设计指定,促进跨平台的程序对程序通信
② W3C目前已指定了一个模板—服务描述语言WSDL、一个过程调用协议—简单对象访问协议SOAP的编程接口作为正式的Web Service标准
-
-
分类
-
函数式程序设计:
① 函数是一种对应规则/映射,它使定义域中每个元素对应值域中唯一的元素。数据结构本质上是表,而函数又可作为值出现在表中,因此函数式程序的控制结构取决于函数,以及函数的定义和调用
② 函数式语言是一类以入演算为基础的语言,代表为LISP。函数式语言主要用于符号数据处理,如微积分演算、数理逻辑、游戏推演、人工智能等其他领域
-
逻辑式程序设计:
① 编程不需要描述具体解题过程,只需给出一些必要事实和规则。这些规则是解决问题的方法规范说明,根据这些事实和规则,计算机利用谓词逻辑,通过演绎推理得到求解问题的执行序列
② 是一类以形式逻辑为基础的语言,代表是建立在关系理论和一阶谓词理论基础上的PROLOG
③ PROLOG有很强的推理功能,适用于书写自动定理证明、专家系统、自然语言理解等问题的程序
④ 主要用在人工智能领域,也应用于自然语言处理、数据库查询、算法描述,尤其适合于专家系统
-
脚本语言:
① JavaScript,VB script等是介于HTML和C、C++、Java、C#等编程语言之间的程序设计语言
② 脚本语言也使用变量、函数,与编程语言之间最大的区别是编程语言的语法、规则更严格复杂
③ 脚本语言一般有相应脚本引擎来解释执行,是一种解释性语言,一般需要解释器才能运行
④ 脚本语言一般以文本形式存在,类似于一种命令
-
汇编语言:
① 是为特定计算机/计算机系统设计的面向机器的符号化程序设计语言,一般情况下效率高于高级语言
② 汇编语言源程序:汇编语言编写的程序,由若干指令语句、伪指令语句、宏指令语句组成
③ 汇编程序:以汇编语言源程序为输入,以机器语言表示的目标程序为输出
④ 指令语句:将被翻译成机器代码,必须有操作码字段,可以没有操作数字段,在源程序汇编时都要产生可供计算机执行的指令代码(即目标代码)
⑤ 伪指令语句:a. 用于指示汇编程序如何汇编源程序,常为汇编程序提供以下信息:该源程序如何分段、哪些逻辑段在程序段中、哪些是当前段、它们分别由哪个段寄存器指向、定义了哪些数据、存储单元如何分配等;b. 伪指令语句除定义的具体数据要生成目标代码外,其他均没有对应的目标代码。伪指令语句的命令功能由汇编程序在汇编源程序时,通过执行一段程序完成,而不是在运行目标程序时实现的
⑥ 不同标准的汇编语言指令格式:a. Windows汇编语言基本遵循Intel风格语法,如MASM、NASM b. Unix/Linux汇编语基本遵循 AT & T 风格语法
⑦ 汇编语言语句格式中的“名称”并不是所有语句都必需的。若语句中带有“名称”,则大多情况下“名称”表示的是内存中某一存储单元的地址,也就是其后面各项在内存中存放的第一个存储单元的地址
-
-
特点
-
Fortran:科学计算,执行效率高
-
Pascal:为教学而开发,表达能力强,Delphi
-
Lisp语言:函数式程序语言,符号处理,人工智能
-
Prolog 语言:逻辑推理,简洁性,表达能力。以特殊的逻辑推理形式回答用户的查询,用于数据库、专家系统
-
C:指针操作能力强,高效
-
C++:基于C语言,增加了类,面向对象,高效
-
C#:面向对象,中间代码,.Net
-
Java:面向对象,跨平台,解释型语言,即时编译(生成中间代码后边解释为目标代码边执行),可根据运行机器优化代码,采用动态优化编译
-
Smalltalk:面向对象语言
-
Python:解释型,面向对象。语法简洁清晰,有丰富、强大的类库,能把用C/C++等语言制作的各种模块轻松结合在一起
-
PHP:一种通用开源脚本语言,将程序嵌入到HTML文档中去执行,产生动态网页
-
HTML:常用于格式化和链接文本,而编程语言通常用于向机器发出一系列复杂指令
-
XML:可扩展标记语言,用于标记电子文件的结构化语言。与HTML相比,XML是一种真正的数据描述语言,没有固定的标记符号,允许用户自定义一套适合于应用的文档元素类型,具有强大灵活性。XML包含了大量自解释型的标识文本,每个标识文本又由若干规则组成,这些规则可用于标识,使XML能够让不同的应用系统理解相同的意义,正是由于这些标识的存在XML能够有效地表达网络上的各种知识,也为网上信息交换提供了载体
-
6.10 Java程序设计
-
优点
-
跨平台
-
代码可移动:与htmI相结合
-
完全面向对象
-
编出来的程序不易出错:没有指针,内存垃圾自动回收,不会产生内存泄露
-
简单、安全、多线程
-
-
Java与C++的区别
-
完全面向对象:无全局变量、无结构和联合、自动回收内存垃圾
-
没有指针
-
没有多继承
-
解释执行
-
-
特点:
-
JAVA的栈空间只存放基本类型、引用类型变量、方法,而堆中存储实例对象
-
即时编译、解释型语言,可生成中间代码后再边解释为目标代码边执行
-
可根据运行机器优化代码,采用动态优化编译。Java程序最初通过解释器进行解释执行,当虚拟机发现某个方法/代码块的运行特别频繁,就把这些代码认定为“热点代码”。为了提高热点代码执行效率,运行时虚拟机将会把这些代码编译成本地机器码,并以各种手段尽可能地进行代码优化,该过程叫即时编译,运行时完成这个任务的后端编译器称为即时编译器
-
在不改变循环体的情况下,可用while语句代替do-while语句,反之则不行
-
-
类的定义
-
一个类是一些属性、方法的封装体,用关键字class 声明,用关键字public(默认)、protected、private指定类成员的存取控制属性
-
尽量隐藏类内部细节,对类属性的操作应通过类的方法进行
[import包] // 引入包中的类 [类修饰符:public|abstract|final|private] class xxxclass [extends超类][implements 接囗]{ public: // 定义公有数据、函数成员:可以从类的外部访问;所有对象中都可以使用 protected: // 定义保护数据、函数成员:可被派生类和同一文件夹下的类访问;可以在本类中使用,以及具有继承关系的子类中访问 private: // 定义私有数据、函数成员:类内部的方法才能访问,只能在本对象中访问 }
-
-
继承
-
Java中用关键字extends表示类间的继承关系
-
父类的公有属性、方法成为子类的属性、方法,子类若有和父类同名同参数类型的方法,那么子类对象在调用该方法时,调用的是子类的方法(方法的重置)。若想调用父类的同名方法/属性,需用super关键字
-
子类对象可以作为祖先类的对象使用,即类的向上转换,反之则不行。即子类对象赋值给祖先类对象,用子类对象作为实参去调用以父类对象为形参的函数
-
-
静态成员:静态属性、方法
-
静态属性、方法的声明用关键字static 实现。一个类的静态属性只有一个,作为类的一种成员,被类的所有对象共享,而不是属于某个对象
-
静态成员变量的值可更新。只要对静态成员变量的值更新一次,所有对象的该静态成员变量的值都会更新
-
不需要创建对象也能访问类的静态属性、方法,访问方式为“类名.静态属性/方法”
-
静态成员函数可直接访问静态成员,但不能在静态方法中访问非静态属性、调用非静态方法
-
-
this、super、final
-
this代表当前对象,super代表当前对象的父类
-
this的主要用途:
① 一个构造函数调用另一个构造函数,对构造函数的调用必须是第一条语句
② 将对象自身作为参数来调用一个函数
-
super的用途:在子类中调用父类的同名方法,在子类构造函数第一条语句中调用父类构造函数
-
final关键字
① 声明常量:在其初始化或第一次赋值后,其值不能改变。常量必须先有值,然后才能使用。常量的第一次赋值只能在构造函数中进行
②声明对象:final对象的值不能改变,即该对象不能再指向其他对象,而不是指不能改变当前对象内部的属性值
③ 声明函数参数:函数中的值不能改变
④ 声明方法:final方法不能被重置
⑤ 声明类:final类不能被继承,其所有方法都是final 的,但属性可以不是final 的
-
-
抽象类与接口
-
抽象类:
① 通过关键字abstract 实现,目的是定义一个框架,规定某些类必须具有的一些共性。表示类中定义出类提供什么服务,而有些具体服务需通过子类实现。包含抽象方法的类一定是抽象类,抽象方法指没有函数体的方法
② 抽象类的直接派生类必须实现其抽象方法,抽象类只能用于继承,不能创建对象;抽象类不能直接实例化,即没有直接对象,只能有非直接对象,即子类对象
-
接口:
① 用关键字interface 声明,只能用于继承,此时关键字为implements。接口用于替代多继承的概念,能实现多继承的部分特点,又避免了多继承的混乱,还能起到规定程序框架的作用
② 接口也可用于多态。直接继承了接口的类,必须实现接口中的抽象方法,间接的则不做要求
-
抽象类与接口的对比:
① 接口、抽象类都不能创建对象
② 抽象类不能参与多继承,抽象类可以有非静态成员变量、非抽象方法
③ 接口可以参与多继承,所有属性都是静态常量,所有方法都是public抽象方法
[修饰符] interface 接口名 [extends 父接口名列表]{ [public] [static] [final] 常量; [public] [abstract] 方法; } interface IFactory{} class SqlServerFactory implements IFactory
-
6.11 C++
-
编译
C/C++程序采用编译方式进行翻译,源程序中通常有预处理指令#include、#define等,需要进行预处理后再编译,形成汇编语言源程序(可选),再将多个目标代码链接后形成可执行程序
-
内存布局
-
分为代码区、栈区、堆区、静态数据区。全局变量、静态变量的存储空间在静态数据区分配
-
函数中定义的局部变量存储空间在栈区动态分配,随函数被执行而为其分配存储空间,当函数执行结束后由系统回收
-
-
变量
-
内存单元的抽象,用于在程序中表示数据
-
指针变量:变量存储的是内存单元地址,指针变量指向了另一个变量。指针变量可定义在函数或复合语句内,也可定义在所有函数外,可以是全局变量或局部变量
-
需要区分指针变量与指针所指向的变量,无论指针变量指向何种变量,其存储空间大小都一样。当指针变量指向数组中的一个元素时,对指针变量进行算数运算可以使其指向同一个数组中的其他元素
-
-
关键字this
-
在C++、Java中用于表示当前对象,实现对象自身引用。对象自身引用的值使得方法体中引用的成员名与特定对象相关,对象自身引用的类型决定了方法体被实际共享的范围
-
可用于区分当前对象属性、局部变量名,是OOPL中的一种特有结构
-
-
派生类的定义
class 派生类名:继承方式1 基类名1, 继承方式2 基类名2,...{ public: // 派生类的公有数据、函数 protected: // 派生类的保护数据、函数 private: // 派生类的私有数据、函数 } class CashNormal:public CashSuper { public: double acceptCash(double money) { retum money; } }
-
类外定义函数体
返回值类型 类名::成员函数名(形参表 ) { 函数体; } // ::是类的作用域分辨符,放在类名后成员函数前,表明后面的成员函数属于的那个类 double CashNormal::acceptCash(double money){ retum money; }
-
虚函数与纯虚函数
virtual 函数类型 函数名(形参表){ // 函数体; } virtual 函数类型 函数名(形参表列) = 0; virtual double acceptCash(double money) = 0;
-
对象指针与对象引用
-
对象指针的语法定义形式:类名 *对象指针名;
-
对象引用的定义形式:类名 &对象引用名 = 被引用对象;
-
注意:
① 对象名或对象引用访问对象的成员,使用运算符" . "
② 对象指针访问对象成员,使用运算符“->”。对象指针名->数据成员名;对象指针名->成员函数名(参数表)
LightOffCommand *kitchenLightOff = new LightOffcommand(k); remoteControl->setCommand(0, livingRoomLightOn, livingRoomLightOff);
-
6.12 python
-
特点
① 简单易学 ② 面向对象:支持面向过程、对象编程 ③ 可移植性:已经被移植在许多平台
④ 解释性 ⑤ 开源 ⑥ 高级语言 ⑦ 可扩展性 ⑧ 丰富的库 ⑨ 规范的代码
-
安装
命令行中使用pip安装Python模块,一般语法为"pip install"。如“pip install numpy"安装numpy模块
-
函数
str():// 内置函数,将参数转换成字符串类型 type():// 查询变量数据类型 id()://返回对象唯一标识符,标识符是一个整数 object()://返回一个空对象,不能向该对象添加新的属性、方法 range():// 返回一个可迭代对象(类型是对象),而不是列表类型 list():// 对象迭代器,可以把range()返回的可迭代对象转为一个列表,返回列表变量类型 list(range(11)) // 返回列表内容为 [0,1,2,3...10] list(range(11))[10:0:-2] //值为 [10,8,6,4,2] // [10:0:-2]表示对该列表截取子列表,从下标10开始至下标0截止,步长为-2(负数指从后向前) Input():// 从标准输入读入一行文本,默认的标准输入是键盘。该文本以字符串格式返回
-
语法
-
switch:不支持使用
-
元组:一种不可变的数据类型,元素按顺序排列,元素可以重复但不能修改、删除、添加。元组中只包含一个元素时,需在元素后面添加逗号消除歧义,如:(1,)
-
list:一种可变、有序、可重复的集合,可随时添加、删除元素。列表与数字n相乘时表示扩展此列表,将列表重复 n次,如 X = [1,2],X * 2 = [1,2,1,2]
-
对结构化异常的处理语法
try: // 可能发生异常的程序块 raise Exception1("主动抛出的异常") except Exception1: // 指定一个异常的处理 except(Exception2,Exception3,...,Exceptionn): // 指定多个异常的处理 except: // 所有其他异常的处理 else: // 没有出现异常时的处理 finally: // 无论是否出现异常都要进行的处理,但是没有try catch的语法结构
-