领域特定的语言和编译器

时间:2010-04-29 22:14:36

标签: dsl compiler-construction

我正在查看Martin Fowler最近的书籍内容 - 领域特定语言,我注意到一些ANTLR示例 - 让我觉得编写编译器会越来越受欢迎,因为人们在这方面的需求会增加。

那么,编译器理论是否仍然像现在一样干净(在这里是主观的),或者我们是否有机会获得更多应用,面向程序员的材料?

5 个答案:

答案 0 :(得分:3)

即使DSL似乎为创建新编译器创造了更多机会,但我认为他们不会更容易编写编译器的挑战。您可以使用yacc之类的编译器工具来生成处理dsl语法的代码,也可以手工雕刻自己的解析器,着眼于提高内部效率,而不是yacc生成器吐出的内部效率。

无论哪种方式,你必须具备足够的知识,知道如何定义和操作语言语法,以使你的DSL工作,并避免漏洞和无法解决的问题。

Spiffy工具有助于实施解决方案,但它们无法为您解决问题。引用我的高中化学老师的话说:“当然!带上你的计算器去上课!计算器只能帮助你更快地得到错误的答案!”

答案 1 :(得分:3)

  

那么,编译器理论是否仍然像现在一样干净(在这里是主观的),或者我们是否有机会获得更多应用,面向程序员的材料?

我认为编译器理论实际上非常丰富,但可能并不以C风格语言为中心。如果你想看一下学术语言设计师常用的一些强大的工具,我建议你查看函数式编程语言(ML,Scheme,LISP,Haskell,OCaml,Scala,Clojure等)。我个人更喜欢Haskell和Parsec,但有很多选择。我认为,共同的共识是,这些语言的结构更有利于语言的设计和实施,至少在理论意义上是这样。

像上面所说的克里斯托弗一样,程序员并不一定能成为最好的语言设计师。我见过一些非常酷的DSL,我看过一些非常糟糕的(我的意见,当然是YMMV)。语言概念的知识是设计任何语言,DSL或其他语言的必要条件(类型理论,类别理论,各种代码分析,机器优化等)。更不用说,如果你正在设计DSL,你必须对你所针对的领域有相当深入的了解。

yacc,ANTLR,flex和cup等现成的工具可以让您更轻松地构建编译器,例如从木材厂购买木材来构建您的房屋比进入树林和砍伐树木更容易。两者都可以获得结构材料,但您仍然需要知道如何建造房屋。我们肯定会在不久的将来看到更多的DSL,这些工具将有所帮助。但是,DSL值得使用甚至可用吗?至少在我看来,这些工具在这里不会产生任何影响。语言设计采用了大量真正的计算机科学和/或数学。优秀的语言设计师必须至少熟悉两者,优秀的语言实现者必须熟悉语言设计工具。

答案 2 :(得分:2)

随着高质量DSL的构建变得更容易,我们更有可能看到更多。有几个障碍:

  • 为DSL选择一个好的问题域。它必须具有足够广泛的吸引力而不是作者,并且足够狭窄以获得良好的解决方案(C#不计算在内)。

  • 实施DSL。很多人似乎都认为如果他们有解析器,他们就完成了。实际上,您需要大量技术:解析,分析,代码生成......(请参阅DMS Software Reengineering Toolkit了解包含我认为有效生成DSL所需的内容的引擎)

  • 社区接受DSL。令人惊讶的是,有多少人坚持使用他们所知道的编程语言来编写

答案 3 :(得分:1)

70年代和80年代出现了大量的编程语言。然后Java出现并杀死了所有东西。现在我们处于发明大量语言的另一个阶段。所以,我认为这是周期性的,并没有什么“新的”发生。

然而,一个保持不变的方面是大多数程序员不擅长设计语言。像yacc和ANTLR这样的工具使得一些实现变得更容易,但它们并没有使语言设计人员在语言设计方面做得更好。

答案 4 :(得分:0)

已经有一些有用的工具,使用M语言查找Xtext,EMFText,Jetbrains MPS,Intentional Domain Workbench和Microsofts以前的OSLO项目。所有这些工具都使定义语言变得更容易,尽管它有成本,但对于DSL而言,除了常规通用编程语言之外,您可能还有其他一些要求。