投递人 itwriter 发布于 2020-10-14 19:08 评论(15) 有1938人阅读 原文链接

  2019 年 8 月底,华为方舟编译器(OpenArkCompiler)正式开源,迈出了跨越性的一步。

  一年多来,方舟编程体系陆续实现了编译器、引擎、调试器的开源,其中编译器的重点功能主要集中在 Java 应用程序静态编译上。

  华为强调,方舟项目的目标是构建一个基于 MapleIR 的跨语言编程环境,实现跨语言的全局分析及优化。

  比如在现有 Java 编程环境下面,开发者经常需要同时编写 Java、C语言程序,通过 JNI 相互调用,而这两种语言之间目前是不直接互通的。

  方舟编程体系的终极愿景之一,就是要通过一致的 IR 来表述不同语言,并跨越语言进行全局优化。

  现在,方舟编译器加入了对C语言程序的支持,当然继续开源,也是实现 Java 和C混合编译的基础。

  未来,方舟引擎不仅要对来自 Java 语言的 IR 代码进行 JIT 编译,也会支持对C、C++语言的 IR 代码进行 JIT 编译。

  代码链接地址:“码云”

  1、https://gitee.com/openarkcompiler-incubator/mapleall

  2、https://gitee.com/openarkcompiler-incubator/maple_engine

  本次开源内容主要限于 O0 的能力范围,针对C的 O2 以上的优化留待未来进一步开源。

  目前,方舟编译器已经支持C语言的绝大部分常用特性,暂不支持的特性有 complex 类型、packedstruct、long double、alloca out-of-scope free。

  当前支持 aarch64 后端,并支持绝大部分 gcc_torture 用例,比如配合一款第三方合作的C前端(开源时间待定),可以正确运行 spec2017 的所有C语言整型用例。

  下一步,方舟社区计划在 Maple 编译器上做更多的拓宽和深耕工作。

  广度上,一方面会尝试支持新的语言,进一步验证 Maple 基础平台的语言无关性,另一方面会增加对新后端如 RISC-V 的支持。

  深度上,社区会尽快开源 O2 分析与优化 phase,性能对标 LLVM/GCC,同时利用统一的 Maple 表示,布局跨语言全局优化。

  正式开源以来,方舟社区开源代码从 50K 增长到 170K,累计 6.9K Star,并孵化 5 个相关子项目。

  方舟编译器作为方舟编程体系的重要一环,目前展现的还只是是静态编译,未来随着方舟引擎的完备,可以看到方舟编译器在各种 AOT 或者 JIT 编译时的运用,以及众多依赖于编译分析的软件分析和优化工具。

  相关阅读

  华为方舟编译器深入解读:已有 45 款第三方应用

  8 月 31 日,华为方舟编译器(OpenArkCompiler)正式开源,官网已上线,源代码包、二进制包已提供下载,相关文档、演示等资料也一应俱全。

  本次方舟编译器开源的是编译器框架部分源码,包括编译器中间表示(IR)和语言编译实现,同时搭配编译器其他二进制组件,实现 Java 程序到 aarch64 汇编指令的编译过程。

  开发者可基于开源代码+二进制,编译构建出编译器工具链,尝试对 Java 程序进行编译。

  社区参与者可以通过框架源码学习方舟编译器的编译器中间表达(IR)及基本的中端编译框架,熟悉方舟编译器的架构思想,并参与诸如对编译器中端优化的贡献。

  【方舟编译器的优势】

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

  通过多语言统一 IR 表示,方舟编译器可实现应用中多种编程语言联合编译优化提升性能,而且在支持多平台的同时,根据设备特征提供便捷的开发与部署策略提升效率。

  华为方舟编译器提供了全新的系统及应用的编译和运行机制,从动态编译变为静态编译,就是直接将高级语言直接编译成机器码,彻底消除了虚拟机动态编译的额外开销,实现了开发和运行效率的兼容并举。

  1、多语言联合

  将同一应用中的不同语言代码联合编译、联合优化,消除语言间的性能“鸿沟”,降低开发者的优化成本

  2、轻量运行时

  通过编译器的语言实现能力和优化能力增强,应用运行时的开销更小

  3、软硬件协同

  编译器与芯片实现软硬件协同优化,充分发挥硬件能效,应用体验更佳

  4、多平台支持

  支持面向多样化的终端设备平台进行编译和运行,根据设备特征提供便捷的开发与部署策略,提高开发效率

  【方舟编译器的架构设计】

  当前方舟编译器支持Java/Kotlin 程序字节码的前端输入,C/C++/JS 等其它编程语言的支持还在规划中。

  方舟编译器的中间表示(IR)转换器将前端输入转换成方舟 IR,并输送给后端的优化器,最终生成二进制文件,二进制文件与编译器运行时库文件链接生成可执行文件,在方舟的运行环境中就可执行该文件。

  方舟编译器 IR 是支持程序编译和运行的中间程序表示。程序源代码中的任何信息对于程序分析和优化都是有帮助的,所以方舟 IR 的目标是尽可能完整详细地提供源程序的信息。

  【方舟编译器的环境配置】

  - 硬件配置推荐

  方舟编译器的硬件配置需求不高,最低只需 2GHz 双核心处理器、2GB 内存、200GB 硬盘空间,当然要获得最高效率,更高配置是强烈推荐的。

  - 开发环境推荐

  需要 64 位版本的 Linux,尤其推荐Ubuntu 16.04

  sudo apt-get -y install openjdk-8-jdk git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip lib32z1-dev qemu g++-multilib gcc-multilib python3-paramiko python-paramiko python-jenkins python-requests python-xlwt libglib2.0-dev libpixman-1-dev linux-libc-dev:i386

  sudo apt-get -y install gcc-5-aarch64-linux-gnu g++-5-aarch64-linux-gnu

  - Clang 编译器

  主要用于编译方舟编译器代码。

  下载 clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04,地址:

  http://releases.llvm.org/download.html#8.0.0

  放置到 openarkcompiler/tools 目录,打开 openarkcompiler/build/config/BUILDCONFIG.gn 文件,将 GN_C_COMPILER、GN_CXX_COMPILER 和 GN_AR 三个变量配置为 Clang 编译器所在路径。例如:

  GN_C_COMPILER = "${MAPLE_ROOT}/tools/clang_llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04/bin/clang"

  GN_CXX_COMPILER = "${MAPLE_ROOT}/tools/clang_llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04/bin/clang++"

  GN_AR = "${MAPLE_ROOT}/tools/clang_llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04/bin/llvm-ar"

  其中${MAPLE_ROOT}为 openarkcompiler 源码根目录。

  安装 Ninja、GN 并完成配置

  - Ninja、GN

  下载 Ninja (v1.9.0) 及 GN (Linux Version) Ninja,地址:

  https://github.com/ninja-build/ninja/releases

  GN 下载地址:

  https://archive.softwareheritage.org/browse/content/sha1_git:2dc0d5b26caef44f467de8120b26f8aad8b878be/raw/?filename=gn

  将 GN 和 Ninja 可执行程序放置到 openarkcompiler/tools 目录,打开 openarkcompiler/Makefile 文件,将 GN 和 NINJA 两个变量配置为 GN 和 Ninja 可执行程序所在路径。例如:

  GN := ${MAPLE_ROOT}/tools/gn/gn

  NINJA := ${MAPLE_ROOT}/tools/ninja_1.9.0/ninja

  【方舟编译器 FAQ】

  Q1:方舟编译器开源有官方网站吗?

  A1:

  孵化期间,官方网站为 https://www.openarkcompiler.cn。正式毕业后的官网待定。

  Q2:方舟编译器是一次性全部代码吗?

  A2:

  首次开源范围是编译器 IR (Intermediate Representation)、RC (Reference Counting)和多语言设计思想等,用于与业界、学术界沟通交流。后续将陆续开源编译器前端、后端,支持其它语言(比如 JavaScript)的编译等。

  当前部分 Java 语言特性和 JVM 虚拟机特性的支持未包括在本次开源代码中,包括 annotation、lambda 表达式、泛型等。

  目前仍有很多地方不完善,会在社区陆续迭代,遇到问题请在社区提交 issue。

  Q3:通过哪些渠道可以获取方舟编译器的框架源码?

  A3:

  孵化期间,开发者可以通过如下代码托管网址获得相关代码和文档,供参考学习、了解方舟编译器的架构和代码。

  华为云托管地址:

  https://code.opensource.huaweicloud.com/HarmonyOS/OpenArkCompiler

  开源中国码云托管地址:

  https://gitee.com/harmonyos/OpenArkCompiler

  Q4:方舟编译器开源路标是怎样的?

  A4:

  方舟编译器从 2019 年 8 月开始开源,欢迎广大的应用开发者、手机厂商、软件从业人员一起共建开源社区和生态。

  开源计划大体上这样安排:2019 年 8 月重点开源框架部分;后续将陆续开源编译器前端、后端;支持 Jav 程序编译、JavaScript 语言应用的编译等。

  Q5:还有哪些方式可以获取方舟编译器的相关信息?

  A5:

  方舟编译器有官方微信公众号:开源方舟编译器

  Q6:方舟编译开源面向全球开发者吗?英文网站何时上线?

  A6:

  方舟编译器是向全球开发者进行开源,因此,官方网站和代码托管平台均面向全球开发者开放。

  目前英文版网站正在紧张的开发及内测,计划将于 2019 年 Q4 上线。

  Q7:方舟编译器源码托管计划是怎么的?

  A7:

  孵化委员会期间,方舟编译器代码是托管在华为云上面。

  在未来走向开放治理以后,将由所挂靠机构选择的平台进行托管。如果挂靠的机构采取了X平台,就采用这个机构的代码托管模式进行托管。

  当前代码托管的地址:

  https://code.opensource.huaweicloud.com/HarmonyOS/OpenArkCompiler

  所有相关信息请以方舟编译器开源官方网站发布为准。

  Q8:方舟编译器开源使用的是什么 License?

  A8:

  方舟编译器采用木兰 License,由业界众多专家和公司集体共建,并非华为主导,具体好处详见专业点评:

  开源中国:https://www.oschina.net/news/108840/mulanpsl-the-1st-opensource-license-of-china

  开源社:https://mp.weixin.qq.com/s/1xqxxiNKhcgw4RRspAaW2A

  InfoQ:https://www.infoq.cn/article/KrZAbAcJrxCU27vKj*JE

  Q9: 如何确认下载包来源可靠?MD5 校验码是多少?

  A9:

  OpenArkCompiler-0.2-ubuntu-16.04-x86_64.tar.gz 二进制包的 MD5 码是:e7dc8b8c242f2d26429e2ad71dae3112

  OpenArkCompiler-0.2.tar.gz 源代码包的 MD5 码是:1bf859a67c8b9a2d4080bdaf25ef6181

