你在 OCaml 的第一個專案

既然 OCaml 發行版可以在你最喜歡的作業系統上使用,我們可以在 OCaml 中建立你的第一個程式:Hello World!

我們有不同的方式來啟動 OCaml 程式。

REPL(頂級)

你可以使用頂層以**互動方式執行程式碼。使用 OCaml toplevel ,你可以編寫和執行 OCaml 程式碼,作為 UNIX shell。之後,頂層會立即檢查你的程式碼型別。因此,你可以快速輕鬆地測試程式碼的某些部分,而無需編譯和執行。 ** ** **

你可以使用 ocaml 命令啟動頂層。然後,你可以寫一個由 ;; 結束的 OCaml 句子,立即評估。在頂層顯示的型別和你的表達剛過的價值:

# "Hello Worlds!";;
- : string = "Hello Worlds!"

也可以在檔案上啟動頂層。你可以看到這個解釋

為方便你在頂層輸入,你可以使用像 leditrlwrap 這樣的工具,它提供了一些功能(如輸入歷史記錄):

 $ 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!
$