解釋型指令碼向編譯型指令碼轉化的乙個簡單轉變

2021-03-31 08:56:58 字數 1841 閱讀 7130

解釋型指令碼是大量遊戲中需要用到的,用以控制觸發器、規則系統和資料系統的乙個重要措施。rpg遊戲中尤其大量用到了指令碼來控制劇情的變化、戰場細節等等。即便是在非rpg類遊戲中,各種各樣的指令碼也是被大量運用的。

這裡的指令碼,並不指代那些"材質指令碼""shader指令碼",對我而言,那些不能叫指令碼,而只是配置檔案,這兩個的意義有些不同。指令碼是用來執行的,而配置檔案則是用來配置、調製的。無論其表現形態如何,是xml?是ini?還是別的,只要是被直譯器裝載、逐行解釋並執行,就是解釋型的指令碼。

解釋型指令碼簡單易學,耐用。就像名槍ak47,結構簡單,經久耐用,高寒、乾旱、濕熱條件均可應用,每一本編譯原理書其實都會花很大的功夫來講解釋原理,正可謂是資源取之不盡用之不竭。我們當時的編譯原理課時嚴重不足,來得及講完的也不過就是解釋原理而已,可惜如何在目標機器上編譯出來目標**、如何把目標**連線為機器碼,都沒有學到,慚愧!遺憾!

既然沒學過真正的編譯原理,因此目前為止所作的也不過就乙個很簡單的直譯器而已。

可惜的事情來了,既然沒有學過編譯原理,把**編譯為機器**幾乎是不可能的事情,難道寫c++或者c的**,最後交給c++或者c的編譯器去編譯?雖然這樣有先例,但那樣也沒什麼意義,還不如直接硬編碼。

後來想想,幹嘛把問題考慮得這麼複雜,編譯,為何要編譯?直譯器的關鍵在於逐行解釋,每一次執行解釋指令碼都會重新解釋,對於很多遊戲來說,這是乙個無法容忍的行為。編譯的作用就是把指令碼**一次編譯為連續的、固定的指令序列的集合,只要指令碼沒變、以及除開隨機數的影響,兩次執行同樣編譯後指令的結果應當是完全相同的。其他還有嗎?應該沒有了。

其實現在已經有這種編譯器,在遊戲中也有所應用,python等指令碼語言都提供了編譯功能,這種編譯其實相對就簡單很多。

可以這樣理解編譯過後的**:那是一系列指令或者說基本元素的集合,沒必要把這些基本元素複雜到細微到push、pop、jump等彙編級別,實際上根據需要,我們可以非常粗略地給出基本元素:按照功能可以把元素劃分為行為子和運算元,例如gethp指令獲取某物件的hp(如果有),或者moveto將某物件設定為moveto某位置的狀態,最後的運算元最為簡單而不可或缺,如:與或非、加減乘除、位算符、位址算符、域算符(用於基於物件)等等。這樣的一系列**,對於上層的使用者來說很簡單,不必要注意一些不需要注意的細節,同時又能保證擴充套件性,如果需要新的元素,只需要新增新元素就可以了。就像cisc那樣,我不用精簡指令,用的就是複雜指令,需要就新增乙個複雜指令,效率?要效率的話你就不要玩這個了,去玩機器**吧,那個效率最高。這本就不準備注意效率,而是去注意開發的效率。在中國,開發了5年的遊戲有幾個?大部分2、3年就撐不住了,還等你有時間去折磨5年?那只有在特大規模的公司和企業才可能,在中國目前的情況:物力、人力財力是不可能做到的。除了行為子和運算元外,更重要的是資料,如何把資料——更多指的是變數——在執行時對應到每個指令上去?這個編譯原理的教材中都會提到,我還沒有動手,因此就不隨便寫了,等做完了再寫吧。

編譯的開始,逐行掃瞄分析指令碼指令,將之打散為基本元素的關係集合。如果指令碼是過程性的,那就需要注意出入棧的問題,而如果是基於物件或者物件導向的,目前還沒有思考過。最後將所有的基本元素以一種更為精簡快速的資料格式儲存到某個檔案中,作為編譯後的目標**。在執行遊戲的時候,我們預先裝入這些目標**,將之轉化為用陣列或者其他資料結構儲存的指令序列。這樣就不用解釋指令碼了,每次執行到目標**的時候,只需要提供相應的資料,然後呼叫for迴圈執行所有的指令就可以了。

我原來用過3dgs,當時聽說那個是編譯的指令碼,剛剛寫完直譯器的我受觸動很大,後來我狠狠查了查3dgs的檔案,覺得3dgs好像沒有真的把指令碼編譯為機器碼。3dgs的指令碼相對是比較risc的,指令大凡都是簡單指令,因此寫起來非常難受,比寫c還難受。cisc還是risc是一種具體做法的區別,前者省了指令碼編纂者的事情,但是比較費力,不好把握,後者會讓指令碼編纂者頭疼,但是比較好把握,而且挑錯比較容易。

粗略寫寫,請大家幫我看看有沒有什麼疏漏,期待與您的交流。

解釋型語言 編譯型語言以及指令碼語言

因為好久沒有碰程式設計了,也不打算將程式設計技能給遺忘,就開始從程式設計基礎複習。再加上也開始了解python,是時候對編譯型語言 解釋型語言 指令碼語言做乙個簡單地歸納總結。我們使用工具編寫的字母加符號的 是我們能看懂的高階語言,計算機無法直接理解,計算機需要先對我們編寫的 翻譯成計算機語言,才能...

編譯型語言和解釋型語言的區別

我們編寫的源 是人類語言,我們自己能夠輕鬆理解 但是對於計算機硬體 cpu 源 就是天書,根本無法執行,計算機只能識別某些特定的二進位制指令,在程式真正執行之前必須將源 轉換成二進位制指令。所謂的二進位制指令,也就是機器碼,是 cpu 能夠識別的硬體層面的 簡陋的硬體 比如古老的微控制器 只能使用幾...

跨站點指令碼(xss)解析(一)反射型xss漏洞

跨站點指令碼 xss 即 cross site script,也經常存在於web程式中,它是往web頁面中插入 html語句 js語句等。如果伺服器端沒有對其進行過濾,當使用者瀏覽該網頁時,我們插入的 就會在使用者的瀏覽器中執行。當web應用程式動態地向我們展示資訊的時候,就可能存在xss漏洞。通常...