各个操作系统下的 JVM 是谁开发出来的?

为什么 iOS 没有对应的 JVM?
关注者
106
被浏览
7094
其实有能在iOS上运行的JVM…而且也不只一个。原则上说只用解释器的、支持ARM的JVM都可以想办法包含在app内运行在iOS上。

前面 @朱亮 的回答不准确。Apple的iOS AppStore并不阻止部署使用Objective-C之外别的编程语言所编写的应用。用Lua、Python、JavaScript写的iOS应用也不少,它们里面照样有虚拟机(所谓runtime)。我觉得最重要的几点是:第三方开发者不能部署一个language runtime来支持多个app(但是可以每个app自己包含自己私有的、不对外公开提供服务的language runtime);然后这些language runtime不能动态生成可执行代码(不能分配具有rwx权限的内存);部署在iOS设备上的app不能下载任何代码。

Statement by Apple on App Store Review Guidelines, 2010-09-09

实质上就是说现在iOS允许应用使用基于解释器的language runtime。
另一种做法是像MonoTouch / Xamarin那样做AOT(ahead-of-time)编译,在部署在设备前就彻底把C#(及其它能编译到MSIL / CIL的语言)应用编译为目标设备的native code,避免app在运行过程中需要动态生成可执行代码,这样也行,或者说这样比屈于用解释器更好。需要注意的是即便使用AOT编译,这种解决方案最终仍然会部署一个language runtime到目标设备上,至少会包含GC、核心库之类的东西,只是执行引擎既不是解释器也不是JIT编译器、而是事先编译好的native code直接执行而已。

能在iOS上运行的JVM的其中一种是Oracle的CDC-HI(Connected Device Configuration HotSpot Implementation,又名CVM)。CDC-HI包含在Oracle ADF Mobile Client中可以部署到iOS设备上运行。CDC-HI原本有JIT编译器,但是当部署到iOS设备上的时候,它只使用解释器来执行Java代码而不使用JIT编译器。

Oracle Brings Java to iOS Devices (and Android too) (The Oracle Mobile Platform Blog)
One part of the container is a headless lightweight JVM based on the Java ME CDC technology. This allows the execution of Java code on your mobile device.

Diagnosing ADF Mobile iOS deployment problems (One Size Doesn't Fit All)
<- 这篇blog里的日志表明ADF Mobile所使用的JVM是CVM,也就是前面说的CDC-HI。

Oracle ADF Mobile现在的对应物是Oracle Mobile Application Framework。

Oracle Mobile Application Framework Data Sheet
Oracle MAF supports coding business logic in your mobile application with the Java language, in addition to supporting coding in JavaScript and HTML5. Packaged Oracle MAF application contains a lightweight Java virtual machine (JVM) delivered as a native library for each platform. The JVM executes the business logic, data access and controller layer logic.

对Java SE熟悉的同学可能会想到Excelsior JET。这玩儿不也是主要用AOT的么?可惜即便是Excelsior JET Embedded也只支持x86而不支持ARM,所以目前它无法用于iOS设备上。

能用AOT模式部署到iOS上的一个JVM是Avian。在下面的链接里有提到。

Open source Java iOS tools compared
<- Java World上的这篇文章列举比较了其它一些在iOS上运行用Java开发的应用的方案——不过它们不一定用了JVM。