開發自己的指令碼引擎(一)先吹吹水,再幹事情。
vczh
其實我很早以前就想寫一些關於指令碼引擎開發的文章了。後來由於自己要寫一些程式而暫停了這個計畫。其實寫這篇文章的原因很簡單,我在開發指令碼引擎的時候在網上找不到適合自己看的資料,不過最後還是做成了,那麼就貢獻一下吧。
在文章的開頭我先宣告一下,本文章不是學術**,不是《編譯原理》的入門資料。我寫的只是我自己知道的一些東西。本文章討論的技術之可以用來參考,在實際開發過程中還是要結合自己的實際情況進行優化。
記得我第一次開發arpg的時候是高一,當時基本上處於小鳥狀態,為了支援劇情就自己琢磨了乙個簡單的命令控制指令碼。後來覺得不爽就開發了乙個語法類似pascal的。後來由於轉到了vc++,就用c++再寫了一次指令碼引擎。這次語法當然是模仿c++的啦。後來在開發這個指令碼引擎的過程中也學到一些東西。
乙個指令碼引擎的結構是什麼樣子的呢?我們可以先從其工作流程看起。一開始就需要一些指令碼**(你可以把這些**寫在檔案裡),然後就用乙個東西把這些**讀進去折騰一下,折騰出來的結果就送到另乙個東西去執行。這個東西在執行的時候,碰到自己無法處理的事情,就把那些資訊扔給你,你接著幹,幹完了讓它繼續工作。於是很明顯,就是乙個編譯器和乙個虛擬機器。虛擬機器裡頭還有一套跟宿主程式交流的機制。
到了這一步,就開始考察者倆兄弟需要的一些行為,然後就制定介面,然後就幹嗎幹嘛……這些是讀軟體工程的人的事情,我現在就先不管了,我只管實現。至於人家怎麼用,那是他們的事情。
想著想著,你會發現,咦?怎麼需要編譯器了?其實,編譯器在這裡充當的是乙個整理**的角色。如果你面對的是一些(語法上)比較複雜的指令碼,這東西就可以當之無愧的叫做編譯器啦。在我自己開發的那個指令碼引擎裡,編譯器就負責把輸入的指令碼**編譯成自己設計的一套指令,看起來像彙編。然後虛擬機器就根據這些指令和一些其它資料來構造整個指令的執行環境,最後就等待使用者啟動了。
假設你現在正在開發乙個遊戲,你需要乙個指令碼解釋程式,你於是就把指令碼裡頭的某些函式對映到你遊戲的一些控制上。這個遊戲開發完了,可是你還不過癮,又來乙個。新的遊戲仍然需要指令碼解釋程式。如果上乙個指令碼引擎是依附在遊戲上的,那就死定啦!那麼多複雜的東西要重來一遍,多不爽啊。於是,現在需要做的就是把不同應用中指令碼引擎做的相同的事情抽象出來,先搞成乙個東西。以後用來幹什麼就在開發一些外掛程式扔進去。
於是現在涉及到了指令碼引擎跟宿主程式的交流了。這個交流需要幹什麼事情呢?其實很簡單,就兩個。第乙個是讓宿主程式執行制定的乙個指令碼,或許是指令碼中的某乙個函式。第二個就是當指令碼需要宿主程式功能上的支援的時候,譬如乙個messagebox,這個時候,指令碼就要跟指令碼引擎說,我給你一些東西,你給我搞乙個messagebox出來。指令碼引擎本身當然做不到啦,於是回過頭又跟宿主程式說,我把指令碼給我的這些東西給你,你幫我搞乙個messagebox出來。宿主程式一聽,沒問題!於是乙個messagebox就出來啦。
為了指令碼引擎跟宿主程式交流的時候方便,我們就可以在指令碼語言的語法中加入一些特定的東西,譬如指定乙個函式在呼叫的時候就是讓宿主程式替著幹的,或者指定乙個函式讓指令碼引擎開乙個口子方便宿主程式呼叫。然後就想辦法在設計出一套指令,讓編譯器好寫一點,虛擬機器跑起來也好跑一點。這就是我們在開始動手寫指令碼引擎之前需要幹的事情。畢竟設計乙個指令碼引擎不僅僅要思考那些煩人的演算法,事實上指令碼的語法也是要自己設計的。不過有時候為了方便就可以參考一些常用的程式語言,然後拿去改造,也就差不多可以了。
吹水就吹到這裡了,現在總結一下。
開發自己的指令碼引擎(一)先吹吹水,再幹事情
其實我很早以前就想寫一些關於指令碼引擎開發的文章了。後來由於自己要寫一些程式而暫停了這個計畫。其實寫這篇文章的原因很簡單,我在開發指令碼引擎的時候在網上找不到適合自己看的資料,不過最後還是做成了,那麼就貢獻一下吧。在文章的開頭我先宣告一下,本文章不是學術 不是 編譯原理 的入門資料。我寫的只是我自己...
開發自己的One Page Scroll外掛程式(二)
開發自己的one page scroll外掛程式 一 我經常會不停地發布當前的版本,從而可以在github上得到不斷的反饋。我的開發模式是不斷的迭代。在開始的時候,我不會太關注它在手機上的效 果,其實到目前我也沒有關注這個問題。但其實我使用了乙個簡單的解決方案。通過檢測和轉換資料,從而在手機上同樣能...
根據nestk庫開發自己的軟體
nestk是rgb demo中演示程式使用的核心庫。它旨在輕鬆整合到現有的基於cmake的軟體中,並快速訪問kinect功能。該庫建立在opencv和qt之上,用於圖形部分。它的一部分也取決於pcl。它包含或尋找所需的所有其他庫。特別地,包括libfreenect。它可以用作系統上安裝的經典外部庫,...