16

我真的很感激有人能简单地向我解释一下,实现 MonoTouch 之类的一般方法是什么?我真的很惊讶,因为当人们获得像 Java 这样的平台并将其转换为 C/Objective-C 之类的东西时,这不是我看到的第一个例子。我真的无法想象垃圾收集器之类的东西是如何被翻译的。

提前致谢。

编辑:我理解将一种语言翻译成另一种语言的理论可能性。我的问题有点技术性:他们是否在 ObjC 中实现了完整的运行时并捆绑它?(我对此表示怀疑......)或者他们只是将 C# 代码翻译成 ObjC/binary/etc?

4

3 回答 3

39

MonoTouch 不是翻译器。它只是在 iPhone 上运行的 Mono 运行时,使用一些花哨的技巧使其与 iPhone 的限制兼容。

传统的 Mono“运行时”不仅仅是 JIT,它还处理 GC、反射、I/O 层、线程、异常等。还有类库。为了让您的应用程序在 iPhone 上运行,应用程序中必须包含其中的大部分内容。瘦身会带来一些挑战。此外,iPhone 阻止 JIT 运行时代码生成,只运行签名代码,并且不允许动态库。

MonoTouch 所做的是使用 IL 链接器将代码使用的类库的部分组合到单个 IL 二进制文件中。然后,它使用 AOT 编译预生成 JIT 通常会从 IL 生成的所有本机代码,然后将其与无 JIT 运行时链接到一个可以签名的本机二进制文件中。最后,从托管二进制文件中剥离 IL。只留下元数据。

于 2009-09-22T18:47:03.117 回答
8

Monotouch 使用 Ahead-Of-Time 编译来生成单个静态编译文件 - 因此它不会在 iPhone 上实现 .Net 运行时。Monotouch 使用绑定到暴露给 C# 的 iPhone 库。没有对 Objective-C 的翻译。

基本上,它让您熟悉在 C# 及其相关工具链中工作,同时公开底层 iPhone OS 的库调用。

Miguel di Icaza 在他做客的 Stackoverflow 播客中对此做了一些解释。关联

于 2009-09-21T11:32:57.820 回答
0

Monotouch 大概是 iPod 的 Mono 端口。

Mono 本身是各种 *nix 环境中 .NET 运行时(和一些开发工具)的开源实现。

这是由 Miguel de Icaza 领导的大规模工作,他很早就意识到 .NET 的重要性,并着手将其移植到开放平台。顺便说一句,由于 MONO 提供了本地 .NET 和 mono 之间的互不相容性,他得到了 MicroSoft 本身的大量支持。

所以第一个答案是你需要成为一个组织良好、工作努力的天才。

第二个答案是更多的 Comp Sciency。“图灵完备”是系统需要被视为可编程计算机的最小功能集。它实际上是一个非常小的集合——减法、比较、分支、读取和存储。

该理论是任何“图灵完备”系统都可以做任何其他“图灵完备”系统可以做的任何事情。因此,给定任何相当完整的编程语言环境,您应该能够使用另一个程序环境来模拟它。

这方面的例子不胜枚举。Jpython 在 Java JVM 中运行模拟 C python。我个人最喜欢的两个是在您的浏览器中运行原始 zX 频谱游戏Knuth MIX 汇编器机器,它们都是纯 JavaScript。

于 2009-09-21T08:36:29.520 回答