如何去學習程序員的三大浪漫,編譯原理,圖形學,操作系統?

目前大二,學了點編譯原理,入了操作系統門,圖形學一點不懂....但對這些很有興趣,求點指點,學習規劃和書籍列表?


書給多了你也就迷惑了.

我給一個基本建議, 不要用c/cpp/java這些語言來寫. 用python/ruby/racket隨你願

個人覺得那幾本書特別是編譯器的書很有可能嚴重打擊你的士氣, 因為它們都有嚴重的毛病

就像這樣

(漢化了一下...)

所以可以走easy mode, 比如

編譯器你可以...

  1. 先實現lisp語法的解釋器(以後你可以拿這個金手指找別人約架...)

  2. 把它編譯成一個棧式虛擬機代碼
  3. 轉換到彙編或者直接用虛擬機跑就隨意了

圖形學你可以...

放棄, 最後再弄

操作系統你可以...

  1. 先&<操作系統概念/現代操作系統/FreeBSD操作系統設計與實現&>隨便看一本, 理解概念就行
  2. 再去github上抓一個小操作系統來玩, 也就1萬行代碼不到, 就ok了

然後你別忘了...

計 算 機 網 絡, 一個完整的tcp/ip協議棧不過3-5萬行代碼, 如果你做完了上面的事情, 寫個協議棧也就是3-5個月的光景

如果你們學校用銳捷/3com認證網路

如果你們學校限制客戶端數量

如果你們學校限制客戶端操作系統

如果你們學校限制上網時長

如果....

那你就有救了, 一網在手, 天下你有. (但是的但是千萬別專門當寫網路程序的程序員, 非 常 無 聊(當然說不定你也許會喜歡什麼的...))

