gpt4 book ai didi

c++ - 我的编译器在 C/C++、OCaml 和 F# 之间犹豫不决

转载 作者:IT老高 更新时间:2023-10-28 21:35:33 25 4
gpt4 key购买 nike

我想开始研究一个小编译器并构建它,我在几种不同的语言之间犹豫不决。

我的要求很简单,我希望能够发出 LLVM-IR 代码,因为我有一个 LLVM 后端,我想重用以针对特定平台。

所以现在我有以下选择:

  1. 使用 OCaml 和 LLVM 绑定(bind) - 高效,LLVM 附带 OCaml 绑定(bind),但 OCaml(IDE,支持)的编码体验并不是最好的。

  2. 使用 C/C++ 和 LLVM 绑定(bind) - 我想说的最明显的方式,但我想使用函数式语言,因为这个主题对我来说是新的,我想学习一些新东西。

  3. 使用 F# - 我爱上了这种语言,但没有官方的 LLVM 绑定(bind)。所以我想我可以通过使用 System.Reflection.Emit 来做同样的事情。尽管这里似乎有针对 LLVM 的 F# 绑定(bind)的倡议 - https://github.com/keithshep/llvm-fs

我很想听听您对此的看法。

最佳答案

元编程是 C++ 的一个真正弱点。您的大部分精力将花费在试图操纵树木上。在这种情况下,OCaml 和 F# 的核心优势在于 union 类型(而不是函数式编程)的模式匹配,正是因为这使得操作树变得更加容易。从历史上看,OCaml 和 F# 都来自 ML 语言家族,是专门为这个应用领域培育的。

我通过其 OCaml 绑定(bind)使用 LLVM 来编写 HLVM ,其中包括独立和 JIT 编译为 native 代码、支持多核的垃圾收集、外部函数接口(interface)、尾调用优化和许多其他功能。体验非常愉快。我唯一的建议是跟踪哪些 LLVM 功能是经过试验和测试的,哪些是实验性的,因为您不想依赖任何实验性的东西(例如,我编写 HLVM 时的 GC 支持)。

您可以轻松地使用 System.Reflection.Emit 从 F# 生成 CIL,但您显然无法通过这样做来利用您的 LLVM 后端,尽管您确实获得了免费的垃圾收集器, 当然。 .NET 绑定(bind)到 LLVM 是一个选项。我不熟悉您引用的那些,但编写与 LLVM 的 C API 的绑定(bind)相对简单。但是,我不确定 LLVM 在 Windows 平台上的支持程度。

关于 OCaml 和 F#,两者都有优点和缺点,但我想说在这种情况下总体差异相对较小。由于缺乏通用打印,编写函数来打印大 union 类型的值在 OCaml 中是乏味的,尽管这可以使用一些第三方宏来自动化。 F# 提供通用打印,但缺少一些有用的功能,例如多态变体和结构类型的对象。

关于c++ - 我的编译器在 C/C++、OCaml 和 F# 之间犹豫不决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6390665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com