3

谁能解释MoSync的运行时架构?

VM Core 不是问题。我认为它是在 java vm 中运行并逐行解释代码的虚拟机。

但是 Recompiler Core 是如何工作的呢?那是一种在本机代码中运行时编译应用程序的 Ahead-Of-Time 编译器吗?但是后来我看不懂图片。或者我是否可能需要运行时的其他模块,即使它是机器代码?

谢谢

4

4 回答 4

9

我刚刚看到马蒂亚斯在我忘记发布我的回复时回复了,但我还是会发布它,因为它进一步阐述了一些观点:)

首先,您的 C/C++ 由 GCC 使用我们的自定义 GCC 后端编译为 MoSync IL(中间语言)。然后,对于某些平台(包括 Android、Symbian 和 Windows Mobile),这个 IL 被输入到“pipe-tool”中,它是一个汇编器/链接器/优化器,可以为不同的平台做不同的事情。以下是一些变体:

对于 JavaME 和我们即将发布的 Blackberry 输出,pipe-tool 生成 MoSync 字节码,这是一种二进制、紧凑、基于寄存器的表示。此字节码与包含虚拟机的 MoSync 运行时打包在一起。当您的应用程序启动时,它将字节码读入内存并开始解释它。

对于 Android、Symbian、Windows Mobile 等,过程类似,但运行时内核所做的不是解释代码,而是遍历整个代码,并在设备上将其重新编译为 ARM 机器代码。完成后,将开始执行它刚刚创建的 ARM 代码。

对于 iOS 设备,情况有些不同——不是将 MoSync IL 转换为 MoSync 字节码,而是将代码转换为 C 源代码,并创建了一个 xcode 项目。这样做有很多原因。一是对于iOS来说,动态生成ARM机器代码是不可能的,而且我们也不允许动态加载代码,作为虚拟机运行是没有意义的。此外,在法律方面,我们希望确保应用程序的生成方式完全符合 Apple 的规则和准则。

MoSync 的主要优势之一就是这种灵活性。通过使用流线型的中间表示,任何输入语言最终都被转换成,并且任何平台的二进制结果总是从中派生出来的,我们在输入和输出之间获得了一个单一的接触点。这允许我们独立于支持的平台添加新的输入语言,反之,独立于输入语言添加对新平台的支持。

当人们问我们“MoSync 能否允许 Java 程序在 iPhone 上运行?” 或“它能让 C++ 程序在 Windows Phone 7 上运行吗?” 答案总是“是”。

如果我们添加对 Java 作为输入语言的支持,它将自动在 MoSync 支持的每个平台上工作。

当我们添加对 Windows Phone 7 的支持时,MoSync 支持的任何输入语言都会自动用于该平台。

我知道,这很难相信,但这是真的:)

于 2011-03-25T15:26:13.420 回答
3

关于 MoSync 的鲜为人知的事实之一是,它不仅是为 CPU 构建的,它还可以很好地转换为其他语言,例如,MoSync 工程师的一个平台运行在 Javascript/HTML 5.0 中。

根据您使用的平台会发生不同的事情,因此 MoSync 会根据最适合目标平台的语言转换为其中间语言。

还有 4 种不同风格的 MoSync IL,它们都相互兼容,但建模以利用不同的处理器架构。

IL 系统有 128 个寄存器,其中 6 个是全局的,其余的是函数的局部。

顺便说一句,MoSync 字节码与 MoSync IL 不同,IL 的元数据非常丰富。

我很乐意讨论更精细的细节或架构,只需发布​​您的问题。

于 2011-04-04T16:28:38.227 回答
1

Recompiler Core 看起来像一个典型的动态重新编译器/JIT 编译器,它会根据需要重新编译代码。显然,MoSync 使用不同的内核,具体取决于它运行的平台(VM Core -> Java ME,Generated Core -> iPhone,Recompiler Core -> 其他任何东西),与运行时系统的接口适用于每个内核,尽管这应该对 MoSync 的用户基本透明。

于 2011-03-19T17:25:11.933 回答
1

Recompiler Core 是基础核心 + AOT 编译器,其中基础核心是 MoSync 系统调用的实现。第一次启动应用程序时,AOT 编译器会检查 MoSync 字节码并将其转换为本机代码,例如 ARM。在转换期间,MoSync 的所有系统调用都直接映射到基本内核中的函数。该应用程序最终通过跳转到转换后的代码部分的开头来执行。

关于模块。当您与相应的库链接时,应用程序框架嵌入在字节码中。系统调用和内部扩展是基本核心的一部分,它们又依赖于资源系统。

于 2011-03-22T08:33:24.157 回答