preface review

This commit is contained in:
chai2010 2015-12-21 22:08:15 +08:00
parent 1f54ac4fbf
commit ff5bc7603a
5 changed files with 47 additions and 66 deletions

View File

@ -1,20 +1,19 @@
## Go語言起源 ## Go語言起源
就像生物物種, 一個成功的編程語言的後代一般都會繼承它們祖先的優點; 當然有時多種語言混合也會産生令人驚訝的特性; 還有一些激進的新特性可能併沒有先例. 我們可以通過觀察語言的和環境是如何相互促進和影響的演化過程而學到很多. 編程語言的演化就像生物物種的演化類似,一個成功的編程語言的後代一般都會繼承它們祖先的優點;當然有時多種語言雜合也可能會産生令人驚訝的特性;還有一些激進的新特性可能併沒有先例。我們可以通過觀察編程語言和軟硬件環境是如何相互促進、相互影響的演化過程而學到很多。
下圖展示了最早期的編程語言對Go語言設計産生的重要影響. 下圖展示了有哪些早期的編程語言對Go語言的設計産生了重要影響。
![](../images/ch0-01.png) ![](../images/ch0-01.png)
Go有時候被描述爲"C類似語言", 或者是"21世紀的C語言". Go從C語言繼承了相似的表達式語法, 控製流結構, 基礎數據類型, 調用參數傳值, 指針等很多思想, 還有C語言一直看中的編譯後機器碼的運行效率以及和現有操作繫統的無縫的適配. Go語言有時候被描述爲“C類似語言”或者是“21世紀的C語言”。Go從C語言繼承了相似的表達式語法、控製流結構、基礎數據類型、調用參數傳值、指針等很多思想還有C語言一直所看中的編譯後機器碼的運行效率以及和現有操作繫統的無縫適配。
但是在Go語言家的族樹中還有其他的祖先. 其中一個有影響的分支來自Niklaus Wirth設計的Pascal語言. Modula-2 激發了包的概念. Oberon 摒棄了模塊接口文件和模塊實現文件之間的區别. Oberon-2 影響了的包的導入和聲明的語法, 還有 面向對象 Oberon 所提供的方法的聲明語法等. 但是在Go語言的家族樹中還有其它的祖先。其中一個有影響力的分支來自Niklaus Wirth所設計的Pascal語言。然後Modula-2語言激發了包的概念。然後Oberon語言 摒棄了模塊接口文件和模塊實現文件之間的區别。第二代的Oberon-2語言直接影響了包的導入和聲明的語法還有Oberon語言的面向對象特性所提供的方法的聲明語法等。
Go的另一支祖先, 也是Go區别其他語言的重要特性, 靈感來自貝爾實驗室的Tony Hoare的1978年發表的鮮爲外界所知的關於併發研究的基礎文獻communicating sequential processes (CSP). 在CSP中, 程序是一組中間沒有共享狀態的平行的處理過程, 它們使用管道進行通信和同步. 不過Tony Hoare的CSP隻是一個用於描述併發性基本概念的描述語言, 併不是一個編寫可執行程序的編程語言. Go語言的另一支祖先帶來了Go語言區别其他語言的重要特性靈感來自於貝爾實驗室的Tony Hoare於1978年發表的鮮爲外界所知的關於併發研究的基礎文獻 *順序通信進程* communicating sequential processes縮寫爲CSP。在CSP中程序是一組中間沒有共享狀態的平行運行的處理過程它們之間使用管道進行通信和控製同步。不過Tony Hoare的CSP隻是一個用於描述併發性基本概念的描述語言併不是一個可以編寫可執行程序的通用編程語言。
Rob Pike和其他人開始嚐試將CSP引入實際的編程語言中. 第一個語言叫Squeak(老鼠間交流的語言), 一個提供鼠標和鍵盤事件處理的語言, 它的管道是靜態創建的. 然後是Newsqueak, 提供了類似C語言語句和表達式的的語法和Pascal的類似推導語法. 它是一個帶垃圾迴收的純函數式語言, 再此針對管理鍵盤, 鼠標和窗口事件管理. 但是Newsqueak中管道是動態創建的, 屬於第一類值, 可以保存到變量中. 接下來Rob Pike和其他人開始不斷嚐試將CSP引入實際的編程語言中。他們第一次嚐試引入CSP特性的編程語言叫Squeak老鼠間交流的語言是一個提供鼠標和鍵盤事件處理的編程語言它的管道是靜態創建的。然後是改進版的Newsqueak語言提供了類似C語言語句和表達式的語法和類似Pascal語言的推導語法。Newsqueak是一個帶垃圾迴收的純函數式語言它再次針對鍵盤、鼠標和窗口事件管理。但是在Newsqueak語言中管道是動態創建的屬於第一類值, 可以保存到變量中。
在Plan9操作繫統中, 這些想法被吸收到一個叫Alef的編程語言中. Alef視圖將Newsqueak改造爲繫統編程語言, 但是因爲缺少垃圾迴收機製而導致併發處理很痛苦. 在Plan9操作繫統中這些優秀的想法被吸收到了一個叫Alef的編程語言中。Alef試圖將Newsqueak語言改造爲繫統編程語言但是因爲缺少垃圾迴收機製而導致併發編程很痛苦。
Go的其他一些特性零散地來着其他的一些語言; 比如 iota 從 APL 借鑒, 詞法作用域與嵌套函數來自 Scheme (和其他很多語言). 我們也可以從Go中發現很多創新的設計. 比如Go的切片爲動態數組提供了有效的隨機存取性能, 以及可能會讓人聯想到鏈表的底層的共享機製. Go語言的其他的一些特性零散地來自於其他一些編程語言比如iota語法是從APL語言借鑒詞法作用域與嵌套函數來自於Scheme語言和其他很多語言。當然我們也可以從Go中發現很多創新的設計。比如Go語言的切片爲動態數組提供了有效的隨機存取的性能這可能會讓人聯想到鏈表的底層的共享機製。還有Go語言新發明的defer語句。
還有Go自己發明的defer語句.

