官术网_书友最值得收藏!

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源代碼中的語句、指針和變量都將被轉換成二進制程序中的指令、地址和數據。因此,通過名字直接引用一個變量、對象及其成員,這樣的代碼在編譯和連接完成后,實際上都被轉換成了通過變量、對象或成員變量的地址(即內存單元的地址)進行訪問。

主站蜘蛛池模板: 台北市| 贵德县| 新民市| 益阳市| 闸北区| 偏关县| 宁乡县| 万盛区| 鞍山市| 沁水县| 宣威市| 兴仁县| 澜沧| 文水县| 尉氏县| 漳平市| 绩溪县| 瑞昌市| 清河县| 宝清县| 滦平县| 明水县| 富蕴县| 东兰县| 金沙县| 吴川市| 靖宇县| 同心县| 都兰县| 仁化县| 涞源县| 阜阳市| 锡林浩特市| 民权县| 平邑县| 民县| 威宁| 响水县| 凤冈县| 温泉县| 通化市|