编译原理——高级语言及其语法描述(笔记)

常用的高级语言

  • FORTRAN —— 数值计算
  • COBOL —— 事务处理
  • PASCAL —— 结构程序设计(结构化设计成熟的标志)
  • ADA —— 大型程序、嵌入式实时系统(支持抽象数据类型,但是非完全面向对象)
  • LISP —— 函数式程序设计语言(人工智能使用较多)
  • PROLOG —— 逻辑程序设计(人工智能使用较多)
  • ALGOL —— 算法语言(结构化设计的萌芽)
  • C/C++ —— 系统程序设计(过程式/面向对象)
  • Java —— Internet 程序设计

"A language that doesn't affect the way you think about programming, is not worth knowing"—— Alan J. Perlis

(一个好的语言应该影响你的编程思想)

与机器语言或汇编语言比较,高级语言优点:

  • 较接近于数学语言和工程语言,比较直观、自 然和易于理解
  • 便于验证其正确性,易于改错
  • 编写效率高
  • 易于移植(抽象程度较高,因而较容易移植)

程序语言的定义

语法

程序本质上是一定字符集上的字符串

语法则是一组规则,用它可以形成和产生一个合式 (well-formed) 的程序(合式:形式结构。形式上的规则,形式上结构的规定)

语法规则词法规则定义了程序的形式结构

词法规则

单词符号的形成规则。

单词符号是语言中具有独立意义的最基本结构,包括

  • 常数、标识符、基本字、算符、界符......

描述工具:有限自动机

语法规则

语法单位的形成规则,包括:

  • 表达式->语句->分程序->过程、函 数(子程序)->类->程序......

描述工具:上下文无关文法

比如:

while结构的写法是语法。

while结构各个部分作用以及怎么执行是语义。

定义语法单位的意义属于语义问题。

语义

一组规则,用它可以定义一个程序的意义

描述方法

自然描述:

会有隐藏错误、二义性和不完整性

形式描述:

  • 操作语义 (PL/1)
  • 指称语义 (ADA)
  • 代数语义 (PASCAL)

标识符与名字

标识符:以字母开头的,由字母数字组成的字符串

标识符与名字两者有本质区别:

  • 标识符是语法概念
  • 名字有确切的意义属性

标识符绑定(binding)名字

名字(属于语义)

  • 值:单元中的内容
  • 属性:类型和作用域

名字的性质的说明方式

  • 由说明语句来明确规定的(int a)
  • 隐含说明(FORTRAN 以 I,J,K,…N 为首的名字代表整型 , 否则为实型)
  • 动态确定(var a,auto a)

语用

(笔者未查到相关解释)

程序的层次结构

程序语言成分的逻辑和实现意义

分为两点,这也体现了计算思维与数学思维的不同

  • 抽象的逻辑意义——数学意义
  • 计算机实现意义——具体实现

高级语言的一般特性

高级语言的分类

强制式语言 / 过程式语言(Imperative Languge)

特点:命令驱动,面向语句。即程序是由一条一条的语句构成,且执行按照指令顺序一条一条的执行。比如:

  • FORTRAN 、 C 、 Pascal , Ada

程序员需要对问题的解决方法给出详细的“描述”,这个“描述”就是程序。

应用式语言 (Applicative Language)

注重程序所表示的功能,而不是一个语句接一个语句地执行,比如:

  • LISP 、 ML

更像是将问题的结构(特别是递归结构)“描述”出来,由解释器/虚拟机/推理机根据你的“描述”,进行推理匹配。

逻辑程序设计语言/基于规则的语言 ( Rule-based Language)

程序=一条条规则,规则=条件+动作

总是判断当前环境是否满足条件,满足则指向条件相应的动作

检测当前状况,匹配相应规则,然后再执行动作动作,比如:

  • Prolog

面向对象语言 (Object-Oriented Language)

必须要有封装性、继承性和多态性,比如:

  • Smalltalk , C++ , Java

程序结构

FORTRAN

  • 一个程序由一个主程 序段和若干辅程序段 组成
  • 辅程序段可以是子程 序、函数段或数据块
  • 每个程序段有一系列 的说明语句和执行语 句组成,各段可以独 立编译
  • 模块结构,没有嵌套 和递归
  • 各程序段中的名字相 互独立,同一个标识 符在不同的程序段中 代表不同的名字

PASCAL

