编译器自托管是否有实际原因?

Is there a practical reason for a compiler to be self-hosting?

如果您的 bootstrap 语言编译器运行良好且可维护,为什么要更改它?例如,Go 在 1.5 版中将其编译器重写为自托管,这导致 compile times to become much slower:当 Go 的目标是快速编译时,这是一个明显的损害。

一个实际原因是社区。如果编译器是用相同的语言编写的,那么使用您的语言进行编程的人可能更愿意在编译器中进行编程。如果我的编译器在 Fortran/COBOL 中并且它生成 Go 我不太可能吸引 Go 开发人员使用编译器。

另一个是构建链,即 dependencies。如果您有一个用一种语言编写的编译器并生成另一种语言,那么当您可以满足于一套时,您有两组测试要编写。这也降低了进入门槛,即您不需要开发人员了解多个工具链等。了解两种语言足以成为一名称职的编译器编写者是一项艰苦的工作,并且会缩小您寻求帮助的潜在受众。 获得帮助对于大多数开源项目来说非常重要,任何可以增加潜在开发人员基础的事情都是一个明确的实际优势。

您还可以将测试列为一项额外的好处。如果您已经编写了一个自托管编译器,那么该语言需要做很多事情才能使其相对容易(而不是拔牙)自托管,即文件 IO、字符串操作、符号表、树和列表等。显然你没有所有这些也可以生存,但它开始使编写编译器变得更加困难。这种坐在吃自己的狗粮营。

它被认为是 Rite of Passage 但我不认为这是一个非常实际的原因,除非你能证明它吸引了开发者或其他一些理由去做,也许对成就感觉良好是一个实际好处,即您不太可能放弃它。

这里有一个有趣的话题...

https://softwareengineering.stackexchange.com/questions/263651/why-are-self-hosting-compilers-considered-a-rite-of-passage-for-new-languages

出于某些具体原因,请阅读 Rob Pikes 的幻灯片,了解他们为何将 Go 编译器移至 Go instead of C。幻灯片中的结论是:

  1. 摆脱 C 是该项目的巨大进步。
  2. 代码更清晰、可测试、可分析、更易于处理。
  3. 新的统一工具链减少了代码大小,增加了可维护性。 灵活的工具链,可移植性仍然是最重要的。

根据所用语言的不同,您获得的收益可能会有所不同。