方舟编译器只能编译Java_说说 方舟编译器
华为继去年推出黑科技 GPU Turbo 之后,今年再次扔出了一枚重磅炸弹, 安卓性能革命,华为方舟编译器,号称解决安卓程序 “边解释边执行” 的低效,全程执行机器码高效运行程序。架构级优化,显著提升性能。系统操作流畅度提升 24%,系统响应提升 44%,三方应用操作流畅度提升 60%,并承诺向业界开源。敢于开源的话,这个数据应该没有水分。大家在网上应该也看到了 P30 Pro 吊打 S10 的视频。
解决安卓程序 “边解释边执行” 的低效,什么是边解释边执行?也就是说,Android 是如何执行 Apk 中的代码的?这得从机器码说起。
机器码
不论是低级语言,如汇编,还是如今广泛使用的各种高级语言,Java,C++ 等,对于 CPU 来说,全部都是天书。它能认识的只有二进制的机器码。当然,机器码对你来说,也是天书。那你应该如何指挥 CPU 运行你的程序呢?这个时候,你们之间就需要一个翻译,将你的代码翻译成机器码给 CPU,它就知道该如何执行了。面对不同的终端,翻译内容也不一样,你一个只知道 x86 指令集的去翻译 arm 的,肯定翻译不出来,就好似拿着本英语字典去翻译日语。翻译也有工具,下面说说几种常见的翻译工具:
汇编器
将汇编代码直接翻译成机器码。由于汇编代码一般和机器码都是一一对应的,所以它的速度非常快。只是汇编语言,你懂的,可读性差,
用起来难,用来写大型程序对于普通开发者基本是不现实的。
编译器
编译器将我们平常开发用的高级语言,例如 Java/C++ 等,翻译成机器码供 CPU 使用。这种编译很慢,但是执行起来会很快。
解释器
程序不需要编译,程序在运行时才翻译成机器语言,每执行一次都要翻译一次。因此效率比较低。可以想象这种运行方式就慢了很多。
典型的解释型语言,php/js/python 等。
JAVA 代码是如何执行的 ?
Java 程序的执行依赖于 Java 虚拟机(JVM),JVM 能直接识别的叫做字节码。Java 代码经过编译会生成 Class 文件,即字节码文件,再交由 JVM 处理。而 JVM 又是怎么执行 Class 文件的呢?这里以
HotSpot 为例,Class 文件被虚拟机加载后会存放在方法区,实际运行时,虚拟机会执行方法区中的代码。
将字节码翻译成机器码的工作自然就由 JVM 来承担了。在 HotSpot 中,有几种翻译形式。
解释执行
逐条将字节码翻译成机器码并执行
即时编译(Just-in-time ,JIT)
将一个方法中包含的所有字节码编译成机器码后再执行。
前者的优势在于无需等待编译,而后者的优势在于实际运行速度更快。HotSpot 默认采用混合模式,综合了解释执行和即时编译两
者的优点。它会先解释执行字节码,而后将其中反复执行的热点代码,以方法为单位进行即时编译。
Android 代码是如何执行的 ?
开发 Android 目前用的最多的还是 Java,即使不是 Java,也是 JVM 语言。Android 工程中的 java 源文件经过编译也是生成
Class 文件,最后被打包成 DEX 字节码文件,负责将 DEX 字节码翻译成机器码的是 Dalvik 或者 Art。
在 Android 5.0 之前,还是 Dalvik 的天下。Dalvik 是解释执行加上 JIT,每次app运行的时候,它动态的将一部分 Dalvik 字节码
解释为机器码。随着 App 的运行,更多的字节码被编译和缓存。因为 JIT 只编译了一部分代码,它具有更小的内存占用和更少的设备物理空间占用。但是,边解释边执行,效率低下,这也是后来 Dalvik 遭到抛弃的原因。
从 Android 4.4 开始,Android 引入了 Art,到 Android 5.0,Art 正式代替了 Dalvik。Art 使用的是 AOT(Ahead of Time)的编译方式,即在应用的安装过程中,就将所有的 Dex 字节码翻译成机器码存储在设备空间中,完全抛弃了 JIT,带来的好处是显而易见的。
Apps 运行的更快,因为 DEX 字节码的解释在安装过程中已经完成,直接运行机器码
减少了应用的启动时间,因为本地代码可以直接执行。
节省电量消耗,不需要再去一行一行的解释字节码。
增强了垃圾回收。
增强了开发者工具。
直接运行机器码,恩,等等,这不就是方舟编译器做的事情吗?答案肯定是否定的,否则它因为完全没有存在的必要了。事实上,这种完全基于 AOT 的模式也已经被 Android 抛弃了。如果你用过 5.0 或者 6.0 的安卓机,你一定不会忘记安装应用带来的漫长等待。由于需要在安装期间翻译字节码,所以安装过程会很长,尤其对
一些大型应用来说。另外,安装过程中翻译出来的机器码也占用了更大的机身存储空间。
Android 7.0,Android 又加入了 JIT,一个具备代码分析功能的即时 (JIT) 编译器。事实上,根据二八定律,经常运行的热点代码可能只占 20%,甚至更少,我们没有必要通过 AOT 提前将所有字节码都翻译成机器码。安装过程中放弃 AOT,加快安装速度,所以初次使用时得解释执行。当你在使用应用时,JIT 就开始分析代码了,在合适的时候将字节码翻译成机器码,在 Android 应用运行时持续提高其性能。另外,设备空闲的时候,AOT 就发挥作用了,它会将热点代码翻译成机器码并保存下来,进一步提高运行效率。这么看下来,现在的 Android 是 解释执行 、JIT、AOT 同时存在的。下面这张官网的图片很好的说明了Art 下的 JIT 架构.
关于解释器,高版本中的 Android 实现也不再那么孱弱了,根据官网相关介绍:
通过引入 Mterp(一种解释器,具有以汇编语言编写的核心提取/解码/解释机制),Android 7.0 版本中的解释器性能得以显著提升。Mterp 模仿了快速 Dalvik 解释器,并支持 arm、arm64、x86、x86_64、mips 和 mips64。对于计算代码而言,ART 的 Mterp 大致相当于 Dalvik 的快速解释器。
不过,有时候,它的速度可能会显著变慢,甚至急剧变慢:
调用性能。
字符串操作和 Dalvik 中其他被视为内嵌函数的高频用户方法。
堆栈内存使用量较高。
Android 8.0 解决了这些问题。
说了这么多,无非是安装速度,空间占用,运行速度的平衡,目前 Android 应该已经做得很好了,但仍然存在不少诟病。
现在可以确定的是,方舟编译器绝对不可能是 完全 AOT。PPT 中最后一句话是 “希望 APP 厂商尽快使用” ,并不是手机厂商,所以不排除方舟编译器可以直接将 Apk ,或者说 Apk 中的 DEX 打包成机器码格式。但由于机器码并不是平台兼容的,所以并不能确定方舟编译器是否必须要绑定 EMUI。其实说到底,这一切都应该是为了华为的新手机系统作铺垫。华为的野心之大,以及其极其超前的技术储备,相信一个完整华为生态已经离我们不远了。
编译器叫方舟,新系统干脆就叫 诺亚 吧!
文章首发于微信公众号: 秉心说 , 专注 Java 、 Android 原创知识分享,LeetCode 题解,欢迎扫码关注!
方舟编译器只能编译Java_说说 方舟编译器相关推荐
- 方舟编译器只能编译Java_方舟编译器学习笔记8 工具链可运行(helloworld编译成功)...
前面的文章 方舟可执行文件简介和 对java2jar及方舟工具链的进一步分析 对工具链中的可执行文件以及测试用例的编译都进行了分析,并对java2jar进行了修改,保证了其可运行.但是后续的jbc2m ...
- 方舟编译器只能编译Java_方舟编译器的安装和编译Helloword
1.安装各种包 sudo apt-get -y install openjdk-8-jdk git-core gnupg flex bison gperf build-essential zip cu ...
- freebasic 编译linux,免费BASIC编译器下载
在网上搜索BASIC编译器结果这么多,不知道哪一款好用,现在极速小编为你推荐这款FreeBASIC软件.FreeBASIC是一个免费自由的 32位BASIC编译器.可以运行在Windows(32位), ...
- vxworks gcc linux,针对VxWorks的GCC交叉编译器无法编译C++
我试图移植Linux库以在VxWorks上运行.我已经成功构建了binutils和gcc,目标为i486-wrs-vxworks,我可以成功构建一个简单的C程序.但是,当我尝试编译C++时,事情就会中 ...
- PL/0语言编译器扩展 编译原理课程实践(1)
转眼大学生活就要结束,编译原理课程学的东西很多都忘记了.当时我们编译原理课程实践是PL/0语言编译器扩展,在原有PL/0语言文法进行扩展.我写这次博文一是为了回忆以前学的知识,加深记忆:二是和大家分享 ...
- 【编译原理入门】–编译器compiler
编译原理[入门]–编译器compiler 参考:https://www.youtube.com/watch?v=cxNlb2GTKIc&list=PLTd6ceoshpreZuklA7RBMu ...
- GCC编译器与编译过程
文章目录 1.GCC简介 1.1概念 1.2 gcc与g++详解 1.2.1 .主要区别 1.2.2 后缀名相关 1.2.3 GCC参数 2 编译过程 2.1 预编译 2.2 编译 2.3汇编 2.4 ...
- 编译器:GNU工具链GCC编译器的编译方法和编译步骤
https://www.runoob.com/w3cnote/working-process-of-the-compiler.html https://www.runoob.com/w3cnote/g ...
- c++模板类(一)理解编译器的编译模板过程
如何组织编写模板程序 前言 常遇到询问使用模板到底是否容易的问题,我的回答是:"模板的使用是容易的,但组织编写却不容易".看看我们几乎每天都能遇到的模板类吧,如STL, ATL, ...
- c语言在线编译网页版,c语言在线编译器(c语言网页版在线编译器)
不好意 我想要的是下载 点 问题没说清楚 sorry dev c++ 选择什么样的编译器对我学习C语言来说重要么.在线等大神指点,不要复制. 学习C语言的话,VC基本上就差不多了,小巧,方便,启动快 ...
最新文章
- 【免费CDN】俄罗斯DDOS-Guard 支持ssl 防御1.5T
- raspberrypi python传感器_Raspberry Pi和Arduino读取串行传感器d
- 五分钟带你摸透 Vue组件及组件通讯
- Apache Commons IO教程:初学者指南
- golang获取程序运行路径
- 提高篇 第五部分 动态规划 第5章 单调队列优化动态规划
- 开课吧:浅析HTML5高薪的原因所在
- C# Socket编程 通过线程方式的异步
- python中for语法
- matlab求六自由度机械臂,基于人工势场的六自由度空间机械臂避障路径
- Java框架总结(高淇java300集+入门笔记)
- 对偶式与反函数_.数字逻辑.对偶式与反函数.数字逻辑下,对偶式与反函数和原函数的关系是什么?...
- zblog如何调用HTML,Zblog教程:模板文件与调用标签详细说明
- 详解 CatBoost 原理
- 脚踏实地才能仰望星空
- 《无声告白》这不是我想要的生活
- 第一篇 安卓系统的介绍及特点
- 光猫、路由器、交换机、wifi通俗释义
- 替换文件内指定字符串
- QVGA HVGA WVGA VGA
热门文章
- jenkins编译java项目时无法读取pom.xml文件
- postgresql源码安装
- wps工资表怎么用计算机,wps制作工资表的方法步骤图
- 1.thrift概述
- 最齐全的文化石 艺术石VRay材质球素材,速来收藏
- 如何解决hangfire使用redis存储时,如果采用了prefix报“Key has MOVED from Endpoint”的错...
- fastlane实现Android自动化打包
- 利用EXCEL计算标准差。
- 解密阿里云效女程序员辰颜、异新代码诗!
- vue配置sass全局变量