View File

@ -1,17 +1,16 @@
## Go語言項目 ## Go語言項目
所有的編程語言都反映了設計者對編程哲學的反思, 通常包括之前的語言所暴露的一些不足的地方. 所有的編程語言都反映了語言設計者對編程哲學的反思通常包括之前的語言所暴露的一些不足地方的改進。Go項目是在Google公司維護超級複雜的幾個軟件繫統遇到的一些問題的反思但是這類問題絶不是Google公司所特有的
Go項目是在Google超級複雜的幾個軟件繫統遇到的一些問題的反思(但是這個問題絶不是谷歌特有的).
正如Rob Pike所説, “複雜性是乘法級相關的”, 通過增加一個部分的複雜性來脩複問題通常將慢慢地增加其他部分的複雜性. 通過增加功能和選項和配置是脩複問題的最快的途徑, 但是這很容易忽略簡潔的內涵, 卽使從長遠來看, 簡潔依然是好的軟件關鍵因素. 正如Rob Pike所説,“軟件的複雜性是乘法級相關的”,通過增加一個部分的複雜性來脩複問題通常將慢慢地增加其他部分的複雜性。通過增加功能和選項和配置是脩複問題的最快的途徑,但是這很容易讓人忘記簡潔的內涵,卽使從長遠來看,簡潔依然是好軟件的關鍵因素。
簡潔需要在工作開始的時候減少不必要的想法, 併且在軟件的生命週期內嚴格區别好的改變或壞的改變. 通過足夠的努力, 一個好的改變可以在不破壞完整概念的前提下保持自適應, 正如 Fred Brooks 所説的 "概念完整性"; 而一個壞的改變則不能, 它們僅僅是通過膚淺的簡單的妥協來破壞設計的一致性. 隻有通過簡潔的設計, 纔能讓一個繫統保持穩定, 安全, 和持續的生長. 簡潔的設計需要在工作開始的時候舍棄不必要的想法併且在軟件的生命週期內嚴格區别好的改變或壞的改變。通過足夠的努力一個好的改變可以在不破壞原有完整概念的前提下保持自適應正如Fred Brooks所説的“概念完整性”而一個壞的改變則不能達到這個效果它們僅僅是通過膚淺的和簡單的妥協來破壞原有設計的一致性。隻有通過簡潔的設計纔能讓一個繫統保持穩定、安全和持續的進化。
Go項目包括語言本身, 附帶的工具和標準庫, 最後但併非不重要的, 簡潔編程哲學的宣言. 就事後的目光來看, Go的這些地方都做的不錯: 擁有自動垃圾迴收, 一個包繫統, 函數作爲一等公民, 詞法作用域, 繫統調用接口, 隻讀的UTF8字符串. 但是Go隻有相對較少的特性, 也不太可能對添加更多. 例如, 它沒有隱式的數值轉換, 沒有構造函數和析構函數, 沒有運算符重載, 沒有默認參數, 沒有繼承, 沒有泛型, 沒有異常, 沒有宏, 沒有函數脩飾, 沒有線程局部存儲. 但是語言是成熟和穩定的, 而且保證向後兼容: 以前的Go程序可以用新版本的編譯器和標準庫下構建. Go項目包括編程語言本身附帶了相關的工具和標準庫最後但併非代表不重要的關於簡潔編程哲學的宣言。就事後諸葛的角度來看Go語言的這些地方都做的還不錯擁有自動垃圾迴收、一個包繫統、函數作爲一等公民、詞法作用域、繫統調用接口、隻讀的UTF8字符串等。但是Go語言本身隻有很少的特性也不太可能添加太多的特性。例如它沒有隱式的數值轉換沒有構造函數和析構函數沒有運算符重載沒有默認參數也沒有繼承沒有泛型沒有異常沒有宏沒有函數脩飾更沒有線程局部存儲。但是語言本身是成熟和穩定的而且承諾保證向後兼容用之前的Go語言編寫程序可以用新版本的Go語言編譯器和標準庫直接構建而不需要脩改代碼。
Go有足夠的類型繫統以避免動態語言中那些粗心的類型錯誤, 但是Go的類型繫統相比傳統的強類型語言又要簡潔很多. 有時候這會導致一個"無類型"的抽象類型, 但是Go程序員併不需要像 C++ 或 Haskell 程序員那樣糾結具體類型的安全屬性. 但實踐中Go的簡潔的類型繫統給了程序員更多的安全性和更好的運行時性能. Go語言有足夠的類型繫統以避免動態語言中那些粗心的類型錯誤但是Go語言的類型繫統相比傳統的強類型語言又要簡潔很多。雖然有時候這會導致一個“無類型”的抽象類型概念但是Go語言程序員併不需要像C++或Haskell程序員那樣糾結於具體類型的安全屬性。在實踐中Go語言簡潔的類型繫統給了程序員帶來了更多的安全性和更好的運行時性能。
Go 鼓勵當代計算機繫統設計的認識, 特别是局部的重要性. 它的內置數據類型和大多數的準庫數據結構都經過精心設計而避免顯式的初始化或隱式的構造函數, 因此較少的內存分配和內存初始化被隱藏在了代碼中. Go的聚合類型(結構體和數組)直接操作它們的元素, 需要更少的存儲空間, 更少的內存分配, 而且指針操作比其他間接語言也更直接. 由於現代計算機是一個併行的機器, Go提供了基於CSP的併發特性. Go的動態棧使得輕量級線程goroutine的初始棧很小, 創建一個goroutine的代價很小, 因此創建百萬級的goroutine是可行的. Go語言鼓勵當代計算機繫統設計的原則,特别是局部的重要性。它的內置數據類型和大多數的準庫數據結構都經過精心設計而避免顯式的初始化或隱式的構造函數因爲很少的內存分配和內存初始化代碼被隱藏在庫代碼中了。Go語言的聚合類型結構體和數組可以直接操作它們的元素隻需要更少的存儲空間、更少的內存分配而且指針操作比其他間接操作的語言也更有效率。由於現代計算機是一個併行的機器Go語言提供了基於CSP的併發特性支持。Go語言的動態棧使得輕量級線程goroutine的初始棧可以很小因此創建一個goroutine的代價很小創建百萬級的goroutine完全是可行的。
Go的標準庫(通常被稱爲自帶的電池), 提供了清晰的構建模塊和接口, 包含 I/O, 文本處理, 圖像, 密碼學, 網絡, 和分布式應用程序, 併支持許多標準的文件格式和協議. 庫和工具使用大量的約定來減少額外的配置和解釋, 從而簡化程序的邏輯, 而且每個Go程序結構都是如此的相似, 因此也更容易學習. 構建項目使用的Go工具隻使用文件名和標識符名稱, 一個偶爾的特殊註釋來確定所有的庫, 可執行文件, 測試, 基準測試, 例子, 特定於平颱的變量, 項目的文檔; Go源代碼本身包含構建規范. Go語言的標準庫通常被稱爲語言自帶的電池提供了清晰的構建模塊和公共接口包含I/O操作、文本處理、圖像、密碼學、網絡和分布式應用程序等併支持許多標準化的文件格式和編解碼協議。庫和工具使用了大量的約定來減少額外的配置和解釋從而最終簡化程序的邏輯而且每個Go程序結構都是如此的相似因此Go程序也很容易學習。使用Go語言自帶工具構建Go語言項目隻需要使用文件名和標識符名稱, 一個偶爾的特殊註釋來確定所有的庫、可執行文件、測試、基準測試、例子、以及特定於平颱的變量、項目的文檔等Go語言源代碼本身就包含了構建規范。

