关于编写编程语言的赤裸裸的真相

2020-05-03 03:57:09

我的职业生涯一直是关于设计编程语言和为它们编写编译器。这对我来说是一种巨大的快乐和满足感,如果您决定设计和实现一种专业的编程语言,也许我可以帮助其他人观察一下您的需求。当然,这是一个全书篇幅的主题,所以我在这里只会顺其自然地谈几个要点,而避开在其他地方已经很好地讨论过的话题。

首先,你有很多工作要做。多年的工作,其中大部分将在沙漠中游荡。成功的机会对你不利。如果你没有强烈的自我激励去做这件事,它是不会发生的。如果你需要别人的认可和鼓励,这是不会发生的。

幸运的是,做这样一个项目不是一大笔钱的投资,即使你失败了,它也不会让你崩溃。即使你真的失败了,取决于项目进展到什么程度,它在你的简历上看起来也会相当不错,对你的职业生涯也有好处。

有一件事非常清楚,那就是语法很重要。这非常重要。这就像汽车上的造型-如果造型不吸引人,那么表演再火爆也无关紧要。语法必须是您的目标受众喜欢的内容。

尝试使用他们以前从未见过的东西,将使语言采用变得更难推销。

我喜欢把熟悉的句法和美感结合在一起。它必须在屏幕上看起来很好看。毕竟,您将花费大量时间来研究它。如果它看起来笨拙、笨拙或难看,那么它就会玷污语言。

也许令人惊讶的是,我建议的几件事不应该是考虑因素。这些都是虚假的神:

最大限度地减少击键。当程序员使用纸带时,这可能很重要,而且对于bash或awk这样的小型语言也很重要。对于较大的应用程序,编程时间花在读写上的时间要比写多得多,因此减少击键本身不应该是一个目标。当然,我并不是说大量的样板文件是个好主意。

易于解析。编写具有任意先行功能的解析器并不难。不应该为了在解析器中节省几行代码而影响语言的外观。请记住,您将花费大量时间盯着代码。这是第一位的。如下所述,它仍然应该是上下文无关文法。

最大限度地减少关键字的数量。这个指标很愚蠢,但我看到它反复出现。英语有一百万个单词,我不认为有任何迫在眉睫的短缺。只要用你正确的判断力就行了。

上下文无关文法。这实际上意味着代码应该是可解析的,而不必在符号表中查找。众所周知,C++不是上下文无关的语法。上下文无关的语法,除了使事情变得简单之外,还意味着IDE可以在不集成到大多数编译器前端的情况下进行语法突出显示,也就是说,第三方工具变得更有可能存在。

冗余。是的,语法应该是多余的。你们都听人说过,语句终止是不必要的,因为编译器可以解决这个问题。这是真的-但这种非冗余会导致无法理解的错误消息。考虑一种没有冗余的语法。然后,任何随机的字符序列都将是有效的程序。甚至不可能出现错误消息。良好的语法需要冗余,以便诊断错误并提供正确的错误消息。

久经考验,千真万确。如果没有非常有力的理由,对于熟悉的结构,最好坚持使用久经考验的真实语法形式。它确实缩短了该语言的学习曲线,并将提高采用率。想想看,如果这种语言交换了+和*的运算符优先级,人们会多么讨厌它。将分歧3保存为以前未见的特征,这也向用户发出这是新的信号。

一如既往,这些原则不应被视为口头禅。要有正确的判断力。任何盲目遵循的语言设计原则都会导致灾难。这些原则很少是正交的,而且经常发生冲突。这很像设计一座房子--把主衣橱做得更大,意味着主卧室会变小。这一切都是为了找到合适的平衡。

抛开语法不谈,语言的核心将是语义处理,也就是将意义赋予句法结构。这是您将花费大量设计和实现的地方。这很像你体内的器官--它们是看不见的,除非它们出了问题,否则我们不会去想它们。语义工作不会有太多荣耀,但它将是语言的全部意义所在。

一旦通过语义阶段,编译器就会进行优化,然后生成代码,统称为后端。这两个关都很有挑战性,也很复杂。我,我喜欢和这些东西打交道,抱怨说我不得不把时间花在其他问题上。但除非你真的喜欢它,而且它需要一个相当精神错乱的人