为什么要创建一种新的编程语言?

24

创建一门新的编程语言的真正好处是什么?实际上你很可能并不会使用它。

简而言之,创建新语言的过程会如何让您成为更好的程序员?


1
关于你问题中的“不使用它”部分:十年前,我写了一个可悲的小脚本语言,几乎只是一个模板引擎。无论如何,在许多项目中,我将其用于代码生成和类似任务,我认为它非常有用。 - Erich Kitzmueller
@ammoQ,这真的很酷,希望当我创建一种语言时,它能对某个人有用,即使只是对我自己有用。 - Pranav
1
@ammoQ,我认为我们都有那些私人的文本处理和语义处理工具,它们非常有用(尽管对于其他人来说是无法学习的):) - Aiden Bell
@Aiden:编程语言在你不必明确说明的地方具有相当大的能力,“个人语言”在这方面表现得非常出色。 :) - Roger Pate
我认为通过设计一种语言并为其创建自己的编译器,你可以学到很多东西。我认为你将会对编程语言中特定的设计选择和编译器有更深入的了解...而编译器只是一个复杂的低级软件,这迫使你思考很多东西。 - Marnix v. R.
16个回答

42
你将了解语言设计背后的决策,并获得更好的整体理解,了解可读性、性能和可靠性之间的妥协。您熟悉诸如递归、闭包、垃圾收集、引用管理、类型、数据结构等概念,以及这些东西实际上是如何工作的,这将增加大多数程序员对资源和语言特性的利用。
与我们使用其他语言学习新编码解决方案的方式类似,当我们编写自己的语言时,我们探索创建解决方案的新方法。参见元编程。与问题所暗示的相反,领域特定语言在许多环境中都被使用。
如果你正在写一个编译器,你会比以前更了解计算机的工作原理。(根据你的目标,可能比你打算学习的更多)
当我在学校里编写自己的排序例程,甚至重新实现好的例程时,它真正地突显出了一些算法的弱点
简而言之,知道如何使用工具和知道如何制造工具的程序员之间存在数量级的差异。

6
你会发现它并不像在学校里看起来的那么容易。 - Paul Tomblin
2
可能比你想知道的还要多。 :) 我不确定。 - Aiden Bell
3
更多:那可能真的很酷。我认为语言不仅仅是一种工具,实际上我非常喜欢编程。当我开始像创造一种语言或编译器这样的事情时,人们会来问我:你为什么要这么做?你试图重复发明轮子吗?嗯,有时候你必须自己看看。即使只是为了好玩。 - Eduardo Cobuci
4
@Eduardo...我常常会遇到“为什么要重复制造轮子”的说法...如果我们不这样做,那么我们现在还是使用木质辐条车!这种说法表明说话者缺乏逻辑论证。轮子是圆的,但由于不断创新而存在于许多形式。说“这个不同,这个很酷,我正在做”有什么问题吗? (注:本翻译尽可能保留了原文的表达方式,同时使其更通俗易懂。) - Aiden Bell
1
@Pranav 确实如此,但我认为创建一个_好的_DSL需要比普通语言更多的预见性和语言理论知识。也许不是这样,我只是在想DSL往往具有非常有趣的语义和规则,因为它们非常特定于手头的问题 :) - cgp
显示剩余4条评论

13

根据我的经验,我可以说...

有趣、特定领域问题解决、上下文的复杂性

我喜欢创造新的语言以供有趣之用,并处理特定领域的问题。一个非常简单的例子可能是维基百科标记语言,或者像专门处理并发处理的Erlang一样复杂。

许多通用编程语言很相似,因为它们是通用的。有时,您需要一个更准确的抽象来表示您正在解决的问题的机制。另一个例子是M4宏语言。

请记住,语言不是魔法,它仅仅是一组定义了语法结构和隐含的语义的集合。 SQL是一个很好的针对特定目的而设计的语言,其语法和语义中定义了这个目的。

学习语言的工作原理,什么使语言可分析,什么使语义有意义以及其实现,我认为可以使您成为更好的程序员。

编译器体现了计算机科学的许多理论

翻译,抽象,解释,数据结构,状态...等等。学习这些内容将使您了解程序的影响以及其底层发生的情况。当然,您可以独立学习这些知识,但编译器是学习复杂主题的上下文环境的好选择,例如DFA/NDFA自动机、基于堆栈的解析器、抽象语法树...

