【问题标题】:How MonoTouch works?MonoTouch 的工作原理是什么?
【发布时间】:2010-11-30 00:21:58
【问题描述】:

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

提前致谢。

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

【问题讨论】:

    标签: cross-platform translation xamarin.ios


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      Miguel di Icaza 在他作为嘉宾的 Stackoverflow 播客中对此做了一些解释。 link

      【讨论】:

      • “所以它没有在 iPhone 上实现 .Net 运行时”——这句话是错误的,或者,至少,误导。运行时存在,实际上运行时包含在您引用的“静态编译文件”中。
      【解决方案3】:

      Monotouch 大概是 Mono 到 iPod 的一个端口。

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

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

      所以第一个答案是你需要成为一个有条理、勤奋的天才。

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

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

      这方面的例子不胜枚举。 Jpython 在 Java JVM 中运行模拟 C python。我个人最喜欢的两个是which runs original zX spectrum games in your browser 和Knuth MIX assembeler machine,它们都是纯javascript。

      【讨论】:

      • 感谢您的回答!但是,我知道图灵补全和其他与计算机科学相关的东西,但我的问题是一个更具技术性的问题:他们是如何做到的?他们只是实现一个运行时并以某种方式将其捆绑到应用程序中吗?还是什么?
      • 他们从标准开始,该标准指定 .NET 环境中需要存在哪些组件,然后他们实现这些组件以使其符合标准。
      • 我明白这一点。但同样,使用 .NET 编写的 MonoTouch 应用程序如何在 iPhone 上运行?他们在那里有运行时?或者他们只是以某种方式将其翻译成 Obj-C/Arm Asm/whatever?
      • 单点触控不是 .NET。它是 .NET 运行时环境的实现。在 Mono 项目开始时,.NET 进行了逆向工程——他们查看了 API 并生成了代码,并弄清楚了运行时环境做了什么,大约一半的时候,MS 给了他们文件格式等的文档,这样他们就可以工作了规范。最终,这些作为 ECMA 标准发布,因此任何人都可以编写。
      猜你喜欢
      • 1970-01-01
      • 2021-01-07
      • 2015-12-12
      • 2019-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      相关资源
      最近更新 更多