編譯原理學了有什麼用處呢?向陽2021-09-03 10:56:32

對於大部分人:

可以完成考試

有學分

這部分人可能以自己4。0的GPA而高興,也許還會因為自己一學期都沒聽課卻沒掛科而暗自慶幸,還可能被老師搞了59分而這輩子也不想聽到這四個字。

但是,對於一小部分人:

一套形式化、高效的字串解析方法

一個能在飯後侃侃而談的話題

更清晰的理解很多事

他們很可能可以清晰地告訴你什麼是“syntax”,什麼是“grammar”,能清晰地告訴你怎麼完成解析json、表示式,甚至還能告訴你一門語言為什麼會報這個錯。在聊起程式語言時,他們總是能把話題引到編譯上面來。

不過,還對於更少的一部分人:

一個新世界

他們大機率會意識到編譯原理背後的故事,也許會沉迷在某個方向,也許還會樂於看一些奇妙的parser構建方式,大概還可能會去學習型別系統,發現形式化的故事似乎在很多方面都有對應的版本,而後,他們也許會嘗試走向研究,去挑戰目前都沒有好好解決的程式碼最佳化問題,也許會走向應用,用起LLVM,在上面加個target,支援一些新硬體,做個新語言的前端……

最後,還有很少的一部分人:

“我好菜啊…”

(光速逃

編譯原理學了有什麼用處呢?knifefire2021-09-03 12:14:10

對於我這種非計科專業的學生來說,能解惑。

當然了,只為興趣而學內容上肯定是(有所側重)/(知識零碎),比如parser,lexer壓根沒看,自動機只看過科普,看開了,反正也不考。

編譯原理學了有什麼用處呢?

編譯原理學了有什麼用處呢?yangrq2021-09-04 01:45:54

編譯原理學了有什麼用處呢?

首先明確,編譯原理是一門關於編譯器構建的學科。

如果走的是標準流程,在本科階段的編譯原理課上學習相關知識,那麼對於大部分大學中的大部分人而言,他們

僅能

瞭解到以下內容:

理論部分:

DFA, NFA和正則表示式,以及一些轉換演算法。

LL文法解析(側重於消除左遞迴的那個部分),

LR文法解析(大篇幅,非常不直觀,很多老師最愛的考點)

語義分析部分,可能會泛泛地談一下屬性文法、分析時儲存一些上下文的“符號表”和特設語法制導翻譯(會有型別檢查這一部分嗎?)。

執行時,物件模型,重複一遍體系課或C語言課的儲存組織及函式呼叫棧的組織方式,種類可能略多一點,但是還是侷限於命令式語言。可能會講講幾種GC方式。

程式碼生成 ,可能會講幾種形式的IR,以及命令式語言中常見的結構(if, while,function call & return)是如何轉換成某種四元式內容。

其餘內容,出現在教材但不知道會不會講or隨便帶過,包括但不限於:靜態分析、程式最佳化(和靜態分析耦合較強)、暫存器分配、指令選擇

實踐部分:

可能會完成下列中的任務(從難到易)

寫一個編譯器,生成native的程式碼 | 跑在自己寫的執行時裡,帶簡單的Mark-Swap GC | 寫一個靜態分析器,對某種語言做簡單的靜態分析

如1,但源語言更toy了,也完全不需要最佳化

如上,但是生成IR就夠了,不用能執行

如上,但是前端(詞語法分析)可以用parser generator

如上,只不過parsing完輸出狀態表即可

寫報告

平心而論,在學完這麼多內容之後,只不過瞭解了最最簡單的原始碼 -> 目的碼流程而已。

實踐部分能夠完全獨立自行完成1,2的同學是很少的,對於真去做編譯器/程式分析的那部分人,這些知識只是個起點;對於剩下的那部分,也派不上過多用處(但會很有啟發意義)。

編譯原理的直接用處

這些內容中,最常用的很可能是正則表示式,其次會嘗試拿parser generator去解析一些文字/DSL。Runtime部分的背景知識,GC,呼叫棧、傳參方式等內容可能會彌補一些人之前課程學習的不足,有助於你對程式執行有更深的理解乃至改善所編寫的程式碼,但也僅限於此了。

事實上,一些編譯原理存在、在當代編譯器構建中最為重要的知識則會在這門課中被跳過:

程式分析

: 巨坑之一,靜態、動態,資料流分析、模型檢查、抽象解釋等等,一方面是單純獲取資訊用以判定程式性質(常用於安全領域),另一方面是為了服務於下述最佳化。

程式最佳化

: 又是巨坑,緊密聯絡程式分析,大量基於圖的演算法,有在較高層級試圖理解你的程式碼的結構並儘量在編譯期計算出更多內容/判定性質並對你的程式做等義而代價/強度削減的變換的(過程間最佳化,資料流最佳化等一堆東西),有在較低層級試圖讓你的程式碼更符合目標機器的執行特點的(指令選擇&重排、向量化、暫存器分配之類)

離開編譯器構建這個話題,還有更寬廣的內容,比如在

theory

而不是system領域

PLT

(其實廣義上包括以上敘述的所有內容):天坑,也是“根正苗紅”的Computer

Science

的一個分支學科。除了程式分析變換的理論,還要有離數理邏輯、抽象代數更近的lambda calculus,type theory,formal semantic等又一堆巨坑。這些內容可能會與formal verification和theorem proof的內容交叉。

偏向system一點、更特化的內容也有

程式語言的執行時

:側重於工程,應用向開發中也常常涉及這方面知識,就是標準流程下的編譯原理課講得過淺以至於相當於沒學過。包括程式語言虛擬機器(直譯器,JIT,記憶體管理(GC),執行緒模型,併發模型,異常模型)相關知識。

以及,上文幾乎完全沒有提及FP語言。針對FP語言,和PLT的成果聯絡很緊密,往往有一套很不相似的分析演算法、最佳化手段、執行時系統。又是一個天坑。

編譯原理學了有什麼用處呢?有用處,但不完全有用處。

大家在編譯原理課上學到了編譯原理嗎?學到了,但沒有完全學到。

編譯原理學了有什麼用處呢?熊起2021-09-12 12:57:11

能對管理複雜度有更徹底的認識

編譯原理學了有什麼用處呢?海納2021-11-06 18:38:19

能知道編譯器幹了什麼。你要再追問,知道這個有什麼用。沒用。就是這麼簡單粗暴