有关创建脚本语言的问题


12

举例来说,我想付钱给我创建一种编程语言或脚本语言。他们需要什么类型的文件,以完全了解我到底想要什么。

我的意思是,是否有描述上述新编程/脚本语言的标准文档?


因为这是关于编程而不是程序员,所以这可能更适合StackOverflow。
Muad'Dib 2010年

14
我不同意Muad'Dib。我认为这是解决这个问题的好地方。
克里斯,2010年

5
我认为与其发明自己的脚本语言,不如花大量时间为您和您的用户学习一种新的语言,您最好嵌入现有的脚本语言。设计了某些语言,例如Python,Javascript / ECMAScript,因此可以将其嵌入到更大的框架中。简而言之,您只需要设计API并找出一种将脚本解释器嵌入到您自己的程序中的方法。
Lie Ryan

1
如果该语言是DSL,则这样做有好处。对于一种通用的语言来说不是很多。当然,某些通用语言是DSL的良好基础,例如Lisp或TCL
jk。

Answers:


16

您需要编写的内容称为语言规范

它应该包含对语言语法的描述(最好以Extended Backus-Naur-Form形式)及其语义的描述。

对于后一部分,您可以用自己的文字写一个描述(但要小心一点)或形式化的语义


1
BNF仅对无内容语法有用,脚本语言并不总是与上下文无关,例如TCL(尽管我认为您仍然可以认为在大多数情况下最好使用无上下文语言)
jk。

@jk。我不会说BNF对于非上下文无关语言完全没有用。根据语法的非上下文自由程度,在EBNF中指定它然后解决单词中的歧义仍然有意义。例如,C ++标准就是这样做的。在大多数情况下,我想这仍然比用语言解释一切或使用上下文相关或不受限制的语法进行指定更为清楚。
sepp2k 2012年

是的,我的意思是更多的是像lisp,tcl之类的语言(实际上非​​常适合定义DSL),它们具有简并的语法,因此BNF很少告诉您
jk。

@jk。当然可以,但是在那种情况下,任何其他描述语法的方法都只会告诉您很少的信息,这仅仅是因为讲的很少。这仅意味着规范的语法部分将非常短。
sepp2k 2012年

13

您将需要以下内容:

  • 创建新语言的原因
  • 哲学
  • 语义定义
  • 您的令牌的词汇描述
  • 语法分析定义

您的语言会如何变化?它的任务是什么?有功能吗?它是面向对象的吗?它是元语言吗?它的独特功能是什么?它会给不存在(或以丑陋方式存在)的世界带来什么?您想如何改变事情?是编译还是解释?DSL还是通用语言?这是您的理念,并就您的语言设计做出了许多决定。

接下来,研究在纸上划掉粗略的语法和语义。这将是您的语义定义。编写伪代码是发展您的想法的好方法。阅读“ C编程语言”以获取有关此操作的出色示例。玩吧。

然后,您将需要以某种方式定义令牌和语法。程序然后将它们处理成能够读取字符串并处理语法的自动机。Yacc和Bison分别使用正则表达式和BNF样式语法进行词法分析和语法分析。还有其他语言的Yacc和Bison之类的工具。

您还需要语言理论/编译器的基础知识才能知道不该做什么。示例包括歧义语法,AST生成和操作问题,以及通常如何使自己的生活变得简单。了解理论非常重要。我会考虑让以下内容开始:

编译器:原理,技术和工具(Dragon Book)
C语言中的现代编译器实现Java语言中的现代编译器实现


1
+1代表哲学,DSL代表您显然想在此标识域
jk。

8

99.9%的时间完全不需要创建新语言。投资回报极有可能是微不足道的,并且您会浪费时间。

您很可能可以将Javascript用作易受攻击的脚本语言,并且已经有适用于大多数语言的解析器。如果可以找到其他适合自己的解析器,则还可以使用其他喜欢的脚本语言。将这些实现到您的程序中将减少工作量,并获得更大的回报。人们不必学习其他语言,而只需学习您的API。它是一个更好的解决方案。

创建一种新语言几乎总是不好的。


9
除了在很多情况下还不错的情况之外。创建自己的简单DSL可能非常有用。现在,创建自己的通用语言将更加符合您的回答。
2010年

@ChaosPandion,但是许多语言已经在创建使用该语言代码的DSL方面表现出色(例如,ruby很擅长)
替代

2
我同意您的回答,但我认为这不是此问题的正确答案。我相信提问者正在考虑创建脚本语言的一般性,而不是针对创建一种脚本语言的利弊。
Tim Murphy

创建新语言几乎总是最好的解决方案。zh.wikipedia.org/wiki/
面向语言的


0

如果您使用的是.NET,这是我前段时间偶然发现的东西。我只是好奇地瞥了一眼,但也许对您有用: 讽刺

Irony是用于在.NET平台上实现语言的开发工具包。

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.