1.1.1 编译器和解释器之间的区别是什么?
答:编译器是把源语言程序(高级语言程序)翻译成目标语言程序(机器语言程序),然后由虚拟机(目标语言程序的运行环境)执行编译的结果程序;由于这个过程很直接,所以编译器的速度快于解释器;但是相对解释器来讲,编译器的错误诊断效果较弱。解释器是把源语言程序(高级语言程序)先翻译成一种中间语言程序(Java的字节码程序),然后对中间语言程序进行解释执行;由于整个过程分为两个部分来执行,所以速度慢于编译器;但是相对于编译器来讲,解释器的错误诊断效果更高。
1.1.2编译器相对于解释器的优点是什么?解释器相对于编译器的优点是什么?
答:前者:在用户把输入映射成输出的过程中,由一个编译器产生的机器语言目标程序通常比一个解释器快的多;后者:在上述同一过程中,解释器的错误诊断效果通常比编译器更好,因为它逐个语句地执行源程序。
1.1.3在一个语言处理系统中,编译器产生汇编语言而不是机器语言的好处是什么?
答:因为汇编语言比较容易输出和调试,接着,这个汇编语言程序由称为汇编器的程序进行处理,并生成可重定位的机器代码。
1.1.4 把一种高级语言翻译成另一种高级语言的编译器称为源到源的翻译器。编译器使用c语言作为目标语言有什么好处?
答:就好比为什么编译器要产生汇编语言而是不是机器语言一样,C语言更简单更常用更加容易理解,同样方便调试和输出。
1.1.5 描述一下汇编器所要完成的任务。
答:汇编器就类似与编译器,只是它的源语言不是高级语言而是汇编语言。同样,它需要一个预处理器进行预处理,如聚合文件,展开宏等。写成的机器语言也要类似与连接器和加载器的程序,完成类似的工作。
1.1.6 详解解释器执行慢的原因?(自选)
答:一般来说,解释执行的效率低于编译执行的效率,究竟相差多少,与所用的中间语言有关。对于一种极端的解释执行(没有编译阶段,只有解释阶段)效率低的原因是:对于编译执行来说,对源程序的词法分析、语法分析和语义分析只要执行一次。对于解释执行来说,每次执行到源程序的某个语句时,都要对其进行一次词法分析、语法分析和语义分析,确定了这个语句的含义后,才能执行该含义指定的计算。显然,反复分析循环体降低了解释执行的效率。因此,解释执行需要寻找一种合适于解释的中间语言,以降低反复分析需要的时间。
1.2.1 一个编译器的结构:分析部分和综合部分;其中分析部分包括内容:词法分析、语法分析和语义分析,综合部分包括内容:中间代码生成、代码生成和代码优化;分析部分经常被称作编译器的前端,而综合部分称为后端;
1.2.2 如果我们更加详细地研究编译过程,会发现它顺序执行了一组步骤、每个步骤把源程序的一种表示方式换成另一种表示方式。而在整个过程中有一个存放整个源程序的信息符号表可由编译器的各个步骤使用。
1.2.3 一个编译器的各个步骤:如下图所示
1.2.4 词法分析
编译器的第一个步骤称为词法分析或扫描。词法分析器读入组成源程序的字符流,并且将他们组织成为有意义的词素的序列。对于每个词素,词法分析器产生如下形式的词法单元作为输出:<token-name attribute-value> :在这个词法单元中,第一个分量是一个由语法分析步骤使用的抽象符号,而第二个分量指向符号表中关于这个词法单元的条目。符号表条目的信息会被语义分析和代码生成步骤使用。
例:如下语句的词法分析阶段:
Position=initial + rate * 60
解析:position是一个词素,被映射成词法单元<id,1>其中id是表示标识符的抽象符号,而1指向符号表中position对应的条目。
+也是一个词素,被映射成词法单元<+>
切记:分隔词素的空格会被词法分析器忽略掉。
1.2.5 语法分析
第二个步骤称为语法分析或解析。语法分析器使用由词法分析器生成的各个词法单元的第一个分量来创建树形的中间表示。一个常见的中间表示方法是语法树,树中的每个内部结点表示一个运算,而该结点的子结点表示该运算分量。
1.2.6 语义分析
语义分析器使用语法树和符号表中的信息来检查源程序是否和语言定义的语义一致。它同时也收集类型信息,并把这些信息存放在语法树或符号表中,以便在随后的中间代码生成过程中使用。语义分析的一个重要部分是类型检查。
1.2.7 中间代码生成
在把一个源程序翻译成目标代码的过程中,一个编译器可能构造出一个或多个中间表示。这些中间表示可以有多种形式。该中间表示应该具有两个重要的性质:它应该易于生成,且能够被轻松地翻译为目标机器上的语言。