在AppStore中,是否禁止使用JIT(即时编译)编译代码的iOS应用程序?

25

我听说JIT编译的代码在iOS AppStore是不被允许的,因为将可执行代码放置在堆中是被禁止的。这是否属实?还是只是谣言?

3个回答

8
  1. 安装代码不被允许(3.3.2中的“或”是关键词)。除了Javascript外,所有内容都必须静态链接。

  2. 即时编译成Javascript源代码文本似乎是允许的。(这不是玩笑,有一种商业编译器可以做到这一点。)将其编译成字节码以供由写成Javascript解释器并在UIWebView中运行的执行可能会使评审员混淆而拒绝该应用程序。

  3. iOS安全沙盒很可能会阻止任何试图跳转到任何动态生成数据的应用程序。


#1和#2我不确定,但是#3让我有把握。谢谢! - eonil

3

没错。 在设置开发者注册时需要接受的iOS标准协议中可以阅读到:

3.3.2 应用程序不得下载或安装可执行代码。 只有在应用程序中打包了所有脚本、代码和解释器且没有下载后才能使用解释性代码。唯一的例外是由Apple内置的WebKit框架下载并运行的脚本和代码。


9
似乎并不禁止JIT..?它只是禁止“下载”。JIT可以解释为脚本解释的最后一步...真的很令人困惑。 - eonil
2
你引用的文本完全与你的陈述相矛盾。它说只要应用程序没有下载代码,就可以进行解释。这一部分在过去6个月左右发生了变化。我认为现在不再被禁止。 - John Ripley
那一行已经改变了,但仍然有关于添加可执行代码的警告。这就是为什么Nitro仍然只能使用Safari组件访问。你有一个误解:解释器!= JIT。解释很慢。像这样的有缺陷的解释代码可以在不考虑安全设置的情况下运行。Python解释器的单个数字逆波兰表示法仅限于加法:input='34+1+7+'; temp=[];d=lambda x: temp.append(int(x)) if x != '+' else temp.append(temp.pop() + temp.pop());filter(d,input); print temp[-1] - Bodey Baker

2
JIT编译成JavaScript源代码文本似乎是被允许的。(不是开玩笑,有一种商业编译器可以这样做。)编译成字节码以供执行...我还提出了一个关于在iOS上运行编译器(不是JIT而是真正的编程语言)的想法。我的想法是使用地址来实现伪操作码作为指令的汇编写函数,而不是传统的字节码(每个伪操作码1个字节)。
一个ARM寄存器被保留为“代码指针”(在这里命名为“rCP”),指向我的“字节码”。伪操作码函数的最后一条指令是“ldmfd rCP!,{pc}”。这意味着该函数的最后一条指令不是“返回”,而是跳转到下一个操作码。
使用这种方法可以获得非常快速的“字节码”。商业编译器可能就是这样工作的。我不相信有一种JIT编译器可以在iOS上运行原生代码。

7
你刚才所描述的直接线程——是一种实现编译器编写的常见技术,适用于简单的语言。 - rmmh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接