C語言學習筆記——編譯和鏈接

目錄

  • 1 C程序的執行流程
  • 2 翻譯環境
    • 2.1 預編譯
    • 2.2 編譯
      • 2.2.1 詞法分析
      • 2.2.2 語法分析
      • 2.2.3 語法分析
    • 2.3 匯編
    • 2.4 鏈接

1 C程序的執行流程

用戶編寫好的C程序不能直接被計算機識別并執行,在執行前,要先將源文件和頭文件進行編譯,生成目標文件,再將目標文件與鏈接庫進行鏈接,生成最終的可執行程序,再由計算機執行
其中,將源代碼轉換成可執行的機器指令的過程被稱為 翻譯環境
執行代碼的過程被稱為 執行環境
在這里插入圖片描述

在這里,主要說明翻譯環境所做的事情

2 翻譯環境

翻譯環境主要有 編譯和鏈接 兩個處理過程
編譯的過程還可以拆分為 預編譯,編譯,匯編 三個小的過程
因此,翻譯環境的處理過程為 預編譯,編譯,匯編,鏈接
在這里插入圖片描述

2.1 預編譯

預編譯階段所做的事情包括:

  • 在代碼中,將 #define 定義的常量用它的值進行替換
  • 將頭文件引入至 #include 的位置處
  • 處理條件編譯指令,比如:#if,#ifdef,#elif等
  • 刪除程序內的所有注釋
  • 生成行號和文件名
  • 保留 #pragma 的編譯器指令

預編譯階段結束后,會產生 .i 后綴的文件

2.2 編譯

編譯階段所做的事情包括 詞法分析,語法分析,語義分析及優化
編譯結束后,會產生 .s后綴的文件,它保存的都是匯編代碼
接下來,針對下面這句代碼來進行說明

array[index] = (index+4)*(2+6);

2.2.1 詞法分析

在詞法分析中要做的事情就是分析代碼,將代碼拆分成符號
上方的這句代碼,就可以做這樣子的拆分:
在這里插入圖片描述

2.2.2 語法分析

在語法分析中要做的事情是分析詞法分析階段產生的符號,從而得到語法樹
上面這句代碼的語法樹如下:
在這里插入圖片描述

2.2.3 語法分析

語法分析要做的事情就是根據語法樹來判斷正在分析的代碼是否有語法錯誤,因此,如果有語法錯誤,會在這個階段報錯
在這里插入圖片描述

2.3 匯編

匯編階段要做的事情就是將 編譯階段產生的 .s后綴文件進行解析,生成 .o/.obj 后綴的目標文件,在目標文件內,保存了機器指令,機器指令為計算機可以識別并執行的指令

2.4 鏈接

每一個源文件,在經過了 預編譯,編譯,匯編 的過程后,都會生成 .o/.obj 后綴的目標文件,在鏈接的階段,就會將這些目標文件鏈接在一起,生成可執行程序
鏈接主要有 空間分配,符號決議,重定位 這些過程

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92540.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92540.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92540.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Flink-1.19.0源碼詳解9-ExecutionGraph生成-后篇

《Flink-1.19.0源碼詳解8-ExecutionGraph生成-前篇》前篇已從Flink集群端調度開始解析ExecutionGraph生成的源碼,解析了ExecutionGraph的ExecutionJobVertex節點、ExecutionVertex節點、IntermediateResult數據集、IntermediateResultPartition數據集分區與封裝Task…

19、閾值分割+blob分析

目錄 一、仿射變換 1.變換矩陣 2.在矩陣的基礎上添加各種變換形式 3.開始變換 4.計算變換矩陣參數 新算子 二、閾值分割 新算子 三、blob分析案例 1.焊點 2.石頭 3.木材 4.車牌 5.骰子 新算子 一、仿射變換 1.變換矩陣 // 產生仿射變換矩陣hom_mat2d_identity…

破解 Django N+1 查詢困境:使用 select_related 與 prefetch_related 實踐指南

破解 Django N+1 查詢困境:使用 select_related 與 prefetch_related 實踐指南 開篇引入 數據庫查詢性能常常是 Web 應用性能瓶頸中的重中之重。Django ORM 以簡潔直觀的 API 層將 Python 代碼與數據庫打通,卻也可能因默認的惰性加載帶來 N+1 查詢問題,造成不必要的網絡往…

深入解析K-means聚類:從原理到調優實戰

一、聚類分析與K-means的核心價值在無監督學習領域,聚類分析是探索數據內在結構的核心技術。?K-means算法因其簡潔高效成為最廣泛使用的聚類方法,在客戶分群、圖像壓縮、生物信息學等領域應用廣泛。其核心目標是將數據集劃分為K個簇,實現“簇…

數據結構基礎:哈希表、排序和查找算法

目錄 一、哈希表 1.哈希算法 2.哈希碰撞 3.哈希表 4.哈希表相關操作 哈希表插入 哈希表遍歷 元素查找 哈希表銷毀 二、排序算法 1. 排序算法對比 2. 排序算法實現 冒泡排序 選擇排序 插入排序 希爾排序 快速排序 三、查找算法 1. 查找算法對比 2. 查找算法實…

Linux內核參數調優:為K8s節點優化網絡性能

在高并發微服務環境中,網絡性能往往成為K8s集群的瓶頸。本文將深入探討如何通過精細化的Linux內核參數調優,讓你的K8s節點網絡性能提升30%以上。引言:為什么網絡調優如此重要?作為一名在生產環境中維護過數千節點K8s集群的運維工程…

