华为官方宣布,华为方舟编译器开源已经准备就绪,8月31日,show you the code!
方舟编译器自面世以来,目前已有不少华为荣耀手机机型已支持方舟编译器。下面是整理的适配机型(更多机型还在陆续适配中):
华为机型
P30、P30 Pro,P20、P20 Pro,Mate 20、Mate 20 Pro、Mate 20 X、Mate 20 RS保时捷设计,Mate 10、Mate 10 Pro、Mate 10保时捷设计、Mate RS保时捷设计,nova 5 Pro,nova 4,nova 3……
荣耀机型
荣耀20、荣耀20 PRO,荣耀9X、荣耀9X PRO,荣耀Magic2,荣耀10,荣耀V10,荣耀Play,荣耀V20……
安卓编译器,这是目前安卓app通用的执行,也就是说目前用的安卓app都是由这个开发出来的,对于 CPU 而言,无论是用 Java、C/C++、还是用 Python 来写应用,结果都一样,因为其根本无法直接识别代码。毕竟当前的计算机只能根据电压的高低变化来计算,即高电压是 1 ,低电压是 0, 而这种数制方式被称之为二进制。二进制代码语言又被称为机器语言,计算机可以直接识别。因此无论是 Android 应用还是 iOS 应用,想要在 CPU 中运行,都需要经过翻译或者编译成机器码。
接下来,将以 Android 平台举例说明,众所周知,大多数的 Android 应用都是由 Java 开发而成,而 Java 代码的执行依赖于 Java 虚拟机(JVM),其提供了字节码文件(.class)的运行环境支持,即在 Java 程序编译成 .class 文件之后,由 JVM 将程序解释给本地系统执行,其中,后者的过程通常被叫做「解释执行」。
此外,还有一种叫做「编译执行」的模式,这种模式主要分为两种:JIT(Just-in-time,即时编译),边运行边编译;AOT(Ahead-Of-Time,运行时编译),在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗。就 Android 系统而言,首次引入 JIT 功能是在 Android 2.2 版本中,彼时Google 的目的是为了提高 Android 的运行速度,即当 App 运行时,JIT 编译器就会对新类进行编译,经过编译后的代码,会被优化成相当精简的原生型指令码,这样在下次执行到相同逻辑的时候,速度就会更快。不过好景不长,JIT 在运行时编译开销大,容易造成卡顿,所以在 4.4 版本之后,Dalvik 虚拟机被逐渐抛弃的过程中,JIT 也被弃用了。而在随后的 Android 5.0 系统中,ART 正式取代了 Dalvik,ART 中完全抛弃了 JIT,使用的是 AOT 的编译方式,这种方式的好处是,当 App 在第一次安装时,字节码会预先编译成原型指令码,让其成为真正的本地应用,这样App 的启动及运行速度都会大幅提升。不过这种方式也存在巨大的缺陷,一是安装应用时需要全面编译,用户等待安装的时间过长;二是安装过程中翻译出来的机器码占用了大量的内存空间。
因此,Google 为在安装时间、内存占用、电池消耗和性能之间获得折中方案,又于 Android 7.0 版本重新加入了 JIT 编译模式,即当前的 Android 系统引入的是包含编译、解释和 JIT 的混合运行时。详细而言,当 App 安装时,首先不用像 Android 6.0 中对应用进行完整的预编译,而会根据 JIT 编译器的分析结果,一方面,在设备充电或其余空闲时间对「cold code」进行解释;另一方面,对「hot code」在实际使用时由 JIT 进行编译。
以上就是目前安卓编译器的工作原理,也就是为什么发布会上余承东会说边解释边执行了,那么华为的方舟编译器又是怎么一回事?