【问题标题】:Choosing an intermediate language选择中间语言
【发布时间】:2011-09-14 20:45:18
【问题描述】:

我目前正在玩编程语言。我花了一些时间用高级语言(最著名的是 Haxe)编写解析器和解释器。

我得到了一些结果,我认为它们实际上相当不错,但现在我想让它们变得更快。

我的想法是将输入语言翻译成 C。
我的 C 知识仅限于你在大学里学到的东西。除了一些练习之外,我从未编写过真正的 C 程序。但我有信心我可以让它发挥作用。

当然,我可以尝试为 LLVM 编写前端或生成 MSIL 或 JVM 字节码。但是我觉得现在要学的东西太多了,实际上我并没有看到太多的收获。
C 语言也完全是人类可读的,所以如果我搞砸了,更容易理解为什么。毕竟,C 是高级别的。我真的可以从输入语言中翻译概念,而无需费神费力。我应该在合理的时间内启动并运行一些东西,然后在我认为合适的时候对其进行优化。

那么:使用 C 有什么缺点吗?你能推荐一个替代品吗?
感谢您的洞察力:)


编辑:一些澄清

  • 我想一路走下去的原因是,我正在编写一种支持 OOP 的语言,并且我想手动实现我的方法调度,因为我有一些非常具体的想法。
  • 主要使用领域是编写 HTTP 服务,但我可以想象将绑定添加到 GUI 库(可能是 wxWidgets)或其他任何东西。

【问题讨论】:

  • 我能想到的大多数编译器都会在原生转到 C 之前采取中间步骤,所以,是的,我认为 C 是一个不错的选择,尤其是因为它自动为您提供了很大的可移植性。如果您的语言是面向对象的,那么您可能会更好地翻译成 C++ 或 Objective-C;同样,如果它是功能性的,你可能有更好的时间翻译到 Haskell。
  • @Rafe Kettler:将其发布为答案,为什么要限制评论? :)

标签: c compiler-construction intermediate-code


【解决方案1】:

C 是您尝试做的一个很好且非常受欢迎的选择。

不过,看看 LLVM 的中间语言 (IR)。它的可读性很强,而且我认为它比 C 更干净、更容易生成和解析。LLVM 附带了相当多的工具来使用它。您可以为各种平台(与 C 语言一样,但对输出的控制稍多一些)或虚拟机生成本机代码。 JIT 编译的可能性也是一个优点。

有关 LLVM 方法和 IR 的一些 sn-ps 的介绍,请参阅 The Architecture of Open Source Applications, Chapter 11


您的目标环境是什么?这可能有助于我们为您提供更好的答案。

【讨论】:

  • @rubenvb:是的。这就是为什么即使你最终不会使用它也值得一看。而且您可能无法直接使用它(例如 LLVM 是 C++,因此在某些环境中可能很难使用它)。或者它可能会激发您做与最初计划完全相反的事情:将 LLVM 前端用于某些现有(和流行)语言,并为您的应用程序提供您自己的自定义后端或 VM。
【解决方案2】:

对于小型或实验性编译器来说,C 实际上是一个不错的目标语言选择——它在许多平台上广泛可用,因此您的编译器在许多环境中立即变得有用。主要缺点是处理 C 中没有得到很好支持的东西,或者 C 规范中没有很好地定义的东西。例如,如果你想做动态代码生成(JIT 编译),C 是有问题的。像堆栈展开和反射这样的事情在 C 中是很棘手的(尽管 setjmp/longjmp 和仔细使用生成布局描述的结构可以做很多事情)。 C 编译器之间的字长、大端或小端布局和算术精度等因素各不相同,因此您必须注意这一点,但如果您想支持多台目标机器,这些都是您需要处理的事情。

也可以使用其他语言——C 的主要优势在于它的普遍性。

【讨论】:

  • 无论使用哪种语言,大/小端都将是一个问题。当然,级别太高甚至无法在字节级别上做事的语言不会遇到任何字节序问题,因为它们甚至不支持它们。
【解决方案3】:

您可能会考虑C--,这是一种类似于 C 的语言,旨在成为比 C 更好的代码生成目标。

【讨论】:

  • 谢谢,这听起来很有趣;)
【解决方案4】:

C 是一个不错的选择,恕我直言。与许多语言不同,C 通常被认为是“优雅的”,因为只有 32 个关键字和非常基本的结构(序列、选择、迭代),以及非常简单且一致的标记和运算符集合。

由于 C 语言中的语法非常一致(括号和大括号、块和语句、表达式的使用),因此您不会进入语言扩展的无限世界。 C 是一门成熟的语言,经得起时间的考验,而且现在是一个“已知量”(对于许多其他语言,甚至是“成熟”的语言,这真的很难说)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 2023-04-07
    • 2012-01-03
    • 2023-03-05
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多