华为方舟编译器正式支持C语言:完全开源的更多相关文章

  1. 华为方舟编译器 下载 和 LiteOS Studio Setup 2019-04-16.exe SDK下载

    华为方舟编译器是首个取代Android虚拟机模式的静态编译器,可供开发者在开发环境中一次性将高级语言编译为机器码.此外,方舟编译器未来将支持多语言统一编译,可大幅提高开发效率. 编译器下载 [Ark] ...

  2. 华为“方舟编译器”到底是啥?一文看懂TA如何让手机性能再突破【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  3. 华为开发者联盟 方舟编译器 DevEco IDE

    华为开发者联盟 https://developer.huawei.com/consumer/cn/ 方舟编译器是为支持多种编程语言.多种芯片平台的联合编译.运行而设计的统一编程平台,包含编译器.工具链 ...

  4. 编译器开发系列--Ocelot语言1.抽象语法树

    从今天开始研究开发自己的编程语言Ocelot,从<自制编译器>出发,然后再自己不断完善功能并优化. 编译器前端简单,就不深入研究了,直接用现成的一款工具叫JavaCC,它可以生成抽象语法树 ...

  5. Win10 UWP 开发系列:使用多语言工具包让应用支持多语言

    之前我在一篇blog中写过如何使用多语言工具包,见http://www.cnblogs.com/yanxiaodi/p/3800767.html 在WinEcos社区也发布过一篇详细的文章介绍多语言工 ...

  6. CI Weekly #18 | flow.ci iOS 最佳实践出炉,正式支持 Git@OSC 构建

    如大家所期待,flow.ci 现已支持开源中国的代码仓库 - 码云,可以直接构建 Git@OSC 的项目了,点击创建项目-选择代码仓库-选择码云-绑定 OSChina 账户-选择要构建项目,教程看这里 ...

  7. 使用xmake检测编译器特性支持

    如果我们要写跨平台的c/c++代码,很多时候需要处理由于不同编译器对c/c++各个标准支持力度不同导致的兼容性问题,一般通常的解决办法是:自己在代码中通过宏去判断各个编译器的版本.内置宏.标准库宏._ ...

  8. C 如何判断编译器是否支持C90 C99?

    参考:<C Primer Plus>,Stephen Prata著,姜佑译. ANSI/ISO C标准 美国ANSI成立委员会X3J11,于89/90年,99年,11年,发布C标准:C89 ...

  9. XE3随笔21:系统默认语言与系统支持的语言列表

    unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...

