[C#] 使用 C# 重新製作一個語言 - Lia
2012-10-05
會有這計畫,是因為公司的Lab 要測試一些東西,所以就研究了一下,不過我並沒有打算在Blog寫這麼多且複雜的東西
對於製作一個語言 來說需要考慮到的事情非常非常的多
不過,對於很多人來說,至少我就是其中之一,對於能夠發明,或是製作一種電腦語言,是一個小小的夢想…
當然製作語言是一門很深很深的學問,本文並不會說到這麼的多,我所知道的也是有限,只有以前在學校時候上過廖賀田老師的課,才有思考對於Compiler 的思維。
這專案叫做Lia Language
之所以叫做Lia,是為了紀念一段死去的愛情..QQ
本文會透過C# 來建立一個新的自定語言,當然做法就是重新再製作MSIL Code.
將 Lia 編譯成MSIL http://msdn.microsoft.com/zh-tw/library/c5tkafs1(v=vs.80).aspx
編譯器會將您的原始程式碼轉譯成 Microsoft Intermediate Language (MSIL),它是可以有效率地轉換為機器碼而與 CPU 無關的指令集。MSIL 包括可用來載入、儲存、初始化和呼叫物件上方法的指令,以及用於數學和邏輯作業、控制流程、直接記憶體存取、例外處理和其他作業的指令。在程式碼可以執行之前,必須將 MSIL 轉換為 CPU 特定程式碼,而此轉換通常是藉 Just-In-Time (JIT) 編譯器進行。由於 Common Language Runtime 會為其支援的每一個電腦架構提供一或多個 JIT 編譯器,因此相同的 MSIL 集可以在任何受支援的架構上進行 JIT 編譯並執行。
當編譯器產生 MSIL 時,它也會產生中繼資料。中繼資料描述您程式碼中的型別,包括各個型別的定義、各個型別成員的簽章 (Signature)、您的程式碼參考的成員,和 Runtime 在執行期間使用的其他資料。MSIL 和中繼資料是包含在可移植執行檔 (PE) 中,這個檔案會根據並擴充已發佈的 Microsoft PE,以及記錄上供可執行檔內容使用的通用物件檔案格式 (COFF)。這個檔案格式 (適用於 MSIL 或機器碼以及中繼資料) 使作業系統能夠辨認 Common Language Runtime 影像。檔案內中繼資料的存在連同 MSIL 讓您的程式碼能夠描述它自己,意即不需要型別程式庫或介面定義語言 (IDL)。Runtime 會依需要在執行期間從檔案找出並擷取中繼資料。
首先,對於想要做出一個語言最重要的一點就是思考文法…
文法除了是一門高深的學問,還包含你這語言的目的,還有未來的擴充性,更重要的是你的創意..
因為我非常的懶,而且為了不在Blog 中來解釋對於或是煩惱對於"文法" 上面的思考以及驗證..
所以我是利用現有的一個語言XML 來進行改造以及規格驗證…
驗證Lia Language 的DTD (LiaFormat.dtd)
<!ELEMENT Lia (print|printline)*> <!ELEMENT print (#PCDATA)> <!ELEMENT printline (#PCDATA)>
如果你對DTD 不熟,簡單的說他是一種用來規範XML 的文件,上述的意思是說 我這一份DTD 文件規範某一份XML文檔 在Lia Element 中只能出現 print 還有printline
當然對於一個語言太少了,不過這只是先從一個語言的一開始Hello World 開始.
再來我 就來看看一個已經寫好的 符合Lia 語言規範的語法
sample.lia :
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE Lia SYSTEM "LiaFormat.dtd"> <Lia> <printline>Hello World !!</printline> <print>測試不換行A</print> <print>B</print> <printline>C</printline> <printline>程式結束</printline> </Lia>
所以預想執行的結果應該是會長這樣:
參考文章:
http://msdn.microsoft.com/zh-tw/library/ddk909ch(v=vs.80).aspx
http://msdn.microsoft.com/zh-tw/library/ht8ecch6(v=vs.80).aspx
http://msdn.microsoft.com/en-us/library/8zwdfdeh.aspx