你在 OCaml 的第一个项目
既然 OCaml 发行版可以在你最喜欢的操作系统上使用,我们可以在 OCaml 中创建你的第一个程序:Hello World!
我们有不同的方式来启动 OCaml 程序。
REPL(顶级)
你可以使用顶层以**交互方式执行代码。使用 OCaml toplevel ,你可以编写和执行 OCaml 代码,作为 UNIX shell。之后,顶层会立即检查你的代码类型。因此,你可以快速轻松地测试代码的某些部分,而无需编译和执行。 ** ** **
你可以使用 ocaml 命令启动顶层。然后,你可以写一个由 ;; 结束的 OCaml 句子,立即评估。在顶层显示的类型和你的表达刚过的价值:
# "Hello Worlds!";;
- : string = "Hello Worlds!"
也可以在文件上启动顶层。你可以看到这个解释 。
为方便你在顶层输入,你可以使用像 ledit 或 rlwrap 这样的工具,它提供了一些功能(如输入历史记录):
$ ledit ocaml
$ rlwrap ocaml
编译为字节码
我们有两个不同的编译器,一个编译为字节码,另一个编译为本机代码。第一个与 Java 虚拟机的字节码相同。因此,字节码效率较低,但更便携。
我们有一些 OCaml 编译器使用的扩展文件:
| 延期 | 定义 |
|---|---|
.ml |
源代码(如 C 中的 .c) |
.mli |
界面(如 C 中的 .h) |
.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 文件不是强制性的。如果你编译一个没有 .mli 文件的 .ml 文件,OCaml 会自动生成一个 .cmi 文件。
-
-o:将一些.cmo文件编译成可执行文件。例如:ocamlc -o program foo.cmo bar.cmo。这些文件需要由第一个文件没有依赖关系的依赖项排列。 -
-I:表示编译器可以找到编译所需文件的其他目录(如接口或源代码)。它与 C 编译器中的-I相同。
我们还有很多其他选择。你可以查看手册以获取更多信息。
所以,你现在可以编写 hello.ml,并使用 ocamlc -o hello hello.ml 编译此文件以生成字节码程序:
let () = print_endline "Hello World!"
let () = ... 是你程序的第一个条目(如 C 中的 main)。之后,我们使用函数 print_endline(由标准库提供)和参数 Hello World! 来打印 Hello Worlds,并在标准输出中添加换行符。
编译完成后,你将获得 .cmo 文件和编译器以及程序 hello 自动生成的 .cmi 文件。你可以打开你的程序,在此文件的顶部,你可以看到:
#!/usr/local/bin/ocamlrun
这意味着你的程序需要 ocamlrun 程序(由发行版提供)来执行字节码 (如 JVM)。
编译到本机代码
我们有另一个生成本机代码的编译器。编译器是:ocamlopt。但是,生成的可执行文件无法在大多数其他体系结构上运行。
ocamlopt 使用与 ocamlc 相同的选项,因此你可以执行 ocamlopt -o hello hello.ml。之后,你可以看到 .cmx 和 .o 文件。
最后,从你的字节码 /本机代码程序中,你可以执行:
$ ./hello
Hello World!
$