PASCAL 程序本身可以看成是一个操作系统所 调用的过程,过程可以嵌套和递归

Ada

引入了程序包(package)的概念,将数据和操作代码封装在一起,支持数据抽象。

程序分为:

  • 可见规范说明部分,定义了程序保外可访问的对象
  • 程序包体,它实际定义程序包的实现细节

Java

作用域

一个名字能被使用的区域范围称作这个名字的作用域

允许同一个标识符在不同过程中代表不同的名字

名字作用域规则 —— “最近嵌套原则” 


最近嵌套原则

一个 在子程序 B1 中说 明的名字 X 只在 B1 中有效(局部于B1)

如果B2是B1的一个内层子程序且B2中对标识符X没有新的说明,则原来的名字X在B2中仍然有效

如果B2对X重新作了说 明,那 么,B2对X的任何引用都是指重新说明过的这个X

数据类型与操作

一个数据类型通常包括三种要素

  • 属性:用于区别这种类型数据对象的属性
  • 值:这种类型的数据对象可以具有的值
  • 操作:可以作用于这种类型的数据对象的操作

初等数据类型

数值类型

  • 整型、实型、复数、双精度
  • 运算: + , - , * , / 等

逻辑类型

  • true 、 false
  • 布尔运算:& | ^(此处是C语言)等

字符类型:符号处理

指针类型

数据结构

数组

逻辑上看:同类型数据所组成的某种n维矩形结构,沿着每一维的距离,称为下标

数组可变与不变:编译时能否确定其存贮空间的大小

访问:给出数组名和下标值

存放方式:按行存放 , 按列存放

数组地址的计算

原本:

A数组的首地址为a,下标从1开始,A[i,j] 地址为:

a + (i-1) * 20 + (j-1)

推广:

A为n维数组,按行存放,每个元素宽度为w,A[i1,i2...ik] 地址为:

((…i1n2 + i2 )* n3 + i3 )…) * nk + ik ) * w +base - ((…((low1 * n2  + low2 ) * n3 + low3 )…) * nk +lowk ) * w

  • lowi:为第 i 维的下界
  • upi:为第 i 维的上界
  • ni: 为第 i 维可取值的个数 (ni = upi - lowi + 1)
  • base: 为 A 的第一个元素相对地址
  • Con = ((…((low1 * n2  + low2 ) * n3 + low3 )…) * nk +lowk ) * w

内情向量:维数,各维的上、下限,首地址,以及数组 (元素)的类型。

记录

记录结构由已知类型的数据组合在一起的一种结构。它的数据类型不需要一致。

存储:一般来说,各种语言按照分量或域或字段的顺序连续存放。

域的地址的计算:先对于记录结构起点的相对数偏移。

字符串、表格、栈

字符串:符号处理、公式处理

表格:本质上是一种记录结构

线性表:一组顺序化的记录结构

栈:一种线性表,后进先出

抽象数据类型(Abstract Data Type)

一个抽象数据类型包括

  • 数据对象的一个集合
  • 作用于这些数据对象的抽象运算的集合
  • 这种类型对象的封装,即,除了使用类型中所定义的运算外,用户不能对这些对象进行操作

语句与控制结构

表达式

表达式由运算量(也称操作数,即数据引用或 函数调用)和算符(操作符)组成

形式:中缀、前缀、后缀

            X*Y     -A         P↑

表达式形成规则

算符的优先次序

一般规定依据数学上的优先次序。

  • 代数性质能引用到什么程度视具体的语言不 同而不同
  • 在数学上成立的代数性质在计算机上未必完全成立

语句

赋值语句

A := B(A = B)

大所属名字有两个值,不同。

名字左值(位于左侧):该名字代表的那个单元(地址)称为该名字的左值(所代表的存贮单元的地址

名字右值(位于右侧):一个名字的值称为该名字的右值(所代表的存贮单元的内容

注意:虽然大多数多有左右值,但一些语言成分只有右值没有左值

控制语句

无条件转移语句:goto 行号

循环语句:for;while;do until

条件语句:if,else if,else;switch

过程调用语句:call P(X1,X2...)

返回语句:return

说明语句

定义各种不同数据类型的变量或运算,定义名字的性质:typdef,#define,#ifndef,@Servlet(),@Autowired...

简单句和复合句

简单句:不包含其他语句成分的基本句

复合句:句中有句的语句

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值