编译原理_P1004

龙书相关知识点总结

//*************************引论***********************************//

1.  编译器(compiler):从一中语言(源程序)等级的翻译成另外一种语言(目标语言)编写的程序过程。如果目标语言是可执行的机器语言,那么它就可以被用户调用,处理输入并产生输出。

2.  解释器(interpreter):一般可以认为是编译器过程的前半部分,其不生成目标语言。

3.  常见的语言处理系统流程图

  上面是宏观的解释编译器,微观来说编译器属于整个“编译过程”的中间一个环节

  过程:

  源程序→(预处理器)→经过预处理的源程序→(编译器)→目标汇编程序→(汇编器)→可重定位机器代码→(连接器/加载器)→目标机器代码

3.1  预处理(preprocessor):负责把那些成为宏的缩写形式转换为源语言的语句。

3.2  宏(mirco):编译好的一些指令集合或者程序集合。

3.3  汇编器(assembler):把远程汇编成伪代码或者机器代码的工作。

3.4  重定位:把程序的逻辑地址空间转换为内存中实际物理空间的过程,也就是在装入时对目标程序中的指令和数据进行修改的过程。

3.5  链接器(linker):可重定位的机器代码有必要和其他可重定位的目标文件以及库文件链接到一起,形成真正的机器上运行的代码。一个文件中的代码可能指向另一个文件中的位置,而链接器就是可重定位的操作方式。(到这一步才是真正实现语言对于机器语言的转换,形成一个exe或者其他的可执行文件)

3.6  加载器(loader):把所有的可执行目标文件放到内存中执行。

4.  编译器逻辑结构

  把编译器看做一个黑箱的话,接收到经过预处理的源程序后,会经过如下步骤,生成目标汇编程序(也叫目标及其语言),扔给编译器:

  (符号表(symbol table))

  字符流→(词法分析器)→符号流→(语法分析器)→语法树→(语义分析器)→语法树→(中间代码生成器)中间表示形式→(机器无关代码优化器)→中间表示形式→(代码生成器)→目标机器语言→(机器相关代码优化器)→目标机器语言

  其中红色部分叫做前端(front end),蓝色表示部分也叫后端(back end);这两部分也分为分析和综合。是通过中间代码进行分割的。
5.   符号表(symbol table)的简单说明
  编译器的第一个步骤词法分析或者叫扫描,把他们组织成有意义的词素(lexeme),其实符号表就是类似于一种“火星文”或者载体的形式,把字符流拆分成一个一个的词法单元(token,有的教材叫做记号或者符号),作为输出到下面,组织完成后字符流就变成符号流了。
  符号表一般有如下这么样的定义:
  <token-name,attribute-value>
  <标识符(identifier),标识符属性>
  教材例子:
  position = initial + rate * 60
  通过用符号表中的词法单元表示如下,生成一串符号流:
  <id,1><=><id,2><+><id,3><*><60>,每一个尖括号里面的都是一个词素(lexeme),id叫做标识符,有时候数字本身就是标识符,或者记号。
6.   面向对象的主要思想:数据抽象和特性的继承、模块化
7.   并行(parallelism)和内存层次结构(memory hierarchy)
  并行:CPU
  内存层次结构:cache缓存
8.   RISC和CISC
  精简指令集计算机和复杂指令集计算机,现在的intel大多是复杂指令集计算机,但是发热大,功耗高。x86机器。
9.   SQL
  structured Query Language,结构化查询语言
10.   环境和状态
  环境:一个名字到存储位置的映射。因为变量就是指内存位置,我们还可以换一种方法,把环境定义为从名字到变量的映射。
  状态:是内存位置到他们的映射
  C语言中环境是左值,状态是右值
11.   静态作用域和块结构
  块:最直观的在C中就是用{ }来界定,作用域:变量在那个区域起作用。
12.   声明和定义
  声明一般指规定变量类型,定义一般是变量的赋值过程。
13.   动态作用域和静态作用域的类比
  虽然可以有各种各样的动态或者静态作用域的策略,在通常的(块结构的)静态作用域规则和通常的动态策略之间有一个有趣的关系。从某种意义上来说,动态规则处理时间的方法类似于静态作用域处理空间的方法。静态规则让我们寻找声明位与最内层、包含变量使用位置的单元(块)中;而动态规则扔我们寻找声明位于最内层的、包含了变量使用时间的单元(过程调用)中。
  位置和时间
  空间和过程
14.   值调用和引用调用
  值调用(call-by-value):对实参求值(如果它是表达式)或拷贝(如果它是变量)
  引用调用(call-by-Reference):实参的地址作为相应形参的值被传递给调用者。
  这就像在高级语言中,引用调用,在使用函数的时候,把实参的地址发送给函数的形参,形参拿到实参的地址去调用相关的表达式或者变量。
15.   别名
  这个问题最常见的是在浅拷贝和深拷贝的上面。两个形式参数会指向同一个对象,造成一个变量的修改改变了另一个变量的值。另外,在声明变量的时候,切记尽量不要重名。(在某些特性环境也是可以的)
16.   正则式是一种算法
 
 
 
//*************************一个简单的语法制导翻译器***********************************//
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/noah0532/p/8993481.html
今日推荐