電腦系大四學生如何在六個月的時間內完成一個編譯器?要學些什嗎?

來源:互聯網
上載者:User
已經有了完成作業系統的問題
一個大四的電腦學生如何在六個月(大概只有晚上有空)的時間內完成一個簡單的作業系統。應該要學些什嗎?
在答案裡看到很多人推薦寫編譯器,希望瞭解一下例如要寫JavaScript或Python的編譯器,需要做什麼,怎樣安排?

回複內容:

如果你不執著於主流語言的話,可以看看SICP第1、2以及第4章,看完後寫scheme解譯器。

我不推薦龍書、虎書什麼的,是因為門檻。那種偏理論的書,對於相對缺乏實踐的在校生來說,不容易理解;加上節奏比較慢,成就感來得晚,很可能爛尾。所以在這裡我姑且只提供短平快的建議。

SICP第1、2章,作為函數式及編程技法的教程,都已經很能讓人受益。
對有一定經驗的同學來說,看完第2章對閉包實現的簡單描述(2句話)後,很可能已經迫不及待的擼了一個簡單的scheme解譯器了;但是現階段你的解譯器實現,冗餘、緩慢、不支援尾調用,所以你還需要看第4章。如果你願意多想多寫的話,第4章可謂本書的精華,lazy evaluation、pattern matching、continuation、partial evaluation都能從書中得到啟發。

實現一個scheme解譯器能讓你收穫什嗎?
你對解譯器的基本原理及最佳化,都有一定感覺了。
如果一上來就閱讀lua源碼裡閉包實現,你可能會陷入各種細節,等好容易理清來龍去脈過後,卻又覺得它過於精巧。畢竟,一個準工業級項目中的關鍵設施,往往是幾經調整、高度最佳化的產物。
而如果有在scheme中,通過聊聊數行代碼,實現一個簡潔、正確的閉包的經驗,這時,再反過來看lua源碼,反組譯碼.Net位元組碼看C#的閉包實現,實在非常容易了。畢竟,先作對,再做好,這個路子往往更順利。

如果有一定執行力,那麼,1~2個月,你總應該看完書中相關內容,做出1個或多個解譯器,不至於白走這一遭了。

下面是一個可供參考的步驟:
  1. 看完SICP相關章節,用scheme寫一個scheme解譯器。由於scheme中的基本結構list,很容易用來構造抽象文法樹,加上scheme語言動態類型的特點、以及強大的模式比對,用scheme實現一個最基本的自舉解譯器,只需數十行代碼(完美的支援閉包哦)。你會發現,這個解譯器的幾個關鍵分支,正好對應lambda演算的3要素,也是SICP全書反覆強調的“基本單元”、“抽象”、“應用”三元素。
  2. 觀摩一下Peter Norvig用數十行python代碼實現一個scheme解譯器:(How to Write a (Lisp) Interpreter (in Python))。於是,你開始知道怎樣用主流語言實現解譯器了,歡迎回到地球...Norvig也介紹了一個技法,讓你的解譯器能夠支援尾遞迴。
  3. 用C/C++語言實現解譯器。第一次用非GC語言實現GC語言,你必須開始認真思考記憶體管理的問題。建議暫時不實現賦值,這樣,你的函數式語言解譯器中,將總是只有新對象引用老對象,不會出現環形引用,於是可以直接使用引用計數。
  4. 更快,更好。
    • 之前實現的解譯器,都是基於抽象文法樹的匹配,相當於OO設計模式中的visitor pattern;比起遍曆文法樹的同時進行解釋的做法,嘗試在遍曆的過程中,先產生位元組碼並儲存下來,之後只解釋執行位元組碼?你能獲得顯著的效能提高。這樣的預先處理,是一種partial evaluation。
    • 發現效能瓶頸在變數求值?你需要引入詞法定址(lexical addressing)了。這裡你一步步最佳化的話,會發現你的環境鏈,被摺疊成lua/C#那種主流形式。
    • 放棄引用計數,轉向真正的GC?mark and sweep、copying gc、mark-compact gc、generational gc?怎樣讓註冊到你環境中的c函數,其函數體中分配的臨時GC對象,總是可達?移動gc對象時,怎樣保證所有指向它的指標被修改?(尤其是棧上的指標變數)
    • 顯然,一個程式並不總能寫成尾遞迴形式,怎樣才能讓非尾遞迴程式的解釋,也不棧溢出呢?Norvig介紹的技巧不夠用了,你需要考慮實現CPS解譯器或者進行全文CPS變換;於是棧空間被移動到堆中,棧將總是只有一幀。
    • 嘗試在scheme中進行一趟預先處理,將library forms如let、let*、cond展開成基本形式?於是你開始意識到宏的威力,這是常見的data abstraction、functional abstraction之外的強力武器,syntactic abstraction。
    • 在CPS解譯器中實現call/cc?通過一趟全文CPS變換,輸出不包含call/cc的普通scheme源碼給你的DS解譯器?
    • 如果你想做得更好,還有很多很多問題需要你思考,而解決這些問題的過程,是很能讓你得到鍛煉的
JavaScript 的規範有 200 多頁(Harmony 的頁數還要翻倍),你看完 Spec 都得一個月……
做一個 lisp 方言的,在兩個方面沿著下面這兩張圖點亮圖裡的技能

不是有這本書嗎?


圖靈社區 : 圖書 : 兩周自製指令碼語言


還有這本:


圖靈社區 : 圖書 : 自製程式設計語言

畢業論文是編譯器吧?是不是很緊張?o(≧v≦)o
先說清楚,你是否確定寫一個編譯器?如果沒有想好那麼就先看看我下面推薦的文章
前期:
編譯器
看完上面的如果確定好了,那麼就進行下面的工作,既然你的時間很短暫。只有晚上有空,先學會安排時間19點(媽蛋,不要告訴我還太早了!!)開始到23點(很多學校是這個時間熄燈斷網).



基礎知識
  1. 想裸寫編譯器,除了編譯原理外還有那些資料可以參考?應該從什麼開始寫起?(用c/c++)?
  2. 開發一個 C++ 編譯器的難度有多大,痛點又在哪裡?
  3. 怎樣去寫一個編譯器(用C語言寫C語言編譯器),需要哪些知識做鋪墊,可以給一下相關網站和書籍的推薦嗎?
  4. 編譯器在硬體層面上的工作原理是什嗎?
  5. 從零開始寫個編譯器吧系列 - 平凡與非凡 - 知乎專欄

前4個是你第一個晚上需要弄明白的。4個小時,如果不懂那麼就立即去查閱資料和Google(Google ,這個不用翻)。第二晚上先不要繼續第5點的內容。從頭再看一次1-4點,看看還是否有遺漏的地方記錄。
看看4點就好好確定下來你寫一個什麼語言的編譯器,想好了就可以進行第5點了順便你需要買一個本書,不要聽他人說買龍書、虎書等,這些大作難度太大了。你就買一個本 @趙劼推薦的圖靈社區 : 圖書 : 兩周自製指令碼語言

寫一個編譯器是一個比較枯燥的事情,看到介面很不容易。歸根結底就是" 折騰";且思且珍惜從scheme這樣的lisp語言的編譯器開始寫。。而且不必完全實現,可以選取子集,gc閉包什麼的都可以不要。。

你可以先寫解譯器,再試試編譯到其他語言,再試試編譯成二進位

這個資料太多,你自己搜吧。

書嘛,我提過的一個問題,下面很多回答都很好,你自己找找看我寫過一個C的編譯器,實際上只是把C翻譯成彙編。編譯器要做好,最重要的是彙編代碼最佳化,不過新手把翻譯做出來才是首要的。

詞法簡單,可以手寫。文法可以找標準的C文法,用Bison之類的工具產生一個分析表(不過我和輪子哥類似,自己寫了個LR1的分析表產生器),剩下的也簡單了,可以產生一個AST。然後,翻譯成彙編就是遍曆AST了,我沒有處理C的所有文法,比如結構體就沒管。翻譯基本的C語言結構,雖然複雜,但並不難,如果是彙編高手,就更輕鬆了。(其實最好產生中間表示IR,再翻譯成彙編)

寫的過程中,AST節點的設計比較關鍵,要儲存很多資訊,另外符號表的設計也很重要。翻譯過程中才真真感覺到,類型是需要時時刻刻考慮的因素,同樣是加減,整形和浮點型在彙編層面差很多。另外我一直認為,課本上教的文法制導翻譯太狗血,對於文法很多的語言,得一條條改文法,所以還是老老實實地建立AST,翻譯起來才比較快樂。從C的編譯器開始寫,不要寫Python和Javascript的編譯器,特別是Javascript的編譯器。]

昨天是在手機上打的,今天來解釋一下。

Javascript和Python都不是上下文無關的語言,做起來相對難度要大一些。而C89有完整的LALR(1)相容的EBNF文法,網上也很容易搜到。

關於文法和分析方法的學習,請參見我的一個回答:

如何自創一門電腦語言?寫編譯器最簡單的方法就是直接去看別人寫的唄,題主大四當然是學過編譯原理了的,我去年年底上編譯原理課的時候就自己實現了一個,其實也就是根據別人的代碼自己思考以後寫出來,前後也就幾周的時間而已
C++實現pascal子集 也就1200行左右
duduscript/pl0 · GitHub 歡迎fork我自己是沒有寫編譯器的能力的,但我聽說,龍書,虎書,和鯨書,很不錯,你看完了,不一定能寫出來,但肯定有協助!“很多人推薦寫編譯器”,估計所謂的“很多人”有80%是裝B
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.