全家桶” 戰略如何重塑智能服務標準?無憂秘書 AI + 智腦 + 數字人協同模式的底層架構解析

在數字化浪潮的推動下,企業對智能化服務的需求日益增長。然而,單一的技術或產品往往難以滿足復雜場景下的多樣化需求。近年來,“全家桶”戰略成為科技行業的一大趨勢,通過整合多維度技術與服務,為企業提供全方位的支持…

前端后端之爭?JavaScript和Java的特性與應用場景解析

一、名字相似,本質迥異 1.1 歷史淵源與命名背景 在編程世界中,很少有兩種語言像JavaScript和Java這樣,僅僅因為名字的相似性就引發了無數初學者的困惑。然而,這種相似性純屬巧合——或者說是一種營銷策略的產物。 JavaScript誕…

【文獻分享】Machine learning models提供數據和代碼

數據輸入及前期信息:ChronoGauge 需要一個基因表達矩陣,其中包括來自多個時間進程 RNA-測序實驗的觀測數據,用于訓練,并且需要有關每個基因在連續光照(LL)條件下經過光暗(LD)周期調整…

PHP MySQL Delete 操作詳解

PHP MySQL Delete 操作詳解 引言 在Web開發中,數據庫是存儲和管理數據的重要工具。PHP作為一種流行的服務器端腳本語言,與MySQL數據庫結合使用可以高效地處理數據。本文將詳細介紹PHP中如何使用DELETE語句刪除MySQL數據庫中的數據。 什么是DELETE語句&am…

計組-大/小端存放區別

在計算機系統中,大端存放(Big-Endian)和小端存放(Little-Endian)是兩種不同的多字節數據存儲方式,主要區別在于字節在內存中的排列順序。理解它們對底層編程(如網絡通信、二進制文件處理、硬件交…

線程同步相關知識

文章目錄一、線程同步的核心目標二、線程安全的判定條件三、同步方式一:synchronized 關鍵字1. 同步代碼塊2. 同步方法四、鎖的釋放與不釋放場景1. 自動釋放鎖的場景2. 不會釋放鎖的場景五、同步方式二:ReentrantLock(顯式鎖)1. 核…

Armoury Crate無法通過BIOS卸載

設備:天選4 Armoury Crate窗口反復彈出影響使用體驗,但無法通過BIOS關閉該怎么辦?本文以天選4為例提供解決方案。 Step1:進入服務支持官網 Armoury Crate-服務支持 下滑點擊”查看更多” 下載安裝卸載工具 得到Armoury_Crate_Un…

如何將視頻轉為GIF格式,3大視頻轉為GIF工具

在社交媒體和即時通訊盛行的當下,GIF 動圖以其獨特的魅力備受青睞。它能夠生動地捕捉視頻中的精彩瞬間,憑借體積小巧、無需復雜加載且可循環播放的特性,成為了人們在網絡交流中表達情感、分享趣事的得力工具。無論是制作詼諧幽默的表情包&…

開發避坑指南(22):Vue3響應式編程中this綁定機制與解決方案

錯誤信息 TypeError: Cannot read properties of undefined (reading find) TypeError: r.vnode.el.querySelector is not a function報錯背景 vue2項目升級到vue3后,原來的代碼報錯。 報錯代碼computed: {/** 計算列的顯示與隱藏*/columnVisible() {return functio…

AI學習筆記三十五:實時傳輸視頻

若該文為原創文章,轉載請注明原文出處。 目的是實現視頻的傳輸,只是個demo. 程序分為兩部分,視頻接收端和視頻發送端。 一、視頻接收端流程分析 主要流程: 初始化配置: 設置UDP端口(5001)和緩…

【ArcGIS】分區統計中出現Null值且Nodata無法忽略的問題以及shp擦除(erase)的使用——以NDVI去水體為例

需求 已有某地NDVI柵格、行政區shp以及水體shp,計算每個行政區的平均NDVI 問題 1.如果不剔除水體 負值NDVI會把平均值拉低 且水體NDVI并不全為負 需要通過shp剔除,Mask掩膜是提取水體本身而不是剩余部分 2.使用分區統計工具(Zonal statis…

Linux中的內核同步源碼相關總結

什么是內核同步Linux 內核同步是指內核中用于解決并發執行單元(如進程、中斷、內核線程等)對共享資源(如全局數據結構、硬件寄存器、鏈表等)的競爭訪問的一系列機制和技術。其核心目標是保證多個并發單元在操作共享資源時的數據一…

WORD接受修訂,并修改修訂后文字的顏色

在 Word 中,接受修訂之后默認會采用正文的默認字體格式,不會保留修訂時設置的顏色,比如“插入內容是藍色字體”的設置會被清除。 如果你想要做到:? 接受所有修訂后仍然讓“原插入的文字”變為藍色字體保留下來你只能通過一些手動…

行業速覽:中國新能源汽車市場格局與關鍵趨勢

在全球汽車產業邁向綠色、低碳、智能化的變革浪潮中,新能源汽車已成為各國爭奪的戰略高地。中國,作為全球最大的汽車市場和新能源汽車制造國,正以強大的市場規模、完整的產業鏈體系以及快速提升的技術創新能力,在這場變革中不斷加…