我使用运行 FreeBSD 7.2 的共享 Web 服务器(NearlyFreeSpeech.net,强烈推荐!),并且很想使用 C# 为其编写 CGI 脚本,但他们还没有在那里安装 Mono。如果我使用自己的 FreeBSD 7.2 机器并在那里编译我的 C# 程序,我可以AOT编译我的代码并将二进制文件部署在 Mono-less 服务器上吗?
我知道 App Store 上正在销售多个 iPhone 游戏,并且所有这些都是 AOT 编译的(到 ARM)。上面引用的页面说支持 x86 和 x64,但是在我的 x86 Mac OS X Leopard Mono 安装上我试过了
sudo mono --aot /Library/Frameworks/Mono.framework/Versions/2.4.2.1/lib/mono/2.0/mscorlib.dll
和
sudo mono --full-aot /Library/Frameworks/Mono.framework/Versions/2.4.2.1/lib/mono/2.0/mscorlib.dll
并得到错误:
AOT compilation is not supported on this platform.
和
Failed to load AOT module '/Library/Frameworks/Mono.framework/Versions/2.4.2.1/lib/mono/2.0/mscorlib.dll.dylib' in aot-only mode.
分别。我只是不想花很多精力让 FreeBSD 7.2 + Mono 2.4.2.1 工作并发现同样的事情:不支持 AOT 编译,这是我关心 FreeBSD + Mono 的唯一原因.. .
AOT 仅消除了(大多数)JIT 编译的需要。您仍然需要 VM 来提供它提供的所有其他服务——垃圾收集、元数据、IO、安全性、动态编译等。
AOT 在桌面环境中的优势是减少启动时间,允许使用更昂贵的编译器优化,并允许应用程序之间的代码共享。
iPhone 是一个特例,因为它不允许动态库和 JITing。因此,CLI 代码被 AOT 编译成静态库,然后与精简的 Mono 运行时链接在一起,生成单个二进制文件。但是,禁用 JIT 会增加一些限制。例如,泛型的某些用途是不可能的(AOT 编译器不能总是静态地确定它需要编译哪些具体化的泛型类型),并且动态代码生成(像 IronPython 这样的语言需要)是不可能的。
你最好的选择是构建一个并行单声道环境——要么直接在远程机器上构建它,要么在本地构建它,安装到一些临时前缀中,然后将其 tar 并复制过来。