华为方舟编译器
v0.2 源码包- 软件大小:8.81 MB
- 更新日期:2019-10-22 11:03
- 软件语言:简体中文
- 软件类别:编程工具
- 软件授权:免费版
- 软件官网:待审核
- 适用平台:WinXP, Win7, Win8, Win10, WinAll
- 软件厂商:
软件介绍 人气软件 下载地址
方舟编译器是一款综合管理编平台,该程序是由华为公司自行研发的业界首个多语言联合优化编译器,它主要是为了支持多种编辑语言,因为很多用户的使用语言习惯不一样,这就会导致在使用开发工具的时候出现很多不便之处,正常情况下肯定不可能同时在电脑中安装多个开发工具,而多语言支持不仅可以使得开发过程更加灵活,还可以将整个系统的实用性大大的提高;不仅如此,该程序还支持多种芯片平台联合编译、运行,在整个大系统中,整个数据包包含的工具非常丰富,必不可少的编译器、工具链以及运行时等关键部件都应有尽有,可以满足不同开发人员的要求;此外,该程序系统已经将编译器的代码优化搬到了开发者环境,此后便不再被手机端的硬件资源所限制,从而为代码优化提供了无限可能;强大又实用,需要的用户可以下载体验
软件功能
一、开发阶段打包的APK就直接是可执行,并且跨语言平台
在方舟编译器里面,已经编译好的APK,会通过静态编译的方式先转换成机器码再安装,这其实是AOT,无需麻烦的虚拟机,提升运行速度和效率。并且作为开发者,还可以根据不同的程序特点,选择不同的编译优化方案,不像安卓官方的方式使用统一的虚拟机方案。
二、方舟编译器边运行变清理,内存清爽
现在安卓手机的一大特色就是内存越来越大,6GB都是老人机的配置了。这除了程序大以外还有安卓的程序运行产生垃圾多有关系。那么清理垃圾呢?则需要暂停程序,也就会顿一下,即所谓的“卡”。华为方舟编译器则是利用程序多线程运行的特点。打个比方,您现在正在用的“中关村在线”这个APP用了AB两个线程,在华为的P30手机中,那么线程A运行的时候,B在清理垃圾,然后A线程清理垃圾的时候B线程在运行,程序运行不中断,垃圾处理不停,做到了又连贯、又节约系统资源。
三、方舟编译器,应用级编译优化
代码优化是编译器最为核心的功能,也是评判一个编译器优劣最重要的标准。
当前由于安卓应用使用了虚拟机机制,难以面向不同应用对虚拟机进行针对性的灵活优化。
安卓ART的AoT和JIT动态编译因为是运行在手机上,受资源所限,因而只能使用简单的优化算法。
而方舟编译器由于是在应用开发阶段进行编译,所以可以允许不同应用灵活采用不同的编译优化方案,而且因为在开发环境编译不会受到手机性能的限制,可以使用更多先进的优化算法,从而使得每个应用的性能达到最佳。
软件特色
1、多语言联合:
将同一应用中的不同语言代码联合编译、联合优化,消除语言间的性能“鸿沟”,降低开发者的优化成本。
2、轻量运行时:
通过编译器的语言实现能力和优化能力增强,应用运行时的开销更小。
3、软硬件协同:
编译器与芯片实现软硬件协同优化,充分发挥硬件能效,应用体验更佳。
4、多平台支持:
支持面向多样化的终端设备平台进行编译和运行,根据设备特征提供便捷的开发与部署策略,提高开发效率。
官方教程
源码编译
在openarkcompiler目录下执行以下命令,编译出OpenArkCompiler,默认输出路径 openarkcompiler/out/bin。
source build/envsetup.sh
make
命令说明:
source build/envsetup.sh 初始化环境,将OpenArkCompiler工具链路径openarkcompiler/src/bin设置到环境变量中
make 编译OpenArkCompiler的Release版本
make BUILD_TYPE=DEBUG 编译OpenArkCompiler的Debug版本
Sample示例编译
当前编译方舟编译器Sample样例需要使用到Java基础库,我们简要介绍Sample样例的编译过程
Java基础库准备
方舟编译器针对不同的操作系统编译Java程序,需要准备相应操作系统上的Java基础库,我们暂且命名java-core.jar
生成libjava-core.mplt文件
编译前,请先在openarkcompiler目录下创建libjava-core目录,拷贝如上准备的Java基础库jar包到此目录下,在openarkcompiler目录执行以下命令:
source build/envsetup.sh;
cd libjava-core;
jbc2mpl -injar java-core.jar -out libjava-core;
执行完成后会在此目录下生成libjava-core.mplt文件。
示例代码快速编译
示例代码位于openarkcompiler/samples目录。
以samples/helloworld/代码为例,在openarkcompiler/目录下执行以下命令:
source build/envsetup.sh; make; cd samples/helloworld/; make
编程规范
目的
规则并不是完美的,通过禁止在特定情况下有用的特性,可能会对代码实现造成影响。但是我们制定规则的目的“为了大多数程序员可以得到更多的好处”, 如果在团队运作中认为某个规则无法遵循,希望可以共同改进该规则。
参考该规范之前,希望您具有相应的C++基础能力,而不是通过该文档来学习C++。
了解C++的ISO标准;
熟知C++的基本语言特性,包括C++ 03/11/14/17相关特性;
了解C++的标准库;
重点关注
约定C++的编程风格,比如命名,排版等。
C++的模块化设计,如何设计头文件,类,接口和函数。
C++相关特性的优秀实践,比如常量,类型转换,资源管理,模板等。
现代C++的优秀实践,包括C++11/14/17中可以提高代码可维护性,提高代码可靠性的相关约定。
约定
规则:编程时必须遵守的约定(must)
建议:编程时应该遵守的约定(should)
本规范适用通用C++标准, 如果没有特定的标准版本,适用所有的版本(C++03/11/14/17)。
例外
无论是'规则'还是'建议',都必须理解该条目这么规定的原因,并努力遵守。 但是,有些规则和建议可能会有例外。
在不违背总体原则,经过充分考虑,有充足的理由的前提下,可以适当违背规范中约定。 例外破坏了代码的一致性,请尽量避免。'规则'的例外应该是极少的。
下列情况,应风格一致性原则优先:
修改外部开源代码、第三方代码时,应该遵守开源代码、第三方代码已有规范,保持风格统一。
某些特定领域,优先参考其行业规范。
命名
通用命名
常见命名风格有: 驼峰风格(CamelCase) 大小写字母混用,单词连在一起,不同单词间通过单词首字母大写来分开。 按连接后的首字母是否大写,又分: 大驼峰(UperCamelCase)和小驼峰(lowerCamelCase)
内核风格(unix_like) 单词全小写,用下划线分割。 如:'test_result'
匈牙利风格 在‘大驼峰’的基础上,加上前缀;前缀用于表达类型或用途。 如:'uiSavedCount', 'bTested'
规则2.1.1 标识符命名使用驼峰风格
不考虑匈牙利命名,在内核风格与驼峰风格之间,根据存量代码的情况,我们选择驼峰风格。
类型命名风格
类类型,结构体类型,枚举类型,联合体类型等类型定义大驼峰
函数(包括全局函数,作用域函数,成员函数)大驼峰(接口部分可加前缀,如XXX_函数名)
全局变量(包括全局和命名空间域下的变量,类静态变量),局部变量,函数参数,类、结构体和联合体中的成员变量小驼峰
常量(const),枚举值k+大小写混合
宏大写+下划线
命名空间全小写
注意: 上表中常量是指全局作用域、namespace域、类的静态成员域下,以 const或constexpr 修饰的基本数据类型、枚举、字符串类型的变量。 上表中变量是指除常量定义以外的其他变量,均使用小驼峰风格。
文件命名
建议2.2.1 C++文件以.cpp结尾,头文件以.h结尾
我们推荐使用.h作为头文件的后缀,这样头文件可以直接兼容C和C++。 我们推荐使用.cpp作为实现文件的后缀,这样可以直接区分C++代码,而不是C代码。
目前业界还有一些其他的后缀的表示方法:
头文件: .hh, .hpp, .hxx
cpp文件:.cc, .cxx, .C
对于本文档,我们默认使用.h和.cpp作为后缀。
建议2.2.2 C++文件名和类名保持一致
C++的头文件和cpp文件名和类名保持一致,使用下划线小写风格。
如下:
database_connection.h
database_connection.cpp
结构体,命名空间,枚举等定义的文件名类似。
函数命名
函数命名统一使用大驼峰风格,一般采用动词或者动宾结构。接口部分可加前缀,如XXX_函数名。
class List {
public:
void AddElement(const Element& element);
Element GetElement(const unsigned int index) const;
bool IsEmpty() const;
bool MCC_GetClass();
};
namespace utils {
void DeleteUser();
}
类型命名
类型命名采用大驼峰命名风格。 所有类型命名——类、结构体、联合体、类型定义(typedef)、枚举——使用相同约定,例如:
// classes, structs and unions
class UrlTable { ...
class UrlTableTester { ...
struct UrlTableProperties { ...
union Packet { ...
// typedefs
typedef std::map PropertiesMap;
// enums
enum UrlTableErrors { ...
对于命名空间的命名,建议全小写:
// namespace
namespace osutils {
namespace fileutils {
}
}
建议2.4.1 避免滥用 typedef或者#define 对基本类型起别名
除有明确的必要性,否则不要用 typedef/#define 对基本数据类型进行重定义。 优先使用头文件中的基本类型:
有符号类型无符号类型描述
int8_tuint8_t宽度恰为8的有/无符号整数类型
int16_tuint16_t宽度恰为16的有/无符号整数类型
int32_tuint32_t宽度恰为32的有/无符号整数类型
int64_tuint64_t宽度恰为64的有/无符号整数类型
intptr_tuintptr_t足以保存指针的有/无符号整数类型
如果模块有自己的定义,请使用统一的typedef来定义类型:
typedef signed char VOS_INT8;
typedef unsigned char VOS_UINT8;
#if __WORDSIZE == 64
typedef unsigned long int VOS_UINTPTR;
#else
typedef unsigned int VOS_UINTPTR;
#endif
如果模块为了封装某个类型的信息,方便后续的扩展,可以使用typedef来重新定义。
typedef uint8_t DeviceID;
// ...
// 若干版本后扩展成 16-bit
typedef uint16_t DeviceID;
有特殊作用的类型 typedef void *Handle; 注意:不要使用 #define 进行别名定义,并且在C++11以后推荐使用using来定义类型。
除上述理由外,应避免给其本数值类型别名定义。因为类型别名可读性并不好,隐藏了基本数值类型信息,如位宽,是否带符号。 滥用举例:
typedef uint16_t MyCounter;
// ...
int Foo(...) {
MyCounter c;
// ...
while (c >= 0) {
printf("counter = %d\n", c);
// ...
}
// ...
}
对'MyCounter'是否可能小于0,打印时用'%d'还是'%u'都不是很直观,极容易引入上述类似缺陷。
变量命名
通用变量命名采用小驼峰,包括全局变量,函数形参,局部变量,成员变量。
std::string tableName; // Good: 推荐此风格
std::string tablename; // Bad: 禁止此风格
std::string path; // Good: 只有一个单词时,小驼峰为全小写
规则2.5.1 类的成员变量命名使用小驼峰。
class Foo {
private:
std::string fileName; // 不添加任何作用域前缀或者后缀
};
当构造函数参数和成员变量重名时,可通过this->来引用成员变量。
class MyClass {
public:
MyClass(int myVar) : myVar(myVar) { // OK,初始化列表允许同名入参初始化同名成员
if (NeedNewVar()) {
this->myVar = GetValue(); // 注意不要漏掉this->,否则就成了给入参赋值
}
}
private:
int myVar;
};
宏、常量、枚举命名
宏采用全大写,下划线连接的格式。常量、枚举值使用k+大小写混合。 函数局部 const 常量和类的普通const成员变量,使用小驼峰命名风格。
#define MAX(a, b) (((a) < (b)) ? (b) : (a)) // 仅对宏命名举例,并不推荐用宏实现此类功能
enum TintColor { // 注意,枚举类型名用大驼峰,其下面的取值是k+大小写混合
kRed,
kDarkRed,
kGreen,
kLightGreen
};
int Func(...) {
const unsigned int bufferSize = 100; // 函数局部常量
char *p = new char[bufferSize];
...
}
namespace utils {
const unsigned int kFileSize = 200; // 全局常量
}
常见问题
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 月重点开源框架部分;后续将陆续开源编译器前端、后端;支持 Java 程序编译、JavaScript 语言应用的编译等。
Q6:方舟编译开源面向全球开发者吗?英文网站何时上线?
A6:
方舟编译器是向全球开发者进行开源,因此,官方网站和代码托管平台均面向全球开发者开放。目前英文版网站正在紧张的开发及内测,计划将于 2019 年 Q4 上线。
Q7:方舟编译器源码托管计划是怎么的?
A7:
孵化委员会期间,方舟编译器代码是托管在华为云上面。在未来走向开放治理以后,将由所挂靠机构选择的平台进行托管。如果挂靠的机构采取了 X 平台,我们就采用这个机构的代码托管模式进行托管。
当前代码托管的地址:https://code.opensource.huaweicloud.com/HarmonyOS/OpenArkCompiler
所有相关信息请以方舟编译器开源官方网站发布为准。
Q8:方舟编译器开源使用的是什么License?
A8:
方舟编译器采用木兰 License。 木兰 License 由业界众多专家和公司集体共建,并非华为主导。木兰 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
人气软件
-
redis desktop manager2020.1中文 32.52 MB
/简体中文 -
s7 200 smart编程软件 187 MB
/简体中文 -
GX Works 2(三菱PLC编程软件) 487 MB
/简体中文 -
CIMCO Edit V8中文 248 MB
/简体中文 -
JetBrains DataGrip 353 MB
/英文 -
Dev C++下载 (TDM-GCC) 83.52 MB
/简体中文 -
TouchWin编辑工具(信捷触摸屏编程软件) 55.69 MB
/简体中文 -
信捷PLC编程工具软件 14.4 MB
/简体中文 -
TLauncher(Minecraft游戏启动器) 16.95 MB
/英文 -
Ardublock中文版(Arduino图形化编程软件) 2.65 MB
/简体中文