View File

@ -1,48 +1,42 @@
## 本書的組織 ## 本書的組織
我們假設你有一個或多個其他編程語言的使用經歷, 不過是類似 C、c++,和Java 的編譯型語言, 我們假設你已經有一個或多個其他編程語言的使用經歷不管是類似C、c++或Java的編譯型語言還是類似Python、Ruby、JavaScript的腳本語言因此我們不會像對完全的編程語言初學者那樣解釋所有的細節。因爲Go語言的 變量、常量、表達式、控製流和函數等基本語法也是類似的。
還是類似 Python, Ruby, JavaScript 的腳本語言, 因此我們不會相對完全的編程語言初學者那樣解釋所有的細節.
因爲Go的語言的 變量,常量,表達式,控製流和函數等語法也是類似的.
第一章包含了Go敎程的基本結構, 通過十幾個程序介紹了用Go如何實現 類似讀寫文件, 文本格式化, 創建圖像, 第一章包含了本敎程的基本結構通過十幾個程序介紹了用Go語言如何實現 類似讀寫文件、文本格式化、創建圖像、網絡客戶端和服務器通訊等日常工作。
網絡客戶端和服務器通訊 等日常工作.
第二章描述了一個Go程序的基本元素結構, 變量, 定義新的類型, 包和文件, 和作用域. 第三章討論了數字, 布爾值, 字符串和常量, 併演示了如何顯示和處理Unicode. 第四章描述了複合類型, 從簡單的數組, 字典, 切片, 到動態列表. 第五章涵蓋了函數, 併討論了錯誤處理, panic 和 recover, 和 defer 語句. 第二章描述了一個Go語言程序的基本元素結構、變量、定義新的類型、包和文件、以及作用域的概念。第三章討論了數字、布爾值、字符串和常量併演示了如何顯示和處理Unicode字符。第四章描述了複合類型從簡單的數組、字典、切片到動態列表。第五章涵蓋了函數併討論了錯誤處理、panic和recover還有defer語句。
第三章討論了數字、布爾值、字符串和常數,併解釋顯示處理Unicode。 第一章到第五章是基礎部分對於任何主流命令式編程語言這個部分都是類似的。雖然有時候Go語言的語法和風格會有自己的特色但是大多數程序員將能很快地適應。剩下的章節是Go語言中特有地方方法、接口、併發、包、測試和反射等語言特性。
第四章描述了複合類型,類型建立使用數組,從簡單的地圖,結構,和切割的方法去動態列表。第五章涵蓋了函數和討論錯誤處理,恐慌和恢複,而推遲的陳述。
第一章到第五章是基礎部分, 任何主流命令式語言的一部分都是類似的. 雖然有時候Go的語法和風格會有自己的特色, 但是大多數程序員將很快適應. Go語言的面向對象是不同尋常的。它沒有類層次結構甚至可以説沒有類僅僅是通過組合而不是繼承簡單的對象來構建複雜的對象。方法不僅僅可以定義在結構體上, 而且可以定義在任何用戶自己定義的類型上;併且具體類型和抽象類型(接口)之間的關繫是隱式的,所以很多類型的設計者可能併不知道該類型到底滿足了哪些接口。方法將在第六章討論,接口將在第七章將討論。
剩下的章節是Go中特有的部分: 方法, 接口, 併發, 包, 測試和反射等.
Go的面向對象是不同尋常的. 它沒有類層次結構, 甚至沒有類; 僅僅是通過組合(而不是繼承)簡單的對象來構建複雜的對象. 第八章討論了基於順序通信進程(CSP)概念的併發編程通過使用goroutines和channels處理併發編程。第九章則討論了更爲傳統的基於共享變量的併發編程。
方法不僅僅可以定義在結構體上, 而是可以在任何用戶自己定義的類型上; 併且具體類型和抽象類型(接口)之間的關繫是隱式的,
所以很多類型的設計者可能併不知道該類型到底滿足了哪些接口. 方法在第六章討論, 接口在第七章將討論.
八章討論了基於順序通信進程(CSP)的概念的併發編程, 使用 goroutines 和 channels. 第九章討論了更爲傳統的基於共享變量的併發性. 第十章描述了包機製和包的組織結構。這一章還展示了如何有效的利用Go自帶的工具通過一個命令提供了編譯、測試、基準測試、代碼格式化、文檔和許多其他任務。
第十章描述了包機製, 包的組織結構. 本章還展示了如何利用有效的利用Go自帶的工具, 第十一章討論了單元測試Go語言的工具和標準庫中集成的輕量級的測試功能從而避免了采用強大但複雜的測試框架。測試庫提供一些基本的構件如果有必要可以用來構建更複雜的測試構件。
通過一個命令提供了編譯, 測試, 基準測試, 代碼格式化, 文檔, 和許多其他任務.
第十一章討論單元測試, Go的工具和標準庫中集成了輕量級的測試功能, 從而避免了采用複雜強大的測試框架. 測試庫提供一些基本的構建, 如果有必要可以構建更複雜的測試抽象. 第十二章討論了反射一個程序在運行期間來審視自己的能力。反射是一個強大的編程工具不過要謹慎地使用這一章通過用利用反射機製實現一些重要的Go語言庫函數來展示了反射的強大用法。第十三章解釋了底層編程的細節通過使用unsafe包來繞過Go語言安全的類型繫統當然有時這是必要的。
第十二章討論了反射, 一個程序在運行期間來檢視自己的能力. 反射是一個強大的工具, 不過要謹慎地使用; 本章通過用反射實現一些重要的Go庫來展示了反射的用法. 第十三章解釋了低級編程的細節, 通過使用 unsafe 包來繞過Go的類型繫統, 有時這是必要的. 有些章節的後面可能會有一些練習你可以根據你對Go語言的理解然後脩改書中的例子來探索Go語言的其他用法。
每一章會有一些練習, 你可以根據你對Go語言的理解, 然後脩改書中的例子來探索Go的其他用法. 書中所有的代碼都可以從gopl.io上的Git倉庫下載。go get命令可以根據每個例子的其導入路徑智能地穫取、構建併安裝。你隻需要選擇一個目録作爲工作空間然後將GOPATH環境指向這個工作目録。
書中所有的代碼都可以從 gopl.io 上的 Git 倉庫下載. go get可以根據每個例子的其導入路徑方便地穫取/構建/併安裝. 你需要選擇一個目録作爲工作空間, 然後將GOPATH環境指向這個工作目録. Go語言工具將在必要時創建的相應的目録。例如
Go工具將在必要時創建的相應的目録. 例如: ```
$ export GOPATH=$HOME/gobook # 選擇工作目録
$ export GOPATH=$HOME/gobook # 選擇工作目録 $ go get gopl.io/ch1/helloworld # 穫取/編譯/安裝
$ go get gopl.io/ch1/helloworld # 穫取/編譯/安裝 $ $GOPATH/bin/helloworld # 運行程序
$ $GOPATH/bin/helloworld # 運行 Hello, 世界 # 這是中文
Hello, 世界 # 這是中文, 不是日文 ```
要運行這些例子, 你需要安裝Go1.5以上的版本. 要運行這些例子, 你需要安裝Go1.5以上的版本.
```
$ go version $ go version
go version go1.5 linux/amd64 go version go1.5 linux/amd64
```
如果你用的是其他的操作繫統, 請參考 https://golang.org/doc/install 提供的説明安裝. 如果你用的是其他的操作繫統, 請參考 https://golang.org/doc/install 提供的説明安裝

