第一次作业--编译原理概述(20190903)
2019-09-03 10:43:54
简述编译程序与翻译程序、汇编程序的联系与区别。
被翻译的程序称为源程序;
翻译出来的程序称为目标程序或目标代码;
将汇编语言和高级语言编写的程序翻译成等价的机器语言,实现此功能的程序称为翻译程序;
把汇编语言写的源程序翻译成机器语言的目标程序称为汇编程序;
编译程序是将高级语言写的源程序翻译成目标语言的程序。
区别
编译: 高级语言 --> 机器语言(指令);
汇编: 汇编指令 --> 机器指令;
编译程序主要由6个部分组成:
- (1)词法分析程序;
- (2)语法分析程序;
- (3)语义分析程序;
- (4)中间代码生成;
- (5)代码优化程序;
- (6)目标代码生成程序;
编译过程包括哪几个主要阶段及每个阶段的主要功能。
词法分析的 功能是对输入的高级语言源程序进行词法分析,识别其中的单词符号,确定它们的种类,交给语法分析器,即把字 符串形式的源程序分解为单词符号串形式。
语法分析的功能是在词法分析结果的基础上,运用语言的语法规则,对 程序进行语法分析,识别构成程序的各类语法范畴及它们之间的层次关系,并把这种层次关系表达成语法树的形式。
词义分析和中间代码生成的功能是在语法分析的基础上,对程序进行语义分析,“理解”其含义,产生出表达程序 语义的内部表达形式(中间代码)。
优化的功能是按照等价变换的原则,对语义分析器产生的中间代码序列进行等 价变换,删除其中多余的操作,对耗时耗空间的代码进行优化,以期最后得到高效的可执行代码
解释程序与编译程序的主要区别
编译程序将源程序翻译成目标程序后再执行目标程序,
而解释程序是逐条读出源程序中的语句并执行,即在解释程序的执行过程中并不产生目标程序。
编译程序能将汇编语言源程序编译成目标程序,而解释程序不能。解释程序通常适用于交互方式工作的,或调试状态下运行的。
了解新开源的华为方舟编译器(https://www.openarkcompiler.cn/home),理解它的基本思想与采用的技术路线,谈谈它对安卓软件生态会有什么影响。
安卓的四大命门
第一个命门 Java的“虚拟机”
第二个命门 Java的“原罪”——额外的JNI开销
第三个命门 代码优化空间有限
第四个命门 Java现有内存回收机制易造成间歇性卡顿
方舟编译器从立项开始,就是要彻底干掉虚拟机
最关键的就是要能够将Java代码直接编译成010101的机器码。
方舟编译器能够将Java代码编译成机器能直接执行的语言。经过华为方舟编译器的APP,再也不需要在手机上编译了,彻底告别了虚拟机,从而带来了媲美甚至超越iOS的安卓体验。
方舟编译器的第二个使命,就是干掉混合语言互相调用带来的JNI开销。
不同语言代码在开发者环境中能够统一编译成同一套可直接执行的机器码,从而彻底消除混合语言互相调用的开销。
华为方舟编译器,直接将代码优化从手机环节搬到了开发者环境,未来还可能搬到云端。
开发者使用方舟编译器,并不需要改变原来的编码习惯。开发者可以自行开发代码优化算法,也可以仅通过方舟编译器预置的算法进行代码优化。
未来,华为还将提供代码调优工具,开发者可以选择根据工具的优化建议来调整代码,和方舟编译器配合获得更优的执行效果。
方舟的第四个使命,就是解决安卓虚拟机GC内存回收带来的“Stop World”。
方舟编译器采用了引用计数法(RC,Reference Counting)来进行内存的实时回收,并且配合使用了专门的消除环算法(消除对象互相引用带来的无法回收问题),来避免GC集中式回收带来的系统卡顿。
相比GC,方舟的内存回收是实时的而非集中式的,且不需要暂停应用进程,这样便大大消除了卡顿。
方舟编译器在运行状态下引入了高效的环回收机制,允许有选择的智能回收某个APP的内存占用,这对传统的环回收算法是一个非常棒的改进。
正是因为方舟做到混合语言的统一中间表示和完全静态编译,它干掉了虚拟机,消除了JNI开销,告别了GC内存回收的“间歇性”卡顿,以及其他很多开销。
同时,为开发者进行代码优化提供了一个更广阔的舞台。

浙公网安备 33010602011771号