我该如何编写编程语言规范?


16

我真的很喜欢编程语言设计。有时,我认为我的语言项目及其潜在用户将从全面的标准文档中受益。我看过许多语言标准,从非常正式的(C ++)到相当非正式的(ECMAScript),但是我无法真正理解如何分解内容并组织这样的文档,即使我认为我总体上很擅长技术写作。

我应该像是一本很长的教程,还是更像是一份正规的数学论文来编写它?如果我正在与参考实现一起开发它,如何使其保持最新状态?我是否应该放弃并将实现和文档视为事实上的标准?此外,拥有标准真的有任何重大好处吗?要求标准是否意味着该语言不必要地复杂?


1
您读过Martin Fowler的《领域特定语言》吗?amazon.com/...
加里·罗

@加里·罗维:我没有。它看起来像是一本不错的书,尽管可能不完全是我想要的。
乔恩·普迪

与参考实现相比,标准的优势在于您可以定义其他实现可以在哪些地方偏离您的实现。
Bart van Ingen Schenau,2015年

Answers:


3

我发现Java语言规范既正式又易于阅读,而且我认为它具有合理的结构。一些W3C规范也可能是很好的例子。

进行正式工作可以帮助您降低语言复杂性并查看具体案例。

标题转储:源编码,词法分析,基本类型,文字,运算符,表达式,简单语句,条件,循环,函数(定义和调用),类型声明,模块,编译单元,变量作用域,各种名称解析(例如导入,方法),内存模型,副作用,键入,并发…


您的建议列表非常有帮助。我认为我要做的是集思广益,列出类似的清单,以类似于教程的格式对其进行排序,然后编写简短的非正式规范,并添加一些正式的附录,例如EBNF语法。我也一定会再看看您提到的规格说明。
乔恩·珀迪

7

阅读很多并保持简单

设计一种新的语言很困难。真的很难。但是最终,如果它流行起来并真正解决人们以优雅的方式遇到的问题,那将是非常令人满意的。

正如我在评论中提到的,出于以下原因,我建议您阅读Martin Fowler的“ 领域特定语言”

  1. 他深入探讨了为什么您应该设计一种语言
  2. 有关如何执行的详细信息(解析器,词法分析器,语言工作台等)
  3. 有详细的实现说明,说明如何使您选择的语法处理诸如闭包,批注,文字列表,动态接收等概念。

至于如何编写规范,请考虑一下您的受众。显然,在使用键盘设计语言之前,您会仔细考虑其意图。

如果它是一种替代JavaScript的新的解释语言,那么您将需要一种放任自流的方法,以使Web开发人员的注意力范围有限,并希望立即获得结果-或尽可能快地获得结果。

如果要在下一次前往Titan的任务中使用它,那么显示每个组件行为的正式形式证明的极其详细的规格将是最低的入门级别。

因此,这不是一件简单的事情。要接近该规范,您可能会获得很多创建语言的经验,并与每天实际使用它们的人员合作,会更好。如果您有愿意的受害者...呃...开发人员,他们在工作中可能需要一些时间来学习您的语言,那么他们可以为您提供反馈,让他们使用它。

简而言之,请保持简单,更多的人会使用它。


谢谢你 我有很多开发语言的经验,甚至还对它们进行了相当详尽的记录,但这是使我始终如一的标准观念。我可能只需要阅读推荐的阅读材料并进行一些实验。
乔恩·普迪

@Jon Purdy您是否可以在问题中包含在线语言的任何示例?
加里·罗

我还没有我当前项目的例子。我制作的语言(我确实使用过!)唯一真正完整的公开示例是在vision-language.sourceforge.net/cgi-bin/Home
Jon Purdy 2010年

@Jon Purdy Vision看起来很有趣-一种增强的Velocity。顺便说一句,您可能需要考虑YouTube截屏视频,其中显示了如何安装它以及编写示例小型网站(例如,本地水管工)。这将使学习曲线容易得多,因为人们可以看到它的实际作用并立即受益。您可以谈论与JSP,Velocity,ASP.Net,Freemarker等相比的好处
Gary Rowe 2010年

那是个好主意。我一直在做的YouTube视频很多最近(约每周三次),所以我想我可以肯定适合1英寸
乔恩·珀迪


2

Common Lisp和Haskell具有语言标准。Ruby和Python具有实现和文档。因此,我想说一种语言标准不是必需的,但是如果您希望所设计的语言有多个实现,那么它可能会有所帮助。另一方面,如果您期望语言定义发生重大变化,那么该标准为时过早。


实际上,Ruby有件事可以被认为是“规范”。有一个ISO Ruby规范,该规范目前处于最终草案状态,并且由一些具有语言规范经验的人(已经在ANSI Common Lisp和ISO C ++上工作)编写。还有RubySpec项目,它是一组RSpec样式的可执行示例,形成了人类可读的规范以及该规范的机器可执行一致性测试套件。
约尔格W¯¯米塔格

1

任何规格都应简洁且经得起时间的考验

这就是为什么您会看到类似BNF的抽象用于许多语言标准的原因...它的简洁性,在我们抛弃了许多当前工具之后,仍然会被理解。

当然,它不仅仅是语法。看看别人做了什么... perl6,scheme,C ...他们解决了实现者还关心的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.