- 高質量程序設計指南:C++/C語言
- 林銳 韓永泉編著
- 889字
- 2019-01-09 14:08:58
3.5 程序的工作原理
程序既可以指開發完成的可執行文件及其相關文件和數據,也可以指正處于開發階段的源代碼及其相關文件和數據(IDE稱之為程序工程)。程序工程包含一個或多個編譯單元、資源文件、靜態庫及配置文件等。把一個C++/C程序工程轉變為一個可執行程序要經歷編譯預處理、編譯、連接等過程。一個可執行文件的結構不一定就是它被加載到內存中運行時的內存映像,但是至少包含代碼段、靜態數據段、堆棧段這三個部分。其中代碼段包含源程序中的可執行語句序列,靜態數據段存放全局變量、靜態對象、符號表等,堆棧段留給函數和線程使用。堆(heap)和自由存儲空間不屬于程序,而是屬于操作系統,但是應用程序可以通過動態內存分配指令來獲得它們的使用權。
現在的計算機仍然遵循馮·諾依曼的“存儲程序控制”原理。本質上,任何一個程序都是由待處理的數據和一系列處理它們的指令(操作)組成的,這些指令通過內存地址來訪問待處理的數據。程序中任何復雜的操作(例如,顯示復雜的圖形或窗口)最終都被轉換為簡單的加法運算讓計算機來執行。程序在運行的時候首先要求把內存操作數的地址通過數據總線(DB)傳遞到CPU寄存器中,然后CPU指示將它送到地址總線(AB)上,接著內存單元的數據就會“流”入CPU的接收寄存器中,然后取第二個操作數,最后執行加法運算。函數調用則是首先提取函數體的首地址到CPU寄存器中,然后將CPU指令指針修改為這個寄存器中的值,CPU從內存提取下一條指令時就可以取到函數的第一條指令,這樣就實現了函數跳轉。
典型的C++/C運行環境如圖3-2所示。

圖3-2 C++/C程序運行環境
存在于二進制可執行程序中的只是指令、地址和數據,沒有別的東西(實際上地址也是一種特殊的數據),這就是“運行時”的本質。像標識符(類型名、變量名、函數名等)、類型定義、const關鍵字、訪問限定符public/private/protected、引用(&)等只是存在于源代碼中,它們不會被帶入二進制可執行程序,這是“編譯時”的本質。C++/C源代碼中的語句、指針和變量都將被轉換成二進制程序中的指令、地址和數據。因此,通過名字直接引用一個變量、對象及其成員,這樣的代碼在編譯和連接完成后,實際上都被轉換成了通過變量、對象或成員變量的地址(即內存單元的地址)進行訪問。
- Oracle WebLogic Server 12c:First Look
- Azure IoT Development Cookbook
- 面向對象程序設計(Java版)
- Learning Network Forensics
- PHP+MySQL網站開發項目式教程
- SQL Server 2012數據庫管理與開發項目教程
- Java程序設計
- Hands-On Natural Language Processing with Python
- 碼上行動:用ChatGPT學會Python編程
- 全棧自動化測試實戰:基于TestNG、HttpClient、Selenium和Appium
- SQL Server數據庫管理與開發兵書
- 持續集成與持續交付實戰:用Jenkins、Travis CI和CircleCI構建和發布大規模高質量軟件
- 交互式程序設計(第2版)
- Node.js從入門到精通
- 征服C指針(第2版)