
編譯器如何工作的?不知道你想過沒有。
查看代碼
這里的代碼有很大的改進(jìn)空間,甚至有一些錯誤的處理,但可以看出一些基本的思想。用js實(shí)現(xiàn)了一個初步的lisp解釋器。
參考文章
這篇文章是用一種不太熟悉的語言寫的,仔細(xì)閱讀還是可以理解作者想要表達(dá)的思想,他考慮到了初學(xué)者的局限,里面的推薦書籍很不錯。
學(xué)習(xí)函數(shù)式程序設(shè)計真的有很多好處(逼格),帶來了一些思想(胡思亂想),會想到以前沒注意的地方(如各個系統(tǒng)的報錯信息)。會思考程序的運(yùn)行情況(讓代碼容易調(diào)試),會經(jīng)常重構(gòu)代碼(這個可能和經(jīng)驗(yàn)有關(guān)),慢慢理解語言的類型信息(這個也可能和看的書籍有關(guān))。總之,你懂的。
學(xué)習(xí)編譯原理的主要一個方面,是想理解為什么我的語言不能這么做,我怎么才能實(shí)現(xiàn)這些功能。另一方面,由于工作的關(guān)系,我已經(jīng)用過四五種編程語言了,它們語法不一,有時候很累的。我不想再羨慕別人學(xué)過某些神奇的語言了。
到處都寫到"解釋器的主要過程: 解析語言>生成中間表示>最后產(chǎn)生輸出"。但是具體如何?不打開箱子,怎么能心甘。做為非科班出身,去實(shí)現(xiàn)一些經(jīng)典程序,補(bǔ)習(xí)基礎(chǔ)理論當(dāng)然是很有必要的。
希望自己盡快實(shí)現(xiàn)一些有價值的東西,整天做著別人設(shè)計的模塊,感覺是在混工資呀。如果我熟悉某種語言,那么我可以表達(dá)一些我的想法。如果暫時沒有想法,看看別人在做什么應(yīng)該是不錯的。
如果對js不熟悉,對函數(shù)式不熟悉。不用怕,我推薦一篇Java寫的四則運(yùn)算解析和簡單json解析的文章。 ? 如果對這些沒有興趣,你喜歡操作XML,那么我要送出一篇XML解析相關(guān)的。
當(dāng)你看不懂上面的文章,也許你基礎(chǔ)不夠好或者工作內(nèi)容的關(guān)系沒有接觸到一些預(yù)備知識,需要我的另外一篇文章 補(bǔ)充一下數(shù)據(jù)類型基的文章。
鄭重說明,大多數(shù)人是愚蠢的,包括我自己。很多知識是網(wǎng)上或書上看來的記憶碎片,畢竟沒有原創(chuàng)的東西。寫文章的原因,整天抄代碼,抄文章來體驗(yàn)一把(看看寫作有什么不同,我以前作文都是低分)。
寫代碼只能在特定條件下,運(yùn)行結(jié)果不出錯誤。文章肯定只能引起少數(shù)人的共鳴,但是哪怕一個人也是值得的。
最近在多看閱讀里面看了一些技術(shù)書,當(dāng)然大多數(shù)看不懂,只好安慰自己道懂一點(diǎn)也好。前段時間閱讀了幾本投資類書籍,那里的作家用完全不同的思維和詞匯,關(guān)心完全不同的問題。我們很多時候都忘了自己想要做的事情,跳出一個領(lǐng)域然后再回來,也許會有所不同。
對于一般的語法形式,如Pascal之類需要一定的語法解析步驟,首先做詞法分析再做語法分享,才能生成想要的程序結(jié)構(gòu)(lexer->parser->ast)。這個過程可以手寫,或者利用工具,由于語法多變復(fù)雜,實(shí)現(xiàn)起來有一定的難度。核心的當(dāng)然是根據(jù)程序結(jié)構(gòu)做處理,如if語句,function定義語句,很多人是到不了這一步的,反而錯過了很多重要的東西。接下來,樹的遍歷,需要一些基本算法支持,加上錯誤處理,高級的還有優(yōu)化,就會變得很復(fù)雜。
只有簡化問題,才能得到一點(diǎn)點(diǎn)答案。參考的文章里面用的是s表達(dá)式這種數(shù)據(jù)結(jié)構(gòu)(e1 e2),類似于線性表,以后看程序的時候希望能看到結(jié)構(gòu),而不是字符串。