Dalvik VM 是否支持(就字节码而言)由于 .class 文件没有而目前未使用的东西?
例如,如果人们为他们的功能语言 XYZ 编写自己的 Source-to-DX 转换器,他们是否能够实现例如完整的尾调用,尽管 .class 文件仅在某些情况下支持尾调用?
我不是专家,但据我所知,答案是否定的。
以下两个站点列出了 Dalvik 和 JVM 操作码,抛开 Dalvik 是基于寄存器的 VM 和 JVM 是基于堆栈的事实,操作码非常相似。
http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
http://en.wikipedia.org/wiki/Java_bytecode
它们都是专门为处理 Java 语言而定制的(尽管在未来的 JVM 版本中,有人建议解除这个限制)。
Java 上尾调用优化的问题之一是调用堆栈实际上可用于程序(例如new Throwable().getStackTrace()
,通过 Android 上也存在)。如果 VM 进行了尾调用优化,则需要对其刚刚“优化掉”的内容进行一些记账,以便能够正确实现该getStackTrace
方法。