从长远来看,是否有更好的杀手级应用程序,算法问题类别等等,可以创造出自己的语言?
PS:可以肯定的是,我的意思是一种新的编程语言和一个编译器,而不是现有语言的新编译器。
编辑:谢谢你的答案。您能提供一些示例,这些示例绝对不需要创建DSL,或者说DSL可能是个好主意?
从长远来看,是否有更好的杀手级应用程序,算法问题类别等等,可以创造出自己的语言?
PS:可以肯定的是,我的意思是一种新的编程语言和一个编译器,而不是现有语言的新编译器。
编辑:谢谢你的答案。您能提供一些示例,这些示例绝对不需要创建DSL,或者说DSL可能是个好主意?
Answers:
一个人出于教育目的写自己的语言当然很重要。了解编程语言设计和编译器设计。但是实际用途很少。
使用自己的语言,您是:
因此,如果您打算为您的项目编写自己的语言,则它提供的其他语言所不需要的功能无需抵消上述费用。
以游戏开发为例。他们经常需要在游戏或脚本语言中使用迷你语言。他们使用这些语言来编写大量发生的游戏内事件的脚本。但是,即使在这种情况下,他们几乎总是选择现有的脚本语言,并根据需要对其进行调整。
让我引用一下VB编译器的前首席开发人员Paul Vick的话,他现在正在研究Oslo项目和M语言:
构建一种新的语言非常困难,极其困难,即使是很大程度上基于现有语言的语言也是如此。但是许多程序员认为,“嘿,我使用语言,这有多难?”然后继续研究。…可能超过98%的人根本无法获得任何吸引力,但是上帝保佑乐观主义者,因为没有他们,我们将永远无法获得2%的成功语言。我个人愿意为从未使用过的语言付出数百万美元的时间和金钱,以便我们获得C#和Java,Ruby和Python等语言。
因此,提出一种新语言是一个坏主意,这一事实不应阻止人们开发新的DSL,而应该让他们停顿一下,并希望有点谦虚。我认为,关键是从小处着手,保持小处。
什么时候合理?
当你喜欢的时候!
不要听这些人的昧评论,他们基本上说:
“不要这样做,因为它太难了,X语言比您能想到的任何一种语言都要好。”
事实是,创建DSL一直都在发生。框架是DSL。宏是DSL。每次为程序编写函数时,它就是DSL的一部分。当然,它在语法的范围之内,但是词汇是语言的一部分。这就是为什么行业经常创建自己的本地语言的原因:效率更高!
如果“不做”是正确的答案,那么我们所有人都将编写COBOL和Fortran。
如果您正在考虑编写自己的语言,则可能需要阅读Martin Fowler即将出版的DSL书的部分内容。
除了真正的学习经验之外,我真的无法想到从头开始创建一种语言的业务案例。
编辑:对于DSL,有很多商业案例,但是这里的关键不是要迷失方向并保持简单。
原因之一可能是将其创建为实验来学习语言设计和编译器。
另一个原因可能是当您无法选择添加第三方API时将脚本语言构建到应用程序中。
我认为您不能在不创建新语言的情况下进行编程,因此很高兴意识到这就是您正在做的事情并理解这些问题。
VB,Java,C#等现成的语言只是一种基本语言。向其中添加类,方法等后,就已经添加了词汇和语义。有多种实现语言的方法-解析和翻译,解析和解释,在现有语言之上的宏,向现有语言添加类和方法。
您如何知道是否已完成此操作?我使用的度量是编辑计数。如果单句要求A出现,我将继续在代码中实现该要求。完成并清除所有错误后,我检入代码,代码存储库向我提供了我所做的更改列表B。B 越小,语言越好。在实际和可能需求的空间中取平均值,该度量告诉我该语言的“特定于领域”。
如果要执行1个要求需要N个代码更改,并且您有时会犯错误,那么引入的bug的数量大致与N成正比。在N = 1的限制内,几乎不可能不引入就引入bug。
请注意,这是对当今我们看到的“代码膨胀”的直接挑战。
已添加:为了响应您对示例的请求,请参见差异执行。我不会说可以很快理解它,但是它确实可以显着减少UI代码。
在您的(原始)问题中使用单词始终是“可行的”,但鉴于存在的大量受支持的成熟语言和框架,它通常不是很有用,而且很少是最优的。
但是,这是一个有趣的智力挑战。
仅当您团队的核心业务是编程语言时。
我曾经在金融公司创建过一种编程语言。
显然,对于建筑师自己而言,这是一个巨大的挑战,并提高了他自己的技能。
不可避免地,该语言无法像C#或Java这样的速度来增长或改进-他们拥有致力于这一目标的团队。
这种语言很快就停滞了,因为没有人愿意承担改善别人宠物项目的任务。
原来的建筑师离开了。语言枯萎了,十年后死亡。
对于那些不幸地用一种死胡同的语言工作的人来说,那十年是地狱。
因此,继续创建您自己的语言,但是请不要让其他人实际使用它。请不要期望任何人感谢您。
除了自学目的,我想声明今天不需要创建自己的语言。在任何情况下。曾经 无论您想做什么,都有大量您可以采用/适应您需要的现有语言。
什么时候创建自己的语言?
当您想要的时候,作为一个大型的爱好项目。
对于特定领域的语言。这些可能很复杂。检出档案,看看互动小说(或文字冒险)社区中发生了什么。
当您的目标非常雄心勃勃,并且您认为自己可以取得真正的进步时,例如Paul Graham的Arc项目。
而且,在开发低级结构的过程中,可以使用任何具有足够适应性的语言(也许是C ++,绝对是Common Lisp)。
我希望何时避免像瘟疫一样避免陈词滥调?
当它成为实际项目的持续开发的基础时。它总是会严重落后于廉价的市售产品,并且会削弱进一步的发展。我曾在一家拥有自己版本的COBOL的公司工作,从不希望在另一家维护自己语言的公司工作。我们看到其他版本的COBOL获得了更好的功能和更好的工具,而我们也遇到了同样的问题。(我不想再与COBOL合作,但这是另外一回事了。)
您可能会创建自己的语言的情况不属于这种情况。爱好项目不用于实际开发。诸如Arc之类的东西会成功(并获得多种实现以及进一步的发展和发展)或失败(其他人不会使用它)。特定于领域的小型语言仅是项目的一部分,并且由于它很小,因此可以随着时间的推移进行改进。文字冒险语言用于编写个人游戏,而这些游戏除了是业余项目外,几乎从未用于持续开发。
我的观点是,DSL通常是一个“弱主意”,从长远来看,使用标准语言并将特定领域的需求作为“非DSL”的库来提高生产力。
但是,事实证明您的需求足够定制,因此最好为您的公司提供DSL(而不仅仅是经过稍微修改的gcc或lisp实现)。许多公司使用针对他们正在做什么的当前语言的插件,而无需编写/维护自己的语言。例如,我听说PHP有一个不错的插件。Lua是围绕插件设计的,ModelView使用Python,而AutoCAD具有AutoLISP作为其脚本编写器。
撇开学习练习,只有当您了解其他语言,您的特定问题领域以及现有语言解决该问题领域的方式时,才创建自己的编程语言是合理的,并且这种理解足够透彻,以至于您知道一种新语言是合理的。解决方案,而无需提出问题。
Tom Van Cutsem最近针对这个问题写了一篇论文答案:
http://soft.vub.ac.be/~tvcutsem/whypls.html
项目符号摘要(从该页面):
您的“编辑”似乎是一个完全不同的问题(“我何时应构建DSL?”,而不是人们最初理解为“何时应构建新的通用编程语言”的原始问题)。似乎人们已经彻底回答了“原始”问题,但是很少给出给出何时使用DSL的特定标准的答案。所以我提出了一个清单:
如果所有这些都是正确的,那么DSL可能是合适的。
从长远来看,是否有更好的杀手级应用程序,算法问题类别等等,可以创造出自己的语言?
这取决于。
让我们动动脑筋。这似乎是一个复杂的混乱局面,以至于我们遇到了任何编程语言的边界(至少现在是这样)。因此,也许为了真正虚拟化我们的大脑,我们需要其他方法以及其他语义和语法。
一般而言,仍然存在如此复杂的主题,这可能会导致其他策略,其中还包括针对给定场景的“更好”的语言。