【问题标题】:Methodologies for designing a simple programming language设计简单编程语言的方法
【发布时间】:2010-11-15 13:15:32
【问题描述】:

为了满足我对更多编程知识的无尽渴望,我一直在努力尝试编写一种(至少目前是)简单的可编译为字节码的编程语言。问题是我不知道关于语言设计的第一件事。有人对构建解析器的方法以及每种语言应具有的基本功能有什么建议吗?对于语言设计,你会推荐什么读物?我应该拍摄多高的水平?希望能够包含一项功能以允许以类似于 gcc 允许内联汇编程序的方式内联字节码是不现实的吗?看到我主要用 C 和 Java 编写代码更适合编译器编写吗?

【问题讨论】:

标签: language-design compiler-construction bytecode


【解决方案1】:

有很多方法...

您可以研究堆栈语言和 Forth。它在设计其他语言时不是很有用,但可以很快完成。

您可以研究函数式语言。它们大多基于一些简单的概念,并具有简单的解析。然而,它们非常强大。

然后是传统语言。他们是最难的。您需要了解词法分析器、解析器、LALR 语法、LL 语法、EBNF 和常规语言才能通过解析。

以字节码为目标不仅仅是一个好主意 - 否则在学习练习中是疯狂的,而且大多是无用的。

帮自己一个忙,查找有关编译器的书籍和教程。

C 或 Java 都可以。 Java 可能有一个优势,因为面向对象非常适合这种类型的任务。我个人的推荐是 Scala。这是一种很好的语言来做这类事情,它会一路教你关于语言设计的有趣事情。

【讨论】:

  • “以字节码为目标不仅仅是一个好主意” 与以真实机器(例如 x86)为目标相反,编写解释器或其他什么?在这个问题上,编写一个针对“理想”虚拟机的编译器(而不是你必须担心寄存器分配等的 CPU)往往比编写解释器要困难得多吗?我想通过编译成树而不是扁平字节字符串可以使编译变得相当容易,但我以前从未这样做过,我想知道其他人对此有什么看法。
  • @Joey 实际上与针对真实机器相反。即使是生成机器代码的编译器也经常生成中间字节码输出(尽管高端编译器可能会避免这样做以最大程度地提高编译速度和可用优化)。确实,编写解释器更容易,特别是如果您选择编写动态语言。至于编译成树,树是解析的输出,所以肯定更容易——虽然不是那么简单。
  • 哎呀,我被你的句子弄糊涂了(看起来你说定位字节码是疯狂和无用的,但你说的恰恰相反)。此外,我说的更多是针对执行调整的树,与基本解析器输出不同(尽管在简单的设置中,它们可能具有几乎相同的结构)。
  • @Joey 我的意思是执行树可以通过对 AST 的转换获得。
【解决方案2】:

您可能想先阅读a book on compilers

为了真正了解发生了什么,您可能希望用 C 编写代码。

如果您想编写解释型语言,例如Jython,Java 不会是一个糟糕的选择。但是因为听起来你想编译成机器码,所以在 C 中可能更容易。

【讨论】:

    【解决方案3】:

    我推荐阅读以下书籍:

    ANTLR

    Language Design Patterns

    这将为您提供用于为自定义语言创建解析器、词法分析器和编译器的工具和技术。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 2017-09-07
      相关资源
      最近更新 更多