跟我一起深入淺出學編譯

  • 2019 年 10 月 4 日
  • 筆記

眾所周知,編譯技術是電腦科學史上的明珠之一。如果說整個互聯網的發展是構建在編譯技術和程式語言之上也毫不為過。

編譯器是啥?就是一個程式,它可以閱讀某一種程式語言編寫的程式碼,並把這些源程式碼翻譯成另外一種等價的程式,也就是源程式 ——> 目標程式。如果目標程式是個可執行的機器語言程式,那就可以被用戶直接調用,產生輸入和輸出結果,比如 C 語言就是這樣編譯型語言。

解釋器呢,是另外一種語言處理器,它並不通過翻譯的方式生成目標程式,而是一邊解釋一邊執行,從用戶角度看,解釋器直接利用了用戶提供的輸入源程式去執行指定的操作。 Java 語言就是結合了編譯和解釋的過程。一個 Java 源程式首先編譯成一個成為位元組碼的中間表示形式,就是 class 或 jar,然後再交給虛擬機對得到的位元組碼加以解釋,這樣就可以實現跨平台運行這些位元組碼程式。

Python 也是半編譯半解釋的語言,Python 的解釋器還有不少版本,比如 Cpython、Jython, Pypy 等,也有位元組碼 pyc 文件。JavaScript 就是解釋型語言了。理解了這些內容,我們就會對程式語言有更透徹和清晰的理解,也更容易學習和掌握更多的程式語言,並在不同場景下發揮其最大的功效。

不過,有程式設計師可能會覺得,咱也不會去設計一門新的程式語言,有必要學習編譯原理嗎?學了有什麼用呢?

實際上,編譯原理不是用於炫耀的屠龍技,程式設計師在工作中經常會碰到需要編譯技術的場景,比如:

1、編寫介面模板引擎; 2、為項目編寫各種各樣的 DSL; 3、深度理解甚至開發出 Spring、Hibernate、阿里巴巴 Druid 這樣的工具。

除此之外,解析用戶輸入,防止程式碼注入,為前端工程師提供像 React 那樣的 DSL,像 TypeScript 那樣把一門語言翻譯成另一門語言,像 CMake 和 Maven 那樣通過配置文件來靈活工作,運維工程師分析日誌文件等等高級別的需求,都會用到編譯技術。

編譯技術,就是把高級語言的程式碼翻譯成為電腦可以理解和運行的二進位程式碼的技術。掌握了編譯技術,你可以獲得什麼能力呢?太多了,比如:

1、讓你的軟體支援公式和腳本,從而具有更強的靈活性; 2、有能力參與基礎軟體的研發,因為它們很多都會用到編譯技術,比如 Hibernate、Spring、大數據系統等等; 3、編寫特定領域語言,解決領域問題; 4、寫出高效、高質的程式碼,成為更優秀的開發者; 5、更好地理解和學習新的語言,降低學習成本,快速跟進技術潮流。

除了實踐性強,學習編譯技術對於提升程式設計師的職場競爭力也很重要。理解了底層機制,才能更深入的思考問題和解決問題。學習編譯原理,能讓你從前端的語法、程式碼優化、與硬體結合等維度,加深對電腦的理解,提升工作中解決疑難雜症的能力。

程式設計師想要保持長期的競爭力,一定是在底層知識下功夫,然後做到一通百通。也許你以後不會成為編譯器開發者,但學好編譯原理,一定會讓你終生受益。

如何深入理解並實踐編譯原理?

很多讀者回饋說,知道編譯技術的重要性,也很希望能啃下來,但總是會遇到許多問題:

1、作為底層技術,編譯原理出了名的晦澀難懂,學習完全沒有頭緒; 2、網路上的資料過於抽象和理論化,篇幅長,講解枯燥; 3、畏難情緒嚴重,學習編譯原理簡直成了心魔。 在這裡幫大家找到一個非常全面的編譯原理知識框架圖資料,能幫你更好的理解和實踐編譯原理,克服畏難情緒,這張圖出自極客時間專欄《編譯原理之美》,作者是宮文學。

這門課如何讓你認識到編譯原理之美呢

在這個課程里,作者會從前端與後端兩個層面來講解編譯原理的核心技術點,用具體的案例帶你理解抽象的原理,幫助你建立信心,克服畏難情緒,讓你在這個過程中一步步趟過雷區,在工作中真正用到編譯技術。

課程具體分為三個部分:

第一部分:實現一門腳本語言 主要聚焦編譯器前端技術,通過具體實例,帶你了解詞法分析、語法分析、語義分析的原理,實現一門腳本語言,並用工具提升效率。

第二部分:實現一門編譯型語言 主要聚焦編譯器後端技術,帶你了解如何生成目標程式碼和對程式碼進行優化,並引入 LLVM 工具,最後生成可執行的文件能支援即時編譯,並經過了多層優化。

第三部分:面向未來的程式語言 人工智慧與編譯技術結合是否會出現人工智慧編程?這個模組將對編譯技術的發展趨勢進行分析,幫你更好地把握未來技術發展的脈搏。

1 分鐘看看目錄,為了幫你更加體系化的掌握編譯器核心技能,我們將編譯原理的內容精簡到了 30 多節,但絕對乾貨滿滿,能讓你真正學懂、落地實踐編譯原理。