【问题标题】:Interpret Objective C scripts at runtime on iPhone?在 iPhone 上运行时解释 Objective C 脚本?
【发布时间】:2010-04-27 17:03:12
【问题描述】:

是否有在运行时加载目标 c 脚本,并针对当前 iPhone 应用程序中的类/方法/对象/函数运行它?

主要注意事项:我想这样做的主要原因是让我能够快速制作应用程序原型,然后,在我完成主要原型设计阶段,取我正在编写的脚本并在构建时编译它们。我从不打算发布带有客观 c 解释器的应用程序。

我问的原因是我一直在玩iPhone wax,这是一个可以嵌入到 iPhone 应用程序中的 lua 解释器,它工作得非常好,从某种意义上说,任何公开的对象/方法/函数在你的 Objective C 代码中可用是自动桥接的,并且在 lua 中可用。

这允许您通过简单地将应用程序的核心设置为用户文档目录中的 lua 文件来快速构建应用程序原型。只需重新加载应用程序,您就可以测试对 lua 文件的更改,而无需在 XCode 中重新构建应用程序 - 节省大量时间!

但是,对于 Apple 最近的 3.1.3 SDK 东西,这让我想到,进行这种类型的快速原型设计最安全的方法是,如果您可以使用 Objective C 作为解释代码......那样的话,最坏的情况,您可以在发布之前将其编译到您的应用程序中。我听说 lua 源可以编译为字节码,并在构建时链接,但我认为最终安全的事情是脚本源是在目标 c 中,而不是 lua。这样一来,您的来源始终处于目标 c 中,无论如何。

这让我想知道(我已经搜索过,但一无所获)是否有任何关于如何在 iPhone 应用程序中嵌入 Objective C 解释器的示例?这将允许您针对构建在二进制文件中的当前类快速构建应用程序原型,并且在您即将部署应用程序时,无需通过应用程序内解释器运行这些类,而是编译它们。

在 iPad 和 OS 4 中,蓝牙和虚拟键盘可以在 iPhone 和 iPad 上使用……这将使这种快速原型设计变得更加有用,至少在开发时间是这样。例如,如果您的应用程序中内置了解释器并在 iPad 上安装了它,那么您可以在旅途中针对解释器进行编码,而无需 XCode。对我来说,让源代码回到“苹果批准”状态的最有用的方法是脚本是否是 Objective C。

【问题讨论】:

    标签: iphone objective-c runtime interpreter objective-c-runtime


    【解决方案1】:

    Objective-C 实际上只是带有运行时和一些语法糖的 C。它是一种固有的编译语言(我认为没有任何可用于 C 的生产就绪解释器,尽管我可能错了)。

    Xcode 曾经有一个名为ZeroLink 的功能来加快编译时间,但在 Xcode 3 中删除了它,因为它导致了太多的错误。

    【讨论】:

    • 好点...我已经澄清了我的问题,我的主要意图是在旅途中使用它在 iPad 上进行快速原型制作,有点像便携式 XCode ...
    • 重点仍然存在。根本没有任何 Objective-C 解释器,更不用说可嵌入的了。
    【解决方案2】:

    这并非完全不可能,但并不容易值得。 Objective-C 通常不是解释性语言。这不是不可克服的——解释与编译在大多数情况下只是一种实现选择。例如,Ruby 传统上被认为是一种解释性脚本语言,但 MacRuby 将其编译为代码,就像 Objective-C 生成的一样。因此,可以为 Objective-C 编写解释器,但没有人这样做。你必须自己写。

    此外,规则禁止使用 Apple 的 Javascript 解释器以外的解释器。到目前为止,这还没有对任何人强制执行,但是如果您想成为一个非常直的箭头,那么不幸的是,解释代码也是如此。

    【讨论】:

    • 感谢您的评论...我已经稍微澄清了我的问题,因为我的主要意图是快速原型应用程序 - 考虑到 iPad 的全尺寸虚拟键盘,这确实非常好!就像你有一个便携的 XCode (某种程度上)。
    【解决方案3】:

    嗯,有几点值得提出:

    1. 为什么解释 Objective-C 代码的时候可以编译呢?我理解“快速原型设计”的想法,但在 Lua 中这样做的部分原因是因为 Lua 是一种比 Objective-C 更简洁的语言。我不知道解释 Objective-C 是否会有这么多的好处。
    2. 如果您想在应用中包含插件或可动态加载的模块,您始终可以将它们编译为单独的包并使用NSBundle 或类似机制加载它们。
    3. 说了这么多,我不知道有任何Objective-C 解释器。您可能必须自己编写。我不确定它是否会违反 Apple 的准则:它仍然是 Objective-C 代码,但我认为他们也有针对解释代码的规则。 (不过,我想他们从未设想过解释 Objective-C 的假设场景。)

    【讨论】:

    • 我已经稍微澄清了我的问题,因为我的主要目的是快速制作应用程序原型,而不是将其部署到应用程序商店的应用程序中,否则,点!
    • 为了进一步澄清,我想在没有 XCode 的 iPad 上使用它,让我可以在没有 XCode 的情况下在路上进行开发工作。
    • 解释性语言解释来自维基百科“解释性语言是一种编程语言,它的大多数实现直接执行指令,而无需事先将程序编译成机器语言指令。解释器直接执行程序,翻译将每条语句转换成已经编译成机器代码的一个或多个子例程的序列。解释语言和编译语言这两个术语没有得到很好的定义,因为理论上,任何编程语言都可以被解释或编译。”
    【解决方案4】:

    【讨论】:

      【解决方案5】:

      Ch 是一个商业 C/C++ 解释器。它是由一家名为 SoftIntegration 的公司制造的。

      【讨论】:

      • 它是否适用于 Objective C? Objective C 既不是 C 也不是 C++
      【解决方案6】:

      不是在 iPhone 上,而是在模拟器上,您可以使用
      动态代码注入工具
      http://dyci.github.com/

      还有另一个工具,工作方式略有不同,但功能相同
      http://injectionforxcode.com/

      【讨论】:

        【解决方案7】:

        你应该看看cycript。您可以连接到应用程序,即时替换方法,更改变量,随叫随到。它是 Objective-C 和 JavaScript 之间的混合语言。 你需要jailbreak你的iDevice来安装它。

        【讨论】:

          【解决方案8】:

          查看objc_msgSend() 的文档和Objective-C Runtime Reference 的其他部分。您基本上可以解析文本并将其发送到运行时。

          【讨论】:

          • 虽然创建一个 Objective-C 解释器肯定需要向对象发送消息,但这无疑是任务中最微不足道的部分。
          • 感谢您的评论...我已经玩弄了一些 Objective C 运行时,这是让我想到可能做到这一点的事情之一!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多