一些简单的概念笔记

1、重定位

  汇编器产生的目标程序至少包含三个区,即文本区,数据区和bss区。文本区一般包括程序的代码和常量,数据区通常存放全局变量等内容,bss区用于存放未初始化的变量或作为公共变量存储空间。在一个目标文件中,其text区从地址0开始,随后是data区,再后面是bss区。而要运行程序,必须装载到内存中,所以这些区的地址需要在内存中重新安排,也就是重定位。

2、链接器和加载器

  链接器解决外部内存地址问题,而加载器把所有的可执行目标文件放到内存中执行。

3、 语法分析

  为一个给定的终结符号串构建一颗语法分析树的过程称为对该符号串进行语法分析。语法分析的任务,即接受一个终结符号串作为输入,找出从文法的开始符号推导出这个串的方法。

4、根据运算符的结合性和优先级构建算法表达式的文法如下:

  expe -> expr + term | expr - term | term

  term -> term * factor | term / factor | factor

  factor -> digit | (expr) 

  digit -> 0 | 1 | 2 | 3 | 4 |5 | 6 | 7 | 8 | 9  

 5、PCT(Parrot Compiler Tools/Parrot Virtual Machine)

  The PCT are a set of tools that people can use to quickly and easily implement new programming languages on the Parrot platform.

  参考:http://en.wikibooks.org/wiki/Parrot_Virtual_Machine/Parrot_Compiler_Tools 

  学习:http://docs.parrot.org/parrot/latest/html/ 

 6、静态作用域和动态作用域的类比

  动态规则处理时间的方式类似于静态作用域处理空间的方式。原因是静态规则让我们寻找的声明位于最内层的、包含变量使用位置的块中,而动态规则让我们寻找的声明位于最内层的、包含了变量使用时间的块中(如C预处理器的宏扩展#define a (x+1))。

7、柯里化(Currying)

  是把接受多个参数函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。如果你固定某些参数,你将得到接受余下参数的一个函数。所以对于有两个变量的函数y^x,如果固定了y=2,则得到有一个变量的函数2^x

8、lambda演算(须查阅资料)

  Lambda演算可以被称为最小的通用程序设计语言。它包括一条变换规则(变量替换)和一条函数定义方式,Lambda演算之通用在于,任何一个可计算函数都能用这种形式来表达和求值。因而,它是等价于图灵机的。看这里http://zh.wikipedia.org/wiki/%CE%9B%E6%BC%94%E7%AE%97

9、求值策略(Evaluation strategy)

  求值策略(Evaluation strategy)是确定编程语言表达式的求值的一组规则(通常确定性的)。求值策略定义何时和以何种次序求值给函数的实际参数,什么时候把它们代换入函数,和代换以何种形式发生。经常使用用来研究函数的形式系统λ演算来建模求值策略,这里它们通常叫做归约策略。求值策略分为两大基本类,严格的和非严格的,基于如何处理给函数的实际参数。一个语言可以组合多种求值策略。详见http://zh.wikipedia.org/wiki/%E6%B1%82%E5%80%BC%E7%AD%96%E7%95%A5

10、后缀表示

  其转换规则:1)若E为一个变量或者常量,则E -> E;

            2)若E是如同E1 op E2的表达式,则E -> E1 E2 op;

        3)若E是形如 (E1)的被括起的表达式,则E -> E1. 

  其运算规则:从左到右扫描后缀串,发现第一个运算符后向左找到对应数目的运算分量,将该运算符与运算分量组合计算后的结果将替换原来的运算分量和运算符这一子串,接着继续扫描过程直至不再有运算符为止。如9 5 2 + - 3 * => 9 7 - 3 * =>2 3 * => 6。

11、简单语法制导定义

  将产生式体中各非终结符符号的翻译结果按照它们在非终结符符号中的出现顺序连接起来,并在其中穿插一些附加的串,从而得到代表产生式头部非终结字符的翻译结果字符串的语法制导定义。 如:

  产生式                                      语义规则(“||”是字符串连接运算符)

  expr -> expr1 + term               expr.t = expr1.t || term.t || '+'(其中‘+’是唯一的附加符号)

12、与语法制导翻译相关的两个重要概念 -- 属性与翻译方案

  属性:表示与某个程序构造相关的任意的量。属性有分综合属性和继承属性,综合属性可以在自底向上遍历语法树时计算,而继承属性则在自顶向下遍历语法树时计算。属性可以以多种多样的形式存在,如生成的代码的指令数目、表达式的数据类型、某个构造生成的代码中的第一条指令地址等都是属性的例子。由于我们用文法符号来表示程序构造,所以我们将属性的概念从程序构造扩展到表示这些构造的文法符号上。

  翻译方案:翻译方案是一种将程序片段附加到一个文法的各个产生式上的表示法。当在语法分析过程中使用一个产生式时,相应的程序片段(即语义动作)就会执行。这些程序片段的执行效果按照语法分析过程的顺序组合起来,得到的结果就是这次分析/综合过程处理源程序得到的翻译结果。

  语法制导翻译方案和语法制导定义相似,只是显式指定了语义规则的计算顺序。(尚未很好理解)

13、前序遍历和后序遍历

  前序遍历和后序遍历是深度优先遍历的两种重要的特例。在这两种遍历中,我们都是从左到右递归地访问每个结点的子结点。而其区别在于:

  前序遍历:被要求的特定动作在我们第一次访问一个结点时被执行;

  后序遍历:被要求的特定动作在我们最后一次访问一个结点时被执行。

 

posted on 2015-04-13 15:19  沙尘万里  阅读(251)  评论(0编辑  收藏  举报

导航