高级程序设计语言概述

常用的高级程序设计语言

常用的高级程序设计语言

语言 特点
FORTRAN 数值计算
COBOL 事务处理
PASCAL 结构化程序设计
LISP 函数式程序设计
PROLOG 逻辑程序设计
C 系统程序设计
Smalltalk 面向对象程序设计
Java Internet应用,可移植性
Python 解释型

高级程序设计语言的优点

相对机器语言或汇编语言,高级程序设计语言

  • 更接近于数学语言和工程语言,更直观、自然和易于理解
  • 更容易验证其正确性、改错
  • 编写程序的效率更高
  • 更容易移植

程序设计语言的定义

标识符是语法概念,名字是语义概念

语法

  • 程序本质上是一定字符集上的字符串
  • 语法:一组规则,用它可以形成和产生一个合式(well-formed)的程序
  • 词法规则:单词符号的形成规则
    • 单词符号是语言中具有独立意义的最基本结构
    • 一般包括:常数、标识符、基本字、算符、界符等
    • 描述工具:有限自动机
    • 语法规则:语法单位的形成规则
    • 语法单位通常包括:表达式、语句、分程序、过程、
  • 函数、程序等;
    • 描述工具:上下文无关文法

E→i
E→E+E
E→E*E(不能理解成乘号)
E→(E)
语法规则和词法规则定义了程序的形式结构
定义语法单位的意义属于语义问题

语义

  • 语义
    一组规则,用它可以定义一个程序的意义
  • 描述方法
    • 自然语言描述
      二义性、隐藏错误和不完整性
    • 形式描述
      操作语义
      指称语义
      代数语义

语用

程序语言的基本功能和层次结构

  • 程序,本质上说是描述一定数据的处理过程
  • 程序语言的基本功能
    描述数据和对数据的运算

    层次结构

    程序

| |

子程序或分程序、过程、函数

| |

语句

| |

表达式

| |

数据引用 运算符 函数调用

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

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

高级程序设计语言的一般特性

高级语言的分类

  • 强制式语言(Imperative Languge)/过程式语言
    • 命令驱动,面向语句
    • FORTRAN、C、Pascal,Ada
  • 应用式语言(Applicative Language)
    • 注重程序所表示的功能,而不是一个语句接一个语句地执行
    • LISP、ML
  • 基于规则的语言( Rule-based Language)
    • 检查一定的条件,当它满足值,则执行适当的动作
    • Prolog
  • 面向对象语言(Object-Oriented Language)
    • 封装、继承和多态性
    • Smalltalk,C++,Java

      程序结构

FORTRAN

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

PASCAL

  • PASCAL程序本身可以看成是一个操作系统调用的过程,过程可以嵌套和递归
  • 一个PASCAL过程
      过程头;
      说明段(由一系列的说明语句组成);
      begin
      执行体(由一系列的执行语句组成);
      end

作用域

  • 同一个标识符在不同过程中代表不同的名字
  • 作用域:一个名字能被使用的区域范围
  • 名字作用域规则——"最近嵌套原则"

    最近嵌套原则
  • 一个在子程序B1中说明的名字X只在B1中有效(局部于B1)
  • 如果B2是B1的一个内层子程序且B2中对标识符X没有新的说明,则原来的名字X在B2中仍然有效
  • 如果B2对X重新作了说明,那么,B2对X的任何引用都是指重新说明过的这个X

program main
var A, B:real;
…
procedure P1
var B:boolean;
…
begin
…
end
procedure P2
var A:integer;
…
begin
…
end
begin
…
end

P2的代码能够调用P1

JAVA

  • 面向对象的高级语言
    • 类(Class)
    • 继承(Inheritance)
    • 多态性(Polymorphism)和动态绑定(Dynamic binding)
class Car{
int color;
int door;
int speed;
…
public push_break ( ) {
…
}
public add_oil ( ) {
…
}
}
class Trash_Car extends car {
double amount;
public fill_trash ( ) {
…
}
}

数据结构与操作

数据类型通常包括三要素

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

初等数据类型

  • 数值类型
    • 整型、实型、复数、双精度
    • 运算:+,-,*,/等
  • 逻辑类型
    • true、false
    • 布尔运算:∨,∧,┑等
  • 字符类型:符号处理
  • 指针类型

    标识符与名字

  • 标识符
    • 以字母开头的,由字母数字组成的字符串
  • 名字
    • 标识程序中的对象
  • 名字的意义和属性
    • 值:单元中的内容
    • 属性:类型和作用域
  • 名字的说明方式
    • 由说明语句来明确规定的
      • int score
    • 隐含说明
      • FORTRAN 以I,J,K,…N为首的名字代表整型,否则为实型
    • 动态确定
      • 走到哪里,是什么,算什么

名字的绑定可以发生在编译过程中也可以发生在运行过程中

  • 标识符
    • 以字母开头的,由字母数字组成的字符串
  • 标识符与名字两者有本质区别
    • 标识符是语法概念
    • 名字有确切的意义和属性

数据结构

