如何自創一門計算機語言

如何自創一門計算機語言
  1. 需要有基本的編譯原理常識。構造基本的編譯原理常識,一方面來自於對已有語言的使用經驗,瞭解基本術語。比如用C,那麼起碼知道語言要素包括宏、表達式、語句、語句塊、函數、指針等;還知道C語言有編譯、鏈接和執行三個階段。這些基本概念對宏觀掌握學習進程是很有必要的。另外一方面編譯原理的常識,要來自圖書。比如龍書、SICP。在這一步,得知道大部分語言的處理都要分爲詞法、語法、語義和代碼生成四個階段。每個階段,分別是做什麼的。
  2. 瞭解具體的編譯算法。瞭解到什麼程度,取決於使用第三方工具,還是需要自己從字符開始處理。個人建議,喬姆斯基文法體系、(擴展)巴克斯範式(EBNF),正則表達式,和LL(1)的遞歸下降分析法是必須要掌握的。對LL(k),LR(k)要有概念。其中,四則運算表達式的分析是很好的練習。
  3. 對語法的感覺。初學者設計語言的難度有兩點。第一,不知道什麼樣的語法/語義是需要的;第二,不知道設計的文法能否實現。如果練習過遞歸下降法,應該已經有了基本的感覺。這個時候可以試圖實現熟悉的語言。一些常用語言的Grammar Rule都是可以查到的。雖然這些語法,特別是C++,可能是上下文相關的所以用書上的辦法難以實現,但是可以實現它的一個子集。通過這樣的練習,能對掌握的分析算法能完成什麼樣的工作就有了個大致的體驗。
  4. 深入瞭解自己的領域,明確需求。是需要一個類似於自然語言的腳本,還是隻是一個表達式。經過3階段的訓練已經有了獨立撰寫語法的能力。可以寫一個基礎版本的出來。
  5. 實現自己的語言,特別是詞法和語法部分。這一步最好能Log出盡可能多的信息,例如詞列表並打印出分析樹。
  6. 當有了分析樹後,就可以去做語義分析了。對於初學者而言,語言的規模要儘可能小,這樣語言的解釋和語義分析可以合爲一體,不用擔心哪個部分算是代碼生成,哪個部分算是語義分析。所以這一步最好能把解釋器也寫出來。這一步的要求很簡單,知道符號表是做什麼的,學會歸納和推導類型,能正確的處理分支和循環語句(如果有的話)。
  7. 設計一門類似於ASM的VM語言,可以是堆棧機模型,也可以是寄存器機模型。撰寫代碼生成從語法樹上生成這個VM語言出來。並寫一個VM的執行器。這一步看起來無從下手,實際上只要肯寫,不出一個禮拜就知道怎麼做了。一開始這個VM語言可以只用做整數的加減乘除就行了,以後可以慢慢加其他比較重要的特性,比如運行棧啦、代碼地址啦,跳轉啦等等。另外,把LLVM作爲目標也是不錯的選擇,起碼指令的解釋不用自己費工夫了,LLVM的手冊讀起來也很容易。那個Tutorial寫的特別好。
至此,語言就初步建立完成了。但是因爲一開始能力有限,所以設計出來的語言是磕磕巴巴的。這個時候可以選擇:
  • 向某個現有的語言靠攏;
  • 自己去了解現有語言的機制並進行權衡。這個時候什麼動態/靜態類型,函數是first class,類和對象纔是該考慮的問題。這個時候一定要多讀、多用現有的語言。拜編譯器經驗所賜,會站在一個不同角度上來對待現有的語言;
  • 學習Functional Programming,這對設計更好用的文法、更快的編寫和修改編譯器都有莫大的幫助。例如可以使用Combinator在C++中以類似於DSL的方式配置語法;
  • 剩下的就是在Language領域無止盡的挖掘了。上下文相關的語法、語法糖的設計、運行時的輔助機制(例如async,await這些廣義上的控制流語句),GC,類型推導和靜態分析等等。;
  • 最後也是最重要的,充分理解需求,才能在諸多語言要素間做出取捨。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章