【发布时间】:2018-07-23 14:48:22
【问题描述】:
这是我脑海中多年的一个问题,我在windows下使用OCaml,当我构建每个OCaml分发版本时,我需要一个C编译器,MSVC或MingGW,我必须在Cygwin下做。
当我手头有 OCaml 并且需要编译代码时,我还需要用于编译 OCaml 的 c 链接器。对我来说,这很奇怪。为什么 OCaml 不能使用旧版本的 OCaml 而不是某些 C 编译器自动引导?
【问题讨论】:
标签: compilation ocaml
这是我脑海中多年的一个问题,我在windows下使用OCaml,当我构建每个OCaml分发版本时,我需要一个C编译器,MSVC或MingGW,我必须在Cygwin下做。
当我手头有 OCaml 并且需要编译代码时,我还需要用于编译 OCaml 的 c 链接器。对我来说,这很奇怪。为什么 OCaml 不能使用旧版本的 OCaml 而不是某些 C 编译器自动引导?
【问题讨论】:
标签: compilation ocaml
OCaml 工具链依赖外部工具来组装和链接二进制文件。后者可能比汇编器更重要,因为汇编器或多或少是稳定的。但是链接器通常与操作系统深度集成,并且每个版本都不同。捆绑它们将增加支持负担,并使 OCaml 程序的可移植性降低,并且整个 OCaml 发行版更加脆弱。因此,依赖于汇编器/链接器抽象是一个甜蜜点,它可以最大限度地减少依赖关系和支持负担,并最大限度地提高可移植性。
其他语言通常采用相同的方法。即使是那些依赖 LLVM 的,因为 LLVM 实际上在底层使用了 GNU 工具链链接器。
为了构建 OCaml 本身,C 编译器是绝对必要的。 OCaml 本身并不是完全用 OCaml 编写的。实际上,OCaml 运行时是用纯 C 编写的,例如垃圾收集器。此外,许多函数,尤其是定义系统接口(例如 Unix)的函数也是用 C 编写的。sloccount 工具给我们一个粗略的估计,即 15% 的 OCaml 源代码(45,000 LOC)是用 C 编写的。
【讨论】:
OCaml 字节码解释器是用 C 语言编写的 - 请参阅 OCaml README here 中的描述。
【讨论】:
ivg 的回答说明了一切,但我只是为 Windows 10 用户提供一个快速提示。
我始终建议 Windows 10 用户使用Ubuntu on Windows 10。然后,您将可以访问成熟的 Unix 环境而不是 Cygwin,其中包括(除其他外)内置 C 工具链。
如果我打算在 Windows 上发布,我只会使用 Windows 进行开发,我很少这样做。即便如此,我还是更喜欢使用交叉编译器并仅使用 Windows 进行测试。
【讨论】: