【C語言】編譯和鏈接詳解

hi,各位,讓我們開啟今日份博客~

小編個人主頁點這里~

目錄

  • 一、翻譯環境和運行環境
    • 1、翻譯環境
      • 1.1預處理(預編譯)
      • 1.2編譯
        • 1.2.1詞法分析
        • 1.2.2語法分析
        • 1.2.3語義分析
      • 1.3匯編
      • 1.4鏈接
    • 2.運行環境

一、翻譯環境和運行環境

在ANSI C(ANSI C 是美國國家標準協會創立的一套C標準,于1989年完成,這個版本的語言常被叫做C89.) 的任何一種實現中,存在兩個不同的環境。
第一種是翻譯環境,在這個環境中,源代碼被轉換成可執行的機器指令(二進制指令)。
第二種是運行環境,它用于實際執行代碼。

在這里插入圖片描述

1、翻譯環境

翻譯由編譯鏈接兩大部分組成,其中編譯又分為預處理、編譯、匯編三個過程。

在編譯器中一個C語言的項目可能有多個.c文件一起構建,那多個.c文件如何生成可執行程序呢?

  • 首先多個.c文件單獨經過編譯器,編譯處理成對應的目標文件(在Windows環境下的目標文件后綴是.obj,Linux環境下目標文件的后綴是.o)
  • 然后多個目標文件和編譯庫一起經過鏈接器處理生成最終的可執行程序(鏈接庫是指運行時庫【它是支持程序運行的基本函數集合】或者第三方庫)。

如果我們再把編譯器分成預處理、編譯、匯編這三個過程,那就變成了以下過程:
在這里插入圖片描述

1.1預處理(預編譯)

在預處理階段,源文件和頭文件會被處理成.i為后綴的文件.
在gcc下觀察對test.c文件預處理后的test.i文件,命令如下:

gcc test.c -E -o test.i

  • -E選項:提示編譯器執行完當前命令后就停下來,后面的編譯、匯編和鏈接暫不執行
  • -S選項:提示編譯器執行完編譯停下來,匯編、鏈接暫不執行
  • -c選項:提示編譯器執行完匯編就停下來

預處理過程進行的操作
1、對#include 頭文件進行包含
2、刪除代碼中的注釋(使用空格替換)
3、#define 定義的符號進行替換,使用完后,符號刪除

1.2編譯

編譯是將C語言程序轉換成了匯編代碼
在gcc下觀察對test.i文件編譯后的test.s文件,命令如下:

gcc test.i -S -o test.s

1.2.1詞法分析

詞法分析是使用一種叫做lex的程序實現詞法掃描,它會按照用戶之前描述好的詞法規則將輸入的字符串分割成一個個記號。產生的記號一般分為:關鍵字、標識符、字面量(包含數字、字符串等)和特殊符號(運算符、等號等),然后他們放到對應的表中。

我們以以下表達式為例進行詞法分析:

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

在這里插入圖片描述

1.2.2語法分析

語法分析器根據用戶給定的語法規則,將詞法分析產生的記號序列進行解析,然后將它們構成一棵語法樹。這些語法樹是以表達式為節點的樹,對于不同的語言,只是其語法規則不一樣。

如下:
在這里插入圖片描述

1.2.3語義分析

語義分析是由語義分析器來完成的,即對表達式的語法層?分析。編譯器所能做的分析是語義的靜態分析。靜態語義分析通常包括聲明和類型的匹配,類型的轉換等。這個階段還會報告錯誤的語法信息。

如下:
在這里插入圖片描述

1.3匯編

匯編過程是通過匯編器來完成的,匯編器將匯編代碼轉變成機器可執?的指令(2進制的指令),每?個匯編語句?乎都對應?條機器指令。它是根據匯編指令和機器指令的對照表一一 的進行翻譯的,不做指令優化。
gcc下匯編命令如下:

gcc -c test.s -o test.o

1.4鏈接

鏈接是?個復雜的過程,鏈接的時候需要把?堆?件鏈接在?起才?成可執?程序。鏈接過程主要包括:地址和空間分配,符號決議和重定位等。

符號解析 目標文件中可能包含一些未定義的符號引用,如函數調用、全局變量引用等。鏈接器會在所有的目標文件和庫文件中查找這些符號的定義,將符號引用與對應的符號定義進行匹配,確保每個符號都有正確的定義。
重定位編譯生成的目標文件中的地址通常是相對地址或未確定的地址。鏈接器會根據最終可執行文件或庫文件的布局,對目標文件中的代碼和數據進行重定位,將相對地址轉換為絕對地址,使程序在運行時能夠正確地訪問代碼和數據。
合并段目標文件通常包含多個段,如代碼段、數據段、只讀數據段等。鏈接器會將各個目標文件中的相同類型的段進行合并,形成最終可執行文件或庫文件中的相應段,并為每個段分配合適的內存地址。

