11

作为口译员,我一直在构建几种语言。当我准备好采取“下一步”时,哪些选项最适合非本机编译格式......每个选项的优缺点是什么?

我一直在考虑编译到 CLR 或 LLVM,并考虑过 C-midcompile 几次,但我并不完全确定。

我希望能够移植的一些功能如下:

  1. REPL - 我正在构建的一种语言在运行时支持块级评估。
  2. 健壮的宏 - 我正在构建的语言之一需要能够在标记化之前单独过滤代码,以及在标记化和解析之间的中间步骤。

好吧,不是真的“几个”,只有两个。我喜欢认为我可以将我的语言支持的任何其他功能移植到“任何东西”。

我最好的选择是什么,它们的优点/缺点是什么?

4

3 回答 3

25

代码生成是我的事:-)

对几个选项的评论:

  • CLR:

    • 优点:工业支持
    • 缺点:你必须完全接受他们的类型系统;取决于你想对类型做什么,这可能无关紧要
    • 缺点:只有 Windows 平台才是真正的黄金时间质量
  • LLVM:

    • 优点:热情的用户社区和有魅力的领导者
    • 优点:Apple 的大力支持
    • 优点:许多有趣的性能改进
    • 缺点:有点复杂的界面
    • 缺点:工程漏洞的历史;随着 LLVM 的成熟,期望通过增加接口的复杂性来填补工程中的漏洞
  • C -

    • 优点:目标是一种实际的书面语言,而不是 API;您可以轻松地检查、调试和编辑您的 C 代码
    • 优点:设计相当成熟且相当干净
    • Pro:支持准确的垃圾回收
    • 优点:大多数用户报告它非常易于使用
    • 缺点:非常小的开发团队
    • 缺点:截至 2009 年初,仅支持三个硬件平台(x86、PPC、ARM)
    • 缺点:不附带垃圾收集器
    • 缺点:项目没有未来
  • C 作为目标语言

    • 优点:看起来很简单
    • 缺点:几乎不可能获得体面的表现
    • 缺点:从长远来看会让你发疯;询问那些尝试使用这种技术编译 Haskell、ML、Modula-3、Scheme 等的人。在某些时候,这些人中的每一个人都放弃了并构建了自己的本机代码生成器。

总结:除了 C 以外的任何东西都是合理的选择。对于灵活性、质量和预期寿命的最佳组合,我可能会推荐 LLVM。

全面披露:我隶属于 C-- 项目。

于 2009-01-17T02:28:51.340 回答
16

优点/缺点:

  • CLR:

    • pro:CLR环境一应俱全;很多东西要绑定
    • con: 绑定到 CLR (;-); 针对某些系统将很难或不可能(嵌入式、大型机等。CLR impl。在非 MS 系统上可能不太成熟)
  • LLVM:

    • pro:独立于MS。
    • 缺点:针对某些系统可能涉及移植 LLVM(?);与 DOT-net、Java 等接口可能很麻烦(可能需要 FFI)
  • C 作为目标语言:

    • pro:几乎所有可能的目标;简单的代码生成
    • 缺点:您将不得不将一些 VM 东西实现为运行时库(GC、dynload、dyn 编译等);有些事情在 C 中很难做到(延续、回溯、堆栈跟踪、异常);在 C 语言中,有些事情很难高效且可移植(GC、动态类型、堆栈布局依赖)。
  • Java ByteCode 作为目标:

    • pro:可能是最大的一组可能的目标平台(甚至是手机和嵌入式产品);周围有很多现有的工具;与现有库的轻松接口
    • 缺点:有些事情很难实现或很难有效地实现(动态类型、延续、回溯)

综上所述,我认为以 Java ByteCode 为目标可能最适合您。

编辑:实际上是对评论的回答,但 300chars 是不够的。

JByteCode 不确定 - 我同意(作为 Smalltalker,JBytecode 对我来说太有限了)。

在 VM 方面,我认为作为 JVM 可以获得相对广泛的性能,从纯慢字节码解释器到高端复杂的 JITting VM (IBM)。我想,CLR VM 会迎头赶上,因为 MS 迟早会窃取和整合所有创新,并且发布了加速动态翻译的技术(例如,阅读 Self 论文)。LLVM 的进展可能会慢一些,但谁知道呢。使用 C,您将免费受益于更好的编译器,但是动态重新翻译等内容很难以 C 作为目标来实现。我自己的系统混合使用了预编译代码和动态编译代码(在一个内存空间中包含所有:慢速字节码解释器、JITter 和预编译静态 C 代码)。

于 2009-01-15T14:48:45.767 回答
3

LLVM 似乎很有希望。该团队声称在 gcc 上的运行时性能比原生的更好。从 AST 编译的能力真的很有趣(看一下教程)。它可以在运行时编译和优化,这是动态的必须的。它也可以作为纯解释器运行。

我考虑在一个涉及创建类似 Tcl 的语言的项目中使用 LLVM。Tcl 是高度动态的,所以在这个阶段我不知道这意味着什么,但我相信我会获得比当前基于字节码的内核更好的性能。

于 2009-01-15T14:32:33.770 回答