LGJ Notes

蒙古大夫 2.0。 這裡紀錄的都不是我的專業,我的專業就是不專業。別傻了,什麼是專業?

« OCaml 初探 | Main | 中英文字間空白 »

OCaml 的 Hello world
2006/12/27,21:33 :: 點閱次數 (5768)
每種程式語言的第一個展示的程式,幾乎就是 Hello World。我不清楚這個歷史淵源,不過,管他的,反正總是要有第一個,不是嗎?而且,這只不過是個破題且借題發揮的手段。XD


要提 hello world 之前,首先先提一下 OCaml 的 interactive mode,就是執行 ocaml 這個執行檔所形成和使用者互動的狀態,這時可以馬上鍵入 OCaml 的 expression/phrase 來測試他的結果,和寫成程式碼,編譯出來的結果「幾乎」是一樣的,對於初接觸的人,想對 OCaml 的運作多一些瞭解,這個互動模式是個不錯的開始,因為他除了會馬上反應出結果出來,也對各種型別的轉變有所交待。

在 OCaml 互動模式裡頭的 hello world,那就太簡單了:

[edt1023@lgj ~]$ ocaml
        Objective Caml version 3.09.3

# print_string "Hell, World!";;
Hell, World!- : unit = ()
#
這樣就完成了。他的傳回值其實是 unit(就是 (),等同於 C 的 void),印出的字串,是他的 side effect 所造成的。當然,print_string 並不會送出換行字元(\n),所以,可以改用 print_endline
# print_endline "Hello, World!";;
Hello, World!
- : unit = ()
#
或者,你也可以在 print_string 後另加一行 print_char '\n' 也是一樣。

再來就是看怎麼把寫成的程式碼拿來編譯成可執行檔:

(*
  vim:ts=2 sw=2 et
  hello-text.ml :
  Edward G.J. Lee (12/27/06)
*)

print_string "Hello World!";
print_char '\n';;
(* 或 print_endline ();; 一行就解決了 *)
這裡要說明的是,(*……*) 是註解,幾個 expression 可以組成一個 phrase, 各 expression 後以一個分號 ; 結束,一整個 phrase 則以雙分號 ;; 來結束。簡單的說,phrase 才是一個完整功能的句子,expression 只是單一的表示式(函數,functional language 是以 function 為處理單位的,連傳回的值本身也是 function),如果搞不清楚,那通通給他以雙分號結束也是可以的。

將上面的程式碼存檔成 hello-text.ml,接下來就要開始編譯。在 OCaml 有兩個編譯器,一個是 bytecode compiler,編譯出來的可執行檔,檔案較小,但執行速度較慢。另一種是 native-binary compiler,這會編譯成和系統相依的原生可執行檔,檔案會大一些,但執行速度會快一點,而且,無需安裝 OCaml 就可以在同一平台上執行:

bytecode compiler:
ocamlc -o hello-text hello-text.ml
native-binary compiler:
ocamlopt -o hello-text hello-text.ml
然後就可以執行 hello-text 這個可執行檔了,玩玩看吧!

這樣的 hello world 好像太「純潔」了一點?我們用 OCaml 內建的繪圖 module 來試看看,順便看怎麼在 OCaml 使用 module:

(*
  vim:ts=2 sw=2 et
  hello-graph.ml :
  ocamlc graphics.cma hello-graph.ml -o hello-graph
  ocamlopt graphics.cmxa hello-graph.ml -o hello-graph
  Edward G.J. Lee (12/27/06)
*)

open Graphics;;
open_graph " 640x480";;

set_color red;
set_font "-*-*-*-r-*--82-*-*-*-p-*-iso8859-1";
moveto 100 200;
draw_string ("Hello World!");
print_endline "Press any key to stop...";
read_line ();;
編譯的方法已經寫在註解裡頭,這是典型使用模組(module)的方法。不使用 open,寫成以下的方式也是一樣:
Graphics.open_graph " 640x480";;

Graphics.set_color red;
Graphics.set_font "-*-*-*-r-*--82-*-*-*-p-*-iso8859-1";
Graphics.moveto 100 200;
Graphics.draw_string ("Hello World!");
print_endline "Press any key to stop...";
read_line ();;
不過,這樣會變得很煩,尤其是模組名稱很長的時候,這時也可以使用 alias 來簡化:
module Gr = Graphics;;
Gr.open_graph " 640x480";;

Gr.set_color red;
Gr.set_font "-*-*-*-r-*--82-*-*-*-p-*-iso8859-1";
Gr.moveto 100 200;
Gr.draw_string ("Hello World!");
print_endline "Press any key to stop...";
read_line ();;
以下是執行結果(這是在 FreeBSD X Window 編譯、執行的,所以是依 X 的取字方式):

hello-graph 圖示

迴響

Comment Icon Hello World

Hello World 的来源是 Brian Kernighan, Dennis Ritchie 的 The C Programming Language.

Posted by: jjgod at 2007/02/11, 17:35
 
Accessible and Valid XHTML 1.0 Strict and CSS Powered by BS2 Blog