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

Compilation 为什么我在构建OCaml和OCaml代码时总是需要一个C编译器环境?,compilation,ocaml,Compilation,Ocaml,这是我多年来一直在思考的问题,我在windows下使用OCaml,当我构建每个OCaml发行版时,我需要一个C编译器,MSVC或MingGW,我必须在Cygwin下完成 当我手头有OCaml时,当我需要编译代码时,我还需要用于编译OCaml的c链接器。对我来说,这很奇怪。为什么OCaml不能用旧版本的OCaml而不是某些C编译器自动引导?OCaml字节码解释器是用C编写的-请参阅OCaml自述文件中的说明。OCaml字节码解释器是用C编写的-请参阅OCaml自述文件中的说明。OCaml工具链依赖

这是我多年来一直在思考的问题,我在windows下使用OCaml,当我构建每个OCaml发行版时,我需要一个C编译器,MSVC或MingGW,我必须在Cygwin下完成


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

OCaml字节码解释器是用C编写的-请参阅OCaml自述文件中的说明。

OCaml字节码解释器是用C编写的-请参阅OCaml自述文件中的说明。

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

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


对于构建OCaml本身,C编译器是绝对必要的。OCaml本身并不是完全用OCaml编写的。事实上,OCaml运行时是用纯C编写的,例如垃圾收集器。此外,许多函数,特别是定义系统接口(例如Unix)的函数也用C编写。
sloccount
工具粗略估计,15%的OCaml源代码(45000 LOC)是用C编写的。

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

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

对于构建OCaml本身,C编译器是绝对必要的。OCaml本身并不是完全用OCaml编写的。事实上,OCaml运行时是用纯C编写的,例如垃圾收集器。此外,许多函数,特别是定义系统接口(例如Unix)的函数也用C编写。
sloccount
工具粗略估计,15%的OCaml源代码(45000 LOC)是用C编写的

ivg的答案说明了一切,但我只想给Windows10用户一个快速提示

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

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

ivg的答案说明了一切,但我只想给Windows10用户一个快速提示

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


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

这是关于引导的,但当我有完整的构建ocaml来编译我的ml文件时,我仍然需要环境中的c链接器,为什么?这是关于引导的,但是当我有完整的构建ocaml来编译我的ml文件时,我仍然需要环境中的c链接器,为什么?谢谢你的回答,明白了。这个问题是因为我知道Rust编译器最初是用OCaml编写的,后来自动启动的。谢谢你的回答,明白了吗。我问这个问题是因为我知道Rust编译器最初是用OCaml编写的,后来自动启动的。windows上的bash有问题,如果录制ocamlc,它将只搜索ocamlc,而不会搜索ocamlc.exe,所以我无法在windowsSure上用bash构建OCaml和libs。如果您想在Windows上使用Bash进行编译,但在Windows上执行,则需要一个交叉编译器。嗯,只有我的子项目(后台服务)使用OCaml,而主项目使用MSVC进行编译。因此,当我谈到交叉编译器时,应该是MinGW,我认为将两者结合起来会有问题..windows上的bash有问题,如果录制ocamlc,它将只搜索ocamlc,而不会搜索ocamlc.exe,因此我无法在windows上使用bash构建ocaml和LIB确定。如果你想在Windows上使用Bash进行编译,但在Windows上执行,你需要一个交叉编译器。好吧,只有我的子项目(一个后台服务)使用OCaml,而主项目是用MSVC编译的。因此,当我谈到交叉编译器(应该是MinGW)时,我认为将两者结合起来会有问题。。