前言
虛幻引擎中的 藍圖 - 可視化腳本系統 是一個完整的游戲腳本系統, 其理念是,在虛幻編輯器中,使用基於節點的界面創建游戲可玩性元素。 和其他一些常見的腳本語言一樣,藍圖的用法也是通過定義在引擎中的面向對象的類或者對象。 在使用虛幻 4 的過程中,常常會遇到在藍圖中定義的對象,並且這類對象常常也會被直接稱為"藍圖(Blueprint)"。本文從代碼的層面講解虛幻引擎中藍圖的編譯(包括編輯部分的代碼,使用的版本是UE4 4.13.0),本文假設已經對藍圖已經有一個比較清楚的了解。
編譯原理相關術語
編譯程序是現代計算機系統的基本組成部分.從功能上看,一個編譯程序就是一個語言翻譯程序,它把一種語言(稱作源語言)書寫的程序翻譯成另一種語言(稱作目標語言)的等價的程序.
我們這里只是對一些術語進行簡單地介紹,如果想系統學習編譯原理,那么需要去找一些專業的書籍(如龍書、虎書、鯨書等,用搜索引擎都可以找得到),並且需要實踐才能對編譯原理有一個比較透徹和了解。
一般編譯器編譯一個程序會分為詞法分析、語法分析、語義分析、中間代碼生成、代碼優化、目標代碼生成這幾個階段來進行。
詞法分析
從左至右讀字符流的源程序、識別(拼)單詞。
- 單詞---token
- 保留字---reserved word
- 標識符 ---identifier(user-defined name)
示例:
語法分析
功能:層次分析.依據源程序的語法規則把源程序的單詞序列組成語法短語(表示成語法樹). 語法分析程序從掃描程序中獲取記號形式的源代碼,並完成定義程序結構的語法分析 (syntax analysis ),這與自然語言中句子的語法分析類似。語法分析定義了程序的結構元素及其關系。通常將語法分析的結果表示為分析樹(parse tree)或語法樹(syntax tree)。
實例:
語義分析
程序的語義就是它的"意思",它與語法或結構不同。程序的語義確定程序的運行,但是大多數的程序設計語言都具有在執行之前被確定而不易由語法表示和由分析程序分析的特征。 這些特征被稱作靜態語義(static semantic),而語義分析程序的任務就是分析這樣的語義(程序的"動態"語義具有只有在程序執行時才能確定的特性,由於編譯器不能執行程序,所以它不能由編譯器來確定)。一般的程序設計語言的典型靜態語義包括聲明和類型檢查。由語義分析程序計算的額外信息(諸如數據類型)被稱為屬性(attribute),它們通常是作為注釋或"裝 飾"增加到樹中(還可將屬性添加到符號表中)。
- 上下文相關性
- 類型匹配
- 類型轉換
示例:
語義分析結果:
中間代碼生成
源程序的內部(中間)表示:
三元式、四元式、P-Code、C-Code、 U-Code、bytecode
代碼優化
- 中間代碼優化
- 目標代碼優化
目標代碼生成
目標代碼生成是編譯的最后一個階段。目標代碼生成器把語法分析后或優化后的中間代碼變換成目標代碼。
符號表管理
這個數據結構中的信息與標識符有關:函數、變量、常量以及數據類型。符號表幾乎與編譯器的所有階段交互:掃描程序、分析程序或將標識符輸入到表格中的語義分析程序;語義分析程序將增加數據類型和其他信息;優化階段和代碼生成階段也將利用由符號表提供的信息選 出恰當的代碼。
- 記錄源程序中使用的名字
- 收集每個名字的各種屬性信息
類型、作用域、分配存儲信息
出錯處理
檢查錯誤、報告出錯信息、排錯、恢復編譯工作。