⑴ 作為程序員計算機基礎的書推薦幾本唄
生活不僅僅只有寫代碼,作為程序員,我們不僅要將數據結構、計昌敬讓算機網路、操作系統這三把斧玩好,更要擁有一個強健的體魄!
網路:
萬物互稿山聯時代,如果你還不懂網路知識,那將寸步難行。這里推薦三本經典書籍:
TCP/IP詳解
該書是網路專家、著名技術作家W.RichardStevens的傳世之作,內容詳盡且極具權威,被譽為TCP/IP領域的不朽名著,就我認識的老通信行業的專業開發人員,基本人手一本。本書共三卷,其中卷一偏重於基礎原理,卷二、卷三更多偏重於編程細節,作為基礎書籍推薦,卷一即可,對於學有餘力的童鞋,可學習二、三卷。
圖解HTTP
應用最廣泛的協議之一,前端工程師分析抓包分析數據,後端工程師實現RESTAPI、搭建自己的HTTP伺服器等過程中都繞不開HTTP這一知識點,《圖解HTTP》,用通俗易懂的語言講解了HTTP協議的方方面面,本書列舉諸多常見通信場景及實戰案例,最後延伸到Web安全、最新技術動向等方面,實在是一本不可多得的好書。
Wireshark網路分析就這么簡單
「授人以魚不如授人以漁」,全書以詼諧幽默的寫法為我們講解了枯燥的技術問題,由淺入深的用Wireshark分析了常見的網路協議,還通過身邊的真實案例分享了Wireshark使用技巧,對初學者是很好的啟蒙書籍。本書可搭配前面介紹的兩本基礎理論書籍一起學習,必能達到事半功倍的效果。
操作系統:
現代操作系統
程序員的耐局自我修養——鏈接、裝載和庫
如果你是高手,LinuxHacker或者geek,請繞行
但如果你是新手
如果你曾好奇過windows系統目錄下和軟體目錄下大堆大堆的dll文件是什麼?
如果你曾疑惑過我寫下的代碼經歷的怎樣的歷程最後怎樣到達了內存?
編譯器每天用,它到底做了什麼?
如果你已經學習或接觸了C,匯編,計算機結構,但還是沒辦法把三者的關系理順。
那麼,《程序員的自我修養——鏈接、裝載和庫》這本書絕對是對你的有幫助。
數據結構
基礎入門的話,這里推薦《大話數據結構》。本書以一名教師的教學為場景,用生動形象的語言講解數據結構和相關演算法的知識。全文大量引用了各種各樣的生活知識來類比數據結構中的專業知識。
程序員必備書籍
重要!
重要!
重要!
作為本文的壓軸戲,也是最重要的一本書《程序員健康指南》推薦給各位程序猿友們,專門為程序員量身製作的健康指南,針對頭痛、眼部疲勞、背部疼痛和手腕疼痛等常見的問題介紹了其成因和對策。身體是革命的本錢,各位在長期面對996的同時,一定要注意身體,加強鍛煉,提高免疫力!
⑵ 程序員的自我修養圖書目錄
本文為程序員的自我修養圖書目錄,旨在為程序員提供深入理解操作系統底層原理和編程技術的指導。以下為各部分和章節的概覽:
第一部分:簡介
第1章 溫故而知新,為讀者回顧和鞏固基礎知識,為後續深入學習打下堅實基礎。
第二部分:靜態鏈接
第2章 編譯和鏈接,解釋程序如何通過編譯器轉換為可執行文件的過程。
第3章 目標文件里有什麼,深入探討編譯過程生成的目標文件結構。
第4章 靜態鏈接,詳細介紹靜態鏈接過程,以及靜態庫的使用。
第5章 WINDOWS PE/COFF,具體講解Windows操作系統中PE/COFF格式的可執行文件結構。
第三部分:裝載與動態鏈接
第6章 可執行文件的裝載與進程,解釋可執行文件如何在操作系統中載入運行,以及進程的概念。
第7章 動態鏈接,闡述動態鏈接的過程,以及動態鏈接庫的作用。
第8章 LINUX 共享庫的組織,深入探討Linux操作系統中共享庫的組織方式。
第9章 WINDOWS 下的動態鏈接,具體講解Windows環境下動態鏈接的實現與應用。
第四部分:庫與運行庫
第10章 內存,詳細介紹內存管理,包括內存分配、釋放以及內存保護等。
第11章 運行庫,闡述運行庫的功能、分類以及在不同編程語言中的應用。
第12章 系統調用與API,解釋系統調用與API的區別與聯系,以及它們在程序開發中的重要性。
第13章 運行庫實現,深入探討運行庫的實現原理,包括內存管理、進程管理等核心功能。
附錄,索引,為讀者提供查找相關章節內容的便利。
⑶ 鏈接與裝載六---靜態鏈接
靜態鏈接的概念和原理是程序編譯過程中的關鍵部分。以「hello world」程序為例,編譯後會生成一個ELF文件,其中printf函數的狀態為「U」,表示該符號未定義。鏈接過程旨在解決這種問題,通過將不同模塊的函數和變數地址進行整合,形成可執行的整體。鏈接器在其中扮演重要角色,負責傳遞參數、控制命令,以及模塊間通信。
靜態鏈接中,鏈接器將多個輸入目標文件合並成一個輸出文件。鏈接過程分為兩步:空間與地址的分配,以及符號解析與重定位。在空間與地址分配階段,鏈接器為每個段分配虛擬地址和空間。對於有實際數據的段,如「text」和"data",它們在文件中和虛擬地址空間中都分配空間;而「bss」段僅在虛擬地址空間中分配空間,因為它在文件中沒有內容。
在鏈接器完成地址和空間分配後,會確定所有符號的虛擬地址,進行重定位。重定位過程中,鏈接器修正指令的地址,將需要重定位的指令與正確的符號地址對齊。這一過程涉及符號解析,鏈接器查找全局符號表以確定引用符號的目標地址。符號解析與重定位是靜態鏈接的核心內容,確保了程序的正確執行。
靜態鏈接中,還涉及到「common塊」機制,用於處理弱符號的多重定義問題。common塊允許未初始化的全局變數在多個文件中定義,鏈接器通過這種方式處理符號類型不一致的情況。靜態庫則是目標文件的集合,常用於提供語言庫,如libc.a。
不使用glibc的二進製程序示例展示了如何編寫和編譯不依賴glibc的程序。最終生成的二進制文件能夠輸出「Hello world」,並通過內聯匯編解釋了程序中使用的函數。
靜態鏈接的總結包括其基本過程、關鍵概念和常見問題的分析,如為什麼未初始化的全局/靜態變數使用common塊、不使用默認C語言運行庫程序的處理方法等。靜態鏈接技術在程序開發中具有重要地位,確保了程序在運行時能夠正確訪問所需的函數和數據。