c編譯器工作原因
王爽 匯編語言 一切答案都在裡面
Ⅱ c語言編譯器如何運行
編譯共分為四個階段:預處理階段、編譯階段、匯編階段、鏈接階段。
1、預處理階段:
主要工作是將頭文件插入到所寫的代碼中,生成擴展名為「.i」的文件替換原來的擴展名為「.c」的文件,但是原來的文件仍然保留,只是執行過程中的實際文件發生了改變。(這里所說的替換並不是指原來的文件被刪除)
2、匯編階段:
插入匯編語言程序,將代碼翻譯成匯編語言。編譯器首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤後,編譯器把代碼翻譯成匯編語言,同時將擴展名為「.i」的文件翻譯成擴展名為「.s」的文件。
3、編譯階段:
將匯編語言翻譯成機器語言指令,並將指令打包封存成可重定位目標程序的格式,將擴展名為「.s」的文件翻譯成擴展名為「.o」的二進制文件。
4、鏈接階段:
在示例代碼中,改代碼文件調用了標准庫中printf函數。而printf函數的實際存儲位置是一個單獨編譯的目標文件(編譯的結果也是擴展名為「.o」的文件),所以此時主函數調用的時候,需要將該文件(即printf函數所在的編譯文件)與hello world文件整合到一起,此時鏈接器就可以大顯神通了,將兩個文件合並後生成一個可執行目標文件。
Ⅲ c語言的編譯器是干什麼用的
高級語言、匯編語言、機器語言這三種語言統稱「計算機語言」。其中,機器語言是最低級的,是一串一串的電流表示「0001101010010110010101000110」之類的數據,全部由0和1組成,這樣的語言是機器語言,只有機器才能記住這樣冗長而沒規律的數據,所以,用機器語言來編程序幾乎是不可能的。但要命令機器做一樣事情,必須用機器語言,怎麼辦呢?於是,產生了匯編語言,匯編語言比機器語言簡單一點,但還是很難明白,當時的編譯器就是把匯編語言轉換成機器語言,再命令機器做事。現在,出現了高級語言,最人性化,人們很容易讀懂,所以,我們可以直接輸入自己熟悉的語言,到達機器的時候變成了機器最熟悉的語言,編程序就很容易了。編譯器擔負的就是這個轉換工作。
Ⅳ C語言程序運行後 出現exe停止工作 為什麼呢
這種情況叫做 runtime error (運行時錯誤)。
在 Windows 7 上這樣提示:
runtimeerror(運行時錯誤)就是程序運行到一半,程序就崩潰了。
比如說:
①除以零
②數組越界:inta[3];a[10000000]=10;
③指針越界:int*p;p=(int*)malloc(5*sizeof(int));*(p+1000000)=10;
④使用已經釋放的空間:int*p;p=(int*)malloc(5*sizeof(int));free(p);*p=10;
⑤數組開得太大,超出了棧的范圍,造成棧溢出:inta[100000000]
Ⅳ C語言編譯原理是什麼
編譯共分為四個階段:預處理階段、編譯階段、匯編階段、鏈接階段。
1、預處理階段:
主要工作是將頭文件插入到所寫的代碼中,生成擴展名為「.i」的文件替換原來的擴展名為「.c」的文件,但是原來的文件仍然保留,只是執行過程中的實際文件發生了改變。(這里所說的替換並不是指原來的文件被刪除)
2、匯編階段:
插入匯編語言程序,將代碼翻譯成匯編語言。編譯器首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤後,編譯器把代碼翻譯成匯編語言,同時將擴展名為「.i」的文件翻譯成擴展名為「.s」的文件。
3、編譯階段:
將匯編語言翻譯成機器語言指令,並將指令打包封存成可重定位目標程序的格式,將擴展名為「.s」的文件翻譯成擴展名為「.o」的二進制文件。
4、鏈接階段:
在示例代碼中,改代碼文件調用了標准庫中printf函數。而printf函數的實際存儲位置是一個單獨編譯的目標文件(編譯的結果也是擴展名為「.o」的文件),所以此時主函數調用的時候,需要將該文件(即printf函數所在的編譯文件)與hello world文件整合到一起,此時鏈接器就可以大顯神通了,將兩個文件合並後生成一個可執行目標文件。
Ⅵ c語言的編譯器從何而來
大致如下:
1)匯編編譯器由二進制代碼直接編寫(只能夠是這樣子的),形成了最原始的匯編編譯器
2)然後用原始匯編編譯器的匯編代碼編寫更復雜的匯編編譯器,依次類推。
3)高級語言(C、C++等)編譯器(最初原始版本的),由匯編語言編寫。
4)在用原始版本編譯器的代碼編寫更加復雜的編譯器。
5)其他高級語言的編譯器一般是用像C、C++這類程序設計語言編寫。
總結一些:用低級語言寫高級語言編譯器;
由簡單的編譯器代碼編寫復雜的編譯器。
Ⅶ C語言工作原理
作為一種編程語言,本身是談不上工作原理的,實際上C語言所有的語法,正是C語言編譯器的工作原理或者工作機制的具體實現。要細致的討論起來是不可能,但是作為C語言程序員,必須了解這個大致的流程。一個程序,從C語言源碼,到系統可執行的文件,一般經歷四個過程。
1、預處理階斷,這個階斷是文本處理階斷,有預處理器來完成,會將源碼中的帶"#"開頭的預處理命令進行相應的處理,在Linux上C語言的預處理器程序是cp命令。
2、編譯階斷,這個階斷是有C語言編譯階斷,在Linux上C語言的編譯器是cc命令,它將C語言源碼轉換成匯編指令。
3、匯編階斷,這個階斷是匯編編譯階斷,在Linux上C語言的匯編器是as命令,這個階斷會將匯編指令編譯成二進制機器碼。
4、鏈接階斷,這個階斷是會將匯編階斷生成的機器碼目標文件,裝載成一個系統可執行的文件,在Linux平台以ELF格式進行組裝,在Windows平台上以PE格式進行組裝。在Linux平台上的鏈接器命令為ld,在windows平台上的鏈接器命令為linker。
Ⅷ C語言編譯器是用來做什麼的
編譯器,是將便於人編寫,閱讀,維護的高階計算機語言翻譯為計算機能解讀、運行的低階機器語言的程序。編譯器將原始程序(Source program)作為輸入,翻譯產生使用目標語言(Target language)的等價程序。源代碼一般為高階語言 (High-level language), 如 Pascal、C++、Java 等,而目標語言則是匯編語言或目標機器的目標代碼(Object code),有時也稱作機器代碼(Machine code)。
一個現代編譯器的主要工作流程如下:
源代碼 (source code) → 預處理器 (preprocessor) → 編譯器 (compiler) → 匯編程序 (assembler) → 目標代碼 (object code) → 連接器 (Linker) → 可執行程序 (executables)
Ⅸ C語言編程的時候出現「程序已停止工作」的原因有哪些
最常見的原因:程序發生了空指針調用。
如果你剛入門,請檢查:
scanf("%d",&i); 有沒有加上「&」號,scanf必須在變數前加「&」(取地址符)。
如果沒有加&, scanf會把變數當作地址來用,而你的程序中又沒有以變數為地址的變數,操作系統不允許程序讀寫程序規定范圍以外的空間。出於安全起見,操作系統將其緊急中止。就發生了「***.exe已停止工作」的效果。
如果你正在學習數組,請檢查:
數組是否越界。定義為int a[10]的數組,如果寫a[10]=0; 相當於對a數組里的第11個元素賦值。事實上,a數組里並沒有第11個元素。如果該元素的位置指向一個程序以外的內存,操作系統同樣會果斷將其終止。
如果你正在學習指針,請檢查:
指針是否賦值;
在給指針賦值時,有沒有在非指針變數前加取地址符「&」;
int * p = &i; //正確!
int * p = i; //錯誤!
這與在sccanf里沒有加上「&」號的原因大致相同。
指針問題屬於程序邏輯錯誤,很多時侯編譯器只會給你一個警告。要注意警告發生的位置自己是否有把握。如果你多次編譯或忽視編譯警告而進行鏈接,編譯器會認為你對這些警告是有把握的,完全地信任了你,也就沒有警告了。
Ⅹ C語言編譯器原理小知識
1、char *p="asdf"; 則sizeof(p)=2; 是返回指針p佔用位元組數;即使你是先定義再賦值,char *p; p="asdfasdf"; sizeof(p)都是等於2;任何指針在turbo c中都是2個位元組,不是說「字元串中有'0\'佔一個位元組,字元類型指針佔一個位元組」。。樓上有的說sizeof(p)是求變數p或字元串長度,是錯的,是求佔用位元組數,不是長度,長度是用函數strlen(p); sizeof不是函數,是一種運算符。。例子:char p[]="abc";則sizeof(p)=4;strlen(p)=3; 比較於char p[10]="abc"; sizeof(p)=10; strlen(p)=3。。。 但如果定義成:char p[]="asdf"; 則sizeof(p);就等於5了,數組名p雖然可以看做指針,但不完全跟指針一樣,這就是例子了。。 2、編譯器可以看作一個虛擬機器,可以有自己虛擬的內存,棧等。。編譯系統就可以看作是物理電腦操作系統上虛擬機的運行系統。。所以不一定是物理地址,但跟物理地址有映射關系,至於為什麼,怎麼映射,我也不知道。。。 3、編譯器是16位。。跟「loat 為4個位元組 double 32個字元」??。。跟float 4位元組32位沒關系,那是編譯器設定的,就是常說電腦是16位或32位操作系統一樣,編譯器16位就看作虛擬機器是16位運行系統。。 4、 我也不知道為什麼, (*p)(int,int);是int (*p)(int,int);吧。。。