首页 文章

引导编译器:为什么?

提问于
浏览
28

我理解一种语言是如何自我引导的,但是我还没有找到很多关于为什么要考虑引导的参考 .

直观的答案是,您正在编写的语言提供了编译器的"base"语言中找不到的实用程序,并且该语言的功能相对非常适合编译器 .

例如,引导C编译器是有意义的 - 当正确使用OOP时,维护编译器可能要容易得多,而不是使用普通的C语言 .

另一方面,MATLAB确实使矩阵数学比普通的C容易得多,但我不能看到在MATLAB中编写MATLAB编译器/解释器有任何明显的好处 - 看起来它的可维护性会降低 . 类似的视图可以应用于R编程语言 . 或者一个非常极端的例子是bootstrapping Whitespace,它是用Haskell编写的 - 绝对是Whitespace的巨大超集 .

引导的唯一原因是利用新语言的功能吗?我知道还有“因为我们可以”的理由,但那不是我想要的:)

11 回答

  • 3

    编译器解决了各种各样的重要问题,包括字符串操作,处理大型数据结构以及与操作系统连接 . 如果您的语言旨在处理这些事情,那么用您的语言编写编译器就可以演示这些功能 . 此外,它会产生指数效应,因为当您的语言包含更多功能时,您可以在编译器中使用更多功能 . 如果您实现任何可以简化编译器编写的独特功能,那么您可以使用这些新工具来实现更多功能 .

    但是,如果您的语言不是为了解决同样的问题编译,然后引导只会诱使你使用与编译有关但与目标问题无关的功能混乱你的语言 . 使用Matlab或SQL进行自编译会很荒谬; Matlab没有理由包含强字符串操作函数,SQL没有理由支持代码生成 . 由此产生的语言将是不必要的和杂乱的 .

    值得注意的是,解释语言是一个稍微不同的问题,应该相应地对待 .

  • 1

    低级语言经常被引导,因为为了将代码放在新系统上,你需要一个低级编译器 . 获取C编译器,现在您可以使用大量代码 . 使用自举编译器可以使这更容易,您只需要存在自己的代码即可编译和改进自己的代码 .

    还有其他方法可以实现这一点,比如制作交叉编译器,在大多数系统上,你永远不需要在普通使用中在设备上编译静态语言(事实上,像Windows这样的系统没有编译器) .

    编译器经常引导的另一个原因是它们不必担心编译它们的编译器中的错误 . 确保您的编译器可以自己编译,并限制在使用其他编译器编译时可能出现的错误组合 .

    我认为引导高级语言主要是为了炫耀一个人毛茸茸的编程技巧 .

  • 4

    有一个叫做“吃自己的狗食”的原则 . 通过使用工具,您可以证明该工具的实用性 .

    人们经常会问,“如果语言X的编译器不是用X语言编写的,那我为什么要冒险使用它呢?”

    这当然仅适用于适合编译器编写领域的语言 .

  • 10

    引导语言实现有两个主要优点:首先,正如您所建议的那样,在实现中利用所述语言的高级功能 . 但是,一个不太明显但同样重要的优点是,它允许您自定义和扩展语言,而不会陷入用C语言编写的较低层(或Java,或者新语言运行时下面的任何内容) .

    元编程可能对大多数日常任务没有用,但有时它可以为您节省大量的重复或样板代码 . 能够为高级语言挂钩编译器和核心运行时可以使高级元编程任务变得更加容易 .

  • 7

    Ken Thompson的Reflections on Trusting Trust解释了引导的最佳原因之一 . 从本质上讲,您的编译器会在引导链中为每个版本的编译器学习新的东西,您将永远不必再次教它 .

    在他提到的情况下,你编写的第一个编译器(C1)必须被明确告知如何处理反斜杠转义 . 但是,第二个编译器(C2)是使用C1编译的,因此本机处理反斜杠转义处理 .

    他演讲的基石是你可以教一个编译器为程序添加一个后门程序的可能性,并且使用受损编译器编译的未来编译器也将被赋予这种能力并且它永远不会出现在源代码中!

    从本质上讲,您的程序可以在 do not have to be reimplemented or recompiled in later compilation cycles 的每个编译周期中学习新功能,因为编译器已经知道了所有这些功能 .

    花一点时间来实现这些后果 .

    [edit]: 这是构建编译器的非常糟糕的方法,但很酷的因素是通过屋顶 . 我想知道它是否可以通过正确的框架进行管理?

  • 13

    它可以被认为是将“玩具”语言与“真实”语言分开的标准 . 如果语言不够丰富,无法实现,那它仍然是一个玩具 . 但考虑到今天用C语言实现的流行语言数量,这可能是一个过去很久以来的态度 .

  • 9

    一个优点是,在编译器上工作的开发人员只需要知道正在编译的语言 . 否则,开发人员需要知道正在编译的语言以及编译器编写的语言 .

  • 30

    您没有为DSL编译编译器 . 您不在SQL中编写SQL查询编译器 . MATLAB可能看起来像一种通用语言,但实际上它不是 - 它是一种专为数值计算而设计的语言 .

  • 2

    Bootstrapping还有另一个优点:如果您的语言很好,您可以通过在<insert language here>中编写编译器来节省时间,而不是使用C语言编写 . 例如,C#编译器是用C语言编写的,但现在它们正在重写它C#,它允许它们(除其他外)使用CLR中的线程框架而不是在C中滚动它们(并且跟随Mono人的领导,营销方面明智,Mono因能够更好地处于更好的位置说我们的C#编译器实际上是用C#编写的 .

  • 2

    作为一个具体的例子,在version 1.5(2015年8月发布)中,Go转变为一种完全自助的语言[1] [2] . 他们列出了以下原因:

    • Go比C更容易编写(正确)

    • Go比C更容易调试(即使没有调试器) .

    • Go是您需要知道的唯一语言;鼓励捐款 .

    • Go具有更好的模块化,工具,测试,分析,......

    • Go使并行执行变得微不足道 .

    其中,唯一适用于所有语言的是您只需要知道一种语言就可以为编译器做出贡献 . 其他论点可以概括为“我们的新语言比旧语言更好” . 哪个应该是真的,为什么还要写一种新语言呢?

  • 2

    你可能想要做几件事(理论上):

    • 您的编译器生成的代码比引导平台上的其他编译器更优化 .

    • 您的编译器生成的代码比引导平台上的其他编译器更正确 .

    • 你're an egotistical jerk who is convinced that one of the above is true even though it'不是 .

    • 原始逻辑没有't a compiler available on your platform (this was GCC',因为许多平台当天没有C编译器 .

    • 您想要证明您的编译器可以处理它(毕竟,这实际上是对编译器的一个非常好的测试) .

相关问题