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