2

我什至无法开始理解它们是如何工作的,我猜这是一个非常广泛的问题。怎么可能将 C# 之类的语言编译为 CLR 的 IL,然后在运行时进一步将 JIT 编译为机器代码,并为它编写一个解释器或 REPL,就像在mono项目中实现的那样。他们是如何做到这一点的?

4

1 回答 1

1

问题是什么?机器代码只是一些数据(位于可执行的虚拟内存页面中)。您可以生成该数据,然后,因为它也是代码,所以运行它。

您可以通过各种方式在内存中生成机器代码。例如,您可以使用LLVMlibjit或许多其他库(甚至自己制作)。

某些语言的一些实现(我在想 Common Lisp 的SBCL实现)甚至能够将您交互输入的每一行转换为机器代码。这并不新鲜,一些 1957 年的计算机做到了(例如,法国的CAB500用于 PAF)。

您甚至可以生成一些源代码(例如在 C 中),派生编译过程,然后动态加载该代码,例如使用dlopen(3)。当前的编译器和处理器足够快,可以与延迟兼容,以实现用户友好的交互。我的MELT领域特定语言(用于扩展 GCC)成功地做到了这一点。

正如millimoose 评论的那样,Mono是免费软件,所以你可以研究它的代码。

代码和数据的等价性是计算机的基本属性同样,在哥德尔图灵的基本见解中数字和演示的等价性(当你听到你最喜欢的 MP3 音乐时,你也会使用它)。

于 2012-11-12T19:36:08.393 回答