【问题标题】:domain specific languages and compilers领域特定语言和编译器
【发布时间】:2010-04-29 22:14:36
【问题描述】:

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

那么,编译器理论会不会像现在一样枯燥(这里是主观的),还是有机会得到更多应用的、面向程序员的材料?

【问题讨论】:

    标签: dsl compiler-construction


    【解决方案1】:

    尽管 DSL 似乎为创建新编译器创造了更多机会,但我认为它们不会让编写编译器的挑战变得更容易。您可以使用像 yacc 这样的编译器工具来生成代码来处理您的 dsl 语法,或者您可以手工雕刻自己的解析器,着眼于比 yacc 生成器输出的更好的内部效率。

    无论哪种方式,您都必须充分了解如何定义和操作语言语法以使您的 DSL 正常工作,并避免漏洞和无法从这里获得的问题。

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

    【讨论】:

    • 是的,所以在真正有机会编码之前,仍然需要了解所有这些毛茸茸的理论。
    • 对。如果您没有在导游的带领下正式完成它,那么当您遇到问题时,您会自己跌跌撞撞地完成它。
    • Yacc 是所谓的“编译器工具”……其实不然。 Yacc(和它的朋友们)是 parser 生成器工具。它们帮助您解析代码。但是从 DSL 生成代码(“编译”)需要的不仅仅是解析:代码生成器必须了解 DSL 的元素如何交互,如何为一般情况生成代码,如何为常见的特殊情况生成代码。 ..因此,只有一小部分编译器与解析有关。因此,您需要“毛理论”来进行解析,而您几乎还没有开始。
    【解决方案2】:

    那么,编译器理论会不会像现在一样枯燥(这里是主观的),还是有机会得到更多应用的、面向程序员的材料?

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

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

    yacc、ANTLR、flex 和 cup 等现成工具可以让您更轻松地构建编译器,就像从伐木场购买木材来建造房屋比到树林​​里砍树更容易。两者都可以为您提供结构材料,但您仍然必须知道如何建造房屋。在不久的将来,我们肯定会看到更多的 DSL,这些工具会有所帮助。然而,DSL 是否值得使用甚至可用?至少在我看来,这些工具在这里不会有什么不同。语言设计采用了大量真正的计算机科学和/或数学。优秀的语言设计者至少必须熟悉两者,而优秀的语言实施者必须熟悉语言设计工具。

    【讨论】:

      【解决方案3】:

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

      • 为 DSL 选择一个好的问题域。它必须足够广泛才能吸引到比作者更多的人,并且必须足够狭窄才能有好的解决方案(C# 不算在内)。

      • 很好地实施 DSL。很多人似乎认为如果他们有一个解析器,他们就完成了。实际上,您需要很多技术:解析、分析、代码生成……(请参阅 DMS Software Reengineering Toolkit 了解我认为有效生成 DSL 所需的引擎)

      • 社区接受 DSL。令人惊讶的是,有多少人坚持使用他们所知道的编程语言进行编码,而不是其他任何东西。

      【讨论】:

      • 域是DSL最重要的部分,我想说你必须从自上而下的设计问题空间域中进行选择,你应该使用自下而上的设计解决方案空间框架来实现它。这意味着,您必须选择一个域并理解它,可能在元模型中实现。您还必须在解决方案中搜索可重用的部分,这些部分将用于代码生成。如果你有这些机器人,它们之间的转换很容易,恕我直言,这是 DSL 的主要好处。
      • 我提到的工具可以完成你提到的所有事情,在外部 DSL 中,我们远离“只是解析器”的心态。只需搜索“DSL 工作台”。
      • 恕我直言 DSL 应该如此简单和高效,以至于他们不需要广告,我认为 DSL 不应该成为“事实上的”标准(不同领域的不同 DSL)。我会说互操作性更重要,当 DSL 变得真正高效和互操作时,采用几乎没有问题。
      【解决方案4】:

      在 70 年代和 80 年代,编程语言呈爆炸式增长。然后Java出现并杀死了一切。现在我们处于人们发明大量语言的另一个阶段。所以,我会说它是周期性的,实际上并没有什么“新”发生。

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

      【讨论】:

      • 它们确实让优秀的设计师能够真正做一些事情。
      • 我不记得 Java 杀死了一切。现在它可以说是新语言的驱动力之一,其中许多都针对 JVM。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2019-01-05
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多