(在你覺得空虛無聊寂寞冷的時候, 可以看看SICP, 我認為它是軟體工程的精華所在

(moreover, 在Lambda the Ultimate上可以學到很多PL知識

最後, 要當一個好程序員, 一定要好好看看&<代碼大全&>和這個網站The Pragmatic Bookshelf

上的書


編譯原理,什麼所謂龍書虎書我都嘗試讀過,不過鄙人才疏學淺,都讀不下去,唯有:

Compiler Construction: Principles and Practice: Kenneth C. Louden: 9780534939724: Amazon.com: Books

這本書還算是讀完了。而且作者比較敬業,直接問問題基本兩天之內都能得到回答。

操作系統,聽說有基本講原理不錯的,還聽說有個專事教育的系統叫 Minix。不過還是 Understanding the Linux Kernel 讀起來感覺不錯。後來學 Lua 的時候知道了一個名詞,叫 no-drill。


編譯原理:

龍書/虎書(二選一

Parsing Techniques

鯨書

garbage collection -- automatic memory management

圖形學:

PBRT

刷siggraph論文

操作系統:

現代操作系統。封面上有很多小動物的,邊框是黑色的,是我們的課本。機械工業出版社的。

==============================

題外話,這些書的一個共同點是,要麼出版太久,要麼沒人買所以沒音多少本,總之都很難買到,題主還是靠電子版吧。龍書除外,最近大火

題外話2,如果從知識的掌握出發的話,學習如何實現一個關係式資料庫(RDBMS——嗯,不是學習如何使用它),你至少可以同時湊齊編譯原理、操作系統以及如何寫出一手健壯的程序三個技能。強烈推薦。


艾倫·圖靈勇於提出了機器能否思考的疑問。而他對於這個問題的理解和回答,卻超出了已有認知體系的分類。——安德魯·霍奇斯 (《圖靈傳:謎團》的作者)

演算法=程序=圖靈機 圖靈機可以表示為問題解決器,語言識別器,整數值函數計算器。

我不求深刻,只求簡單。三毛

我們在工作中能做的就是將複雜的事情簡單化,話說,有些人恰喜歡反其道而行。

在科學中,我們不能直接去解決某個大的理論問題,必須從簡單而又堅固的基礎開始。你必須先理解簡單的東西,簡單的東西往往有很大的理解空間,你需要確認自己的理解是否正確。Jessica Coon 電影《降臨》語言學顧問

之所以需要這麼長的學習時間,其原因之一就是因為我們經常迷路

如果你挖掘一點歷史,也許會發現圖靈機的原型,其實是圖靈母親使用的打字機。用一台打字機來建模所有的計算,這當然是可行的,然而卻複雜不堪。 約翰 巴克斯 《程序設計能從馮諾依曼風格中解放出來嗎?程序的函數風格及其代數》

計算機科學裡關於哲學範疇的轉化:實體(對象)等價於關係,過程,實體分作兩部分:代表功能的邏輯部分和代表支持功能實現的物理部分,且邏輯擴展物理。 機器,從抽象來說,是一個對象,一個過程,一個函數,一個方法;機器從實體結構角度對應的是數據結構或者變數,而行為是過程的函數實現。演算法的數學形式化就是圖靈機。有限狀態機實現為識別正則語言的演算法。

第一章 人工智慧

自然數不僅僅表示了一個數,而且表示了集合。-羅素

作為經驗調查的計算機 科學:符號和查找 艾倫 紐厄爾和希爾伯特 西蒙

一般的科學假設符號系統的定性結構的定律:第一定律,物理符號系統假設,一個物理符號系統有對於一般智能動作的必要和充分手段

第二定律,物理符號系統藉助於帶啟發式探索的查找來解決問題。

物理符號系統  對邏輯和計算機的研究已經揭示,智能駐留在物理符號系統中,這是計算機科學最基本的定性結構定律。符號系統是模式和過程的彙集,模式最重要的性質是能指定對象、過程或其他的模式,而且,當它們指定過程時,它們可被解釋解釋意味著執行被指定的過程,後者有能力產生、破壞和修改前者。

帶啟發式探索的查找  人工智慧定性結構的第二個定律是,符號系統通過生成可能的解和測試它們來解決問題,即通過查找。通常是通過創建符號表達式以及順序修改它們直到它們滿足一個解的條件為止,來尋求解的。因此符號系統通過查找來解決問題。由於它們具有有限的資源,查找不可能畢其功於一役,而必須順序進行。它在它之後留下了從起始點到目標的單條路,或者,如果改正和後援是必要的話,留下這樣的通路的一整棵樹。

圖靈機由兩個存儲器組成:一個無界的帶和一個有限狀態的控制。帶用來存放數據,即著名的 0和1 的串。機器在帶上有一個很小的適當操作的集合讀、寫以及掃描操作。讀操作不是一個數據操作,但提供在讀頭之下作為數據函數的對控制狀態的條件轉移。眾所周知,這個模型就它們所能做的事來說,包含了所有計算機的實質,特別是,圖靈機模型在其內部包含兩種思想:一種思想是什麼是不能計算的,而另一種是萬能機器 即能做由任何機器所能做的事的計算機。

程序內存的概念,既從概念上同時也從實踐上說,程序現在可以是數據,也可像數據一樣對之進行操作。當然這個能力已經隱含在圖靈的模型當中:描述像數據一樣出現在相同的帶上。而且僅當機器擁有足夠的存儲器時這個思想才得以實現。程序內存的概念體現了解釋原理的另一半,即指出系統自己的數據可被解釋的那一部分。但它不包含奠定意義基礎的物理關係的指定的概念

表列處理,數據結構的內容現在是在物理符號系統意義下的符號:即被指定、有語問所指對象的模式。表列保持允許存取其他表列的地址,因此是表列結構的思想。

表列處理同時有三個含義:

1.它是機器中真正動態的存儲器結構的建立,從此機器被想像具有一個固定的結構。它把除替代和改變內容之外的那些構建的和修改的結構加到我們操作的整體中;

2.它是下列基本抽象的一個早期演示,即一台計算機由數據類型和適合於這些數據類型的一組操作組成,使得計算系統獨立於奠基的機器,使用適合於應用的無論什麼樣的數據類型;

3.表列處理產生一個指定模型,因此在我們今天使用計算機科學的這個概念的意義下,它定義符號處理。表列處理的概念作為一個抽象建立了一個新的世界,在這個世界中,指定和動態符號結構是定義的特徵。

知道了物理符號系統提供了智能動作的矩陣,並沒有告訴我們,它們是如何實現這一點的。帶啟發式探索查找假設  把對問題的解表示為符號結構。物理符號系統通過查找實施它在問題求解中的智能,即通過查找和逐漸地修改符號結構直到產生一個解結構為止來實施它的智能.

記憶理論 表述一個問題是來指定(1) 對一類符號結構(問題的解)的測定。( 2)符號結構(可能的解)的一個生成程序。求解一個問題是使用(2)生成滿足的測試的一個結構。在可以成為一個問題的動作生成程序之前,必定有一個問題空間:符號結構的空間,其中可以表示包括初始情況和目標情況的問題情況。

動作生成程序是為把問題空間中的一個情況修改成另一個情況的過程。物理符號系統的基本特徵保證,它們能表示問題空間且具有動作生成程序。從問題空間抽取信息考慮一組符號結構,它的某些小的子集是一個給定問題的解進一步假設,這些解隨機地分布於整個集合中。

計算機程序的構造和解釋》就是為這兩篇文章的思想寫註解

《作為經驗調查的計算機 科學:符號和查找 》艾倫 紐厄爾和希爾伯特 西蒙

《程序設計能從馮諾依曼風格中解放出來嗎?程序的函數風格及其代數》約翰 巴克斯

第二章 總論

Bad programmers worry about the code. Good programmers worry about data structures and their relationships.--------------Linus Torvalds

計算機編程的本質就是控制複雜度。– Brian Kernighan

知識和經驗是關鍵基礎,數據是依據,工具是利用知識處理數據的手段,工具永遠都是知識技能的一層包裝。 經驗的欠缺可以被知識和工具所彌補。

計算機科學分為三門:系統 計算 信息 其實這三門就大致對應三本書《深入理解計算機系統》,《計算機程序構造和解釋》,《演算法導論》

計算機學科學習路徑:基元-系統-設計-新抽象

《深入理解計算機系統》困難在於體系結構和操作系統的大量交叉組合,系統本就是軟硬體的交互作用後的邏輯:

計算機體系結構(硬體)操作系統網路

彙編語言 C語言 編譯原理

圖靈機模型是計算機體系結構(硬體)和所有程序的抽象,等價於物理符號系統。

操作系統擴展指令集並管理計算機的資源,但它的靈魂是看不見的哲學。web操作系統的邏輯與普通操作系統相同。

奠定每個程序設計語言基礎的是其程序控制計算系統的模型。某些方法是純粹的抽象,某些通過硬體來表現,其他則通過編譯或解釋程序。

編譯器基於高級編程語言的原則,目標機器的指令集和操作系統遵循的規則,經過一系列階段產生機器代碼。

資料庫系統可以等價於是完整的應用程序-編譯器-操作系統模式;還可以看做是客戶端(JavaScript的DOM對象)和伺服器端 。

計算機是計算的核心如果沒有計算機,今天的大多數計算機科學只是理論數學的分支。

用一組基本指令來編製一個計算機程序,非常類似於從一組公理來構成一個數學證明。高德納

計算機科學就是這樣一門科學:它相信所有問題都可以通過增加一個間接層來解決。

體系結構角度:計算機設計成一系列層,每層建立在它的前一層上,由不同對象和操作表示不同的抽象機,用這種方式設計和分析計算機,每層數據類型 操作 和特性構成了該層的體系結構。

在不關心底層的硬體實現的時候,將這個物理設備當做會以合適方式響應軟體發出命令的抽象設備。

第三章 操作系統

操作系統最後的目標是類UNIX,而編程語言最後的目標是LISP。

人類的知識分為兩種,古典的認知和浪漫的認知,大致可以理解為理科生和文科生。「古典的思想往往依賴於理性和法則。雖然騎摩托車旅行是一件很浪漫的事情,但是要維修、保養摩托車卻全然是古典的行為。《禪與摩托車維修藝術》

我不理解操作系統的設計和實現為什麼會比編譯程序的設計和實現困難得多。這就是為什麼我在後來的研究中致力於並行程序設計和語言構造的問題,它們將有助於操作系統的清晰結構諸如監控器和通信進程這樣的構造 霍爾

讀專業書要有一種健康的懷疑態度。Bjarne Stroustrup

操作系統擴展指令集並管理計算機的資源,web操作系統的邏輯與普通操作系統相同 。

操作系統是從具體的Unix開始,並以UNIX的良好的抽象和統一性為最終目標的:微軟Windows和蘋果Mac最終進化的目標都是在核心抽象層面的基本概念與Unix操作系統中難以區分。

Linux操作系統的誕生、發展和成長過程依賴於以下五個重要支柱:UNIX操作系統、MINIX操作系統、GNU計劃、POSIX標準,Internet,

過去讀書《操作系統》,書都是先原理,然後就沒有了然後,而且原理闡述是特別的笨重和繁瑣,不得要領。

學習計算機操作系統關鍵在於需要一種系統思維方式藉助概念(抽象)建立簡單模型,理解和想像複雜系統的過程與機制。

操作系統提供的核心概念進程提供兩個抽象機制:虛擬內存(內存管理實現)和虛擬處理器(進程調度器實現)。進程調度器實現:調度器的實體結構-數據結構,行為對於函數 。

後來讀《Unix編程藝術》有所頓悟Unix操作系統就是玩出來,怎麼爽就怎麼來,理解到這一點離完全理解操作系統思想就不遠了。

研究有兩部分:一個是硬知識邏輯抽象,另一個是軟部分:文化藝術歷史。後一部分,很多時候對於做事成功的心理影響更重要。

其次,作為最複雜的三個軟體系統(操作系統編譯器,資料庫)之一,不能用抽象和邏輯科學描述,只能用更高層次的審美理念和哲學來描述它的根源和組織思想。操作系統的靈魂是看不見的知識:簡單,清晰,統一性

UNIX統一性來自:一切皆文本化,文件模型和在此基礎上的管道概念

在unix系統中的絕妙的想法就是對外設I/O的處理 它並沒有使用特殊的系統常式,而是提供一個作/dev/mt0文件,在內核內部,對該事件的引用轉變成訪問磁帶的硬體命令, 所以如果一個進程讀/dev/mt0,安裝在驅動器上的磁帶的內容就被返回。把磁帶內容複製到一個稱作junk的文件中,CPU並沒有意識到文件有什麼不同,它只是一個文件-一個位元組序列。(解釋了為什麼介紹Unix的時候文件這個抽象都會放置在最先講解,實在是因為它是統一性的基礎)

操作系統作為控制機構在兩方面獨特:操作系統功能的實現與普通的計算機軟體相同,也就是由處理器執行的程序;操作系統經常放棄控制權,並依賴處理器的啟用而重新獲得控制權。

批處理系統中的監控程序(中斷處理 設備驅動程序,作業排序,控制語言解釋)構造了自動作業序列,但是處理器經常空閑。

多道程序設計是從處理器角度出發,讓多個程序同時裝入主存,處理器在多個程序切換,多道程序的關鍵是調度。

存儲器管理,交換是I/O,替換I/O的分頁導致虛擬存儲器。

好的操作系統和語言的設計思想是將計算機體系結構和計算機程序設計語言及操作系統編譯程序等系統軟體和支撐環境統一整體加以考慮,以集成方式設計和開發。

對於程序映射為計算機內存和操作具有基本和實際的理解,你將會把握高層次的主題時遇到的問題:數據結構和演算法,及操作系統。

要實現控制,我們都要拉上幾根導線作為控制線。但自從數據通信介入後,我們就可以用數據通信的方法來實現控制。而所謂電力線載波技術,其實就是利用電力線作為信息交換的介質來實現控制而已。

操作系統如何控制硬碟:類似於網路的分層結構,Linux系統中對於磁碟的一次讀請求在核心空間中所要經歷的層次模型。看出:對於磁碟的一次讀請求,首先經過虛擬文件系統層,其次是具體的文件系統層。接下是Cache層、通用塊層、I/O調度層、塊設備驅動層,最後是物理塊設備層 。

文件系統是操作系統的一個組成部分,它能夠讓硬碟、CD 和DVD、移動存儲設備, 以及其他各種存儲器等物理存儲媒體,變成看起來像是由文件和文件夾組成的層次結 構。

我們常說計算機有邏輯組織和物理實現兩大概念,文件系統就是這兩大概念的集 中體現。文件系統能夠在各種不同的設備上組織和存儲信息,但操作系統則為所有這 些設備都提供相同的介面。

互聯網有很多協議,其中最基礎的有兩個,一是互聯網協議(Internet Procotol,IP),定 義了單個包的格式和傳輸方式,二是傳輸控制協議(Transmission Control Protocol,TCP), 定義了IP 包如何組合成數據流以及如何連接到服務。兩者合起來起就叫TCP/IP。

高層協議的共同之處,就是它們規定的都是如何在計算機程序之間搬 運信息,即把互聯網作為一個傻瓜網路,從一台計算機到另一台高效地複製位元組流, 但不去解釋或處理這些數據。這是互聯網的重要特性:從數據原樣傳送的意義來講, 互聯網就是個「傻瓜」。說得不那麼難聽點(同時也是端對端原理):連同收發數據的 程序在內的各個端點是智能的。與此相反的是傳統的電話網路,其所有智能都體現在 網路上;而端點設備,比如老式電話機,真的是傻瓜,除了連接到網路上傳遞聲音之 外,什麼多餘的功能都沒有。

如果壓縮是去除冗餘信息的過程,那麼錯誤檢測和校正就是加入精心控制的冗餘信息 以便檢測錯誤甚至修正錯誤的過程。

單獨的程序只能完成簡單的工作,然而,在與其他程序結合起來使用時,它們就成為通用有效的工具。這就是學習編程最為困難的原點和核心:系統的能力更多來自程序之間的關係,而不是程序本身。操作系統難在它和體系結構及應用程序關聯上。

庫函數和系統調用的關係 :一系列動作。從用戶程序到系統調用到設備驅動是多層次和多種程序同時的調用和通信

select()poll()事件驅動模型的關鍵系統調用函數。

程序訪問變數和對象的機器級編程的實現和控制是彙編語言和存儲器的定址技術;

變數就是內存,c的對象管理其實是內存管理抽象,換句話說,c語言的很多附加語言特性都是面向內存的;

Java內存模型理解為在特定操作協議下,對特定的內存或高速緩存進行讀寫訪問的過程抽象,內存模型本身一般是圍繞著過程中原子性,可見性,有序性這三個特徵建立的。

第四章 編譯器

我寧願寫程序來幫助我寫程序,而不願寫程序 《程序設計的範例》羅伯特弗洛伊德

所有語言具有普適的基本深層結構,各種語言只不過是把這一深層結構規劃成特定的不同樣式。喬姆斯基

事件的概率表示了一次試驗某一個結果發生的可能性大小。若要全面了解試驗,則必須知道試驗的全部可能結果及各種可能結果發生的概率,即必須知道隨機試驗的概率分布(probability distribution)。

為了深入研究隨機實驗,我們先引入隨機變數的概念。引入隨機變數的概念後,對隨機試驗的概率分布的研究就轉為對隨機變數概率分布的研究了。

實驗是過程,變數即狀態也就是內存或者寄存器。隨機變數就是編碼 《概率論基礎 李賢平》

編譯器基於高級編程語言的文法,目標機器的指令集和操作系統遵循的規則,經過一系列階段產生機器代碼。編譯器的科學理論:自動機原理,它使編譯器結構合理。 圖靈機, 遞歸函數, λ演算 ,命題和謂詞邏輯演算,文法 語言和自動機 五種理論計算模型等價 。正則語言(有限自動機)詞法分析;上下文無關(下推自動機)語法分析;圖靈機,語義分析。

奠定每個程序設計語言基礎的是其程序控制計算系統的模型。某些方法是純粹的抽象,某些通過硬體來表現,其他則通過編譯或解釋程序。

聲明性語言---顯式操作---命令性語言---完備化(圖靈機=解釋器)-----複雜的數據結構------Perl,python,Java

FORTRAN、COBOL 和BASIC 獲得成功的部分原因,是它們都專註於某個特定的領 域,而且有意避免大而全的定位。20 世紀70 年代,出現了專門為「系統編程」開發 的語言。所謂系統編程,就是編寫彙編器、編譯器、編程工具乃至操作系統等程序員 使用的工具。迄今為止,這些語言中最成功的是C 。

在其最簡單的形式下,馮諾依曼計算機有三個部分:一個中央處理部件CPU、一個存儲器以及可以在和存儲器之間傳送一個字,並向存儲傳送一個地址的連接管。我建議把這個管稱為馮諾依曼瓶頸。

程序的任務是以某種重要方式改變存儲的內容。程序設計基本上是通過馮諾依曼瓶頸來計劃和實現大量字的交通的細節策劃,而且這個交通的許多部分不僅涉及重要的數據本身,而且還涉及在哪裡找到它。

馮諾依曼程序設計語言使用變數來模擬計算機的存儲單元;控制語句精心完成它的跳轉和測試指令;而賦值語句模擬它的取、存和算術運算。賦值語句是程序設計語言的馮 諾依曼瓶頸,而且使我們以和計算機的瓶頸同樣的方式來想像一次一字的項

一次一個字的馮 諾依曼程序設計風格得出,它要求字來回地在狀態中流動,就像通過馮 諾依曼瓶頸流動一樣。因此馮 諾依曼語言必須有同這個狀態緊密耦合的一個語義。在這個狀態下,一個計算的每個細節改變這個狀態。這個語義同狀態緊密耦合的結果是,每個特徵的每個細節必須被構造到狀態及其轉換規則中.

馮諾依曼語言也把程序設計分成為一個表達式世界和一個語句世界。其中第一個世界是一個有序的世界,而第二個世界是無序的世界,是結構程序設計已經稍微簡化了的世界,但是並沒有解決把本身分開和傳統語言一次一字風格的問題

證明一個程序的正確性要求在數學和邏輯方面有中等深度的知識:關於完全偏序集、連續函數、函數的最小不動點、一階謂詞演算、謂詞轉換、最弱的前提條件等的性質。

機器級編程兩種抽象:

第一種ISA(處理器)是機器級程序的格式和行為,定義為指令集體系結構,它定義了處理器狀態,指令的格式,以及每條指令對狀態的影響;

第二種抽象是(內存)虛擬地址,機器級程序看上去就是一個非常大的位元組數組,這個抽象是由操作系統和體系結構共同作用提供的。計算機內存看做數組,數組實現指針和對象,而指針和對象實現鏈表結構 。

用彙編語言編程的時候,必須要從CPU的角度來考慮問題,對CPU來說,系統中的所有存儲器中的存儲單元都處於一個統一的邏輯存儲器中,它的容量受CPU定址能力的限制,這個邏輯存儲器就是我們所說的內存地址空間。

彙編程序員 CPU中的主要部件是寄存器 。寄存器是CPU中程序員可以用指令讀寫的部件,程序員通過改變各種寄存器中的內容來實現對CPU的控制

C語言的本質就是高級的彙編語言----抽象,指針特別要思考計算機內存的工作原理 .C語言說到底是一門以內存為中心的編程語言。

C/C++語言可以看做變數,函數定義,函數調用的集合。 程序的層次性:語句,函數,文件。語句能夠通過創建和操作變數、對變數賦值並控制這些操作的執行流程來描述運算。語句通常會被組織成代碼段,即花括弧中的一系列語句。

程序就是由一系列聲明、賦值、條件、循環、調用和返回語句組成的。一般來說代碼的結構都是嵌套的:一個條件語句或循環語句的代碼段中也能包含條件語句或是循環語句。

C語言在某種意義上都是一種數據類型,也就是說,是數值集合(內置類型或其他類型)及其相關操作 (函數)的一個列表。

C語言操縱數據的方式:內置類型,結構體,間接操縱數據的方式指針(是對內存中對象的引用,實現為一個機器地址,指針結構化數據),C語言中實現對數據進行新操作機制就是新函數定義-定義與聲明分開。數組適合訪問,而表適合操縱。

鏈接與C指針之間的對應關係是:鏈接是抽象,而指針是一種具體表示。指針為鏈表的抽象概念提供了一種直接而又便利的具體實現途徑,但是鏈表的抽象解決的核心價值並不依賴任何特定的實現,也就是說,我們可以用數組索引而不是指針實現鏈表。

編程語言越來越多,升級越來越快,但是,總體都是語法變得越來越簡單,語義越來越豐富。任何現代程序語言都是脫胎於Smalltalk和LISP。任何語言都可以用LISP實現。 保羅·格雷厄姆

有了數據抽象,程序處理數據就不再是單純的數值或文字這樣概念的東西,而變成了人腦容易想像的具體的事物,而代碼的「抽象化」則是把想像過程具體化了。這種智能數據可以模擬現實世界的實體,被稱作對象,面向對象變成也由此得名。

所有應用程序的開發過程都可以說是設計語言的過程-Dave Thomas

從這個觀點開看,開發應用程序就是針對應用程序的問題領域定義各種辭彙,最後用這些辭彙來描述解決問題的方法。利用原有語言(LISP PYTHON)方法調用和塊定義應用程序的辭彙。

STL庫本身是一個《設計模式》與演算法和數據結構的體系 。任何特定的數據結構就是為了實現特定的演算法。演算法和數據結構是理解標準庫的基礎。

對使用傳統語言的程序設計專家們的研究表明,其知識和經驗並非是簡單地圍繞語法來 組織的,而是圍繞著諸如演算法、數據結構、習慣用語.和滿足某特定目標的計劃等更大的概念結構來組織的。

設計模式》使你可以在比設計表示或編程語言更高的抽象級別上談論一個系統,從而降低了其複雜度。

人們在學習面向對象編程時常常抱怨系統中繼承的使用令人費解以及難於理解控制流程。這在很大程度上是由於他們未能理解該系統中的設計模式。

學習這些設計模式將有助於你理解已有的面向對象系統。 《設計模式》就是人肉編譯器。

設計模式是程序抽象化的延伸:從軟體設計進化的觀點看設計模式,設計模式看做軟體抽象化的新工具。

數據構造抽象是抽象數據類型,再次抽象共同部分就是繼承,但是繼承僅僅是單一類共同部分抽象化,而面向對象的系統很少是單一類實現,幾乎所有都是由很多類組合構成,就會有一些模式出現在各種不同的系統,模式無法用類庫來抽象,為達到再利用的目的,設計模式這種形式是最

Google大數據三篇著名論文中文版 - robert198837的專欄 - 博客頻道 - CSDN.NET

計算機科學是一個經驗的學科。被構造的每一個程序都是一個實驗。它對自然提出一個問題,而且它的行為提供對答案的提示。無論是機器還是程序都不是黑箱子,它們是已被設計出的人造物,硬體和軟體都在內,而且我們可以把它們打開並觀察其內部。可以把它們的結構同其行為關聯起來,並且從一個實驗得出多個教訓。

軟體工程實踐將程序分為三個文件:客戶-介面-實現模式,類比函數(調用-聲明-定義)

所有關於編程的哲學都是工程學通用的:模塊化,易維護,簡單勝於複雜;降低複雜度和偶聯度就是編程和工程學最大的共性

設計的真諦,就是在一些互相衝突的需求和約束條件之間尋找平衡點;程序的複雜性與各部件間可能互相作用的途徑數目有關。

對減少排錯時間能有所幫助的技術包括:好的設計、好的風格、邊界條件測試、代碼中的斷言和合理性檢查、防禦性程序設計、設計良好的界面、限制全局數據結構以及檢查工具等

科技,和它創造的所有產品一樣,就目前而言都是愚蠢到家的東西。科技唯一有意思的地方,就是你能用它來幹些什麼,而且它背後的驅動因素實際上就是人類真正的需要和興趣。三點動機依次是:生存,人在社會秩序中的位置,以及娛樂。就是這些動機驅使我們做我們正在做的事。Linus Torvalds

機械化,貫穿中國古代數學的思想是機械化,中國古代數學的特點就是構造性和機械化。中國古代數學是著重解決實際問題,它的方法是「機械」的,跟西方數學的證明不一樣,靈機一動什麼的。中國古代數學不講這個,沒有什麼靈機一動,都是死板的。這是我的發現,這是我真正讀懂了中國古代數學。――吳文俊


三大浪漫只能做其一,人之一生,只能精於一道


這只是3大本職能力而已,高等級玩家還要修三大副職能力:應用數學、電子工程、物理學


這個行業總是可以劃分為科學和工程兩個相關但基本不同的方向,你想建立系統的理論知識就多看書,否則找本經典課本看過之後,動手挨個折騰吧。

操作系統其實比較容易懂,編譯原理的話推薦 Introduction to automata theory, language and computation 吧,比較薄而且講得比較透。圖形學是個大坑。


我怎麼覺得,編碼:隱藏在計算機軟硬體後面的語言,計算機程序的構造與解釋,深入理解計算機系統這三門才是


請問這三大浪漫是誰定義的?圖形學怎麼浪漫了,沒人屌啊!


作為想當程序員的同學,學那些東西還不如趁著有空,讀讀《c++ primer》,《effective c++》,《more effective c++》,《design patterns(go4)》。當然,前提是你已經會c了。

學了操作系統原理再學編程跟學了修車再學開車一樣。


我認為體系結構、編譯原理、操作系統才算得上三大浪漫,圖形學有點勉強。


三大浪漫明明就是自製編譯器,自製操作系統,還有個自製什麼來著……(逃)


首先,推薦三本不錯的書

自己動手寫操作系統,程序員的自我修養,python源碼分析

第一本書對學習操作系統很有幫助,而不只是漂浮在一般的教材理論上。

這裡有個開源項目,http://code.google.com/p/mytos,這個是我在大學弄得。裡面也有圖形學的東西,包括了簡單的直線演算法等基本圖形演算法。

第二本書和第三本書主要是編譯原理的,或許並沒有涵蓋編譯原理的大部分東西,但是實踐會讓你提示對其探索的慾望。

圖形學的話:建議自己寫一個矢量地圖程序,可以載入某種格式的地圖(就包括了點、線、面的顯示,也包括了圖形剪裁演算法等。雖然各種平台都有這些函數,但是也可以自己動手寫一寫)。做這些東西不是很簡單,也不是一時半會兒就能完成,希望你能在大學裡沉住氣慢慢研究。


操作系統感覺是裡面最輕鬆的,想加深理解的話,安個烏邦圖再弄個Nachos。操作系統學到哪一部分就去Nachos裡面看相關的源碼,試著去修改它,比如加入進程的優先順序之類的。

呃書是用的Abraham Silberschatz的Operating System Consepts 第七版


圖形學 Milo的圖書豆列


好說是好多,就是腦容量不夠。一般人只能選一個,然後終其一生。


我表達一個觀點,可能對學習有用,就是簡化模型的觀點,這個思想下能做點操作性強的東西出來。至於如何簡化,以及模型是什麼,就看你的數學能力和抽像思維能力。模型可以從經典模型出發,往性價比高的商業領域或自己的實踐領域方向靠攏。

如果是直接看三大領域的經典的書,而不簡化模型,直接按書實踐,這樣會很艱難。


學編譯原理之前,請一定先學習可計算和自動機理論。自動機理論的書挺難懂的,我個人的學習經歷來說,學習新的學科知識,最好是去找視頻入門。可計算和自動機理論看這個視頻很不錯:萬門大學公開課——可計算理論,有限狀態自動機1 。


完成虎書中的編譯器。

實現jos操作系統。

圖形學學的很淺,不敢說。


《自己動手構造編譯系統》看看這個吧!


推薦閱讀:

為什麼所有的教科書中都不贊成手寫自底向上的語法分析器?
學好c++,是不是最好研究下其編譯器?因為感覺c++的編譯器做了很多僅從語言前端看不出的工作。?
有沒有不適合使用flex/lex作為詞法分析器的語言?

TAG:程序員 | 操作系統 | 編譯原理 | 計算機圖形學 |