【新书速递】计算机系统解密:从理解计算机到编写高效代码
許多程序員對使程序運行的底層技術并不熟悉。但是,如果希望程序運行良好,而不是充滿了難以發現的bug,就要關心代碼是如何正常運行的,誰都不希望自己因為代碼安全問題而成為新聞的主角。
網上有很多技術細節,但都沒有整理或收集到一個方便的地方。在本書中,資深工程師Jonathan E. Steinhart深入探討了計算機背后的基礎內容,比如計算機硬件、軟件在硬件上的行為,以及隨著時間的推移,人們如何解決問題等主題。
就像你在書里看到的,理解內存是程序員的一個重要技能。學習編程時養成的習慣很難改掉。研究表明,在所謂的“安全”操場玩耍長大的孩子更容易受傷,大概是因為他們不知道摔倒的傷害。在編程領域也存在類似的情況。舒適的編程環境使入門不那么恐怖,但你還是需要做好準備,以面對復雜的外部環境。本書可以幫你實現這種轉變。
01
底層知識的重要性
Mathematica和Wolfram語言的創造者Stephen Wolfram在一篇題為“How to Teach Computational Thinking”的博客帖子中表達了一個有趣且有些相悖的觀點:他把計算思維定義為“把事件標準化得足夠清晰,人可以通過一個足夠系統化的方法告訴計算機怎么運行”。我完全認同這個定義。事實上,很大程度上這也是我寫這本書的動力。
但我非常不認同Wolfram的一個觀點,即那些學習編程的人應該使用強大的高級工具(比如他開發的那些工具)來培養計算思維能力,而不是學習底層基礎技術。例如,從人們對統計學的興趣日益超過對微積分的興趣這一趨勢中,我們可以清楚地看到,“數據整理”是一個正在發展的領域。但是,如果人們只是將大量的數據輸入這些并不熟悉的程序中,又會發生什么呢?
一種可能是,它們產生的結果看起來很有趣,但沒有意義或者不正確。例如,最近的一項研究(MarkZiemann、Yotam Eren和Assam El-Osta的“Gene Name Errors Are Widespread in the Scientific Literature”)顯示,五分之一已發表的遺傳學論文由于電子表格使用不當而出現錯誤。試想一下,如果有更多人使用更強大的工具,可能會產生怎樣的錯誤和后果!當人們的生活受到影響時,正確處理好它才是至關重要的。
理解底層技術可以幫助你了解可能出現的問題。只知道高級工具很容易提出錯誤的問題。在學習釘槍之前,先學會使用錘子是值得的。學習底層系統和工具的另一個原因是,它能賦予你構建新工具的能力,這一點很重要,因為永遠需要工具構建者,盡管工具用戶更常見。學習有關計算機的知識使你能夠編寫更好的代碼,程序的性能狀態也就不再神秘了。
02
目標讀者
本書是為想成為優秀程序員的人準備的。是什么成就了一個優秀的程序員?首先,一個優秀的程序員應該具備良好的批判性思維和分析能力。為了解決復雜的問題,程序員需要有能力評估程序是否能正確地解決恰當的問題。這比聽起來要難得多。經常會見到有經驗的程序員對別人寫的程序冷嘲熱諷:“將簡單事情復雜化了,制造了不是問題的問題。”
你可能很熟悉一個經典的魔幻故事比喻:魔法師通過了解事物的真名來獲得力量,如果忘了某個細節,魔法師就會遭殃。優秀的程序員就是那種能夠牢牢把握住事物的本質,不放過任何一個細節的魔法師。
優秀的程序員也應該有一定的藝術修養,就像熟練的工匠一樣。遇到讓人完全無法理解的代碼的情形并不少見,就像許多說英語的人對詹姆斯·喬伊斯(JamesJoyce)的小說《芬尼根的守靈夜》很困惑一樣。優秀的程序員寫出的代碼不僅要能正常工作,而且要很容易讓別人理解和維護。
最后,優秀的程序員需要對計算機的工作原理有深刻的理解。僅憑淺薄的知識基礎無法很好地解決復雜問題。本書適合那些正在學習編程,但又對現有知識深度不滿意的人。本書也適合已經在學習編程,但還想要學習更多的人。
03
計算機全景圖
計算機設計和編程是一個巨大的學術領域,這里就不再贅述了。你可以像圖1展示的那樣分層想象計算機的結構。
圖1是簡化后的結果,在實際中,各層之間界限并沒有這么清晰明顯。
04
本書涵蓋
本書在概念上分為三個部分。第一部分探討計算機硬件,包括它是什么以及它是如何構建的。第二部分研究在硬件上運行的軟件的行為和表現。最后一部分介紹編程的藝術—與他人合作寫出好的程序。
第1章:計算機的內部語言
本章將開始探索計算機這個三歲小孩的心態。計算機是比特大玩家,它們靠“放牧”比特為生。本章將具體介紹它們是什么,可以用它們做什么,用像“過家家”一樣的假想游戲來賦予比特和比特集合意義。
第2章:組合邏輯
本章將研究使用比特而不是數字的原理,并探討數字計算機的合理性,還將討論一些為我們現在的數字計算機出現鋪平道路的舊技術。本章涵蓋組合邏輯的基礎知識,并介紹如何從位和邏輯實現更復雜的功能。
第3章:時序邏輯
本章將介紹如何使用邏輯構建內存,包括如何生成時間,因為內存只不過是一種隨時間而存在的狀態。本章涵蓋時序邏輯的基礎知識,并討論各種存儲器技術。
第4章:計算機剖析
本章將介紹計算機如何由前面幾章討論的邏輯和內存元素構造出來,并介紹一些不同的實現方法。
第5章:計算機架構
本章將探討我們在第4章中看到的計算機的基礎附加組件,介紹它們如何提供基本功能并提高效率。
第6章:通信故障
計算機需要與外部世界進行交互。本章將介紹輸入和輸出,回顧數字量和模擬量的區別,以及如何讓數字計算機在模擬世界中工作。
第7章:組織數據
了解了計算機的工作原理后,我們來看看如何高效地使用它們。計算機程序對內存中的數據進行操作,重要的是將內存的使用方式映射到需要解決的問題上。
第8章:語言處理
編程語言的發明是為了讓人們更容易地在計算機上寫出程序。本章著眼于將語言轉換成在計算機上實際運行的程序的過程。
第9章:Web瀏覽器
很多程序都是為Web瀏覽器寫的。本章主要介紹Web瀏覽器的工作原理以及它的主要組件。
第10章:應用程序和系統程序設計
本章將編寫一個程序的兩個版本,分別在圖1中的兩個不同的層上運行。
第11章:捷徑和近似法
提高程序的效率很重要。本章將探討一些通過省去不必要的工作來讓程序更有效率的方法。
第12章:死鎖和競態條件
許多系統包含不止一個計算機。本章將研究讓計算機相互合作時可能會出現的一些問題。
第13章:安全性
計算機安全是一個先進主題。本章在講解基礎知識的同時,還會著重講解難消化的數學知識。
第14章:機器智能
機器智能也是一個先進主題。大數據、人工智能和機器學習的結合帶來全新的應用—從自動駕駛到把你逼瘋的廣告。
第15章:現實世界的考慮
編程是一個非常有條理的過程,邏輯性很強。人類會參與決定編什么、如何編程,而人類往往缺乏邏輯性。本章將討論現實世界中關于編程的一些問題。
在閱讀本書時,請記住,很多解釋都是已簡化的,因此細究細節可能不完全正確。要解釋得完美,就需要太多分散注意力的細節。如果你在深入學習的過程中發現了這一點,請不要驚訝。你可以把這本書看成是一本可以讓你在計算機的太虛世界里神奇遨游的光鮮亮麗的旅行手冊。本書不可能涵蓋所有的細節,當你深入閱讀時,就會發現很多細微的差別。
05
編輯推薦
計算機編程不是抽象的,程序是在機器上運行的。了解計算機如何工作以及程序如何在計算機上運行是成為一名更好的程序員的必要條件在本書中,資深工程師Jonathan E. Steinhart深入探討了計算機背后的基礎概念,比如計算機硬件,軟件在硬件上的行為,如何編寫高效的程序,計算機安全基礎知識,以及在編寫代碼時需要考慮的現實問題。本書對底層知識的多個主題進行了公平的覆蓋——介紹有助于提高整個系統質量的許多領域的知識(包括計算機硬件、組合邏輯、時序邏輯、計算機體系結構、計算機組成原理、操作系統、系統程序設計等)。每一章都以一種易于閱讀的水平涵蓋了一個重要的知識領域,并為那些有興趣深入研究的人提供了參考。
通過閱讀本書,你將學到:
現實世界是如何轉換成計算機能理解的形式的,比如位、邏輯、數字、文本和顏色。
組成計算機的基本構件,包括邏輯門、加法器、譯碼器,寄存器和存儲器。
為什么設計與計算機硬件(特別是內存)相匹配的程序可以提高性能。
如何將程序轉換為計算機能夠理解的機器語言。
軟件構建塊是如何結合起來創造Web瀏覽器等程序的。
讓程序更高效的巧妙技巧,如循環不變式、強度削弱和遞歸細分等。
計算機安全和機器智能的基礎知識。
項目設計、文檔編制、日程安排、可移植性、維護和其他實用的編程經驗。
了解代碼在計算機上運行時到底發生了什么將幫助你編寫更好、更高效的代碼。
作者:[美]喬納森·E.斯坦哈特 (Jonathan E. Steinhart )
譯者:張開元、張淼
計算機程序硬件、軟件從底層實現到高層展現的原理講解
有助于提高整個系統質量的知識圖譜
掃碼關注【華章計算機】視頻號
每天來聽華章哥講書
更多精彩回顧
書訊 |?10月書訊(上) | ?小長假我讀這些新書
書訊?|?10月書訊(下) | ?小長假我讀這些新書
資訊 |?什么是ETL?一文掌握ETL設計過程
書單 |?8本書助你零基礎轉行數據分析崗
干貨 |?架構設計的新思路,《架構之道》讀書筆記
收藏 |?終于有人把微服務講明白了
上新 |?【新書速遞】構建高質量軟件:持續集成與持續交付系統實踐
贈書?|?你已選中了添加鏈接的內容
點擊閱讀全文購買
總結
以上是生活随笔為你收集整理的【新书速递】计算机系统解密:从理解计算机到编写高效代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【SDOI2008】仪仗队
- 下一篇: thinkcmf 横向排列数据_利用py