借华为方舟编译器掀起的讨论的热潮,我来说下和 Android ART JVM 和编译有关的小知识。或许你看懂下面这些小知识,就能从另外一个方面明白方舟编译器为什么那么让人好奇了。
本文首发我的公众号:
神农和朋友们的杂文集公众号。主要想记录自己、朋友、朋友的朋友们的一些关于coding、programing、程序人生方面的思考。有一些技术,有一些调侃,有一些反思,有一些自勉。
我从16年开始,花了近3年的时间对ART虚拟机做了一个稍微全面的源码分析(成果见我的新书《深入理解Android:Java虚拟机ART》京东销售地址 https://item.jd.com/12510921.html )。其中第六章就是专门讲从dex字节码如何编译成机器码。
第六章的最后,我特意解释了,即使 java字节码编译成机器码,其运行也是离不开虚拟机的管控 ,这些机器码叫 managed code 。它们和非虚拟机管控运行的程序区别见下面几个图:
虚拟机管控运行的机器码
虚拟机为什么要管控机器码的运行 呢?接着看下图
以上就是managed code和虚拟机的关系。
所以,方舟编译器说不用虚拟机了,具体是什么含义?另外,android app是从zygote fork出来的,zygote自己可是一个JVM,那APP是什么?
除此之外,根据 java 语言的特性, 某些数组越界的处理逻辑还要从机器码运行态退化为解释模式执行 (HDeoptimize处理)。来看图:
下面是 一个触发HDeoptimize的 程序示例:
从HDeoptimize可以看出,JVM是为Java语言本身关系及其紧密。
所以,方舟编译器对这种情况是怎么处理的?如果要符合Java的要求,那就不会完全是机器码执行了?或者说有更高级的办法?
等等等,还有很多谜团需有更进一步的解释。
简单来说,源码写成什么样的逻辑,无论是解释执行还是机器码执行都得按这个逻辑来执行。按华为方舟编译器介绍的那样,这是一个类似翻译的工作。再牛、再快的编译器, 如果翻译错了,就毫无价值 。
JVM、编译技术 属于基础关键技术,但感觉绝大部分开发并不真正了解它们。这种现象的原因有很多,可能比较关键的一个问题是没有合适的书籍。编译领域中的 龙书,虎书 很难。而能从JVM源码角度来介绍JVM的更是绝少有。
我们都希望基业长青。显然,基业长青离不开对基础技术的坚守.但是一方面我们也要降低入门门槛,让更多人有机会看到它,亲身接触到它,然后才是扩展和完善它。
对方舟编译器的看法:
1 很高兴华为能在编译技术这么底层基础技术上能让国人扬眉吐气。希望华为能把这个方舟编译器搞好,搞强大。
2 具体实施过程中,希望能服务好开发者。把真正牛的技术以更友好,更方便的形式提供给开发者慢慢把生态建立起来。
3 希望华为尽快能在技术上全面剖析和解释一下方舟。
4 评价一个编译器的好坏应该是有一套基准测试的 ,华为不妨亮出测试数据。
以上所述就是小编给大家介绍的《Android ART JVM中和机器码编译有关的小知识》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Go 程序到机器码的编译之旅
- 指令集架构、机器码与 Go 语言
- Golang获取机器码(MachineCode、PhysicalId)
- [译] Go 程序到机器码的编译之旅
- Go 程序是如何编译成目标机器码的
- 不依赖OS编译器,不依赖库,用汇编/机器码直接编程
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Writing Apache Modules with Perl and C
Lincoln Stein、Doug MacEachern / O'Reilly Media, Inc. / 1999-03 / USD 39.95
Apache is the most popular Web server on the Internet because it is free, reliable, and extensible. The availability of the source code and the modular design of Apache makes it possible to extend Web......一起来看看 《Writing Apache Modules with Perl and C》 这本书的介绍吧!