调用用C编写的C编译器或用PHP metacircular编写的PHP解释器是否合法?这个定义是否仅对特定类型的语言有效,比如Lisp?简而言之,口译员被称为Metacircular应满足的条件是什么?
在C语言中,由于诸如“地址”和“易失性”之类的概念已内置于该语言中,因此很容易操作存储器和硬件寄存器。因此,大多数操作系统都是使用C语言族编写的。例如,我可以将任意函数复制到内存中的任意位置,然后将该位置作为函数调用(假设硬件不会阻止我执行数据;当然,这在某些微控制器上是可行的)。
int hello_world()
{
printf("Hello, world!");
return 0;
}
int main()
{
unsigned char buf[1000];
memcpy(buf, (const void*)hello_world, sizeof buf);
int (*x)() = (int(*)())buf;
x();
}
Run Code Online (Sandbox Code Playgroud)
但是,我一直在阅读有关某些专用Lisp机器的Open Genera操作系统的信息。维基百科说:
属完全用Lisp编写;甚至所有低级系统代码都用Lisp编写(设备驱动程序,垃圾回收,进程调度程序,网络堆栈等)。
我对Lisp完全陌生,但这似乎是一件困难的事情:从我所见,Common Lisp对运行的硬件没有很好的抽象。Common Lisp操作系统将如何做一些基本的事情,例如编译以下琐碎的函数,将其机器代码表示形式写入内存,然后调用它?
(defun hello () (format t "Hello, World!"))
Run Code Online (Sandbox Code Playgroud)
当然,Lisp 本身可以很容易地实现,但是用Sam Hughes 的话说:“在某个地方,抽象用完了,机器必须执行一条指令。”