我什至无法开始理解它们是如何工作的,我猜这是一个非常广泛的问题。怎么可能将 C# 之类的语言编译为 CLR 的 IL,然后在运行时进一步将 JIT 编译为机器代码,并为它编写一个解释器或 REPL,就像在mono项目中实现的那样。他们是如何做到这一点的?
user1462199
问问题
726 次
1 回答
1
问题是什么?机器代码只是一些数据(位于可执行的虚拟内存页面中)。您可以生成该数据,然后,因为它也是代码,所以运行它。
您可以通过各种方式在内存中生成机器代码。例如,您可以使用LLVM或libjit或许多其他库(甚至自己制作)。
某些语言的一些实现(我在想 Common Lisp 的SBCL实现)甚至能够将您交互输入的每一行转换为机器代码。这并不新鲜,一些 1957 年的计算机做到了(例如,法国的CAB500用于 PAF)。
您甚至可以生成一些源代码(例如在 C 中),派生编译过程,然后动态加载该代码,例如使用dlopen(3)。当前的编译器和处理器足够快,可以与延迟兼容,以实现用户友好的交互。我的MELT领域特定语言(用于扩展 GCC)成功地做到了这一点。
正如millimoose 评论的那样,Mono是免费软件,所以你可以研究它的代码。
代码和数据的等价性是计算机的基本属性。同样,在哥德尔和图灵的基本见解中数字和演示的等价性(当你听到你最喜欢的 MP3 音乐时,你也会使用它)。
于 2012-11-12T19:36:08.393 回答