轉自http://my.oschina.net/mayqlzu/blog/113528ios
問題:編程
最近lua很火,由於《憤怒的小鳥》使用了lua,ios上有lua解釋器?它是怎麼嵌入大ios中的呢?lua的官網說:"lua is an embeddable scripting language",怎麼理解呢?怎麼在你本身的程序裏嵌入lua解釋器呢?若是能夠在個人程序中嵌入了lua,那是否意味着我能夠今後用lua編程了呢?windows
帶着這些問題,打算在個人windows筆記本上作個實驗,目標是在windows上跑一個lua的解釋器,而後用lua語言寫一個程序,跑在這個解釋器之上,也就說最後的效果是:eclipse
(上) lua program -> lua解釋器 -> windows (下)編輯器
或者是:函數
(上) lua program -> lua解釋器 -> my c program -> windows (下)工具
實踐:ui
1) 下載lua源碼;lua
2) 用eclipse+mingw編譯lua解釋器的源碼spa
eclipse+mingw編譯環境我以前就已經搭好了,有興趣的同窗能夠參考個人另外一篇文章,固然你也能夠用其餘編譯工具,好比visual Studio;
創建一個空白c工程,project type選Executable->Empyt Project;
導入src目錄下的全部文件,包括.c, .h和Makefile文件;
點擊build,開始編譯;
遇到編譯錯誤:main()重定義,lua.c和luac.c裏分別有一個main(),lua.c是解釋器的源碼,luac.c是編譯器的源碼,咱們此時要的是解釋器,因此從工程刪除luac.c,從新編譯,經過,生成lua.exe;
沒想到lua的源碼和Makefile寫得這麼好,這麼順利就編譯經過了,網上說lua是用標準c寫的,只要是支持標準c的編譯環境都能順利的編譯它;
3) 運行編譯出來的解釋器
找到lua.exe所在的目錄,在這個目錄下先準備一個用lua寫的程序,好比hello.lua,包含代碼:print "hello lua";
打開一個windows的cmd窗口,cd到編譯結果lua.exe所在的目錄,調用lua解釋器,執行hello.lua程序,命令爲:lua.exe "hello.lua",(我以前從官網下載了一個編譯好的lua解釋器和SciTE編輯器,我看到SciTE編輯器就是用這個命令調用lua解釋器的)看到窗口輸出hello lua,太好了,至此,我親手編出了一個lua解釋器,能夠跑在個人windows系統之上;
4) 下一步,怎麼在個人c程序裏調用lua解釋器?
哦,知道了,個人c程序調用windows的接口將lua.exe跑起來,同時把hello.lua文件做爲參數傳給lua.exe,不就好了。
在你的main.c中,能夠用相似這樣的代碼調用lua.exe:system("C:\\some_path\\lua.exe -e \"hello.lua\" " )
5) lua解釋器執行hello.lua的時候,若是hello.lua想調用一個本地庫foo.dll中的foo()函數,foo.dll是foo.c編譯生成的,怎麼辦?
稍等,我正在作...
6) foo.c怎麼調用hello.lua中的函數?
寫到這兒,忽然明白了,解釋型語言和編譯型語言之間的相互調用沒什麼神祕的,仍是以lua和c爲例,
a)先看lua怎麼調c?
所謂的lua調用c,是指foo.lua調用bar.c中的代碼,foo.lua自己只是一段源碼,不能執行的,必須由lua解釋器來執行,lua解釋器是一個可執行程序,能夠運行,foo.lua能夠當作是解釋器程序運行過程當中讀取的一個配置文件,根據」配置文件foo.lua「內容的不一樣作不一樣的事情,若是」配置文件foo.lua「說調用bar.c中的bar()函數,那麼解釋器lua.exe就去調用了,假設此時bar.c也已經編譯成了二進制bar.dll,那既然lua.exe和bar.dll是同一個平臺(好比windows)上的二進制程序,互相之間的調用就沒什麼稀奇了吧,就跟你寫一個簡單的main.exe調用bar.dll同樣了;
b)再看c怎麼調用lua?
所謂的c調用lua,是指foo.c調用bar.lua中的代碼,咱們先要把foo.c編譯成一個可執行程序foo.exe,這樣才能執行嘛,但是被調用方bar.lua只是一個包含lua代碼的源文件,不是二進制的(咱們如今是在討論解釋器,不考慮lua預編譯成二進制的狀況),沒法調用,因此咱們就要借用lua解釋器了,因此整個流程就是:foo.exe -call-> lua解釋器(可執行程序)-讀取-> bar.lua,foo.exe其實只和lua解釋器打交道,告訴它我要調用某個函數,而後由解釋器負責去找到這個函數並調用;
綜上,你會發現,不論是lua調c仍是c調lua,他們都不是直接交互的,由於lua程序只是一堆」死「的源代碼,像一個配置文件同樣,不能執行的,因此就須要一箇中間人」lua解釋器「,只要c程序和lua解釋器之間約定好接口,那麼實現c和lua之間的調用就是很天然的事情了,沒什麼神祕的。
最後給出一個示意圖:
一個用c寫的程序,已經編譯成二進制 <--> 用c寫的lua解釋器,已經編譯成二進制 -> 一個lua寫的程序,只能被解釋器」被動「地讀取,不能」主動「地執行