開始解釋器篇。
解釋器部分會寫幾節還說不許,由於,很多相關內容在以前的版本中是有覆蓋到的。
一樣,仍是從解釋器入口的 main 函數提及。
windows
int main (int argc, char *argv[]) { int i; int result = 0; iolib_open (); strlib_open (); mathlib_open (); lua_register("argv", lua_getargv); if (argc < 2) manual_input(); else { for (i=1; i<argc; i++) if (strcmp(argv[i], "--") == 0) { lua_argc = argc-i-1; lua_argv = argv+i; break; } for (i=1; i<argc; i++) { if (strcmp(argv[i], "--") == 0) break; else if (strcmp(argv[i], "-") == 0) manual_input(); else if (strcmp(argv[i], "-v") == 0) printf("%s %s\n(written by %s)\n\n", LUA_VERSION, LUA_COPYRIGHT, LUA_AUTHORS); else { result = lua_dofile (argv[i]); if (result) fprintf(stderr, "lua: error trying to run file %s\n", argv[i]); } } } return result; }
程序上來先定義一個程序的返回值。按 C 語言慣例,程序返回 0 表示成功,非 0 表示失敗。
打開幾個庫,io 庫,字符串庫,數學庫。打開庫的過程就是把庫函數註冊到全局符號表中去。
註冊一個 argv 函數以在 Lua 腳本里取得命令行中給 Lua 腳本的參數。這些參數是保存在了 C 的執行環境中。註冊函數用的是 lua_register 宏,上面的程序內置庫的註冊用的也是這個宏。
若是無參,則表示程序執行在交互模式。就是把命令行裏的用戶手動輸入的內容作爲 Lua 腳本程序來執行。
函數
static void manual_input (void) { if (isatty(0)) { char buffer[250]; while (fgets(buffer, sizeof(buffer), stdin) != 0) lua_dostring(buffer); } else lua_dofile(NULL); /* executes stdin as a file */ }
isatty 是檢查設備是不是某種終端類型,它定義在 POSIX 裏的。
這裏是在 windows 裏分析的,因此用一個宏代替它,就是把標準輸入當作一個 tty。
所以在 windows 裏,isatty(0) 永遠爲真,也就是手動輸入 manual_input 裏是按行執行輸入腳本代碼的,經過 lua_dostring 執行。
回到 main 函數。
接着開解釋命令行的參數。
第一個 for 循環是爲了解析出 Lua 腳本的輸入參數的位置和個數,就是從兩個減號 "--" 開始的參數是 Lua 腳本的參數。
lua
for (i=1; i<argc; i++) if (strcmp(argv[i], "--") == 0) { lua_argc = argc-i-1; lua_argv = argv+i; break; }
第二個 for 循環也是解析命令行輸入的。
若是是兩個減號"--",表示是 Lua 腳本的參數開始了,就中止。
若是是一個減號 "-",表示是交互模式,這個和無參時狀況相似,調用的也是 manual_input 來執行用戶的手動輸入內容。
若是是 "-v",打印程序的版本,版權,做者信息。
不然,就是腳本文件的解釋執行了。調用 lua_dofile 解釋腳本文件。
若是執行腳本文件結果出錯(就是 result 非 0 的狀況),打印出錯信息。
這一版本,新增了外部編譯器,Lua 能夠直接解釋編譯器編譯過的 luac.out 格式的二進制文件, Lua 是如何區分腳本文件和編譯過的二進制文件的呢?
----------------------------------------
到目前爲止的問題:
> Lua 是如何區分腳本文件和編譯過的二進制文件的呢?
----------------------------------------
命令行