1.遍
编译过程的5个阶段是从逻辑功能上进行划分的,具体实现时,受不同语言、设计要求、使用对象和计算机条件(如内存大小)的限制,往往将编译程序组织为若干遍的处理过程。所谓“遍”(Pass),指的是对源程序或源程序的中间结果从头到尾扫描一次并完成规定任务的过程。通常,每遍的工作由从外存上获得前一遍的中间结果开始,完成有关工作之后再把结果存放于外存。但是,对于第一遍而言,从外存上获得的是源程序,而非源程序的中间结果。例如,词法分析器对源程序进行扫描并生成token文件,同时进行必要的符号登记工作;语法分析器再对token文件进行扫描,构造语法分析树。上述过程均可作为单独的一遍进行处理。
对于编译程序而言,究竟一遍处理好,还是多遍处理好,往往是不定的。既可以将几个不同的编译阶段合为—遍,也可以把一个阶段的工作分为若干遍来处理。例如,我们可以把词法分析、语法分析、语义分析与中间代码产生这3个阶段安排成一遍,此时,语法分析器处于核心位置,当它需要下一个单词符号时,就会调用词法分析子程序,一旦识别出一个语法单位时,就会调用语义分析子程序来完成语义分析工作并生成相应的中间代码。
遍数多尽管使得整个编译程序的逻辑结构更加清晰,但势必增加一些不必要的输入输出操作,不仅浪费时间,而且浪费空间。因此,只要计算机条件许可,一般还是遍数少一点为好。应当注意的是,并不是每种语言都可以用单遍编译程序来实现的。
2.编译前端与后端(www.xing528.com)
编译程序有时也可划分为编译前端和后端。前端(Front End)主要由与源语言有关但与目标机无关的那些部分组成,通常包括词法分析、语法分析、语义分析和中间代码生成以及部分代码优化工作;后端(Back End)主要由与源语言无关但与中间语言和目标机有关的部分组成,包括部分代码优化和目标代码的生成。
上述划分的好处在于:可以取某一编译程序的前端,配上不同的后端,就能构成同一源语言在不同机器上的编译程序,这样就可实现编译程序的目标机的改变;若用不同的前端配上一个共同的后端,就可以为同一机器生成不同语言的编译程序。
为了使编译程序的目标机可以改变,通常需要定义一种良好的中间语言作为支持。例如,在Java语言环境里,为了使编译后的程序能从一个平台移到另一个平台上来执行,Java定义了一种中间代码,称为虚拟机代码(Bytecode)。只要实际使用的操作平台上存在执行Bytecode的Java解释器,该操作平台就可以执行各种Java程序。这就是常说的Java语言的操作平台无关性。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。