随机推荐

  1. 深入理解 JVM 的内存区域

    深入理解运行时数据区 代码示例: 1. JVM 向操作系统申请内存: JVM 第一步就是通过配置参数或者默认配置参数向操作系统申请内存空间,根据内存大小找到具体的内存分配表,然后把内存段的起始地址和终 ...

  2. Vue 事件的高级使用方法

    Vue 事件的高级使用方法 事件方法 在Vue中提供了4中事件监听方法,分别是: $on(event: string | Array, fn) $emit(event: string) $once(e ...

  3. Linux:apache安装

    1.查询是否已安装 rpm -qa httpd 如果已安装,先卸载 发现有依赖包,先把依赖卸载 或者加上--nodeps参数,不考虑依赖,直接卸载   rpm -e --nodeps httpd-2. ...

  4. 2017年PHP程序员未来路在何方(转)

    PHP 从诞生到现在已经有20多年历史,从Web时代兴起到移动互联网退潮,互联网领域各种编程语言和技术层出不穷, Node.js . GO . Python 不断地在挑战 PHP 的地位.这些技术的推 ...

  5. Docker网络(五)

    本章内容 1.dokcer默认自带的几种网络介绍 2. 自定义网络 3. 容器间通信 4. 容器与外界交互 docker网络分为单个主机上的容器网络和多个主机上的哇网络,本文主要讲解单个主机上的容器网 ...

  6. 使用Mysql分区表对数据库进行优化

    早期工作中没有做好足够的设计,目前记录表单表数据2000w且无有效索引,表现是分页缓慢,模糊查询拉闸. 当前业务中,写操作会多于读操作,时不时会遇到慢SQL占用过多的数据连接,导致写操作无法正常进行. ...

  7. token认证、JWT

    登录的token操作 #app.models.py :表结构 from django.db import models class User(models.Model): user = models. ...

  8. dubbo学习(十)spring boot整合dubbo

    工程搭建与配置 生产者 1.创建一个生产者的spring boot工程,配置好依赖,并把接口实现类文件夹复制到新的工程里 2.pom.xml配置dubbo的相关依赖 <!-- Dubbo Spr ...

  9. ServletContex对象学习

    问题: 不同的用户使用相同的数据 解决: ServletContext对象 特点: 服务器创建 用户共享 作用域: 整个项目内 生命周期: 服务器启动到服务器关闭 使用: 1.获取SercvletCo ...

  10. Filecoin: 挖矿流程扫盲

    前言 IPFS以及FileCoin的白皮书知识量比较大,需要花费一些时间成本来学习. 下面先针对挖矿相关的知识进行研究,总结一下Filecoin中挖矿的流程以及相关概念. What is Fileco ...