在生成輸出文件時,還會添加一些必要的頭部信息,如程序入口點、段的屬性等,以便操作系統能夠正確的加載和執行程序。

2.運行環境

程序必須載入內存中,在有操作系統的環境中,一般由操作系統來完成,在獨立的環境中,程序的載入必須由手工安排,也可能是通過可執行代碼置入只讀內存來完成。程序載入內存之后,執行才能開始,開始后首先調用main函數,開始執行程序代碼。這個時候程序將使用一個運行時堆棧(stack),儲存函數的局部變量和返回的地址,程序同時也可以使用靜態(static)內存,儲存于靜態內存中的變量在程序的整個執行過程一直保留他們的值,正常終止main函數時,程序終止,也有可能是意外終止。
在這里插入圖片描述
如上圖,我們雙擊以.exe結尾的可執行文件就會進入運行環境,此時程序已經被加載到內存中。

總結:

以上就是本期博客分享的全部內容啦!技術的探索永無止境。
道阻且長,行則將至!后續我會給大家帶來更多博客內容,歡迎關注我的CSDN賬號,我們一同成長!
(~ ̄▽ ̄)~

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

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

相關文章

VIC模型率定驗證

在氣候變化問題日益嚴重的今天,水文模型在防洪規劃,未來預測等方面發揮著不可替代的重要作用。目前,無論是工程實踐或是科學研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。雖然,這些軟件有各自的優點;但是&am…

【AWS入門】AWS云計算簡介

【AWS入門】AWS云計算簡介 A Brief Introduction to AWS Cloud Computing By JacksonML 什么是云計算?云計算能干什么?我們如何利用云計算?云計算如何實現? 帶著一系列問題,我將做一個普通布道者,引領廣…

Flutter_學習記錄_ ImagePicker拍照、錄制視頻、相冊選擇照片和視頻、上傳文件

插件地址&#xff1a;https://pub.dev/packages/image_picker 添加插件 添加配置 android無需配置開箱即用&#xff0c;ios還需要配置info.plist <key>NSPhotoLibraryUsageDescription</key> <string>應用需要訪問相冊讀取文件</string> <key>N…

藍橋與力扣刷題(藍橋 星期計算)

題目&#xff1a;已知今天是星期六&#xff0c;請問 20^22 天后是星期幾? 注意用數字 1 到 7 表示星期一到星期日。 本題為填空題&#xff0c;只需要算出結果后&#xff0c;在代碼中使用輸出語句將所填結果輸出即可。 解題思路&#xff0b;代碼&#xff1a; 代碼&#xff1…

向量數據庫原理及選型

向量數據庫 什么是向量什么是向量數據庫原理應用場景 向量數據庫的選型主流向量數據庫介紹向量數據庫對比主流向量數據庫對比表 選型建議 什么是向量 向量是一組有序的數值&#xff0c;表示在多維空間中的位置或方向。向量通常用一個列或行的數字集合來表示&#xff0c;這些數…

以實現生產制造、科技研發、人居生活等一種或多種復合功能的智慧油站開源了

AI視頻監控平臺簡介 AI視頻監控平臺是一款功能強大且簡單易用的實時算法視頻監控系統。它的愿景是最底層打通各大芯片廠商相互間的壁壘&#xff0c;省去繁瑣重復的適配流程&#xff0c;實現芯片、算法、應用的全流程組合&#xff0c;從而大大減少企業級應用約95%的開發成本。用…

小程序網絡大文件緩存方案

分享一個小程序網絡大圖加載慢的解決方案 用到的相關api getSavedFileList 獲取已保存的文件列表&#xff1b;getStorageSync 獲取本地緩存&#xff1b;downloadFile 下載網絡圖片&#xff1b;saveFile 保存文件到本地&#xff1b;setStorage 將數據儲存到小程序本地緩存&…

軟考系統架構師 — 3 操作系統

目錄 3.1 考點分析 3.1 操作系統概述 3.1.1 操作系統的功能 3.1.2 操作系統的分類 3.1.3 嵌入式操作系統主要特點 3.2 進程 3.2.1 進程的組成和狀態 3.2.2 前趨圖與進程資源圖&#xff08;重點&#xff09; 3.2.3 進程同步與互斥 3.2.4 進程調度 3.2.5 死鎖 3.3 線…

PE,ELF,COFF

本文來自 (1)騰訊元寶 (2)程序員的自我修養 PE&#xff08;Portable Executable&#xff09;是一種文件格式&#xff0c;主要用于Windows操作系統中的可執行文件&#xff08;如.exe、.dll、.sys等&#xff09;。PE格式是Windows操作系統中標準的可執行文件格式&#xff0c;由…

