我没有受过正规的计算机科学教育,但我已经用 Java、Ruby、jQuery 编程了很长时间。
我正在检查 macruby 项目。我不断遇到类似于“在 MacRuby 中,objective-c 运行时与 ruby 运行时相同”的语句。
我明白什么是核磁共振。我了解 ruby 1.9 带来了什么。但是我不明白一种语言的虚拟机如何支持另一种语言。
我知道我在问一个依赖于多年正规教育的问题答案。仍然任何指示和任何讨论都会有所帮助。
我也喜欢我在 macruby 中看到的内容。
我没有受过正规的计算机科学教育,但我已经用 Java、Ruby、jQuery 编程了很长时间。
我正在检查 macruby 项目。我不断遇到类似于“在 MacRuby 中,objective-c 运行时与 ruby 运行时相同”的语句。
我明白什么是核磁共振。我了解 ruby 1.9 带来了什么。但是我不明白一种语言的虚拟机如何支持另一种语言。
我知道我在问一个依赖于多年正规教育的问题答案。仍然任何指示和任何讨论都会有所帮助。
我也喜欢我在 macruby 中看到的内容。
出色地,
最简单的解释是 MacRuby 是一个 ruby 1.9 VM。在早期版本中,它是 YARV(ruby 1.9 的官方 VM)的修改版本,它没有为 ruby 字符串、哈希等使用自定义类型,而是使用了苹果基础类中的等价物,例如 NString。随着 0.5 版的出现,基于 LLVM 框架开发了一个全新的 VM,再次兼容 ruby 1.9,它基于 apples 基础类。
因此,您可以将 Macruby 简单地视为 ruby 1.9 VM。然而,由于使用了上述基础类,它可以与许多苹果自己的 api 进行本机接口,提供仅对那些运行 MacRuby 的人可用的附加功能(例如 HotCocoa)。
只是一个注释
但是我不明白一种语言的虚拟机如何支持另一种语言。
部分。
VM 代表机器和编程语言之间的中间层。例如,Java 虚拟机 (JVM) 执行所谓的 java 字节码。编译器获取源代码并将其javac
编译成一种中间语言——即字节码。运行应用程序时,实际上是在虚拟机中运行字节码:
JVM 运行时执行 .class 或 .jar 文件,通过解释 JVM 指令集或使用诸如 Sun 的 HotSpot 之类的即时编译器 (JIT) 来模拟 JVM 指令集。如今,大多数 JVM 都使用 JIT 编译而不是解释来实现更高的速度。还存在使开发人员能够将类文件预编译为特定平台的本机代码的提前编译器。
因此,可以使用任何语言(例如 Clojure、Scala、Rhino等)编写特定 VM 的编译器。同样的原则适用于围绕 Microsoft .NET 的通用中间语言 (CIL) 的体系结构。
至于 macruby 内部结构,在他们的网站上有一个简短的概述。