【问题标题】:Why I always need a C compiler environment when build OCaml and OCaml codes?为什么在构建 OCaml 和 OCaml 代码时总是需要 C 编译器环境?
【发布时间】:2018-07-23 14:48:22
【问题描述】:

这是我脑海中多年的一个问题,我在windows下使用OCaml,当我构建每个OCaml分发版本时,我需要一个C编译器,MSVC或MingGW,我必须在Cygwin下做。

当我手头有 OCaml 并且需要编译代码时,我还需要用于编译 OCaml 的 c 链接器。对我来说,这很奇怪。为什么 OCaml 不能使用旧版本的 OCaml 而不是某些 C 编译器自动引导?

【问题讨论】:

    标签: compilation ocaml


    【解决方案1】:

    OCaml 工具链依赖外部工具来组装和链接二进制文件。后者可能比汇编器更重要,因为汇编器或多或少是稳定的。但是链接器通常与操作系统深度集成,并且每个版本都不同。捆绑它们将增加支持负担,并使 OCaml 程序的可移植性降低,并且整个 OCaml 发行版更加脆弱。因此,依赖于汇编器/链接器抽象是一个甜蜜点,它可以最大限度地减少依赖关系和支持负担,并最大限度地提高可移植性。

    其他语言通常采用相同的方法。即使是那些依赖 LLVM 的,因为 LLVM 实际上在底层使用了 GNU 工具链链接器。

    为了构建 OCaml 本身,C 编译器是绝对必要的。 OCaml 本身并不是完全用 OCaml 编写的。实际上,OCaml 运行时是用纯 C 编写的,例如垃圾收集器。此外,许多函数,尤其是定义系统接口(例如 Unix)的函数也是用 C 编写的。sloccount 工具给我们一个粗略的估计,即 15% 的 OCaml 源代码(45,000 LOC)是用 C 编写的。

    【讨论】:

    • 谢谢你的回答,明白了。我收到这个问题是因为我了解到 Rust 编译器最初是用 OCaml 编写的,然后是自动引导的。
    【解决方案2】:

    OCaml 字节码解释器是用 C 语言编写的 - 请参阅 OCaml README here 中的描述。

    【讨论】:

    • 这是关于引导程序的,但是当我有完整构建的ocaml来编译我的ml文件时,我仍然需要环境中的c链接器,为什么?
    【解决方案3】:

    ivg 的回答说明了一切,但我只是为 Windows 10 用户提供一个快速提示。

    我始终建议 Windows 10 用户使用Ubuntu on Windows 10。然后,您将可以访问成熟的 Unix 环境而不是 Cygwin,其中包括(除其他外)内置 C 工具链。

    如果我打算在 Windows 上发布,我只会使用 Windows 进行开发,我很少这样做。即便如此,我还是更喜欢使用交叉编译器并仅使用 Windows 进行测试。

    【讨论】:

    • windows上的bash有问题,如果你用ocamlc,它只会搜索ocamlc,从不搜索ocamlc.exe,所以我不能在windows上用bash构建ocaml和libs
    • 当然。如果你想在 Windows 上使用 Bash 编译但在 Windows 上执行,你需要一个交叉编译器。
    • 嗯,只有我的子项目(后台服务)使用OCaml,而主项目是用MSVC编译的..所以当我来到交叉编译器时,应该是MinGW,我想会有将两者结合起来是一个问题..
    猜你喜欢
    • 2011-06-30
    • 2014-11-03
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2011-09-07
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多