编译与解释(腾讯)

1、题目:编译的哪个阶段生成Parse Tree?答案:语法分析(语义分析?)的结果表示为分析树(Parse Tree)或语法树(syntax tree)。

2、编译与解释可以参考《编译原理(第2版)》中的第一章。

可参看http://www.cnblogs.com/bluestorm/archive/2012/12/09/2810167.html  

  对于C和C++,它们经过一次编译之后,可以由操作系统直接执行,所以它们是编译型语言。而Java不一样,它首先由编译器编译成.class(字节码)文件,然后在通过JVM从.class文件中读一行解释执行一行,所以它是解释型的语言。

  也正是由于java对于多种不同的操作系统有不同的JVM,所以实现了真正意义上的跨平台。Java源程序先编译成字节码-->JAVA虚拟机进行边解释边执行

  定义:

编译型语言:把做好的源程序全部编译成二进制代码的可运行程序(即生成目标程序)。然后,可直接运行这个程序。特点:执行速度快、效率高;依靠编译器、跨平台性差。包括:C、C++、Delphi、Pascal、Fortran

解释型语言:把做好的源程序翻译一句,然后执行一句,直至结束,不生成目标程序!特点:执行速度慢、效率低;依靠解释器、跨平台性好。包括:Java、Basic、javascript

3、一个完整的语言处理系统

   除编译器之外,创建一个可执行的目标程序还需要一些其他程序。一个源程序可能被分割成多个模块,并存放于独立的文件中。(下面只看文字)

 

4、编译

编译器能够把源程序映射为语义等价的目标程序。这个映射过程由两部分组成:分析和综合。

       

(1)词法分析:例如图1-7所示。分割词素的空格会被词法分析器忽略掉。

(2)语法分析:语法分析器使用由词法分析器生成的各个词法单元的第一个分量来创建树形的中间表示。该中间表示给出了词法分析产生的词法单元流的语法结构。常用的是语法树,树中每个内部结点表示一个运算,该结点的子结点表示该运算的分量。比如赋值表达式的运算顺序。

(3)语义分析:主要是类型检查,比如数组下标一定要是整数,比如类型的自动转换。

 (4)中间代码生成:该中间表示应该具有两个性质,即易于生成,并且能够轻松的被翻译成目标机器上的语言。

    例如:三地址代码的中间表示形式(图1-7):赋值指令右侧最多只有一个运算符;编译器应生成一个临时的名字存放三地址指令计算得到的值;有些三地址指令的运算分量少于三个。

(5)代码优化:机器无关的优化和机器相关的优化

(6)代码生成:如果目标语言是机器代码,则必须为程序使用的每个变量选择寄存器或内存位置。

 (7)符号表管理:为每个变量名创建一个记录条目,存放名字的各个属性。允许编译器迅速查到每个名字的记录,并快速存取记录中的数据。

原文地址:https://www.cnblogs.com/seven7seven/p/3662950.html