View File

@ -1,14 +1,14 @@
## 更多的信息 ## 更多的信息
最佳的信息來自Go的官方網站, https://golang.org, 它提供了訪問完善的參考文檔, 包括編程語言規范和標準庫等諸多信息. 同時也包含了如果更好了編寫Go程序的基本敎程, 還有各種各樣的在線文本資源和視頻資源, 它們是本身終有價值的補充. Go的博客 blog.golang.org 發布一些Go語言最好的實踐文章, 包括當前語言的狀態, 未來的計劃, 會議報告和Go相關的各種主題. 最佳的幫助信息來自Go語言的官方網站https://golang.org 它提供了完善的參考文檔包括編程語言規范和標準庫等諸多權威的幫助信息。同時也包含了如何編寫更地道的Go程序的基本敎程還有各種各樣的在線文本資源和視頻資源它們是本書最有價值的補充。Go語言的官方博客 blog.golang.org 會不定期發布一些Go語言最好的實踐文章包括當前語言的發展狀態、未來的計劃、會議報告和Go語言相關的各種會議的主題等信息。
在線訪問的一個有價值的地方是可以從web頁面運行Go的程序(而紙質書則沒有這麽便利了). 這個功能 由來自 play.golang.org 的 Go Playground 提供, 併且可以方便地嵌入到其他頁面, 例如 golang.org 的主頁, 或 godoc 提供的文檔中. 在線訪問的一個有價值的地方是可以從web頁面運行Go語言的程序(而紙質書則沒有這麽便利了)。這個功能由來自 play.golang.org 的 Go Playground 提供,併且可以方便地嵌入到其他頁面中,例如 golang.org 的主頁,或 godoc 提供的文檔頁面中。
Playground 可以簡單的通過執行一個小程序來測試對語法, 語義, 或對程序庫的理解, 類似其他很多語言提供的 REPL 卽時運行的方式. 同時它可以生成對應的url, 非常適合共享Go代碼片段, bug報告或提齣建議. Playground可以簡單的通過執行一個小程序來測試對語法、語義和對程序庫的理解類似其他很多語言提供的REPL卽時運行的工具。同時它可以生成對應的url非常適合共享Go語言代碼片段滙報bug或提供反饋意見等。
基於 Playground 構建的 Go Tour (tour.golang.org), 是一個繫列的Go入門敎程, 包含了諸多基本概念和結構相關的可在線運行的互動小程序. 基於 Playground 構建的 Go Tour tour.golang.org是一個繫列的Go語言入門敎程它包含了諸多基本概念和結構相關的併可在線運行的互動小程序。
Playground 和 Tour 也有一些不足, 它們隻能導入標準庫, 而且因爲安全的原因對一些網絡庫做了限製. 而且要編譯和運行需要訪問互聯網. 對於一些更複製的實驗, 你可能需要在自己的電腦上運行程序. 幸運的是下載Go的過程很簡單, 從 golang.org 下載應該不超過幾分鐘, 然後就可以在自己電腦上編寫和運行Go程序了. 當然Playground 和 Tour 也有一些限製它們隻能導入標準庫而且因爲安全的原因對一些網絡庫做了限製。如果要在編譯和運行時需要訪問互聯網對於一些更複製的實驗你可能需要在自己的電腦上構建併運行程序。幸運的是下載Go語言的過程很簡單從 golang.org 下載安裝包應該不超過幾分鐘感謝偉大的長城大陸的Gopher需要自己學會打洞下載時間可能從幾分鐘到幾天或更久然後就可以在自己電腦上編寫和運行Go程序了。
Go是一個開源項目, 你可以 在 https://golang.org/pkg 閲讀標準庫中任意函數和類型的代碼, 和下載的代碼完全一致. 這樣可以知道很多函數是如何工作的, 挖掘一些答案的細節, 或者僅僅是欣賞 專業的Go代碼. Go語言是一個開源項目,你可以在 https://golang.org/pkg 閲讀標準庫中任意函數和類型的實現代碼,和下載安裝包的代碼完全一致。這樣你可以知道很多函數是如何工作的, 通過挖掘找齣一些答案的細節或者僅僅是齣於欣賞專業級Go代碼。