MySQL 在 CentOS 7 上安裝的步驟指南

目錄 1. 卸載不需要的環境 2. 獲取 MySQL YUM 倉庫 3. 安裝 MySQL 4. 啟動 MySQL 服務 5. 獲取臨時 Root 密碼 6. 登錄 MySQL 7. 更改 Root 密碼 8. 設置 MySQL 開機自啟動 9. 配置 MySQL 編碼 10. 重啟 MySQL 配置生效 11. 常見問題解決 1. 卸載不需要的環境 如果…

C++初階——類和對象(三) 構造函數、析構函數

C初階——類和對象&#xff08;三&#xff09; 上期內容&#xff0c;我們圍繞類對象模型的大小計算&#xff0c;成員存儲方式&#xff0c;this指針&#xff0c;以及C實現棧和C語言的比較&#xff0c;進一步認識了C的封裝特性。本期內容&#xff0c;我們開始介紹類的默認成員函…

【NLP】 5. Word Analogy Task(詞類比任務)與 Intrinsic Metric(內在度量)

Word Analogy Task&#xff08;詞類比任務&#xff09; 定義&#xff1a;Word Analogy Task 是用于評估詞向量質量的內在指標&#xff08;Intrinsic Metric&#xff09;。該任務基于這樣的假設&#xff1a;如果詞向量能夠捕捉單詞之間的語義關系&#xff0c;那么這些關系應該能…

矩陣冪(矩陣k次冪)

矩陣冪 #include<stdio.h> //矩陣乘法 void cf(int a[20][20],int b[20][20],int result[20][20],int n){for(int i0;i<n;i){for(int j0;j<n;j){result[i][j]0;for(int k0;k<n;k){result[i][j]a[i][k]*b[k][j];}}} }void print(int a[20][20],int n){for(int…

信火一體作戰模式運用特點分析及對一體化防空反導能力建設的啟示

文章目錄 內容摘要1. 引言2. 信火一體作戰模式在現代戰爭中的新內涵和特征2.1 充當火力和信息要素的作戰單元種類更加豐富2.2 信息利用更加凸顯異構平臺間的數據共享和情報融合2.3 作戰環節上更加強調指揮決策的敏捷性和智能化3. 增強防空反導能力的舉措建議3.1 強化各類作戰單…

樣本是怎么估計總體的

樣本是怎么估計總體的 flyfish 1. 什么是樣本估計總體&#xff1f; 樣本估計總體是指通過樣本數據&#xff08;例如100人的身高&#xff09;推斷總體參數&#xff08;例如全國人口的平均身高&#xff09;。核心方法包括&#xff1a; 點估計&#xff1a;用樣本統計量直接估計…

自己動手打造AI Agent:基于DeepSeek-R1+websearch從零構建自己的Manus深度探索智能體AI-Research

第一章&#xff1a;AI Agent基礎與DeepSeek-R1架構解析&#xff08;1/10&#xff09; 1.1 AI Agent技術演進與核心價值 人工智能代理&#xff08;AI Agent&#xff09;經歷了從規則驅動到數據驅動的范式轉移。早期基于專家系統的符號主義方法&#xff08;如MYCIN醫療診斷系統…

DeepSeek 助力 Vue3 開發:打造絲滑的表格(Table)之添加列寬調整功能,示例Table14_13可展開行的固定表頭表格

前言:哈嘍,大家好,今天給大家分享一篇文章!并提供具體代碼幫助大家深入理解,徹底掌握!創作不易,如果能幫助到大家或者給大家一些靈感和啟發,歡迎收藏+關注哦 ?? 目錄 DeepSeek 助力 Vue3 開發:打造絲滑的表格(Table)之添加列寬調整功能,示例Table14_13可展開行的固…

Gemini Robotics:將人工智能帶入物理世界

25年3月來自谷歌的技術報告“Gemini Robotics: Bringing AI into the Physical World”。 大型多模態模型的最新進展&#xff0c;已使數字領域出現卓越的通才能力&#xff0c;但將其轉化為機器人等物理智體仍然是一項重大挑戰。一般有用的機器人需要能夠理解周圍的物理世界&am…

關于離子濾波小記

粒子濾波&#xff08;Particle Filter, PF&#xff09; 粒子濾波是一種基于蒙特卡洛方法的貝葉斯濾波算法&#xff0c;主要用于解決非線性、非高斯的狀態估計問題。它廣泛應用于機器人定位、目標跟蹤、金融建模等領域。 1. 粒子濾波的基本概念 粒子濾波的核心思想是用一組加權…