我听说 iOS AppStore 中不允许 JIT 编译代码,因为禁止将可执行代码放在堆中。对吗?还是只是谣言?
3 回答
不允许安装可安装代码(“或”是 3.3.2 中的关键词)。一切(Javascript 除外)都必须静态链接。
似乎允许将 JIT 编译成 Javascript 源代码文本。(不是开玩笑,有一个商业编译器可以做到这一点。)编译成字节码以由解释器编写的 Javascript 执行并在 UIWebView 中运行可能会使审阅者感到困惑,以至于可能会拒绝这样做的应用程序。
iOS 安全沙箱可能会杀死任何试图跳入任何动态生成数据的应用程序。
没错。您可以阅读 iOS 标准协议,在设置开发者注册时需要接受该协议:
3.3.2 应用程序不得下载或安装可执行代码。如果所有脚本、代码和解释器都打包在应用程序中并且未下载,则解释的代码只能在应用程序中使用。上述情况的唯一例外是由 Apple 的内置 WebKit 框架下载和运行的脚本和代码。
似乎允许将 JIT 编译成 Javascript 源代码文本。(不是开玩笑,有一个商业编译器可以做到这一点。)编译成字节码执行......
我还对在 iOS 上运行的编译器(不是 JIT,而是真正的编程语言)提出了自己的想法。我的想法是使用地址来实现伪操作码作为指令而不是“传统字节码”(每个伪操作码 1 个字节)的汇编程序编写的函数。
一个 ARM 寄存器被保留为指向我的“字节码”的“代码指针”(这里称为“rCP”)。伪操作码函数的最后一条指令是“ldmfd rCP!, {pc}”。这意味着函数的最后一条指令不是“返回”,而是跳转到下一个操作码。
使用这种方法,您可以获得非常快的“字节码”。也许商业编译器就是这样工作的。我不敢相信有一个 JIT 编译器在 iOS 上运行本机代码。