如何设计一种新的编程语言

2020-12-26 19:28:39

从模糊的,空洞的想法到如何在新的编程语言中实现,再到健壮,自洽,实际的实现这些想法,还有很长的路要走。从头开始设计和实现新的编程语言是程序员可以执行的最具挑战性的任务之一。

注意:这篇文章的目标读者是那些想要在设计有用的编程语言上做出艰苦尝试的积极进取的程序员。如果您只是想将一种语言作为有趣的附带项目,那么您完全可以使用它。从事那种性质的不认真的项目也是发展专业知识的好方法,这对以后的严肃项目很有用。

让我们设置场景。您已经知道几种编程语言,并且知道自己对它们的喜好和不喜欢-这些都是您的影响。您也有一些很酷的新颖语言设计思想。从这里开始的一个很好的第一步是幻想一些伪代码,将您的一些想法付诸实践,以便您可以理解使用这种假想的语言编写或阅读代码的实际想法。也许是简短的写作或目标和想法的列表。在您的知己之间散布这些内容,以进行讨论和反馈。

想法需要在实现的伪造中得到证明,下一步是编写编译器(或解释器,本文中的所有内容均适用于它们)。我们将其称为牺牲性实施,因为您应该准备在以后将其丢弃。其目的是证明您的设计思想有效并且可以有效地实施,而不是成为新语言的生产就绪型实施。它是帮助您优化语言设计的工具。

为此,即使您最终希望使用其他设计(例如递归下降),也建议使用yacc这样的解析器生成器来创建解析器。快速更改语法的能力以及在工作时编写正式语法的副作用,都是在此开发阶段具有的宝贵价值。准备好扔掉其余的编译器是有帮助的,因为由于同时设计和实现编程语言的固有困难,您的第一个实现可能会变得很糟糕。您不知道该语言的外观,会假设您以后必须撤消操作,并且会进行数十种重构。会很烂。

但是,尽管可能如此,它将在验证您的想法和完善您的设计方面做重要的工作。我建议您的下一步是开始研究该语言的正式规范(相信所有语言都应该具备的规范)。您已经证明了行之有效的方法,然后正式编写它是确定想法并解决极端情况的好方法。 Gathera小组由感兴趣的早期采用者,贡献者和主题专家(例如,使用类似语言的编译器专家)组成,并在工作时就规范进行讨论。

这也是开始第二个实施工作的好时机。在这一点上,您将掌握编译器的总体设计,原始实现的缺陷以及作为编译器程序员的更好技能。同时工作第二个编译器和您的规范可以为彼此提供帮助,因为这两个工作都可以使他人受益。特别难以实现的细节可能会导致规格简化,而规格不足的细节被拥护可能会导致更坚固的实现。

不要气carried,让这个新的编译器变得简单小巧。不要疯狂地使用诸如linter和formatters,详尽的测试套件,详细的错误消息,复杂的优化器等出色的功能。您希望尽可能简单地实现该规范,以便可以将其用于下一步:托管编译器。您需要编写第三种实现,使用自己的语言进行编译。

我希望您使用C编写的第二个编译器现在是bootstrap编译器。我建议将其与规范保持最新并永久维护,这是从头开始启动工具链的便捷途径(看着您,Rust) 。但这并不是最终的实现:任何自尊的通用编程语言都将自己实现。下一步,也是最后一步,是第三次实现您的语言。

此时,您将完善并证明您的语言设计。您将拥有开发和应用编译器编程的技能。您将拥有完整,自洽的编程语言的强大实现,该语言经过精心开发并具有后见之明。您未来的社区将感谢您为这项工作所付出的精力和时间,因为您的语言设计和实现为编写init程序的质量设定了上限。