为什么在构建OCaml和OCaml代码时总是需要C编译器环境?

时间:2018-07-23 14:48:22

标签: compilation ocaml

这是我脑海中的一个问题,多年来,我在Windows下使用OCaml,当我构建每个OCaml发行版时,我需要一个C编译器(MSVC或MingGW),并且必须在Cygwin下进行。 / p>

当我手头有OCaml时,以及当我需要编译代码时,我还需要用于编译OCaml的c链接器。对我来说,这很奇怪。为什么OCaml无法使用OCaml的较早版本而不是某些C编译器进行自动引导?

3 个答案:

答案 0 :(得分:5)

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

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

对于构建OCaml本身,C编译器是绝对必要的。 OCaml本身并不是完全用OCaml编写的。实际上,OCaml运行时是用纯C语言编写的,例如垃圾收集器。同样,许多功能,尤其是定义系统接口的功能(例如Unix)也用C编写。sloccount工具粗略估计,OCaml源代码(45,000 LOC)的15%用C编写。

答案 1 :(得分:0)

OCaml字节码解释器用C编写-请参见OCaml自述文件here中的描述。

答案 2 :(得分:0)

  

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

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

如果打算在Windows上发行,我只会使用Windows进行开发,而我很少这样做。即使那样,我还是希望使用交叉编译器,而仅将Windows用于测试。