高级语言的编译过程和解释过程_进来了解一下C语言真正的编译过程看你掌握了吗?...
C語言
前言
說實話,很多人做了很久的C/C++,也用了很多IDE,但是對于可執行程序的底層生成一片茫然,這無疑是一種悲哀,可以想象到大公司面試正好被問到這樣的問題,有多悲催不言而喻,這里正由于換工作的緣故,所以打算系統的把之前用到的C/C++補一補。
總述
從一個源文件(.c)到可執行程序到底經歷了哪幾步,我想大多數的人都知道,到時到底每一步都做了什么,我估計也沒多少人能夠說得清清楚楚,明明白白。
其實總的流程是這樣的。
C語言
(1)編輯hello.c
#include #include int main(){ printf("hello world!"); return 0;}(2)預處理
預處理過程實質上是處理“#”,將#include包含的頭文件直接拷貝到hell.c當中;將#define定義的宏進行替換,同時將代碼中沒用的注釋部分刪除等
具體做的事兒如下:
(1)將所有的#define刪除,并且展開所有的宏定義。說白了就是字符替換
(2)處理所有的條件編譯指令,#ifdef #ifndef #endif等,就是帶#的那些
(3)處理#include,將#include指向的文件插入到該行處
(4)刪除所有注釋
(5)添加行號和文件標示,這樣的在調試和編譯出錯的時候才知道是是哪個文件的哪一行
(6)保留#pragma編譯器指令,因為編譯器需要使用它們。
加C/C++學習交.流群獲取C語言、C++、Windows高級編程,MFC框架編程、QT框架編程,Linux應用程序開發,Linux內核研究等系統學習路線,更有進階干貨的直播免費學習權限 ,都是大牛帶飛 讓你少走很多的彎路的 群...號是 787190917gcc -E hello.c -o a.c可以生成預處理后的文件。通過查看文件內容和文件大小可以得知a.c講stdio.h和stdlib.h包含了進來。
C語言
(3)編譯
編譯的過程實質上是把高級語言翻譯成機器語言的過程,即對a.c做了這些事兒
(1)詞法分析,
(2)語法分析
(3)語義分析
(4)優化后生成相應的匯編代碼
從 高級語言->匯編語言
gcc -S hello.c -o a.s可以生成匯編代碼
C語言
匯編代碼如下。
.file "hello.c" .section .rodata.LC0: .string "hello world!" .text .globl main .type main, @functionmain:.LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 andl $-16, %esp subl $16, %esp movl $.LC0, (%esp) call puts movl $0, %eax leave .cfi_restore 5 .cfi_def_cfa 4, 4 ret .cfi_endproc.LFE0: .size main, .-main .ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3" .section .note.GNU-stack,總結
以上是生活随笔為你收集整理的高级语言的编译过程和解释过程_进来了解一下C语言真正的编译过程看你掌握了吗?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nodejs核心模块fs删除文件_用 N
- 下一篇: 非root用户组启动sftp_如何在 D