我正在使用 Titanium Mobile 1.0 构建一个 iPhone 应用程序,我发现它可以编译为原生 iPhone 二进制文件。这是如何运作的?如果没有像 280 North 的 Objective-J 和 Cappuccino 这样的超集语言,分析 JavaScript 代码并直接翻译成 Objective-C 似乎需要很多繁重的工作。
3 回答
Titanium 获取您的 Javascript 代码,对其进行分析和预处理,然后将其预编译为一组符号,这些符号将根据您的应用程序对 Titanium API 的使用进行解析。从这个符号层次结构中,我们可以构建一个映射到底层 Titanium 库符号的符号依赖矩阵,以了解您的应用程序需要哪些 API(以及相关的依赖关系、框架等)。我以半通用的方式使用符号这个词,因为它根据语言而有所不同。在 iPhone 中,符号映射到真正的 C 符号,最终映射到为 ARM/i386 架构编译的已编译 .o 文件。对于 Java,嗯,它或多或少是一个 .class 文件等。一旦前端可以理解您的依赖矩阵,我们然后调用 SDK 编译器(即 iPhone 的 GCC,
因此,一种简单的思考方式是,您的 JS 代码几乎是一对一地编译成本地的代表符号。仍然有一个解释器在解释模式下运行,否则动态代码之类的东西将无法工作。但是,它更快、更紧凑,并且尽可能接近纯原生映射。
我们显然仍然有足够的空间来改进和努力。到目前为止,在我们最新的 1.0 测试中,它与相同的 Objective-c 直接代码几乎无法区分(因为在大多数情况下它完全映射到那个)。然而,从 CompSci 的角度来看,我们现在可以开始优化人类无法轻易做到的事情——就像今天的 GCC 编译器已经做的那样。
就像 jhaynie 说的,应用程序被编译为本机代码,但是仍然有一个解释器来运行一些 javascript,这使得应用程序非常动态。
如果我打包我的简单代码,我会得到一个 ~80MB gzip 存档(原始代码 ~1kB)。在包中 - 除其他外 - 您可以找到我的源 html 和 js 文件。该软件包还附带了许多库(例如 ssl)(因为您可以在此框架内对很多东西进行低级访问)。
我认为他们会使用您的代码并包装某种解释器软件和库。在我的情况下,如果我将我的 html 和 js 代码打包到一个只显示我的网站的小型浏览器旁边,那就好像是这样。
但是,只要代码以相同的方式在每个受支持的系统上运行,它就是一件好事。