方舟编译器 订阅
方舟编译器是华为推出的首个完全自主研发的编译器平台,于2019年8月31日正式上线。方舟编译器已成为码云最快达成5000 Star的开源项目。 [1]  华为方舟编译器是华为公司专门为软件厂商研发的统一编程平台,包含编译器、工具链、运行时等关键部件。该编译器支持多种编程语言、多种芯片平台的联合编译与运行,能够有效解决安卓程序“边解释边执行”的低效率问题。 [2]  2019年8月31日,华为方舟编译器开源官网正式上线。 [3]  2019年11月,华为方舟编译器获“2019东北亚优秀开源项目”奖。 [1] 展开全文
方舟编译器是华为推出的首个完全自主研发的编译器平台,于2019年8月31日正式上线。方舟编译器已成为码云最快达成5000 Star的开源项目。 [1]  华为方舟编译器是华为公司专门为软件厂商研发的统一编程平台,包含编译器、工具链、运行时等关键部件。该编译器支持多种编程语言、多种芯片平台的联合编译与运行,能够有效解决安卓程序“边解释边执行”的低效率问题。 [2]  2019年8月31日,华为方舟编译器开源官网正式上线。 [3]  2019年11月,华为方舟编译器获“2019东北亚优秀开源项目”奖。 [1]
信息
外文名
HuaWei Ark Compiler
类    型
静态编译
中文名
华为方舟编译器
运行平台
HarmonyOS,EMUI,MagicUI
华为方舟编译器研发背景
编译器是连接人类世界与机器世界之 间的一座桥梁,任何在手机上的程序都需要经历软件开发的过程,软件开发使用的语言是易于程序员理解的高级语言,程序在手机上运行需要转换成可以高效执行的机器码,这样的转换过程就是由编译器完成的。可以说编译器是用来生成软件的软件,是连接软件与芯片的桥梁,其性能,效率直接影响到最基础的消费者体验。 [4] 
收起全文
精华内容
参与话题
问答
  • 方舟编译器

    千次阅读 2019-09-10 08:27:23
    华为方舟编译器是华为公司专门为软件厂商研发的统一编程平台,包含编译器、工具链、运行时等关键部件。该编译器支持多种编程语言、多种芯片平台的联合编译与运行,能够有效解决安卓程序“边解释边执行”的低效率问题...

    华为方舟编译器是华为公司专门为软件厂商研发的统一编程平台,包含编译器、工具链、运行时等关键部件。该编译器支持多种编程语言、多种芯片平台的联合编译与运行,能够有效解决安卓程序“边解释边执行”的低效率问题

    2019年8月31日,华为方舟编译器开源官网正式上线。

    中文名

    华为方舟编译器

    外文名

    HuaWei Ark Compiler

    类    型

    静态编译

    运行平台

    HarmonyOS,android

    研发背景

    编译器是连接人类世界与机器世界之间的一座桥梁,任何在手机上的程序都需要经历软件开发的过程,软件开发使用的语言是易于程序员理解的高级语言,程序在手机上运行需要转换成可以高效执行的机器码,这样的转换过程就是由编译器完成的。可以说编译器是用来生成软件的软件,是连接软件与芯片的桥梁,其性能,效率直接影响到最基础的消费者体验。 

    发展历程

    方舟编译器架构示意图

    2019年4月,在华为P30系列国内发布会上,华为首次宣布了华为方舟编译器技术。 

    2019年8月31日,华为方舟编译器开源官网正式上线。 

    技术特点

    安卓系统使用Java作为编程语言,易于开发,但是不会将代码直接编译成机器语言,程序运行时有相当一部分代码还需要通过手机上的虚拟机临时同步编译,影响程序执行的效率。华为方舟编译器采取了静态编译的方式,是首个取代了安卓虚拟机模式的静态编译器。 

    性能效果

    方舟编译器采用全程执行机器码高效运行程序,架构进一步得到优化,可供开发者在开发环境一次性的将高级语言编译为机器码,手机安装应用程序后可全速运行程序,带来效率上的极大提升。根据华为实验室的测试数据,EMUI 9.1在仅仅对系统组件System Server应用了华为方舟编译器后,就带来了系统操作流畅度提升24%,系统响应性能提升44%。

    开源计划

    在方舟编译器面世之时,华为就宣布未来将这一技术开源,希望更多的APP厂商,高校,安卓手机厂商,开源社区的开发者能一同加入进来。 

    华为计划在2020年将方舟编译器完整开源,帮助开发者构建完整的工具链。届时华为还将提供代码调优工具,开发者可以选择根据工具的优化建议来调整自己的代码,和方舟编译器配合获得更优的执行效果。 

    截至2019年,已经有40多个顶级应用通过方舟的编译上架到华为应用商城,未来将有更多的第三方使用方舟编译器。同时,方舟编译器所有代码也将开源给业界。 

    展开全文
  • 华为方舟编译器 During the summer of 2019, Huawei gave a series of presentations announcing the Ark Compiler technology. The company claims that this open-source project will help developers make the ...

    华为方舟编译器

    Picture 1

    During the summer of 2019, Huawei gave a series of presentations announcing the Ark Compiler technology. The company claims that this open-source project will help developers make the Android system and third-party software much more fluent and responsive. By tradition, every new promising open-source project goes through PVS-Studio for us to evaluate the quality of its code.

    在2019年夏季,华为发表了一系列演讲,宣布了Ark编译器技术。 该公司声称,这个开源项目将帮助开发人员使Android系统和第三方软件更加流畅和快速响应。 按照传统,每个新的有前途的开源项目都会通过PVS-Studio,以供我们评估其代码的质量。

    介绍 (Introduction)

    The Ark Compiler was first announced by Huawei at the launch of the new smartphone models P30 and P30 Pro. It is claimed that the Ark Compiler will improve the fluency of the Android system by 24% and response speed by 44%. Third-party Android applications will also gain a 60% speed-up after recompilation with the Ark Compiler. The open-source version of the project is called OpenArkCompiler; its source code is available on Gitee, a Chinese fork of GitHub.

    华为在发布新的智能手机型号P30和P30 Pro时首次宣布了Ark编译器。 据称,Ark编译器将使Android系统的流畅度提高24%,响应速度提高44%。 使用Ark编译器重新编译后,第三方Android应用程序的速度也将提高60%。 该项目的开源版本称为OpenArkCompiler ; 其源代码可在GitHub的中文分支Gitee上获得。

    To check this project, I used the PVS-Studio static code analyzer. This is a tool for detecting bugs and potential vulnerabilities in the source code of C, C++, C#, and Java programs.

    为了检查该项目,我使用了PVS-Studio静态代码分析器。 这是一个用于检测C,C ++,C#和Java程序的源代码中的错误和潜在漏洞的工具。

    The project's size is 50 KLOC and it didn't take long to check. A small project means modest results: the article will be focusing on 11 out of the total of 39 warnings (of High and Medium levels).

    该项目的规模为50 KLOC,并且很快就可以检查完。 一个小项目意味着适度的结果:本文将重点讨论39个警告(高和中级别)中的11个。

    代码中发现的缺陷 (Defects found in the code)

    警告1 (Warning 1)

    V502 Perhaps the '?:' operator works in a different way than it was expected. The '?:' operator has a lower priority than the '==' operator. mir_parser.cpp 884V502也许'?:'运算符的工作方式与预期的不同。 '?:'运算符的优先级低于'=='运算符。 第884章
    enum Opcode : uint8 {
      kOpUndef,
      ....
      OP_intrinsiccall,
      OP_intrinsiccallassigned,
      ....
      kOpLast,
    };
    
    bool MIRParser::ParseStmtIntrinsiccall(StmtNodePtr &stmt, bool isAssigned) {
      Opcode o = !isAssigned ? (....)
                             : (....);
      auto *intrnCallNode = mod.CurFuncCodeMemPool()->New<IntrinsiccallNode>(....);
      lexer.NextToken();
      if (o == !isAssigned ? OP_intrinsiccall : OP_intrinsiccallassigned) {
        intrnCallNode->SetIntrinsic(GetIntrinsicID(lexer.GetTokenKind()));
      } else {
        intrnCallNode->SetIntrinsic(static_cast<MIRIntrinsicID>(....));
      }
      ....
    }

    We are interested in the following part:

    我们对以下部分感兴趣:

    if (o == !isAssigned ? OP_intrinsiccall : OP_intrinsiccallassigned) {
      ....
    }

    The precedence of the '==' operator is higher than that of the ternary operator (?:). Therefore, the conditional expression is evaluated in the wrong order and is equivalent to the following code:

    '=='运算符的优先级高于三元运算符(?:)的优先级。 因此,条件表达式的计算顺序错误,并且等效于以下代码:

    if ((o == !isAssigned) ? OP_intrinsiccall : OP_intrinsiccallassigned) {
      ....
    }

    Since the constants OP_intrinsiccall and OP_intrinsiccallassigned are non-null, the condition will be returning true all the time, which means the body of the else branch is unreachable code.

    由于常量OP_intrinsiccallOP_intrinsiccallassigned不为null,因此条件将一直返回true ,这意味着else分支的主体是不可访问的代码。

    警告2 (Warning 2)

    V570 The 'theDoubleVal' variable is assigned to itself. lexer.cpp 283V570将'theDoubleVal'变量分配给它自己。 lexer.cpp 283
    int64 theIntVal = 0;
    float theFloatVal = 0.0;
    double theDoubleVal = 0.0;
    
    TokenKind MIRLexer
    ::GetFloatConst(uint32 valStart, uint32 startIdx, bool negative) {
      ....
      theIntVal = static_cast<int>(theFloatVal);
      theDoubleVal = static_cast<double>(theDoubleVal); // <=
      if (theFloatVal == -0) {
        theDoubleVal = -theDoubleVal;
      }
      ....
    }

    The theDoubleVal variable is assigned to itself without changing. The developer must have intended to store the result to theFloatVal instead because it is this variable that gets checked in the next line. If so, it should also be cast to float, not double. I think the fixed version should look like this:

    TheDoubleVal变量被分配给它自己而不更改。 开发人员必须打算将结果存储到TheFloatVal,因为在下一行将检查此变量。 如果是这样,还应该将其强制转换为float而不是double 。 我认为固定版本应如下所示:

    theFloatVal = static_cast<float>(theDoubleVal);
    if (theFloatVal == -0) {
      theDoubleVal = -theDoubleVal;

    or even like this if the programmer simply wrote the wrong variable in the condition:

    甚至是这样,如果程序员只是在以下情况下写了错误的变量:

    if (theDoubleVal == -0) {
      theDoubleVal = -theDoubleVal;

    I may still be wrong; perhaps this code should be fixed in some entirely different way. It does look obscure to an outside programmer like myself.

    我可能还是错了。 也许应该以完全不同的方式来修复此代码。 对于像我这样的外部程序员来说,它确实显得晦涩难懂。

    警告3-5 (Warnings 3-5)

    V524 It is odd that the body of '-' function is fully equivalent to the body of '+' function. mpl_number.h 158V524 “-”功能的主体与“ +”功能的主体完全等效是奇怪的。 mpl_number.h 158
    template <typename T, typename Tag>
    inline Number<T, Tag> operator+(const Number<T, Tag> &lhs,
                                    const Number<T, Tag> &rhs) {
      return Number<T, Tag>(lhs.get() + rhs.get());
    }
    
    template <typename T, typename Tag>
    inline Number<T, Tag> operator-(const Number<T, Tag> &lhs,
                                    const Number<T, Tag> &rhs) {
      return Number<T, Tag>(lhs.get() + rhs.get());
    }

    The header file mpl_number.h contains a lot of duplicate code with small modifications – and mistakes, of course. In this example, the addition and subtraction operators are implemented in the same way: the programmer forgot to change the operation sign in the body of the subtraction operator.

    头文件mpl_number.h包含许多重复的代码,但有一些小的修改,当然还有错误。 在此示例中,加法和减法运算符的实现方式相同:程序员忘记更改减法运算符主体中的运算符。

    Other warnings of this type:

    此类型的其他警告:

    • V524 It is odd that the body of '-' function is fully equivalent to the body of '+' function. mpl_number.h 233

      V524“-”功能的主体与“ +”功能的主体完全等效是奇怪的。 mpl_number.h 233
    • V524 It is odd that the body of '-' function is fully equivalent to the body of '+' function. mpl_number.h 238

      V524“-”功能的主体与“ +”功能的主体完全等效是奇怪的。 mpl_number.h 238

    警告6 (Warning 6)

    V560 A part of conditional expression is always false: !firstImport. parser.cpp 2633V560条件表达式的一部分始终为false:!firstImport。 parser.cpp 2633
    bool MIRParser::ParseMIRForImport() {
      ....
      if (paramIsIPA && firstImport) {
        BinaryMplt *binMplt = new BinaryMplt(mod);
        mod.SetBinMplt(binMplt);
        if (!(*binMplt).Import(...., paramIsIPA && !firstImport, paramIsComb)) {
          ....
        }
        ....
      }
      ....
    }

    The firstImport variable checked in the first conditional expression is always true. It means the following expression will always evaluate to false:

    在第一个条件表达式中检查的firstImport变量始终为true 。 这意味着以下表达式将始终为false

    paramIsIPA && !firstImport

    This code either contains a logic error or is overcomplicated and can be simplified by passing the false constant to the Import function.

    该代码包含逻辑错误或过于复杂,可以通过将false常量传递给Import函数来简化。

    警告7 (Warning 7)

    V547 Expression 'idx >= 0' is always true. Unsigned type value is always >= 0. lexer.h 129V547表达式'idx> = 0'始终为true。 无符号类型值始终> =0。lexer.h 129
    char GetCharAtWithLowerCheck(uint32 idx) const {
      return idx >= 0 ? line[idx] : 0;
    }

    This check of the index variable idx (>= 0) doesn't make sense because the variable is unsigned. Perhaps it was meant to be compared with some other value as the threshold for indexing into the line array, or this meaningless check should be removed altogether.

    索引变量idx (> = 0)的检查没有意义,因为该变量是无符号的。 也许应该将其与其他值进行比较,以作为索引到数组的阈值,或者应该完全删除这种无意义的检查。

    警告8 (Warning 8)

    V728 An excessive check can be simplified. The '||' operator is surrounded by opposite expressions 'c != '\"'' and 'c == '\"''. lexer.cpp 400V728过度检查可以简化。 “ ||” 运算符被相反的表达式'c!='\“''和'c =='\”''包围。 lexer.cpp 400
    TokenKind MIRLexer::GetTokenWithPrefixDoubleQuotation() {
      ....
      char c = GetCurrentCharWithUpperCheck();
      while ((c != 0) &&
             (c != '\"' || (c == '\"' && GetCharAtWithLowerCheck(....) == '\\'))) {
        ....
      }
      ....
    }

    The analyzer has spotted a code pattern that can be simplified. It looks similar to this form:

    分析仪发现了可以简化的代码模式。 它看起来类似于以下形式:

    A || (!A && smth)

    The !A expression will always evaluate to true, so the original expression can be simplified as follows:

    !A表达式将始终为true ,因此可以将原始表达式简化如下:

    while ((c != 0) && (c != '\"' || (GetCharAtWithLowerCheck(....) == '\\'))) {
      ....
    }

    警告9-10 (Warnings 9-10)

    V728 An excessive check can be simplified. The '(A && !B) || (!A && B)' expression is equivalent to the 'bool(A) != bool(B)' expression. mir_nodes.cpp 1552V728过度检查可以简化。 '((A &&!B)|| (!A && B)'表达式等同于'bool(A)!= bool(B)'表达式。 mir_nodes.cpp 1552
    bool BinaryNode::Verify() const {
      ....
      if ((IsAddress(GetBOpnd(0)->GetPrimType()) &&
          !IsAddress(GetBOpnd(1)->GetPrimType()))
        ||
         (!IsAddress(GetBOpnd(0)->GetPrimType()) &&
           IsAddress(GetBOpnd(1)->GetPrimType()))) {
        ....
      }
      ....
    }

    This is another snippet that needs refactoring. To make it more readable, I split the code into several lines, while in its original form, the condition occupies two full lines, which made it much more difficult to figure out. The code can be rewritten in a simpler and clearer form:

    这是另一个需要重构的代码段。 为了使代码更具可读性,我将代码分成几行,而在原始形式下,该条件占据了两行,这使得查找起来变得更加困难。 可以用更简单明了的形式重写代码:

    if (IsAddress(GetBOpnd(0)->GetPrimType()) !=
        IsAddress(GetBOpnd(1)->GetPrimType()))
      ....
    }

    Another code fragment to be refactored in a similar way:

    将以类似方式重构的另一个代码片段:

    • V728 An excessive check can be simplified. The '(A && B) || (!A && !B)' expression is equivalent to the 'bool(A) == bool(B)' expression. bin_mpl_import.cpp 702

      V728过度检查可以简化。 '(A && B)|| (!A &&!B)'表达式等同于'bool(A)== bool(B)'表达式。 bin_mpl_import.cpp 702

    警告11 (Warning 11)

    V1048 The 'floatSpec->floatStr' variable was assigned the same value. input.inl 1356V1048为 'floatSpec-> floatStr'变量分配了相同的值。 第1356章
    static void SecInitFloatSpec(SecFloatSpec *floatSpec)
    {
      floatSpec->floatStr = floatSpec->buffer;
      floatSpec->allocatedFloatStr = NULL;
      floatSpec->floatStrSize = sizeof(floatSpec->buffer) /
                                sizeof(floatSpec->buffer[0]);
      floatSpec->floatStr = floatSpec->buffer;
      floatSpec->floatStrUsedLen = 0;
    }

    The analyzer has detected two identical initializations of the variable floatSpec->floatStr. I believe the second duplicate line can be removed.

    分析器检测到变量floatSpec-> floatStr的两个相同的初始化。 我相信第二条重复行可以删除。

    结论 (Conclusion)

    Just a few days ago, we checked another project by Huawei, Huawei Cloud DIS SDK. The company is currently making their projects open-source, which is good news for the developer community. Such projects as the Ark Compiler or Harmony OS are very young and haven't become popular yet, so investing in the quality control of the code at this stage should be very profitable since it can help avoid potential vulnerabilities and customer criticism.

    就在几天前,我们检查了华为的另一个项目,即华为Cloud DIS SDK 。 该公司目前正在将其项目开源,这对于开发人员社区来说是个好消息。 方舟编译器或Harmony OS之类的项目还很年轻,尚未普及,因此在此阶段对代码的质量控制进行投资应该是非常有利可图的,因为它可以帮助避免潜在的漏洞和客户批评。

    参考文献 (References)

    1. Checking LLVM, 2011

      检查LLVM,2011年

    2. Checking LLVM, 2012

      检查LLVM,2012年

    3. Checking GCC, 2016

      检查GCC,2016年

    4. Checking LLVM, 2016

      检查LLVM,2016年

    5. Checking PascalABC.NET, 2017

      检查PascalABC.NET,2017年

    6. Checking Roslyn (.NET Compiler Platform), 2019

      检查Roslyn(.NET编译器平台),2019年

    7. Checking LLVM, 2019

      检查LLVM,2019年

    翻译自: https://habr.com/en/company/pvs-studio/blog/478282/

    华为方舟编译器

    展开全文
  • 方舟编译器学习

    千次阅读 2020-01-25 12:21:52
    2.方舟编译器源码编译 3.方舟可执行文件简介 4.方舟编译器文档导读 5.方舟开始接受代码合并请求 6.方舟编译器学习笔记6 方舟开源目录简介 7.方舟编译器学习笔记7 对java2jar及方舟工具链的进一步分析...

    2.方舟编译器源码编译

     

    3.方舟可执行文件简介

     

    4.方舟编译器文档导读

     

    5.方舟开始接受代码合并请求

     

    6.方舟编译器学习笔记6 方舟开源目录简介

     

    7.方舟编译器学习笔记7 对java2jar及方舟工具链的进一步分析

     

    8.方舟编译器学习笔记8 工具链可运行(helloworld编译成功)

     

    9.测试用例编译过程的试优化

     

    11.方舟编译器学习笔记_IR设计文档中的IR总体设计思想

     

    12.方舟编译器学习笔记12 方舟编译器的phase

     

    13.方舟编译器学习笔记13 方舟编译器phase相关类的关系辨析

     

    14.方舟编译器学习笔记14 DriverRunner源码分析

     

    15.方舟编译器学习笔记15 DriverRunner的调用关系分析与编译工具链的反思

     

    16.方舟编译器学习笔记16 MapleCombCompiler与phase体系的代码对照

     

    17.方舟编译器学习笔记17 phase的实现和使用

     

    18.方舟编译器学习笔记18 Compiler及其子类

     

    19.R基本类型与LLVM IR基本类型的对比

     

    20.方舟编译器学习_方舟编译器的IR结构和LLVM的IR结构对比

     

    21.方舟编译器学习_MAPLE IR设计的指导论文——Fred Chow论文阅读

     

    22.方舟编译器学习_MAPLE IR和LLVM IR中module层面的信息对比

     

    23.方舟编译器_虚函数表和接口函数表的分析和验证

     

    24.方舟编译器学习笔记24 以一维数组为例看MAPLE IR中存储访问

     

    25.方舟编译器学习笔记25 MAPLE IR中的field-ID

     

    26.方舟编译器学习笔记26 _MAPLE IR和WHIRL IR的基本类型对比

     

    27.方舟编译器学习笔记27 MAPLE IR的控制流语句及其之间的转换

     

    28.方舟编译器学习笔记28 MAPLE IR和WHIRL IR的控制流语句对比

     

    29.方舟编译器学习笔记29 MAPIE IR中if语句的向下转换

     

    30.方舟编译器学习笔记30 MAPIE IR中控制流语句所对应的节点类简介

     

    31.方舟编译器学习笔记31 MAPLE IR表达式对应的节点类

     

    32.方舟编译器学习笔记32 MAPIE IR中while和dowhile语句的向下转换

     

    33.方舟编译器学习笔记33 MAPLE IR中label使用的两个过程及doloop语句的向下转换

     

    34.方舟编译器学习笔记34 MAPLE IR向下转换中的扩展数组管理

     

    35.方舟编译器学习笔记35 IR中语句parser的调用关系追踪

     

    36.方舟编译器学习笔记36 以if语句为例看MAPLE IR语句的parse过程

     

    37.方舟编译器学习笔记37 MAPLE IR中几个常见类的介绍

     

    38.方舟编译器学习笔记38 MAPLE IR 中lower操作和phase操作的关系

     

    39.方舟编译器学习笔记39 从parser中的几个map来看parser及MIR的结构

     

    40.方舟编译器_MAPLE IR中的基本类型的实现及其与文档中基本类型的对比

     

    41.方舟编译器学习笔记41 MAPLE IR 中的MIR Type体系与属性体系

     

    42.方舟编译器学习笔记42 Me体系中的MeFunction分析

     

    43.方舟编译器学习笔记43 MAPLE IR中的常量系统

     

    44.方舟编译器学习笔记44 Me体系中的BB

     

    45.方舟编译器学习笔记45 Me体系中的MeExpr相关内容

     

    46.方舟编译器学习笔记46 Me体系中的MeStmt相关内容

     

    47.方舟编译器学习笔记47 MeFuncPhase类的phase的返回分析

     

    48.方舟编译器学习笔记48 ModulePhase类的phase的执行情况

     

    49.方舟编译器学习笔记49 src/maple_phase/目录代码分析

     

    50.方舟编译器学习笔记50 方舟编译器phase的体系运行机制分析

     

    51.方舟编译器学习笔记51 MeFuncPhase类phase的执行前准备

     

    52.方舟编译器学习笔记52 ModulePhase之classhierarchy分析

     

    方舟编译器_MeFuncPhase之dominance分析

     

    RISCV IDE评测的后续

     

     

     

     

     

    展开全文
  • 华为方舟编译器开发文档
  • 华为方舟编译器插件

    2019-08-13 20:04:44
    华为方舟编译器插件,可免费远程调试华为的Android机器,试了一下,感觉速度杠杠的,加油华为,加油中国。
  • 方舟编译器部署

    千次阅读 2020-09-20 20:23:15
    文章目录环境配置Ubuntu装入依赖库源码下载安装Clang编译器并完成配置安装Ninja、GN并完成配置编译方舟编译器编译HelloWorld基础库准备示例代码快速编译 Tips:本教程参照的是方舟编译器环境配置和开发者指南。这里...


    Tips:本教程参照的是方舟编译器环境配置开发者指南。这里是一些坑的总结【加粗注明】。

    环境配置

    Ubuntu系统、Clang编译器、Ninja、GN

    Ubuntu

    装入依赖库

    使用命令:

    sudo apt-get -y install openjdk-8-jdk git-core build-essential zlib1g-dev libc6-dev-i386 g++-multilib gcc-multilib linux-libc-dev:i386
    sudo apt-get -y install gcc-5-aarch64-linux-gnu g++-5-aarch64-linux-gnu
    

    这部分可能会出现Unable to locate package ***的问题,这是apt更新源的问题。主要出现在openjdk-8-jdk和linux-libc-dev:i386上。解决方法如下:

    sudo add-apt-repository ppa:openjdk-r/ppa
    sudo dpkg --add-architecture i386
    sudo apt-get update
    sudo apt-get upgrade
    

    然后再运行上面的安装命令。

    源码下载

    需要注意码云上面方舟编译器已经更换了仓库地址。

    git clone https://gitee.com/openarkcompiler/OpenArkCompiler.git
    

    安装Clang编译器并完成配置

    https://releases.llvm.org/download.html#8.0.0下载对应版本的压缩包并放到openarkcompiler/tools/目录下。

    打开openarkcompiler/build/config.gni文件,将GN_C_COMPILERGN_CXX_COMPILERGN_AR_COMPILER三个变量配置为Clang编译器所在路径。

    GN_C_COMPILER = "${MAPLE_ROOT}/tools/clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-18.04/bin/clang"
    GN_CXX_COMPILER = "${MAPLE_ROOT}/tools/clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-18.04/bin/clang++"
    GN_AR_COMPILER = "${MAPLE_ROOT}/tools/clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-18.04/bin/llvm-ar"
    

    打开文件后请先查看16行是否已经自动添加,如果已经添加请检查是否是自己使用的版本。其中${MAPLE_ROOT}为openarkcompiler源码根目录。这个根目录可能需要自己设定。如下情况是没有设定时的报错:

    路径报错

    MAPLE_ROOT在文件OpenArkCompiler/build/config/BUILDCONFIG.gn的第20行。

    安装Ninja、GN并完成配置

    Ninja下载地址:https://github.com/ninja-build/ninja/releases

    GN下载地址:https://gitee.com/xlnb/gn_binary/blob/master/gn 点击下载可能会出现乱码,右键从链接另存为文件即可。

    将它们的可执行文件放置到openarkcompiler/tools下,然后修改这两个文件为可执行:

    cd openarkcompiler/tools
    chmod 775 gn
    chmod 775 ninja
    

    打开openarkcompiler/Makefile文件,将GN和NINJA两个变量配置为GN和Ninja可执行程序所在路径:

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

    打开文件后请先查看22行是否已经自动添加,如果已添加请检查是否是自己的路径

    编译方舟编译器

    OpenArkCompiler下运行此命令:

    source build/envsetup.sh # 初始化环境,将OpenArkCompiler工具链路径
    make # 编译OpenArkCompiler的Release版本
    

    编译后不要关闭终端。编译完成成功截图:

    编译成功

    编译HelloWorld

    当前编译方舟编译器Sample应用需要使用到Java基础库,我们以Android系统提供的Java基础库为例,展示Sample样例的编译过程。

    基础库准备

    下载java-core.jar包到OpenArkCompiler/libjava-core,地址:https://gitee.com/mirrors/java-core/ 。

    运行命令:

    cd libjava-core
    jbc2mpl -injar java-core.jar -out libjava-core
    

    成功后OpenArkCompiler/libjava-core中会出现文件:

    libjavacore.mpl生成成功

    示例代码快速编译

    这里以OpenArkCompiler/samples/helloworld为例。在根目录运行以下命令:

    cd samples/helloworld/
    make
    

    运行成功截图:

    helleworld编译成功 参考文档:
    环境配置
    开发者指南

    展开全文
  • 方舟编译器 核心组件

    2020-05-19 10:41:53
    具体安装教程在官网有,安装方舟编译器其实挺麻烦的,但是本资源中有必须的组件,而且有一键安装的脚本,可以快速安装,tmp.clang.tar.xz是很难下载的,所以我都提供在里面了
  • 华为方舟编译器开源!前华为人重磅解读!

    万次阅读 多人点赞 2019-09-01 18:00:00
    【CSDN 编者按】8月31日,华为方舟编译器正式开源。据华为内部人士表示,华为员工为了这次开源,连续30小时没有合眼。 早在在8月9日的华为开发者大会上,华为消费者业务CEO余承东,就宣布将在8月底开源方舟编译器的...
  • 方舟编译器是为支持多种编程语言、多种芯片平台的联合编译、运行而设计的统一编程平台,包含编译器、工具链、运行时等关键部件。 方舟编译器还在持续演进中,陆续将上述能力实现和开源。
  • 方舟编译器资源汇总

    千次阅读 2019-10-30 09:05:10
    方舟编译器 资料 小乖他爹–方舟编译器系列文章中科院软件所 智能软件研究中心 程序语言与编译技术实验室
  • 方舟编译器part1.zip

    2019-09-11 15:41:58
    方舟编译器所需要的文件,基于Ubuntu18.04,包括所需要的方舟编译器源代码,gn,Ninja(v1.9.0)以及clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-18.04 clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-18.04超过300M,无法...
  • 简单的使用方舟编译器编译Android

    千次阅读 2019-09-02 14:04:25
    华为方舟编译器华为方舟编译器开源了 华为方舟编译器开源了 方舟编译的使用教程。 有没有简单的使用方舟编译器,成功编译Android是app的教学,求链接 ...
  • 8月31日,早上9点,华为方舟编译器官网就这么悄然上线了。网上甚至没有大面积的新闻报道,我是隔天才知道的这个消息。 在今年4月份华为P30系列的发布会上,华为首次对外公开了正在自主研发一款开源的统一编程平台,...
  • 方舟编译器HelloWorld

    千次阅读 2019-09-18 02:20:23
    方舟编译器HelloWorld 方舟编译器已经开源,官网见 https://www.openarkcompiler.cn/home 根据官方文档进行操作 环境配置请阅读 Development_Preparation.md 文档 环境配置 硬件推荐配置 2 GHz 双核处理器或者更高...
  • 方舟编译器编译

    千次阅读 2020-04-10 00:32:00
    编译华为方舟编译器源码 这篇文章仅仅是关于如何搭建环境并进行编译。 本机环境: Ubuntu 16 server. 一定要好好看参考文档!建议使用root账户操作 源码下载 先 clone 源码华为开源平台 注意 对...
  • 华为方舟编译器

    千次阅读 2019-09-26 10:22:55
    华为方舟编译器 官方网站:https://www.openarkcompiler.cn 代码托管网站:https://code.opensource.huaweicloud.com/HarmonyOS/OpenArkCompiler 码云镜像仓库地址:...
  • 方舟编译器简单介绍

    千次阅读 2019-11-01 20:34:17
    华为方舟编译器作为一款全新的安卓应用编译器可以显著提高手机的运行速度,它不采用现有安卓编译器边解释边执行的模式,而是将这种动态编译改为静态编译,可以做到全程执行机器码,进而高效运行程序,大大缩短程序...
  • 方舟编译器最新技术细节

    千次阅读 2019-09-24 23:02:18
    今天的 华为有技术·EMUI媒体沙龙 中,华为消费者BG软件部总裁王成录博士和大家分享了华为黑科技背后的故事,其中透露了关于方舟编译器的更多细节。作为一名 Android 开发,我也一直关注着方舟的最新动态。在方舟...
  • 华为的方舟编译器

    千次阅读 2019-04-29 20:17:30
    要知道方舟编译器有多牛,首先你要了解编译器是什么 你可以理解为编译器就是一种人类和机器对话的工具,就像是两种不同语言的人可以通过使用手机上的翻译软件进行对话一样。在机器的世界里,要想和它对话就需要将...
  • [杂记]方舟编译器初识

    千次阅读 2020-10-24 23:19:53
    方舟编译器跨过了VM这道坎,将高级语言直接编译成机器码,消除了动态编译的开销。 另一方面,安卓在内存回收上采用集中回收机制,发声全局回收时更需要暂停应用,这也是随机卡顿的根因之一。而方舟编译器提供了更...
  • 说说 方舟编译器

    千次阅读 2019-09-24 22:58:47
    华为继去年推出黑科技 GPU Turbo 之后,今年再次扔出了一枚重磅炸弹, 安卓性能革命,华为方舟编译器,号称解决安卓程序 “边解释边执行” 的低效,全程执行机器码高效运行程序。架构级优化,显著提升性能。系统操作...
  • 助力 Android 抗衡 iOS,华为发布方舟编译器

    千次阅读 多人点赞 2019-04-16 13:36:13
    传说中的诺亚方舟可以拯救全人类,那么活在现实的方舟编译器是否真的能突破Android系统性能原有的限制?(图源:CSDN付费下载自东方IC)要说上个月于巴黎召开的...
  • 华为方舟编译器正式开源,采用自主平台托管 Kotlin 开发者社区 01 — 概述 “方舟编译器概述:方舟编译器是为支持多种编程语言、多种芯片平台的联合编译、运行而设计的统一编程平台,包含编译器、...
  • 方舟编译器开源代码

    千次阅读 2019-09-08 10:05:42
    https://www.openarkcompiler.cn/home方舟编译器官网 https://gitee.com/harmonyos/OpenArkCompiler?utm_source=gitee_widget镜像仓库
  • 华为方舟编译器开源官网正式上线

    千次阅读 2019-09-03 18:09:25
    【摘要】 8月31日,华为方舟编译器开源官网正式上线。 本次方舟编译器开源的是编译器框架部分源码,包括编译器中间表示(IR)和语言编译实现,同时搭配编译器其他二进制组件,实现Java程序到aarch64汇编指令的编译...

空空如也

1 2 3 4 5 ... 17
收藏数 324
精华内容 129
关键字:

方舟编译器