引导一个编译器:为什么?
我了解一种语言如何引导自己,但我一直无法找到关于为什么应该考虑引导的很多参考。
直观的答案是,您正在编写的语言提供了在编译器的“基本”语言中找不到的实用程序,并且该语言的功能相对而言非常适合编译器。
例如,引导一个C ++编译器是有意义的 - 当正确使用OOP时,它可能更容易维护编译器,而不是使用plain C.
另一方面,MATLAB确实使得矩阵运算比普通C算法容易得多,但是在MATLAB中编写MATLAB编译器/解释器看不到任何明显的好处 - 看起来它的可维护性会降低。 类似的观点可以应用于R编程语言。 或者一个非常极端的例子是引导Whitespace,它是用Haskell编写的 - 绝对是一个巨大的Whitespace超集。
自举是利用新语言功能的唯一原因? 我知道还有“因为我们可以”的原因,但那不是我正在寻找的:)
有一个原则叫做“吃自己的狗粮”。 通过使用工具,您可以证明该工具的实用性。
经常会问,“如果语言X的编译器不是用X语言编写的,为什么我应该冒这个风险呢?”
这当然只适用于适合编译器编写领域的语言。
引导式语言实现有两个主要优点:首先,如您所建议的,在实现中利用所述语言的高级特性。 然而,一个不太明显但同样重要的优点是它可以让你自定义和扩展语言,而不会落入用C语言编写的低层(或Java,或者低于新语言运行时的任何东西)。
对于大多数日常任务来说,元编程可能没有用处,但有时可以为您节省大量重复或样板代码。 能够以高级语言挂钩到编译器和核心运行时,可以使高级元编程任务变得更加容易。
Ken Thompson关于信任信任的思考解释了自举的最佳理由之一。 从本质上讲,你的编译器会在引导链中为编译器的每个版本学习新东西,你永远不需要再次教它。
在他提到的情况下,你写的第一个编译器(C1)必须明确告诉如何处理反斜杠转义。 但是,第二个编译器(C2)使用C1进行编译,所以本机处理反斜杠转义处理。
他的演讲的基石是你可以教导一个编译器为程序添加一个后门程序,并且用编译器编译的未来编译器也会被赋予这个能力,并且永远不会出现在源代码中!
从本质上讲,您的程序可以在每个编译周期中学习新特性,因为编译器已经知道它们的全部内容,所以不必在以后的编译周期中重新实现或重新编译。
花一点时间来认识这些后果。
[编辑]:这是构建编译器的非常糟糕的方式,但很酷的因素是通过屋顶。 我想知道它是否可以通过正确的框架进行管理?
链接地址: http://www.djcxy.com/p/80799.html