我读过一篇来自 Xamarin 的文章,偶然发现了一个特定的计算机科学词:Ahead of Time。根据一些谷歌搜索结果,这个 AOT 不允许在运行时生成代码。这是否意味着,它不支持动态的东西?
我知道这个问题可能很愚蠢,我对 IOS 的了解为 0,希望能从这里得到一些答案。谢谢
我读过一篇来自 Xamarin 的文章,偶然发现了一个特定的计算机科学词:Ahead of Time。根据一些谷歌搜索结果,这个 AOT 不允许在运行时生成代码。这是否意味着,它不支持动态的东西?
我知道这个问题可能很愚蠢,我对 IOS 的了解为 0,希望能从这里得到一些答案。谢谢
首先,动态的定义是什么?对于公众来说,动态代码意味着应用程序可以在运行时更改功能。对于 iOS 平台,对二进制文件进行签名以防止恶意软件。而且 Apple 不喜欢可以在运行时加载功能的应用程序。
提前 (AOT) 编译器与动态代码本身无关。它与即时编译 (JIT) 的中间语言有关。中间语言最大的例子是Java字节码;编译一次,随处运行。当 Java 应用程序正在执行时,编译后的代码是本地机器代码的 JIT。AOT 编译器只是提前做,以节省时间。
对于 iOS 平台,Xcode 将 Objective-C 编译为设备的本机二进制文件。
另一种看待这个问题的方法是举个例子......
在 .Net 中,您可以使用Reflection.Emit命名空间在运行时生成和编译代码。
例如,您可以创建一个带有接受 C# 的文本框的“IDE”。当您单击一个按钮时,.Net 框架可以将 C# 编译为动态加载的自定义库或作为新进程启动的成熟可执行文件。
当与 System.Reflection 命名空间的其余部分结合使用时,这非常强大。您可以在运行时检查对象并根据您喜欢的任何标准编译自定义代码。
也就是说......在大多数情况下,问题通常超过好处。主要是,这是一个巨大的安全问题,尤其是在消费设备上运行时。
可以创建一个没有任何接近恶意代码的应用程序,让苹果对其进行审核,然后让应用程序从您的网络服务器下载代码,编译并执行它。这个新代码不会被审计......
在消费者应用程序中这样做确实没有充分的理由。