您在OCaml中的第一个程序

示例

现在,您可以在喜欢的操作系统上使用OCaml发行版,我们可以在OCaml中创建您的第一个程序:Hello World!

我们有不同的方法来启动OCaml程序。

REPL(Toplevel)

您可以与顶层交互地执行代码。使用OCaml toplevel,您可以将UNIX外壳程序编写和执行OCaml代码。之后,顶层将立即检查您的代码类型。因此,您可以快速轻松地测试代码的某些部分,而无需编译和执行。

您可以使用命令启动顶层ocaml。然后,您可以编写一个OCaml句子,;;该句子将立即被评估。顶级紧随其后显示表达式的类型和值:

# "世界您好!";;
- : string = "世界您好!"

也可以在文件上启动顶层。您可以看到有关此内容的说明。

为了方便您在顶层输入,可以使用ledit或的工具,该工具rlwrap提供了一些功能(例如输入历史记录):

 $ ledit ocaml

 $ rlwrap ocaml

编译为字节码

我们有两种不同的编译器,一种编译为字节码,另一种编译为本机代码。第一个与Java虚拟机的字节码相同。因此,字节码效率较低,但可移植性更高。

我们有一些OCaml编译器使用的扩展文件:

延期定义
.ml源代码(如.cC语言)
.mli接口(如.hC语言)
.cmo源代码通过编译ocamlc的字节码
.cmi接口代码由 ocamlc
.cmx 和 .o由ocamlopt本机代码编译的源代码
.cma字节码中的库(部分存储桶*.cmo)
.cmxa 和 .a本机代码库
.cmxs本机代码库(动态加载)

字节码编译器ocamlc。

您有不同的常用选项:

  • -c:编译没有链接过程的源文件(生成可执行文件)。因此,该命令将ocaml -c foo.ml生成一个.cmo文件。与不需要编译头文件的C不同,在OCaml中必须编译.mli文件:ocaml -c foo.mli。

您需要先编译接口。之后,当您编译源文件时,OCaml会尝试检查实现是否与接口匹配。

该.mli文件不是必需的。如果编译的.ml文件中没有.mli文件,OCaml将.cmi自动生成一个文件。

  • -o:将某些.cmo文件编译为可执行文件。例如:。这些文件需要按照与第一个文件没有依赖性的依赖性进行排列。ocamlc -o programfoo.cmobar.cmo

  • -I:表示编译器可以在其中找到编译所需文件的其他目录(例如接口或源代码)。它与-IC编译器中的相同。

我们还有许多其他选择。您可以参阅手册以获取更多信息。

因此,您可以编写hello.mlnow,然后编译该文件ocamlc -o hello hello.ml以生成字节码程序:

let () = print_endline "你好,世界!"

该let () = ...是你的程序的第一个条目(如mainC语言)。之后,我们将函数print_endline(由标准库提供)与参数"你好,世界!"一起Hello Worlds使用,以在标准输出中以换行符进行打印。

编译后,您将拥有该.cmo文件以及.cmi该编译器和您的程序自动生成的文件hello。您可以打开程序,在该文件的顶部,您可以看到:

#!/usr/local/bin/ocamlrun

这意味着您的程序需要该ocamlrun程序(由发行版提供)来执行字节码(例如JVM)。

编译为本机代码

我们还有另一个生成本机代码的编译器。编译器为:ocamlopt。但是,生成的可执行文件无法在大多数其他体系结构上运行。

ocamlopt使用与相同的选项,ocamlc因此您可以执行ocamlopt -o hello hello.ml。之后,您可以看到.cmx和.o文件。

最后,从您的字节码/本机代码程序,您可以执行:

$ ./hello
你好,世界!
$