107.08.24 C 語言編譯到執行流程

很久之前寫過這篇 106.02.11 程式編譯流程
但是覺得還不夠深入,剛好學過編譯器了
雖然不是學到的主要內容,不過多整理有助於記憶,順便記錄專有名詞的英文這樣

先上總覽
參考 Create a program – C  - CodingMeta
language-processing for C

編輯器 (Editor or IDE)

編輯程式碼,C 語言的原始碼,副檔名為 .c,標頭檔副檔名為 .h
例如 vim 就是一種編輯器

預處理器 (Preprocessor)

預先處理原始碼,將須引入的檔案或是 macro 展開
以 C 語言為例,通常以 ' # ' 開頭作為預處理的指令

編譯器 (Compiler)

廣義的編譯器用途是把一個語言 (source language) 的程式碼轉換成另外一個語言 (target language) 的程式碼
C 語言的編譯器常見有 GCCClang (本文以 GCC 為主要探討對象)
GCC (the GNU Compiler Collection) 支援的語言很多,不只有 C 語言。功能也很多,可以直接將 C 的原始碼輸出成可執行檔 (Executable),也可以透過選項控制輸出中介檔案 (.s, .o, ....),因此 GCC 在此張圖中可以達到 Build 的所有功能。
圖中的編譯器屬於較狹義的編譯器,主要是把 C 語言轉成組合語言。其中亦包含許多部份:詞法分析 (Lexical analysis)、語法分析 (Parsing、Syntax analysis)、語意分析 (Semantic analysis)、符號表 (Symbol Table)、中間碼產生 (Intermediate Code Generation)、最佳化 (Code Optimization)、目標語言產生 (Code Generation) 也是很多東西呢 www

組合語言 (Assembly)

副檔名為 .s, .asm
屬於低階程式語言 (Low-level programming language)
會針對不同電腦架構及作業系統而有不同,會需要這樣是因為對於不同的架構可以有不同的優化方式,並且可以使高階語言 (High-level programming language) 有可攜性,代表高階語言不需要為了不同的環境寫不同的程式碼,而是透過編譯器將程式碼轉成對應環境的組合語言
常見有 x86-64ARMMIPS

組譯器 (Assembler)

將低階語言所寫的程式翻譯成目的檔

目的碼 (Object codes)

目的檔的副檔名為 .o
目的碼通常是 CPU 可以直接執行的機器碼 (Machine code) 或是暫存器傳遞語言 (Register transfer language、RTL),GCC 為後者
目的檔可以透過連結成為可執行檔或是函式庫 (Library)

連結器 (Linker)

將多個目標檔或靜態函式庫 (Static library) 合併成一個可執行檔或函式庫的工具
From Wikipedia

載入器 (Loader)

是作業系統的一部份,用於把程式和動態函式庫 (Shared library) 的指令載入到記憶體 (RAM) 中等待 CPU 執行,當載入完成之後,作業系統會將控制權交給載入的程式碼,讓它開始運作

CPU (Central Processing Unit)

對載入的指令進行運算或儲存等操作



參考資料:
Create a program – C

沒有留言:

張貼留言

^ Top