C语言运行环境介绍
目錄
介紹
什么是運行環境
為什么要有運行環境
如何理解運行環境
翻譯環境與執環境詳解
翻譯環境介紹
編譯環境詳解
鏈接環境詳解
?一圖勝千言
兩個小問題
執行環境詳解
運行環境執行過程
介紹
什么是運行環境
運行環境指的的是將源文件轉換成程序的過程
為什么要有運行環境
如果沒有運行環境編譯器就無法識別你寫的C語言代碼,也無法將源代碼轉換成可執行程序
如何理解運行環境
運行環境分為:翻譯環境和執行環境
- 翻譯環境:它用于將源代碼轉換成可執行的機械指令
- 執行環境:它就是一般說的可執行程序
翻譯環境與執環境詳解
翻譯環境介紹
翻譯環境分為兩步
- 第一步是編譯,通過編輯器將同一工程內不同的源文件都轉換成目標文件
- 第二步是鏈接,通過鏈接器將不同的目標文件都鏈接起來形成一個可執行程序,同時連接器還會將標準庫函數中所用到的函數和個人程序庫中所用到的函數連接到該程序中
編譯環境詳解
編譯環境又可以分為三個階段:預處理->編譯->匯編
預處理(*.i)
- 將#include包含的文件替換到前文件中
- 預處理指令替換和刪除
- 將注釋替換成空格
編譯(*.s)
- 檢查語法與符號等錯誤
- 符號匯總(記錄下具有外部連接屬性的符號)
- 將c語言代碼翻譯成匯編代碼
總結:在編譯階段會通過語法分析,詞法分析,語義分析,去檢查代碼中的語法與符號等錯誤還會將具有外部連接屬性的符號記錄下來(函數,全局變量)最后將c語言代碼翻譯成匯編代碼
注:檢查語法錯誤就是在這個階段發生的
匯編(生產可重定位的目標文件 *.o)
- 將匯編代碼翻譯成二進制指令
- 形成符號表(將符號匯總記錄下來的符號,形成一個表格,表格記錄了符號名和該符號的地址)
鏈接環境詳解
合并段表:
目標文件在鏈接階段會被分成幾段進行操作,合并段表就是把相關目標文件對應的段鏈接到一起。
?
符號表的合并和重定位:
將不同目標文件中的符號表進行合并,最后通過合并的符號表中的符號地址來確定這個符號到底有沒有存在
?一圖勝千言
兩個小問題
為什么函數不聲明也可以使用?
因為最后鏈接的時候會進行符號合并,可以通過這個合并后的符號表找到該函數的地址
那為什么全局變量需要聲明外部符號?
因為全局變量不聲明在編譯階段的語法分析時就會報錯
執行環境詳解
運行環境執行過程
將程序加載到內存中(在有操作系統的環境中,一般由操作系統來完成,在獨立的環境中需要手動完成)-> 程序開始執行,調用main函數 -> 開始執行程序代碼(這時在程序運行時會調用棧、堆、靜態區等空間來儲存執行過程中創建的變量,字符常量等數據)-> 終止程序,釋放空間
總結
- 上一篇: 大数据生态系统的认识
- 下一篇: 阿里巴巴发送短信验证码验证实战