程序设计语言
3~6分(20、21、22、48、49、50)
基本成分:数据、运算、控制和传输等
栈跟局部变量、函数有关,堆要申请(变量在栈,对象在堆)
低级语言和高级语言
- 低级语言:汇编和机器语言
- 高级语言:面向各类应用的程序设计语言(java、c++…) (不依赖具体的机器硬件)
脚本语言(为了缩短传统的编写-编译-链接-运行过程而创建的计算机程序语言):
属于动态语言,其程序结构可以在运行中改变,动态语言都是解释型语言
eg.python是脚本语言、解释型语言、动态语言
在python语言中,列表list是一种可变的、有序的序列结构,其中元素可以重复(元组、字符串不可变,集合不能重复)
数据类型的作用:
1)便于为数据合理分配存储单元
2)便于对参与表达式计算的数据对象进行检查
3)便于规定数据对象的取值范围及能够进行运算
编译程序和解释程序
编译:高级语言源程序—(翻译)—>机器语言程序
反编译是编译的逆过程,不能把可执行的文件还原成高级语言源程序,只能转换成功能上等价的汇编语言
(编译过程中为变量分配提供存储单元所用的地址是逻辑地址,程序运行时再映射为物理地址)
语言之间的翻译形式 基本方式为:汇编、解释和编译
- 解释器:
翻译源程序时不生成 独立的目标程序,解释程序和源程序要参与 到程序的运行过程中
- 编译器:
翻译时将源程序翻译成独立保存的目标程序 ,机器上运行的是与源程序等价的目标程序,源程序和编译程序都不再参与 目标程序的运行过程
程序基本控制结构
- 顺序结构
- 选择结构
- 循环结构
逻辑表达式
and(左结合):真&&真=真 否则为假
or(左结合):假||假=假 否则为真
not(右结合):真!假 假!真
短路计算:(计算规则:从左边开始计算)
假&__=假
真||__=真
参数传递方式
-
值调用:(传值)
- 传递的是值;
- 将实参的值传递给形参,实参可以是变量、表达式和常量
- 修改形参 实参的值不会变(不可以实现形参和实参间双向传递数据的效果)
-
引用调用:(&传地址)
- 传递的是地址;
- 将实参的地址传递给形参,形参必须有地址,实参不能是表达式和常量(值)
- 修改形参的值 同时实参的值会变(可以实现形参和实参间双向传递数据的效果)
编译器工作阶段
**解释方式:**词汇分析、语法分析、语义分析(前3个,不可省略且位置不可交换)
**编译方式:**词汇分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成(其中"中间代码生成"、"代码优化"可省略)
*词法分析
- 词法分析的输入是源程序,输出是记号流
- 词法分析阶段的主要作用:分析构成程序的字符及右字符按照构造规则构成的符号是否符合程序语言的规定(识别单词)
*语法分析
- 输入是记号流,输出是语法树(分析数)
- 语法分析阶段的主要作用:(检查语句的结构)
- 对各条语句的结构进行合法性分析
- 分析程序中的句子结构是否正确
- 可以发现程序中的所有语法错误
- 语法分析方法:
- 自底向上:算符优先分析法、LR分析法、递进-归约分析法
- 自顶向下:递归下降分析法、预测分析法
*语义分析
- 输入是语法树(分析树)
- 语义分析阶段的主要作用:进行类型分析和检查
- 语义分析阶段不能发现程序中所有的语义错误,语义分析阶段可以发现静态语义错误,不能发现动态语义错误(死循环),动态语义错误运行时才能发现
- 语义分析方法:语法指导翻译
中间代码生成
- 常见的中间代码:后缀式、三地址码、三元式、四元式和树(图)等
- 中间代码与的 机器无关(不依赖具体的机器),可以将不同的高级程序语言翻译成同一种中间代码
- 中间代码可以跨平台
- 因与具体的机器无关,使用中间代码有利于进行与机器无关的优化处理和提高编译程序的可移植性
目标代码生成
- 目标代码阶段生成阶段的工作与具体的机器 密切相关
- 寄存器的分配工作处于目标代码生成阶段
符号表
-
不断收集、记录和使用源程序中 一些相关符号的类型和特征 等信息,并将其存入符号表中
-
记录源程序中各个字符的必要信息,以辅助语义的正确性检查和代码生成
*正规式
| :二选一 ; * :闭包,出现0次或多次
*有限自动机
-
有限自动机是词法分析的一个工具,它能正确地识别正规集
-
一个圈为初态,两个圈为终态;初态亦可以是终态
-
ε:空,不需要识别字符就可以转移
-
分类:
- 确定的有限自动机(DFA):对每一个状态来说识别字符后转移的状态是唯一的
- 不确定的有限自动机(NFA):对每一个状态来说识别字符后转移的状态是不确定的(有多条道路)
上下文无关文法
被广泛用于表示各种程序设计语言的语法
即 E——>T|(或)E+T,T——>F|(或)T*F,F——>-F|N…
(根据运算符号推导,可优先排除题干中没有的符号和括号)
eg.简单算术表达式的结构可以用下面的上下文无关文法描述(E为开始符号),___是符合该文法的句子
E——>T|E+T T——>F|()T*F
F——>-F|N N——>0|1|2|3|4|5|6|7|8|9
A.2- -3X4 B.2+ -3X4 C.(2+3)X4 D.2X4-3
*中缀、后缀表达式转换
中缀式:a?b(?为运算符号)
后缀式:ab?(也叫逆波兰式)
- 优先级:1.小括号() 2.乘除x、 / 3.加减+、- (逻辑与先于逻辑或)
优先级相同,按从右往左的顺序(中缀式——>后缀式)
- 栈:先进后出、后进先出(后缀式——>中缀式的原理,从左往右扫描)
eg.中缀式:1-2x(3+4)/5
后缀式:1234+5/x-
后缀式—>中缀式:从左往右扫描,遇到符号变中式,a为先b为后
- 遇到+号:3为先(进),4为后(进)===>3+4(成了一个整体)
- 遇到/号:3+4为先,5为后===>(3+4)/5
- 遇到x号:2为先,(3+4)/5为后===>2x(3+4)/5
- 遇到-号:1为先,2x(3+4)/5为后===>1-2x(3+4)/5
语法树 中、后序遍历
中序遍历:左根右——>中缀式(从右往左)
后序遍历:左右根——>后缀式(从左往右)