【发布时间】:2010-04-29 22:14:36
【问题描述】:
我正在查看 Martin Fowler 最近的书籍内容 - 领域特定语言,我注意到一些 ANTLR 示例 - 这让我想到编写编译器将变得越来越流行,因为人们在这方面的需求将会增加。
那么,编译器理论会不会像现在一样枯燥(这里是主观的),还是有机会得到更多应用的、面向程序员的材料?
【问题讨论】:
我正在查看 Martin Fowler 最近的书籍内容 - 领域特定语言,我注意到一些 ANTLR 示例 - 这让我想到编写编译器将变得越来越流行,因为人们在这方面的需求将会增加。
那么,编译器理论会不会像现在一样枯燥(这里是主观的),还是有机会得到更多应用的、面向程序员的材料?
【问题讨论】:
尽管 DSL 似乎为创建新编译器创造了更多机会,但我认为它们不会让编写编译器的挑战变得更容易。您可以使用像 yacc 这样的编译器工具来生成代码来处理您的 dsl 语法,或者您可以手工雕刻自己的解析器,着眼于比 yacc 生成器输出的更好的内部效率。
无论哪种方式,您都必须充分了解如何定义和操作语言语法以使您的 DSL 正常工作,并避免漏洞和无法从这里获得的问题。
出色的工具有助于实施解决方案,但它们并不能为您解决问题。引用我的高中化学老师的话:“当然!把你的计算器带到课堂上!计算器只会帮助你更快地得到错误的答案!”
【讨论】:
那么,编译器理论会不会像现在一样枯燥(这里是主观的),还是有机会得到更多应用的、面向程序员的材料?
我想说编译器理论实际上非常丰富,但可能并不以 C 风格语言为中心。如果你想看一些学术语言设计师常用的强大工具,我建议你看看函数式编程语言(ML、Scheme、LISP、Haskell、OCaml、Scala、Clojure 等)。我个人更喜欢带 Parsec 的 Haskell,但有很多选择。我认为普遍的共识是,这些语言的结构更有利于语言的设计和实现,至少在理论上是这样。
就像 Kristopher 上面所说的那样,程序员不一定是最好的语言设计师。我见过一些非常酷的 DSL,也见过一些非常糟糕的 DSL(当然,我认为是 YMMV)。语言概念的知识是设计任何语言、DSL 或其他语言(类型理论、类别理论、各种代码分析、机器优化等)的必要条件。更不用说,如果您正在设计 DSL,您必须对您的目标领域有相当深入的了解。
yacc、ANTLR、flex 和 cup 等现成工具可以让您更轻松地构建编译器,就像从伐木场购买木材来建造房屋比到树林里砍树更容易。两者都可以为您提供结构材料,但您仍然必须知道如何建造房屋。在不久的将来,我们肯定会看到更多的 DSL,这些工具会有所帮助。然而,DSL 是否值得使用甚至可用?至少在我看来,这些工具在这里不会有什么不同。语言设计采用了大量真正的计算机科学和/或数学。优秀的语言设计者至少必须熟悉两者,而优秀的语言实施者必须熟悉语言设计工具。
【讨论】:
随着高质量的 DSL 越来越容易构建,我们更有可能看到更多的 DSL。有几个障碍:
为 DSL 选择一个好的问题域。它必须足够广泛才能吸引到比作者更多的人,并且必须足够狭窄才能有好的解决方案(C# 不算在内)。
很好地实施 DSL。很多人似乎认为如果他们有一个解析器,他们就完成了。实际上,您需要很多技术:解析、分析、代码生成……(请参阅 DMS Software Reengineering Toolkit 了解我认为有效生成 DSL 所需的引擎)
社区接受 DSL。令人惊讶的是,有多少人坚持只使用他们所知道的编程语言进行编码,而不是其他任何东西。
【讨论】:
在 70 年代和 80 年代,编程语言呈爆炸式增长。然后Java出现并杀死了一切。现在我们处于人们发明大量语言的另一个阶段。所以,我会说它是周期性的,实际上并没有什么“新”发生。
然而,一个不变的方面是大多数程序员并不擅长设计语言。 yacc 和 ANTLR 之类的工具使一些实现变得更容易,但它们并没有让潜在的语言设计人员在语言设计方面做得更好。
【讨论】:
已经有一些有用的工具了,找 Xtext、EMFText、Jetbrains MPS、Intentional Domain Workbench 和微软以前用 M 语言的 OSLO 项目。所有这些工具都使定义语言变得更容易,尽管它有其成本,但是对于 DSL,您可能有一些不同于常规通用编程语言的要求。
【讨论】: