編譯原理是不是計算機基礎課程中最難的?


當然不是 因為它背後有很多理論的支持 比如自動機 文法等 而這些理論恰好又比較好出題 比較好實現 所以比較好變成作業 對於不熟悉的人來說看起來往往很難

而真正難得東西 比如OS 往往由於國內沒幾個老師有能力教的好 所以最後反而讓人覺得沒那麼難了


編譯原理,近年來越來越多的教材不再稱之為 theory 或者 principle,而是更直接的叫 compiler construction。所以它越來越接近一個學期的 project 而不是一門理論。這個 project 又大致包括兩個方面,俗稱前端和後端。

前端的正式名稱其實是 language recognition,工程上也稱為 parsing。這實際上是整個計算機理論的一個楔入點。比如說,比較基礎的 computation theory,也就是研究四種基本計算模型的理論,就是以 language recognition 為起始工具的。而且這個理論討論了很多有意思的東西:

  • 計算機可以用什麼方法有效地「記憶」多久的歷史?注意這裡的記憶是狀態式的,有遺忘的記憶。和數據結構不同,數據結構是無限期的記憶。
  • 計算模型的「能力 (strength)」的定量比較:LL(n), LR(n), LALR 等等。
  • 在 parsing 中利用數據結構和避免 explicit 數據結構的 trade-off。

可以說,學習 parsing 之於學些計算理論就像學習 OS kernel 之於數據結構和演算法。雖然理論並不嚴密,但是更接近 real world。非常有趣。

後端的 code generation,理論並不成熟。所以一兩本初始的教材也就是勉強讓你能寫一個功能完整的 compiler 而已。說實話,即使你不看教材,在學會 parsing 之後摸黑寫一個 target to C 的 compiler 也並不難。

Target to assemble/byte-code 這樣的沒有 branch-block 結構的 flat 語言稍微難一些。不過也僅僅是一些定勢。高級的優化技巧就是各路研究和工程 hack 的奇技淫巧了。個人推薦可以看看 Lua 的 comiler。純粹的 one-pass,沒有 explicit AST,中間的 temporary tree 都是利用 runtime stack 來構建。不強調過多優化。


我覺得網路、資料庫和編譯原理,都差不多難度……不過這還是要比演算法和數據結構難多了。設計模式這種東西要靠經驗,不能直接相比。


我覺得不是。我認為演算法才是最難的。


null


明明離散更噁心


國內985本科編譯能教的大約是半本龍書組成的前端加一個基本的後端,不難。

但是實踐的工作量大。認真做一個編譯器至少兩三萬行C++的工作量,只有半個學期的時間,壓力很大。當然,compiler的可玩性不錯,不那麼枯燥。


真的不算最難的。我想說編譯原理相比較而言,如果題主是本科生的話,了解前端應該夠了。而且聽系統的。

  1. 正則表達式
  2. 自動機 這裡龍書還插了一節kmp(既是前綴也是後綴的串記下來書上定義好簡潔)。
  3. 正則表達式轉自動機以及自動機的化簡。基本都是dfs,bfs這兩個可以搞定的的。
  4. 文法就是用來定義你程序語法的
  5. LL parser這個真的比較簡單。人肉寫個狀態機每次進入一個定義就是一個函數遞歸。比如programme -&> declear + statements; statements -&> statement + statements。只要你在函數里實現到別的函數的跳轉表就可以了。
  6. LR parser 就是根據已有的內容和來的內容從葉子向上長出一棵語法樹。
  7. 語義分析比如把中綴改後綴or直接建立樹都不難。憑YY都能YY出來。

和編譯原理相比操作系統內容更加多進程管理,內存管理,文件管理,許可權什麼的我覺得看書了解概念大概代碼長什麼樣還是YY不出來吧。更要說硬體這種課,數電的東西還少一點,模電還要了解那麼多高數。


難道不是操作系統和體系結構嗎


學到現在專業課就掛了一門信號

符號都看不懂= =|||


難道不是通信原理最難嗎


我本科事有幾門專業課考的還不錯,編譯就是其中的一門93分。考的最差的是模電和數電,都是60出頭的分數。


編譯原理我覺得不是最難的,或者是讀得很淺所以不覺得難。在計算機基礎課中最難的我覺得是操作系統,很難很重要,但是很少人會去重視,基本都是草草的上課草草的學了,不得精髓;次之演算法也很難,不止是理論,實際用用也難。


我印象比較深的是編譯原理中講到的文法類型包括了圖靈機(TM),但是課程討論的文法類型卻只在2型文法和3型文法。說到難易程度,0型文法和1型文法的實現圖靈機和線性有界自動機(LBA)自然比限制更多的下推自動機(PDA)和有限自動機(FA)更難。所以討論一門課程的難易程度要看教學要求,而不是課程所涉及的知識本身。

我們學院教授這門課程的老師分別是研究人工智慧的agent和軟體逆向工程與測試的,分別是教授(副院長)和副教授,從師資配備和層次看,這門課必然是處於較高難度層次的。不過,從課程的要求來看,這門課的難度並沒有高到哪兒去。我們的編譯原理分兩個學期,一個學期學習理論知識,從龍書的書名借用一個詞就是principles,一個學期學習techniquestools。理論學習期間只有一次期末考試和平時作業。另一個學期自己構造一個編譯程序,作為小組合作項目。在我看來理論學習和大部分課程一樣,還只是機械式地灌輸解題方法,對於更加深層次的為什麼這麼做討論甚少。雖然教材規定是龍書,講課卻是老師自己的一套,和龍書的體系完全不同。會解題和理解知識是兩個概念。從這個角度來講,編譯原理真的只是一門平常的專業基礎課了。


編譯原理中的詞法分析器,語法解析器都有很成熟的理論支撐。而代碼生成這塊還有很大的優化空間。


在幾十年前是,到現在經過幾十年的發展,很多理論已成體系,現在絕對說不上難。


剛剛上完編譯原理課回來,這幾天晚上都在學習編譯原理。感覺難度和那些都差不多,聽懂了立馬應用到後面的學習,上課時比較專註,也比較興奮。很喜歡這個老師,也喜歡這門課,很享受上這個課的感覺~想來這是大學最喜歡的一門課了。


在cmu最難的是操作系統


會者不難,難者不會~


考試的話,其實都不難,主要是每個人腦子不是對等的,就跟高中學數學一樣走的人不學,都會,所以跟腦子構造有關係,當然啦,本科生玩的考試東西能難到哪去,讓你造個編譯器才是真的難,讓你造個操作系統才是真的難,讓你實現一個tcp協議是真的難,演算法數據結構我不清楚,因為我真的翻爛了一本數據結構我也沒看明白到底怎麼從演算法到實現,逃。。。。


我讀書那陣本科課程里通過率最低的都說是《數理邏輯》。


推薦閱讀:

對比JIT和AOT,各自有什麼優點與缺點?
C++ 為什麼沒有 function 關鍵字?
如何用通俗易懂的語言解釋虛擬存儲器?
計算機語言算不算語言?
國人對於國外CS教材是否存在盲目崇拜心理?

TAG:計算機科學 | 編譯原理 |