1.低级语言、高级语言:1)低级语言:包括机器语言(010101之类的)还有汇编语言(在机器语言中加入了简单的符号)
2)高级语言:java,c,c++之类的
2.如果源程序是用高级语言编写的,则需要解释程序(解释器)才能对其翻译
编译器:将源程序翻译成目标语言程序
3.解释器:翻译源程序时候,不生成独立的目标程序,但是参与目标程序运行过程
编译器:翻译时候讲源程序翻译成独立保存的目标程序,但是不参与目标程序的运行过程
4.程序的三种控制结构:顺序、选择、循环
5.程序类型的作用:1)便于为数据合理分配存储单元 2)可以用表达式运算进行数据对象的检查(整形不能乘浮点型) 3)便于规定数据的取值范围
6.数据范围大的和数据范围小的进行运算时候结果为数据范围大的eg:int+double=double
赋值时候,结果为被赋值数的数据类型
7.常量是有类型属性的,但是常量在运算时候不能改变,常量没有地址不能进行引用调用(传址调用 ),但是传值调用的时候可以传常量
8.传地址调用可以实现形参和实参的双向传递数据的效果
9.编译器工作阶段:1词法分析2语法分析3语义分析(前三个阶段不可省略不可交换顺序)(4中间代码生成5代码优化可以省略)6目标代码生成
解释方式工作阶段就只有编译器的123
10.符号表:不断收集源程序中的一些相关符号的类型和特征等信息,并将其存入符号表中。记录源程序中各个字符的必要信息,以辅助语义的正确性检查和代码生成
11.编译过程概述:1)词法分析:把源程序给编译器之后:可以把源程序看为多行字符串,作用就是对源程序的字符进行逐个扫描,主要用于分析构成程序的字符还有按照构造规则构成的符号是否复合程序语言的规定(printf打对了没)(输入源程序输出记号流)(扫描字符,识别单词)
2)语法分析:把上面的的单词符号分解成各类语法单位,就是检查语法(语句结构)有没有错误(eg:int a=“123”;虽然语法没有错误但是语义有错误(因为句子的形式是对的),不能把字符串划入整形)(输入记号流输出语法树)
2.5)动态语义错误就是在语义上没有错误,但是在运行之后就会报错那种
3)语义分析:是分析语法结构的含义,检查源程序是否有静态语义的错误,进行类型分析和检查(例如float型和整形不能互相做运算),不能发现动态语义错误(输入的是语法树)
4)目标代码生成:是编译器工作的最后一个阶段,这一阶段的工作与具体的机器密切相关。寄存器的分配工作是处于目标代码生成
12.中间代码生成:与具体机器无关,中间代码有后缀式,三地址码、三元式、四元式、树
可以把多种不同的高级程序语言翻译成一种中间代码,中间代码可以跨平台,有利于与机器无关的优化处理和提高可移植性
13.正规式:词法分析的一个工具
A | b的意思是a或者b(但是不能a,b一起出现)
A*:说明a可以出现0次或多次
A(…)是以a为首字符组成的集合
A | b* 的意思是a或者b*的集合
Ab*的意思是b可以出现多次,a可以出现一次
14.有限自动机:词法分析的工具:用于正确识别正规集
1)初态和终态的样子:
2)一次成功的识别:识别完串之后会停留在终态
3)确定的有限自动机 (DFA) : 对每一个状态来说识别字符后转移的状态是唯一的
4)不确定的有限自动机(NFA) : 对每一个状态来说识别字符后转移的状态是不确定的
5)如果没有识别结果的话可以用空(一部西戎)直接跳过
15.上下文无关文法:被广泛的用于标识各种程序设计语言,可以用于用字母求表达式
E:开始符号 E->T:E可以变成T 不能往后面推的话就是终结符号 竖线就还是或的意思
基本计算过程:
16.后缀式、中缀式:中:1+2、1-2
后:12+、12-(把运算符放到后面)
若要把中缀式转换为后缀式:算符号放到后面。运算优先级相同的(又有加又有减的):就先放右边再放左边,就是把整体看成a ? b转换成ab?eg:
把后缀式转换成前缀式就是:把a+b转换成ab+
17.中缀式遍历:左根右
例如这种,先把跟拿出来(把最上面的减号拿出来)左右两边的添加进去(变成了1 - *),在把*拿出来当根,左右的添加到两边。2*1 结果变成了(1-2*1)
后缀:左右根