如何自创一门计算机语言
生活随笔
收集整理的這篇文章主要介紹了
如何自创一门计算机语言
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
如何自創(chuàng)一門計(jì)算機(jī)語(yǔ)言
需要有基本的編譯原理常識(shí)。構(gòu)造基本的編譯原理常識(shí),一方面來(lái)自于對(duì)已有語(yǔ)言的使用經(jīng)驗(yàn),了解基本術(shù)語(yǔ)。比如用C,那么起碼知道語(yǔ)言要素包括宏、表達(dá)式、語(yǔ)句、語(yǔ)句塊、函數(shù)、指針等;還知道C語(yǔ)言有編譯、鏈接和執(zhí)行三個(gè)階段。這些基本概念對(duì)宏觀掌握學(xué)習(xí)進(jìn)程是很有必要的。另外一方面編譯原理的常識(shí),要來(lái)自圖書。比如龍書、SICP。在這一步,得知道大部分語(yǔ)言的處理都要分為詞法、語(yǔ)法、語(yǔ)義和代碼生成四個(gè)階段。每個(gè)階段,分別是做什么的。 了解具體的編譯算法。了解到什么程度,取決于使用第三方工具,還是需要自己從字符開(kāi)始處理。個(gè)人建議,喬姆斯基文法體系、(擴(kuò)展)巴克斯范式(EBNF),正則表達(dá)式,和LL(1)的遞歸下降分析法是必須要掌握的。對(duì)LL(k),LR(k)要有概念。其中,四則運(yùn)算表達(dá)式的分析是很好的練習(xí)。 對(duì)語(yǔ)法的感覺(jué)。初學(xué)者設(shè)計(jì)語(yǔ)言的難度有兩點(diǎn)。第一,不知道什么樣的語(yǔ)法/語(yǔ)義是需要的;第二,不知道設(shè)計(jì)的文法能否實(shí)現(xiàn)。如果練習(xí)過(guò)遞歸下降法,應(yīng)該已經(jīng)有了基本的感覺(jué)。這個(gè)時(shí)候可以試圖實(shí)現(xiàn)熟悉的語(yǔ)言。一些常用語(yǔ)言的Grammar Rule都是可以查到的。雖然這些語(yǔ)法,特別是C++,可能是上下文相關(guān)的所以用書上的辦法難以實(shí)現(xiàn),但是可以實(shí)現(xiàn)它的一個(gè)子集。通過(guò)這樣的練習(xí),能對(duì)掌握的分析算法能完成什么樣的工作就有了個(gè)大致的體驗(yàn)。 深入了解自己的領(lǐng)域,明確需求。是需要一個(gè)類似于自然語(yǔ)言的腳本,還是只是一個(gè)表達(dá)式。經(jīng)過(guò)3階段的訓(xùn)練已經(jīng)有了獨(dú)立撰寫語(yǔ)法的能力。可以寫一個(gè)基礎(chǔ)版本的出來(lái)。 實(shí)現(xiàn)自己的語(yǔ)言,特別是詞法和語(yǔ)法部分。這一步最好能Log出盡可能多的信息,例如詞列表并打印出分析樹。 當(dāng)有了分析樹后,就可以去做語(yǔ)義分析了。對(duì)于初學(xué)者而言,語(yǔ)言的規(guī)模要盡可能小,這樣語(yǔ)言的解釋和語(yǔ)義分析可以合為一體,不用擔(dān)心哪個(gè)部分算是代碼生成,哪個(gè)部分算是語(yǔ)義分析。所以這一步最好能把解釋器也寫出來(lái)。這一步的要求很簡(jiǎn)單,知道符號(hào)表是做什么的,學(xué)會(huì)歸納和推導(dǎo)類型,能正確的處理分支和循環(huán)語(yǔ)句(如果有的話)。 設(shè)計(jì)一門類似于ASM的VM語(yǔ)言,可以是堆棧機(jī)模型,也可以是寄存器機(jī)模型。撰寫代碼生成從語(yǔ)法樹上生成這個(gè)VM語(yǔ)言出來(lái)。并寫一個(gè)VM的執(zhí)行器。這一步看起來(lái)無(wú)從下手,實(shí)際上只要肯寫,不出一個(gè)禮拜就知道怎么做了。一開(kāi)始這個(gè)VM語(yǔ)言可以只用做整數(shù)的加減乘除就行了,以后可以慢慢加其他比較重要的特性,比如運(yùn)行棧啦、代碼地址啦,跳轉(zhuǎn)啦等等。另外,把LLVM作為目標(biāo)也是不錯(cuò)的選擇,起碼指令的解釋不用自己費(fèi)工夫了,LLVM的手冊(cè)讀起來(lái)也很容易。那個(gè)Tutorial寫的特別好。
至此,語(yǔ)言就初步建立完成了。但是因?yàn)橐婚_(kāi)始能力有限,所以設(shè)計(jì)出來(lái)的語(yǔ)言是磕磕巴巴的。這個(gè)時(shí)候可以選擇:
- 向某個(gè)現(xiàn)有的語(yǔ)言靠攏;
- 自己去了解現(xiàn)有語(yǔ)言的機(jī)制并進(jìn)行權(quán)衡。這個(gè)時(shí)候什么動(dòng)態(tài)/靜態(tài)類型,函數(shù)是first class,類和對(duì)象才是該考慮的問(wèn)題。這個(gè)時(shí)候一定要多讀、多用現(xiàn)有的語(yǔ)言。拜編譯器經(jīng)驗(yàn)所賜,會(huì)站在一個(gè)不同角度上來(lái)對(duì)待現(xiàn)有的語(yǔ)言;
- 學(xué)習(xí)Functional Programming,這對(duì)設(shè)計(jì)更好用的文法、更快的編寫和修改編譯器都有莫大的幫助。例如可以使用Combinator在C++中以類似于DSL的方式配置語(yǔ)法;
- 剩下的就是在Language領(lǐng)域無(wú)止盡的挖掘了。上下文相關(guān)的語(yǔ)法、語(yǔ)法糖的設(shè)計(jì)、運(yùn)行時(shí)的輔助機(jī)制(例如async,await這些廣義上的控制流語(yǔ)句),GC,類型推導(dǎo)和靜態(tài)分析等等。;
- 最后也是最重要的,充分理解需求,才能在諸多語(yǔ)言要素間做出取舍。
總結(jié)
以上是生活随笔為你收集整理的如何自创一门计算机语言的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2020牛客寒假算法基础集训营1-nic
- 下一篇: 工程师评测 | RK3568开发板上手测