• 作业一——编译原理概述


    2019年9月3日   作业一——编译原理概述

    1)简述编译程序与翻译程序、汇编程序的联系与区别。

      ① 编译程序是现代计算机系统的基本组成部分之一,从功能上看,一个编译程序就是一个语言翻译程序。但是编译语言不等同于翻译语言,编译语言是源语言想Pascal或者C这样的高级语言,目标语言是像汇编语言或机器语言那样的低级语言,这样的翻译程序才叫做编译程序。

      ② 翻译程序就是把一种语言(源语言)书写的程序翻译成另一种语言(目标语言)的等价程序。

      ③ 汇编程序是一个翻译程序,它把汇编语言程序翻译成机器语言程序。

    2)编译过程包括哪几个主要阶段及每个阶段的主要功能。

      编译过程包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成6个阶段。

    阶段 主要功能
    ①词法分析 是编译过程的第一个阶段,是从左到右一个字符一个字符地读入源程序,对构成源程序地字符流进行扫描和分解,从而识别出一个个单词。
    ②语法分析 是编译过程的第二个阶段,任务是在词法分析的基础上将单词序列分解成各类语法短语。这种语法短语也成为语法单位,可以表示成语法树。
    ③语义分析 审查源程序有无语义错误,为代码生成阶段收集类型信息。
    ④中间代码生成 将源程序变成一种内部表示形式,这种内部表示形式叫做中间语言或中间代码。所谓中间代码是一种结构简单、含义明确的记号系统,这种记号系统可以设计为多种多样的形式。
    ⑤代码优化 对前一阶段产生的中间代码进行变换或进行改造,目的是使生成的目标代码更为高效,即省时间和省空间。
    ⑥目标代码生成 把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。

    3)简述解释程序与编译程序的区别。

      ① 解释程序不需要在运行前先把源程序翻译成目标代码,也可以实现在某台机器上运行程序并生成结果。工作模式是一个个的获取、分析并执行源程序语句,一旦第一个语句分析结束,源程序就开始运行并且生成结果。特别适合程序员以交互方式工作的情况,即希望在获取下一个语句之前了解每个语句的执行结果,允许执行时修改程序。

      ② 编译程序是一个语言处理程序,它把一个高级语言程序翻译成某个机器的汇编语言程序或二进制代码程序,这个二进制代码程序在机器上运行以生成结果。程序员可以先准备好一个在该机器上运行的程序,然后这个程序便会以机器的速度运行,但是在不把整个程序全部翻译完成之后,这个程序是不能开始运行,也不能产生任何结果,编译和运行是两个独立分开的阶段。

    4)了解新开源的华为方舟编译器(https://www.openarkcompiler.cn/home),理解它的基本思想与采用的技术路线,谈谈它对安卓软件生态会有什么影响。

      方舟编译器是为支持多种编程语言、多种芯片平台的联合编译、运行而设计的统一编程平台,包含编译器、工具链、运行时等关键部件。 方舟编译器还在持续演进中,陆续将上述能力实现和开源。

      通过多语言统一IR表示,可实现应用中多种编程语言联合编译优化提升性能;在支持多平台的同时,根据设备特征提供便捷的开发与部署策略提升效率;将同一应用中的不同语言代码联合编译、联合优化,消除语言间的性能“鸿沟”,降低开发者的优化成本;通过编译器的语言实现能力和优化能力增强,应用运行时的开销更小;编译器与芯片实现软硬件协同优化,充分发挥硬件能效,应用体验更佳;支持面向多样化的终端设备平台进行编译和运行,根据设备特征提供便捷的开发与部署策略,提高开发效率。

    方舟编译器架构示意图

      当前方舟编译器支持Java/Kotlin程序字节码的前端输入,其它编程语言的支持(如 C/C++/JS 等)还在规划中,方舟编译器的中间表示(IR)转换器将前端输入转换成方舟IR,并输送给后端的优化器,最终生成二进制文件,二进制文件与编译器运行时库文件链接生成可执行文件,在方舟的运行环境中就可执行该文件。

      在知乎上看到,有用户说到华为的野心是为了将Java、JavaScript、Python、C、C++都要翻译到Maple IR,并且Maple IR是为了在芯片上运行做优化Wie目的的语言。虽然方舟编译器在网上争议还是很大,有一些程序员对其进行了批评,但是我们还是不能否认进步,我们可以学习官方文档,在使用过程中找到bug,帮助这一技术更加完善。在硬件和软件都要兼顾的情况下,共同学习,技术也是在一次次迭代中进步和完善,将来如果这项技术完善了,我认为会提高安卓软件生态的速度,提供给安卓用户更好的使用感。

  • 相关阅读:
    设计模式之装饰者模式
    每天一点点
    生财有道
    地图的移动和缩放
    钱分割
    位运算
    ref和out
    使用startCoroutine制定倒计时
    静态类和单例类
    Awake和Start
  • 原文地址:https://www.cnblogs.com/cyxxixi/p/11452064.html
Copyright © 2020-2023  润新知