View File

@ -1,25 +1,14 @@
## 致謝 ## 致謝
Rob Pike 和 Russ Cox, 以及其他很多Go糰隊的覈心成員多次仔細閲讀了本書的手稿, Rob Pike和Russ Cox以及很多其他Go糰隊的覈心成員多次仔細閲讀了本書的手稿他們對本書的組織結構和表述用詞等給齣齣了很多寶貴的建議。在準備日文版翻譯的時候Yoshiki Shibata更是仔細地審閲了本書的每個部分及時發現了諸多英文和代碼的錯誤。我們非常感謝本書的審閲者併感謝對本書給齣了重要的建議的Brian Goetz、Corey Kosak、Arnold Robbins、Josh Bleecher Snyder和Peter Weinberger等人。
他們對本書的組織結構和表述用詞等給齣了很多寶貴的建議. 在準備日本翻譯的時候,
Yoshiki Shibata 更是仔細地審閲了本書的每個部分, 及時發現了諸多英文和代碼的錯誤.
我們非常感謝本書的審閲者, 併感謝對本書給齣了重要的建議的 Brian Goetz, Corey Kosak,
Arnold Robbins, Josh Bleecher Snyder 和 Peter Weinberger 等人.
我們感謝 Sameer Ajmani, Ittai Balaban, David Crawshaw, Billy Donohue, Jonathan Feinberg, Andrew Gerrand, 我們還感謝Sameer Ajmani、Ittai Balaban、David Crawshaw、Billy Donohue、Jonathan Feinberg、Andrew Gerrand、Robert Griesemer、John Linderman、Minux Ma中國人、Bryan Mills、Bala Natarajan、Cosmos Nicolaou、Paul Staniforth、Nigel Tao好像是陶哲軒的兄弟以及Howard Trickey給齣的許多有價值的建議。我們還要感謝David Brailsford和Raph Levien關於類型設置的建議。
Robert Griesemer, John Linderman, Minux Ma, Bryan Mills, Bala Natarajan, Cosmos Nicolaou, Paul Staniforth, Nigel Tao
以及 Howard Trickey 給齣的許多有用的建議.
我們還要感謝 David Brailsford 和 Raph Levien 關於類型設置的建議.
我們來自 Addison-Wesley 的編輯 Greg Doench, 從最初就得到了越來越多的幫助. 我們的來自Addison-Wesley的編輯Greg Doench收到了很多幫助從最開始就得到了越來越多的幫助。來自AW生産糰隊的John Fuller、Dayna Isley、Julie Nahil、Chuti Prasertsith到Barbara Wood感謝你們的熱心幫助。
來自AW生産糰隊的 John Fuller, Dayna Isley, Julie Nahil, Chuti Prasertsith, 和 Barbara Wood,
感謝你們的熱心幫助.
Alan Donovan 特别感謝: Sameer Ajmani, Chris Demetriou, Walt Drummond 和 Google的Reid Tatge 允許他有充裕的時間去寫本書; Alan Donovan特别感謝Sameer Ajmani、Chris Demetriou、Walt Drummond和Google公司的Reid Tatge允許他有充裕的時間去寫本書感謝Stephen Donovan的建議和始終如一的鼓勵以及他的妻子Leila Kazemi併沒有讓他爲了家庭瑣事而分心併熱情堅定地支持這個項目。
感謝 Stephen Donovan 的建議和始終如一的鼓勵, 以及他的妻子 Leila Kazemi 沒有讓他爲了家庭瑣事而分心, 併熱情堅定地支持這個項目.
Brian Kernighan特别感謝: 朋友和同事的耐心和寬容他, 讓他慢慢地梳理本身的寫作思路. Brian Kernighan特别感謝朋友和同事對他的耐心和寬容讓他慢慢地梳理本書的寫作思路。同時感謝他的妻子Meg和其他很多朋友對他寫作事業的支持。
同時感謝他的妻子 Meg 和其他很多朋友對他寫作事業的支持.
2015年 10月 於 紐約 2015年 10月 於 紐約