【发布时间】:2011-06-30 14:19:01
【问题描述】:
听说iOS AppStore不允许JIT编译代码,因为禁止将可执行代码放在堆中。对吗?还是只是谣言?
【问题讨论】:
标签: ios jit appstore-approval
听说iOS AppStore不允许JIT编译代码,因为禁止将可执行代码放在堆中。对吗?还是只是谣言?
【问题讨论】:
标签: ios jit appstore-approval
不允许安装代码(“或”是 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 上运行本机代码。
【讨论】: