寫編譯器的作用?

寫編譯器對於編程能力有什麼樣的提高,有其他方法能達到相同的效果嗎


編寫編譯器,是實踐整個計算機科學知識的最佳入口,是與代碼做鬥爭的最佳戰場,是擁有上帝創造之手的最佳途徑。


寫一個能用的編譯器,當然還要加上自己做的一個指令集和虛擬機,你就可以學會但不限於下面幾種技能:

1、強大的調試能力(譬如說你用你的語言寫了個程序,出錯了,你怎麼知道是編譯器搞錯、虛擬機搞錯、還是你的腳本自己搞錯了)

2、牛逼的內存管理能力(寫虛擬機,垃圾收集內存不泄露,屌!)

3、組織大量代碼的能力

4、寫庫的能力(你開發的語言沒有容器?沒有字元串?沒有多線程?沒有IO?那有什麼用!)

5、混合語言開發的能力

6、開發高質量單元測試的能力

7、寫腳本產生Release文件夾的能力


前端可以讓你更徹底地理解一門語言。

後端可以讓你深入了解一種計算機架構。


編程的大部分工作,都是在處理字元串,也可以說是數字吧。

在我看來,編譯器最大的作用除了讓你深入了解語言機制外,就是培養了你嫻熟的處理字元串技能。

你會解析字元串,就已經和只會用庫的人大不相同了。像json yaml這些,蘋果平台直到ios5才有自帶的json庫。

web領域什麼scss之類的,例子太多。

額外的,你擁有了一個語言編譯到另一個語言的能力,這個就很實用了。web開發領域經常出個coffeescript這樣的東西就高興壞了,社區大震動。。。。其實主要因為web領域高水平程序員比較少,會做語言編語言的事情的人一抓一大把,可惜人家大多不做web開發,你想要好東西,只能等,哈哈。。。

所以操縱語言這個超能力還是很好的,起碼lv5吧,而且反正你可以開發多種超能力,是吧


實現完整的編譯工具:

從上到下可以了解語言 優化技術 指令集 體系結構 ELF/COFF/machO

從左到右可以解各種構造工具 cmake configure 測試框架

調試技能會得到很大鍛煉:比如你的編譯器編了一個JS VM,然後運行錯誤,哭吧


不是每個人(應該是,幾乎沒有人)都需要編寫發布的編譯器,但作為一個整天被編譯器女神吐槽各種 warning 和 error 的跪添屌絲,你不知道編譯器是怎麼回事,就像你永遠摸不到女神的G點 —— 多麼遺憾的一生。

技術上當然有極大的好處,搞通一遍之後估計牛逼的和 @vczh 一樣,但如果你不是專門做編譯器的話,考慮到學習的成本問題,下面是一個強大的理由:

看清自己的智商。

不信?編譯器入門級教材龍書,後面的習題幫你認清現實。

===== (more) seriously =====

Masterminds of Programming 這本書是對 27 位程序語言創造者(也就是編寫編譯器的頂級程序員)的採訪,真知灼見都溢出了:

[Bjarne/C++]

- How do you debug? Do you have any suggestion for C++ developers?

- By introspection. I study the program for so long and poke at it more or less systematically for so long that I have sufficient understanding to provide an educated guess where the bug is.

- 閣下怎麼調試?

- 我太牛了,盯著屏幕看,bug 什麼的就會自動顯形。

[Guido/Python]

- How do you test and debug your code?

- ... I』ve gotten a pretty good intuition for doing QA, but unfortunately it』s hard to explain.

- 閣下怎麼調試的?

- 跟你說不清楚,因為靠的是我牛逼的直覺。

[Tom/Basic]

- How should debugging be taught?

- One of our former students become an Apple fellow doing some very significant work for

them and then retired. Before that he worked at Dartmouth in the computer center. He

wrote a PL/1 compiler, and it』s a big thing, and he checked it, and looked at it, and so on,

but he never tested it, he never ran it until it was all done. You know, 20,000 or 30,000

lines of code, and the only test he did was to read it. Then he ran it and it worked the first

time!

- 閣下怎麼調試的?

- 我有一個學生。在開發兩三萬行的編譯器代碼中,零測試,零運行,最後完成時一次運行成功。

總之,到了一定的境界,你的大腦就成了人肉 compiler,這種感覺,估計類似洞察一切的上帝。

btw, 這本書的中文翻譯是屎。


寫完一個編譯器,可以表明你真的學懂了計算機。


這個問題都兩年了,題主寫出來編譯器了嗎

工作時候花了半年寫了一個Ruby-&>類C語言的翻譯器,當然大的翻譯器是包括多的小的翻譯器了,跟編譯器差不多吧,收穫:

1. 弄懂了一個語言的每個角落和每個用法,可以說真正明白了語言是什麼

2. 遞歸水平高了

3. 大程序測試能力提高了

4. 同時使用多種語言寫測試,寫腳本,寫翻譯,寫目標語言

5. 對變數,函數,lambda這種鬼東西的本質有了更清晰的認識

以上說的點,別的辦法還真很難做到同幅度的提高


Makefile 自己寫 ,測試自己寫,我嘞個去,學的東西很多,當然你可以寫伺服器 寫操作系統,寫標準庫,寫框架


減少語言學習阻力

掌握了2,3種語言後,然後稍微掌握點編譯原理的知識,學習其他語言過程,可自行腦補語言簡單實現機制,快速掌握語法。


了解一個系統化的大型工程如何去實現和構造才能寫出的不是翔.學習前端帶你步入程序語言設計理論.學習後端深入學習各種優化技術和演算法以及彙編技術


用處很多啊

比如學會高效管理內存

封裝底層數據

了解動態語言的實現原理

了解強類型的好處

當然最最最重要的

看哪門語言不爽你自己實現一門語言自己寫不是件很帶感的事么


可以深入了解計算機語言的核心能力,了解字元串的演算法,語法樹的構建和運算,了解複雜數據結構的使用。


嗯 寫了編譯器,再來點ASM!然後為大公司打工去~


推薦閱讀:

為什麼這麼多人喜歡寫編譯器?
為什麼那麼多前端大佬搞培訓開live?
如果想要拿到regional金,該如何制定一年計劃?
如何在職系統學習編程?
有什麼方法可以快速了解學習matlab?

TAG:編程學習 | 編譯原理 | 編譯器 |