创建新编程语言的真正好处是什么?你真的不太可能实际使用它。
简而言之,创建新语言的过程将如何使您成为更好的程序员?
答案 0 :(得分:40)
您将了解语言设计背后的决策,并更好地全面了解可读性,性能和可靠性之间的妥协。
您对递归,闭包,垃圾收集,参考管理,打字,数据结构以及这些内容实际工作方式等概念的熟悉程度会提高。大多数程序员将更好地利用资源和语言功能。
类似于我们在使用其他语言时学习编写解决方案的新方法的方式,当我们编写自己的语言时,我们会探索创建解决方案的新方法。见Metaprogramming。与问题所暗示的相反,Domain Specific Languages在许多环境中使用。
如果您正在编写编译器,您将了解有关计算机如何工作的更多信息。 (取决于您的目标,可能比您打算学习的更多)
当我在学校编写自己的排序例程,甚至重新实现好的例程时,它确实驱动了一些算法weaknesses中的一些。
简而言之,知道如何使用工具的程序员和知道如何制作工具的程序员之间存在一个数量级的差异。
答案 1 :(得分:12)
我可以根据这里的经验说话......
有趣,特定于域的问题解决,上下文中的复杂性
我喜欢为有趣创建新语言,以及解决特定于域的问题。一个非常简单的例子可能是维基百科标记或像Erlang那样复杂的东西,专门用于并发处理。
许多通用语言都很相似,因为它们是通用的。有时您需要更强大的准确抽象您正在解决的问题的机制。另一个例子是M4宏语言。
记住语言不是魔术,它只是具有隐含语义的已定义语法结构的集合。 SQL是一个很好的语言示例,其目的是在语法和语义中定义。
学习语言如何工作,什么使语言可解析,什么使语义合理以及实现这一点,我认为可以使你成为更好的程序员。
编译器体现了很多支持计算机科学的理论:
翻译,抽象,解释,数据结构,状态....列表继续。学习这些东西会让你了解你的程序的含义以及幕后的内容。您当然可以独立学习,但编译器是一个很好的上下文,可以学习复杂的主题,例如DFA / NDFA自动机,基于堆栈的解析器,抽象语法树....
我认为编译器是漂亮的机器:)
答案 2 :(得分:7)
多种原因:
答案 3 :(得分:6)
我认为Jeff Attwood在this Coding Horror post中很好地回答了这个问题 - 虽然他正在谈论一个更普遍的问题(为什么在同一设计空间中存在其他工件时创建任何新的库,框架等),我怀疑确切地说更广泛的观点给了他一个不同而有趣的观点。
答案 4 :(得分:4)
我将补充一点,如果您编写语义,那么您的语言是一种实际语言,而不仅仅是某些特定实现所接受的语言,您将学到很多关于如何准确描述计算行为:
您将了解哪些行为是什么,不容易描述 - 并证明是正确的。
您将学习如何权衡不同形式的形式来描述不同类型的特征。
你最终会成为一个更好的程序员,因为你将学习的形式主义和证明技术将适用于各种问题:锁定技术,内核中的安全属性,无锁数据结构,网络协议和信息安全,仅举几例。所有这些领域都适用于编程语言的相同形式的处理。
要选择一个例子,如果你给你的语言一个静态类型系统,然后你证明一个好的类型程序保证是内存安全的,那么你将学习和你一样多(在不同的维度上)将通过编写解释器或编译器。
编辑:如果您想了解这些内容,我认为最简单的起点是Benjamin Pierce's series of two books on Types and Programming Languages。还有一个graduate textbook by Glynn Winskel更难,但更倾向于语义和证明技术。
答案 5 :(得分:3)
创建特定于域的语言非常有价值。不要只考虑通用语言,而应考虑创建所谓的“小语言”,清楚地表达项目中的抽象。
例如,在最近的一个项目中,我决定使用命令模式来驱动服务层。我在命令代码中发现了一些重复,所以我编写了一个小编译器,它接受一种表达命令的简单语言,并以“底层”语言发出命令实现。
答案 6 :(得分:2)
出于同样的原因,即使您从未在一生中编写过单个编译器,在大学学习编译器构建课程也会使您受益。如果可能的话,这是一个引人注目的外观。
答案 7 :(得分:2)
除了altCognito所说的,这是一个理论/学术视角,当现有的“通用”语言对你的任务来说效率极低或者根本没有效率时,会创建一些高度专业化的语言来有效地解决特定问题。一种易于使用的现有替代方案。
当然,这种情况往往是罕见的,如果你遇到问题的第一直觉是“我需要一种新的语言”,那么你很可能会遗漏一些东西。 “可用”技术需要有相当大的差距,而且你需要保证这样的承诺。
答案 8 :(得分:2)
我认为这有两个概念上不同的答案。首先,您将了解编译器如何将代码转换为可执行代码。这可以帮助您更好地决定如何构建代码以优化(或允许优化)代码。例如,如果您知道某个构造会禁止编译器内联代码块或展开循环,那么如果性能成为真正的问题,您可以避免这种情况。
其次,所有当前语言都是在历史的某个时刻发明(或衍生出来的)。对于这些中的每一个,实际使用它的可能性可能很小,但在这里它们是。他们都发现他们有理由认为有人想做一些现有语言不可能或不容易做的事情,并决定对此采取行动。懒惰(或让计算机为你工作的愿望)是发明之母。
答案 9 :(得分:2)
只是为了好玩...然后你就会意识到你不能比你认为他们吸吮xD的所有语言做得更好(所以你不要抱怨他们)。
答案 10 :(得分:1)
编写编译器或解释器需要对计算机科学理论有非常深刻的理解。如果您正在编译机器代码而不是其他语言,那么它也需要对硬件设计有一个坚定的理解。
除此之外,了解如何设计编译器意味着您将更好地理解语言,以及您专门使用的语言。您将更好地理解语言设计者在编写规范时所采用的语法和权衡。
编写编译器不是让你成为更好的程序员。这是对语言理论和编译器设计的深刻理解,使您更好。
答案 11 :(得分:1)
创建新语言的过程将如何使您成为更好的程序员?
你是对的,你可能会也可能不会使用这种语言,但至少体验你将从中获益,这将有助于你理解编程语言和某些事物的实现您将能够应用于您遇到的未来计算问题。
答案 12 :(得分:0)
大多数情况下,您这样做是为了娱乐或拓宽您对某个主题的理解。
我不同意创造新语言影响表现 - 表现如何?恕我直言的执行速度不应该依赖于语言结构,而是语言被翻译成什么 - 这是不同的东西:比如为语言创建语法并为其编写编译器/虚拟机。
答案 13 :(得分:0)
答案 14 :(得分:0)
我想要一种托管语言,允许修改其内部作为标准做法。有点像Ruby的鸭子在更大范围内打孔。
作为库的客户端,我应该能够交换不能满足我想要的库函数。
这就是让我疯狂使用.NET的原因。微软无法解决的框架中存在漏洞,而且由于GAC签名我无法解决。即使不是GAC签名,热修补全局库也是一个坏主意(可能会破坏其他应用程序)。
答案 15 :(得分:-3)
我不关心编译器如何工作,不关心学习新语言,也不关心使用perl和javascript等脚本语言。我对大型程序的构建(或应该构建)的方式更感兴趣。仍然没有很好的解决方案使LARGE软件像原型代码一样易于使用。编程语言对此没有帮助。它们可以解决诸如排序和内存释放之类的琐碎问题,让您独自解决真正重要的问题(让您或您的公司免于赔钱)。