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