我甚至无法理解它们是如何工作的,我猜这是一个非常广泛的问题。怎么可能采用C#这样的语言编译为IL用于CLR,然后在运行时将JIT编译成机器代码,并在mono中实现为它编写解释器或REPL。项目。他们是怎么做到的?
答案 0 :(得分:1)
问题是什么?机器代码只是一些数据(放置在可执行的虚拟内存页面中)。然后,您可以生成该数据,因为它也是代码,运行它。
您可以通过各种方式在内存中生成机器代码。例如,您可以使用LLVM或libjit或许多其他库(甚至可以创建自己的库)。
某些语言的一些实现(我考虑的是Common Lisp的SBCL实现)甚至能够将您交互式键入的每一行转换为机器代码。这并不是新的,一些1957年的计算机就是这样做的(例如PAF的法国CAB500)。
您甚至可以生成一些源代码(例如在C中),分叉编译过程,然后动态加载该代码,例如与dlopen(3)。当前的编译器和处理器足够快,以便与用户友好交互的延迟兼容。我的MELT域特定语言(扩展GCC)成功地做到了这一点。
AS由millimoose评论,Mono是免费软件,因此您可以研究其代码。
代码和数据的等价性是计算机的基本属性。同样,在Gödel和Turing的基本洞察中,数字和演示的等效性(当您听到自己喜欢的MP3音乐时,也会使用它)。