数组
  • 逻辑上,数组是由同一类型数据组成的某种n维矩形结构,沿着每一维的距离,称为下标
  • 数组可变与不可变
    • 编译时能否确定其存贮空间的大小
  • 访问
    • 给出数组名和下标值,如A[10, i+ j]
  • 存放方式
    • 按行存放,按列存放
  • 数组A[10,20]的A[1,1]的地址为a,每个元素占1字节,各维下标从1开始,按行存放,那么
    A[i,j]地址为:
    a+(i-1)*20+(j-1)
  • 通用的数组元素地址计算公式
数组元素地址计算
  • 设A为n维数组,按行存放,每个元素宽度为w
    • low i 为第i维 的下界
    • up i 为第i维 的上界
    • n i 为第i维 可取值的个数(n i = up i -low i + 1),
    • base为A的第一个元素相对地址
  • 元素A[i 1 ,i 2 ,…,i k ]相对地址公式
    ( ((…i 1 n 2 +i 2 )n 3 +i 3 )…)n k +i k )×w +
    base-((…((low 1 n 2 +low 2 )n 3 +low 3 )…)n k +low k )×w)/Con
内情向量
  • 内情向量
  • 登记维数,各维的上、下限,首地址,以及数组(元素)的类型等信息

记录

  • 由已知类型的数据组合在一起的一种结构
  • 记录或者结构的元素,也叫做域(field)
record { char name[20];
integer age;
bool married;
}
  • 访问:复合名 cards[k].name
  • 存储:连续存放
  • 域的地址计算
    • 相对于记录结构起点的相对数OFFSET

字符串、表格、栈

  • 字符串:符号处理、公式处理
  • 表格:本质上是一种记录结构
  • 线性表:一组顺序化的记录结构
  • 栈:一种线性表,后进先出,POP, PUSH

抽象数据类型

  • 抽象数据类型(Abstract Data Type)
  • A set of data values and associated operations that
    are precisely specified independent of any particular
    implementation.
  • 抽象数据类型由数据集合、及其相关的操作组成,这些操作
    有明确的定义,而且定义不依赖于具体的实现
  • 一个抽象数据类型包括
    • 数据对象集合
    • 作用于这些数据对象的抽象运算的集合
    • 这种类型对象的封装,即,除了使用类型中所定义
      的运算外,用户不能对这些对象进行操作
  • 程序设计语言对抽象数据类型的支持
    • Ada通过程序包(package)提供了数据封装的支持
package STACKS is
type ELEM is private;
type STACK is limited private;
procedure push (S: in out STACK; E: in ELEM);
procedure pop (S: in out STACK; E: out ELEM);
…
end STACK;
//规范说明

//程序包体

package body STACKS is
procedure push(S: in out STACK; E: in ELEM);
begin
……实现细节
end push;
procedure pop (S: in out STACK; E: out ELEM);
begin
……实现细节
end pop;
end;
  • 一个抽象数据类型包括
    • 数据对象集合
    • 作用于这些数据对象的抽象运算的集合
    • 这种类型对象的封装,即,除了使用类型中所定义
      的运算外,用户不能对这些对象进行操作
  • 程序设计语言对抽象数据类型的支持
    • Ada通过程序包(package)提供了数据封装的支持
    • Smalltalk、C++和Java通过类(Class)对抽象数据类型提供支持

JAVA 程序示例

class Car{
int color_number;
int door_number;
int speed;
…
public push_break ( ) {
…
}
public add_oil ( ) {
…
}
}
class Trash_Car extends car {
double amount;
public fill_trash ( ) {
…
}
}
编译原理

语句与控制结构

表达式

  • 表达式由运算量(也称操作数,即数据引用或函数调用)和算符(运算符,操作符)组成
  • 形式:中缀、前缀、后缀X*Y -A P↑或者p->
  • 表达式形成规则
  • 变量(包括下标变量)、常数是表达式。
  • 若E 1 、E 2 为表达式,θ是一个二元算符,则E 1 θE 2 是表达式。
  • 若E是表达式,θ为一元算符,则θE(或Eθ)是表达式。
  • 若E是表达式,则(E)是表达式

算符的优先次序

  • 一般的规定
    • PASCAL:左结合A+B+C=(A+B)+C
    • FORTRAN:对于满足左、右结合的算符可任取一种,如A+B+C就可以处理成(A+B)+C,也可以处理成A+(B+C)
  • 注意两点
    • 代数性质能引用到什么程度视具体的语言而定
    • 在数学上成立的代数性质在计算机上未必完全成立
    • A + B = B +A

语句

赋值语句

  • A := B
  • 名字的左值:该名字代表的存储单元的地址
  • 名字的右值:该名字代表的存贮单元的内容

控制语句

* 无条件转移语句
goto L
* 条件语句
if B then S
if B then S 1 else S 2
* 循环语句
while B do S
repeat S until B
for i:=E 1 step E 2 until E 3 do S
* 过程调用语句
call P(X 1 , X 2 , ... ,X n )
* 返回语句
return (E)

功能

  • 执行语句:描述程序的动作
  • 说明语句:定义各种不同数据类型的变量或运算,定义名字的性质

语句的分类

  • 形式
  • 简单句:不包含其他语句成分的基本句
A = B + C ;
goto 105 ;
  • 复合句:句中有句的语句
while (i >= 0) {
j = i * 10;
i++;
}

猜你喜欢

转载自www.cnblogs.com/ygjzs/p/11863514.html