1程序设计语言
- 低级语言
- 机器语言:二进制代码表示的机器指令的集合,灵活,直接执行,速度快
- 汇编语言:一种助记符表示的面向机器的语言
- 汇编程序:翻译程序
- 输入:用汇编语言书写源程序
- 输出:用机器语言表示的目标程序
- 汇编程序语言
- 指令语言
- 伪指令语言
- 宏指令语言
- 汇编程序:翻译程序
- 高级语言:相对于汇编语言而言
- 命令式语言:语义基础模拟“数据存储/数据操作”c,c++,java,basic,c#
- 函数式语言:基于数学函数概念“LIsp,F#,”
- 逻辑式语言:Prolog
- 面向对象语言
2 常见数据类型
- 基本类型:int,char,实型float/double,bool
- 特殊类型:空类型void
- 用户定义类型:枚举类型enum
- 构造类型:数组,结构,联合
- 抽象数类型:类
3 程序结构(顺序,选择,循环结构)
4 汇编语言
4.1 指令语句
- 指令语句:机器指令语句,汇编后产生的相应的机器代码
指令语句:传送,算术运算,逻辑运算,移位指令和处理机控制指令等 - 伪指令语句:指示汇编程序汇编源程序时完成某些工作。
如:为变量分配存储单元,给某个符号赋值等 - 宏指令语言:宏的引用
宏:即为可重复使用的程序段,类似于函数
4.2 解释程序,编译程序
-
解释程序(解释器):直接解释执行源程序,或将其翻译为中间代码后执行
解释方式下,解释程序与源程序(或某种等价表示)要参与到程序的运行过程中,运行程序的控制权在解释程序 -
编译程序(编译器):将源程序翻译成目标语言再在计算机上运行目标程序
编译方式下,机器上运行的是与源程序等价的目标程序,源程序与编译程序都不再参与目标程序的执行过程 -
区别:解释方式,翻译程序不生成独立的目标程序,而编译方式则生成独立保持的目标程序
对比
- 效率. 编译比解释方式可能取得更高的效率。一般情况下, 在解释方式
下运行程序时, 解释程序可能需要反复扫描源程序. 例如:每一次引用变量
都要进行类型检查, 甚至需要重新进行存储分配, 从而降低了程序的运行速
度. 在空间上,以解释方式运行程序需要更多的内存, 因为系统不但需要为用
户程序分配运行空间, 而且要为解释程序及其支撑系统分配空间. - 灵活性. 解释方式比编译方式更灵活。解释程序需要检查源程序, 当解
释器直接运行源程序时, 在运行中, 修改程序成为可能, 例如 增加语句或修
改错误等 - 移植性.源程序若由解释器控制运行的, 而已提前将解释器安装在不同的
机器上, 从而使在新环境下无需修改源程序使之运行. 在编译方式下则需要
针对新机器重新生成源程序的目标代码才能运行.
5 编译程序基本原理
- 词法分析:编译过程的第一阶段,这个阶段的任务是对源程序从前到后(从左到右)逐个字符地扫描,从中识别出一个个“单词”
- 语法分析:在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类单位,如“短语”、“句子”、“程序段”和“程序”。通过语法分解,确定整个输入串是否构成一个语法上正确的程序
- 语义分析:检查源程序是否包含语义错误,并搜集类型,供后面的代码生成阶段使用,只有语法和语义正确的源程序才可被翻译成目标代码。语义分析程序需要进行频繁的造表和查表工作。语义分析的一个重要内容是类型检查,对表达式及语句中的各种语法分作类型检查和分析
- 中间代码生成阶段:根据语义分析的输出生成中间代码. 它是一种简单且含义明确的记号系统, 他们的共同特征是与 机器无关. 中间代码的设计原则: 一是容易生成, 二是容易被翻译成目标代码. 语义分析和中间代码生成所依据的是语言的语义规则.
- 代码优化阶段:由于编译器将源程序翻译成中间代码的工作是机械的, 因此, 生成中间代码往往在计算时间上和存储空间上有很大的浪费. 优化过程可以在中间代码生成阶段进行, 也可以在目标代码生成阶段进行. 优化所依据的原则是程序的等价变换规则.
- 目标代码生成阶段:这一阶段的任务是把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码, 这个阶段的工作与具体的机器密切相关.
- 错误
- 词法错误:非法字符,关键字或标识符拼写错误
- 语法错误:语法结构出错,if…end if 不匹配,缺分号
- 语义错误:死循环,零除数,其它逻辑错误(程序run的时候出现)
6 文法
以有穷的集合描述无穷的计划的工具
7 语法推导树
8 有限自动机
例题
9 文法推导与正规式
10 表达式
- 前缀表达式(+ab)
- 中缀表达式(a+b)
- 后缀表达式(逆波兰表达式ab+)
1)转换方法
其实就是以符号为根的树结构
前序遍历,中序遍历,后序遍历
2)后缀表达式计算方法
后缀表达式的计算方法:
从左向右,每遇到一个运算符,就将前两个数字进
行该运算,再将运算结果放到该位置
比如刚才的后缀表达式:8 3 2 6 * + 5 / - 2 2 ^ +
- 第一步*运算:8 3 12 + 5 / - 2 2 ^ +
- 第二步+运算:8 15 5 / - 2 2 ^ +
- 第三步/运算:8 3 - 2 2 ^ +
- 第四步:5 2 2 ^ +
- 第五步:5 4 +
- 第六步:9
11 函数调用,传值与传址
- 传值:把实参的值赋给实参,相当于copy
- 传址:传递的地址,传之后,实参和形参都会指向同一个对象