我知道Android使用它自己的虚拟机称为Dalvik,它运行.dex文件而不是.class文件。
According to Wikipedia,
程序通常用Java编写并编译为Java虚拟机的字节码,然后转换为Dalvik字节码并存储在.dex(Dalvik可执行文件)中。
为什么Android需要先编译成JVM的字节码(.class),然后再翻译成Dalvik字节码(.dex),为什么不能直接从.java
文件编译成Dalvik字节码??
如果它使用两个VM,首先是JVM,然后是Dalvik,那么它不会使编译过程变慢吗?
更新:
如果我在Java中运行一个程序,它会将.java
文件编译为字节码(.class
),然后解释它,如果我在Android中运行同一个程序,它会首先将.java
文件编译为.class
,然后将.class
编译为.dex
,然后运行它......相比之下,Android不是更慢吗?
2条答案
按热度按时间lx0bsm1f1#
为什么Android需要先编译成JVM的字节码,然后再转换成Dalvik字节码?为什么不能直接从.java文件编译成Dalvik字节码?
如果你想写一个完整的编译器的话,它是可以的。new Jack compiler for Android显然可以做到这一点。
一般来说,编写字节码转换器比编写完整的编译器容易。
那么它不会使编译过程变慢吗?
转换过程确实增加了开销。“慢”是一种观点的陈述,所以我不知道字节码转换是否会使“编译过程慢”成为你对“慢”的定义。
qybjjes12#
Android使用Dalvik的主要原因是应用和系统范围的资源。Dalvik运行应用的方式是分叉一个已经拥有应用运行所需的大部分资源的进程(更不用说这种方法让沙箱变得微不足道)。
有一篇很棒的(虽然很旧,因为ART是街区上的新孩子)文章,关于为什么Dalvik在移动的设备的背景下如此有用,标题是“The Dalvik Virtual Machine Architecture“。