《Erlang程序設計》學習筆記-第6章 編譯並運行程序

 

第6章 編譯並運行程序

 

1. erlang:halt()可以即刻停止系統運行。

2. q()命令可以完成文件和數據庫的一些處理後再退出。它是init:stop()的一個shell別名

 

3. erlang可以動態加載代碼,正在運行的代碼可以在重新編譯後動態加裁而不用停止程序的運行。

4. 模塊加載相關函數:

code:get_path() %% 可以獲取當前加載路徑的設定值。

code:all_loaded() %% 獲取所有已經加載的模塊。

code:clash() %% 看加載的模塊是否有衝突。

另外

@spec code:add_patha(Dir) => true | {error, bad_directory} %% 增加一個新的目錄到加載路徑的開頭。

@spec code:add_pathz(Dir) => true | {error, bad_directory} %% 增加一個新的目錄到加載路徑的末尾。

5. 啓動erlang時增加加載路徑:

erl -pa Dir1 -pa Dir2 ... -pz DirK1 -pz DirK2

其中-pa相當於add_patha,-pz相當於add_pathz

6. 在erlang的home目錄下(或當前目錄下)可以加一個.erlang文件,在這個文件中可以寫一些erlang代碼,erlang在啓動時首先執行這裏面的代碼。

   一般情況一下可以將加載目錄的命令放到這個。

   如果不清楚當前系統下erlang的home目錄,可以用init:get_argument(home).來獲取。

   當前目錄下的.erlang文件比home目錄下的.erlang文件的優先級要高。

 

7. 除了在shell中運行一個模塊外,還有以下的方法:

方法一:命令行下編譯運行

$ erlc hello.erl

$ erl -noshell -s hello start -s init stop

%% -noshell的意思是關閉shell 

%% -s hello start是運行hello模塊的start函數

%% -init stop的意思是在運行完apply(hello, start, [])後,運行init模塊的stop函數退出

%% -s命令可以運行任何多個

%% 可以加-pa/-pz命令選項在這個命令行中

%% 可以將這個命令行寫到一個shell腳本中(如bash腳本),這樣就可以直接執行腳本平啓動erlang程序了。

%% 在windows下可以寫一個bat文件,將這個命令寫入。

方法二:將程序當作escript腳本運行(不用編譯),只有erlang R11B-4以後的版本才支持escript,在windows下不行

#!/usr/bin/env escript

main(_) -> io:format("Hello world/n"). %% 這個函數需要是main,escript從這個函數開始

方法三:當程序需要參數時,如何在命令行輸入參數。

-s選項後面是:ModName FuncName Args,其中Args是一個原子的參數列表。所以我們在程序中最好有一個處理命令行參數的函數。

像這樣: main([A]) -> I = list_to_integer(atom_to_list(A)), ... %% 這裏只接收一個參數,如果需要兩個可以這樣main([A, B]) -> ...

escript與其它的腳本一樣,運行時直接將參數放到後面就可以了。

8. atom_to_list(Atom) -> string 可以獲取原子的字符串形式

9. list_to_integer(List) -> int 可以獲取一個字符串的整數形式

10. 快速腳本:用-eval在命令行上直接運行一個erlang表達式,這個方法沒什麼大用途,我在windows測試好像沒有顯示什麼內容。

erl -eval 'io:format("Memory: ~p~n", [erlang:memory(total)]).' -noshell -s init stop

 

11. 一個makefile模板

# leave these lines alone

.SUFFIXES: .erl .beam .yrl # .yrl文件是erlang解析生成器程序(yecc)的解析定義文件

 

.erl.beam:

erlc -W $<

 

.yrl.erl:

erlc -W $<

 

ERL = erl -boot start_clean

 

# edit the lines below

MODS = module1 module2 /

module3 ... special1 .../

muduleN

 

all: compile

 

compile: ${MODS:%=%.beam} subdirs

 

#特殊情況,特殊編譯

special1.beam: special1.erl

${ERL} -Dflag1 -W0 special1.erl

 

#運行程序

application1: compile

${ERL} -pa Dir1 -s application1 start Arg1 Arg2

 

#編譯子目錄,子目錄中也有makefile

subdirs:

cd dir1; make

cd dir2; make

 

clean:

rm -rf *.beam erl_crash.dump #erl_crash.dump是erlang的崩潰轉存文件

cd dir1; make clean

cd dir2; make clean

 

12. 一個精簡makefile

.SUFFIXES: .erl .beam

 

.erl.beam:

erlc -W $<

 

ERL = erl -boot start_clean

 

MODS = module1 module2 module3

 

#編譯加運行

all: compile

${ERL} -pa Dir1 -s module start

 

compile: ${MODS:%=%.beam}

 

clean:

rm -rf *.beam erl_crash.dump

 

13. erlang shell中有一個emacs編輯器中的行編輯命令的一個子集。對於不用emacs的人沒有什麼用,比如我。

 

14. erlang啓動時帶有一個-detached選項,它後在後臺運行

15. erlang啓動時帶有一個-heart Cmd選項,系統會啓動一個監視進程,如果發現erlang進程死亡,監視進程就會執行Cmd,通常Cmd會重啓Erlang系統。

 

16. 如果調用一個eralng函數時發生undef錯誤,可能是以下幾種原因:

(1)系統中不存在這個模塊或函數,可能是拼寫錯誤。

(2)系統中有這個模塊,但沒有編譯。

(3)已經編譯了,但它所在的目錄不在erlang的加載路徑中。

(4)加載了幾個不同版本,我們可以通過code:clash()函數來看一下是否有重名的模塊。

 

17. JCL(Job Control Language)模式:在erlang shell中按下Ctrl+G會進入JCL模式,可以輸入h尋求幫助。

 

18. man:在Unix系統的命令行中執行:$ erl -man lists可以看到lists模塊的幫助。當然要首先安裝erlang的幫助手冊(不是默認安裝的)。

 

19. 在erlang shell中輸入命令help().會看到內建的命令,這些命令的定義在模塊shell_default中。

20. 可以定義一個user_default模塊,編譯後放到加載目錄中。這樣在erlang shell中可以直接調用其中的函數,不用寫模塊名。

 

21. 如果erlang崩潰了,它會留下一個叫做erl_crash.dump的文件。erlang有一個基於web的崩潰分析器。在erlang shell中啓動webtool:start().就啓動了。

 

發佈了46 篇原創文章 · 獲贊 4 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章