我认为编译器是非常美妙的机器 :)


7

多种原因:

  • 炫耀权利
  • 经济奖励
  • 极端的无聊
  • 对现有数百种语言不满意
  • 未治愈的精神错乱
  • 希望实现更容易融入新设计概念的语言(比如那些使设计模式更加简单易懂的语言)
  • 其他原因,也许还有

经济激励?像什么? - Pranav
1
对我来说这是不满意的(或许我只是疯了)。 - Zifre
@Pranav:据推测,Sun创建Java是为了商业利益。微软创建.NET平台(我意识到那不是一种语言)也是为了商业利益。语言的创造如何带来经济收益取决于具体情况。 - Garrett

6

我认为Jeff Attwood在这篇Coding Horror的文章中回答得很好--尽管他谈论的是一个更一般的问题(当同一设计空间中已经存在其他工件时,为什么要创建任何新库、框架等),但我认为正是这种更广泛的视角给了他不同和有趣的观点。


5
我想补充一点,如果你编写语义,使得你的语言不仅仅是某个特定实现所接受的内容,而是真正的语言,你将学到大量关于如何准确描述计算行为的知识:
  • 你将学习哪些行为易于描述和证明正确,哪些不易于描述。

  • 你将学习如何权衡不同形式主义来描述不同特性。

  • 你最终会成为一名更好的程序员,因为你所学的形式主义和证明技术将适用于各种问题:锁技术、内核中的安全属性、无锁数据结构、网络协议和信息安全等等。所有这些领域都可以得到与编程语言相同的形式处理。

举一个例子,如果你给你的语言添加静态类型系统,并证明良好类型的程序保证是内存安全的,那么你将学到与编写解释器或编译器同样多(在不同维度上)的知识。

编辑: 如果你想学习这些东西,我认为最容易入手的起点是Benjamin Pierce的两本类型和编程语言书。还有一本Glynn Winskel的研究生教科书,更加注重语义和证明技术。


如果你的编程语言采用静态类型系统,并且你证明了一个良好类型的程序保证是内存安全的,那太棒了!我不知道该如何解决这个问题。你有什么书可以推荐吗?谢谢。 - Pranav
@Pranav:我编辑了我的答案,链接到了几本好书。 - Norman Ramsey

3
创建领域特定语言非常有价值。不要只考虑通用语言,而是考虑创建所谓的“小语言”,清晰地表达项目中的抽象概念。
例如,在最近的一个项目中,我决定使用命令模式来驱动服务层。我发现我的命令代码中有一些重复,因此我编写了一个小编译器,它接受一个简单的语言来表达命令,并在“底层”语言中生成命令实现。

2

即使您终身从未编写过任何编译器,参加大学的编译器构造课程也会对您有所裨益。这是因为它让您深入了解内部机理。


2
除了altCognito所说的理论/学术角度,有些高度专业化的语言被创建出来是为了在现有的“通用”语言对于你的任务要么极其低效要么根本没有易于使用的现有替代方案时,能够有效地解决特定问题。
当然,这样的情况往往很少见,如果你在遇到问题时第一反应是“我需要一个新的语言来解决这个问题。”,那么很可能你正在错过什么。必须存在相当大的“可用”技术和你的需求之间的差距才能证明这样的努力是值得的。

2
我认为这个问题实际上有两个不同的概念性答案。首先,你可以了解编译器如何将你的代码转换为可执行代码。这可以帮助你更好地决定如何构建你的代码以优化(或允许它被优化)。例如,如果你知道某个结构会阻止编译器内联代码块或展开循环,那么如果性能成为真正的问题,你就可以避免使用它。
其次,所有现有的语言都是在某个历史时期发明(或派生)的。对于每一种语言,它被实际使用的可能性潜在地很小,但它们都找到了存在的理由,因为有人想做一些在现有语言中不可能或不容易完成的事情,并决定采取行动。懒惰(或让计算机为你工作的愿望)是发明之母。

2

只是为了好玩...然后你会意识到你无法创造出比你认为不好的语言更好的东西 xD (所以你停止抱怨它们)。


所以你别再抱怨它们了。- 不是真的 :) - Pranav
1
我认为创造自己的编程语言有时就像试图做一件完美的衣服...但你不是裁缝;但你最终会得到那件衣服。 - Aiden Bell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接