c語言編譯成目標語言
Ⅰ c編譯程序是什麼
c編譯程序是將c語言程序編譯成目標代碼程序的程序,即正確答案應該選擇D。
1、c語言是目前世界上最流行、使用最廣泛的面向過程的高級程序設計語言。 c語言對操作系統和系統使用程序以及需要對硬體進行操作的場合,用c語言明顯優於其它高級語言,許多大型應用軟體都是用c語言編寫的。
2、編譯就是利用編譯程序從源語言編寫的源程序產生目標程序的過程,其中的五個階段分別是詞法分析、語法分析、語義檢查和中間代碼生成、代碼優化、目標代碼生成。主要是進行詞法分析和語法分析,又稱為源程序分析,分析過程中發現有語法錯誤,給出提示信息。
(1)c語言編譯成目標語言擴展閱讀
c編譯程序的語言特點
對於c編譯程序來說,其語言的特點如下:
1、c語言是一種結構化語言。它層次清晰,便於按模塊化方式組織程序,易於調試和維護,而且表現能力和處理能力極強。
2、c語言具有豐富的運算符和數據類型,便於實現各類復雜的數據結構。它還可以直接訪問內存的物理地址,進行位(bit)一級的操作。
3、由於c語言實現了對硬體的編程操作,因此集高級語言和低級語言的功能於一體。它既可用於系統軟體的開發,也適合於應用軟體的開發。
4、此外,c語言還具有效率高、可移植性強等特點。因此它廣泛地移植到了各類各型計算機上,從而形成了多種版本。
Ⅱ 怎麼把C語言轉化為相應對機器語言
以GCC編譯器為例,可以分為四步。
第一步是預處理,包括語法檢查等工作。
gcc -P abc.c
第二步由源程序生產匯編語言代碼。
gcc -S abc.c
會生成abc.s文件,這個文件里就是匯編代碼。
第三步編譯器生成目標代碼,一個源文件生成一個目標代碼。
gcc -c abc.c
會生成abc.o
第四步連接器從目標代碼生成可執行文件。
gcc abc.o
目標代碼包括機器碼和符號表(函數及變數名)。連接器的主要作用是通過符號表在庫文件和其他模塊中找到在目標代碼中引入或未定義的符號(函數及變數名),將幾個目標代碼合成可執行文件。
Ⅲ C編譯程序是
C
C編譯程序就是將C語言程序編譯成目標機器上的程序的。
Ⅳ c語言源程序通常由什麼將其轉換為目標程序
C語言程序不能直接運行,通常用編譯程序將其編譯為目標程序。再連接上需要的庫程序,得到可運行的二進製程序。
Ⅳ 編譯器用c語言作為目標語言有什麼好處
可移植性強
Ⅵ C語言編譯原理
編譯共分為四個階段:預處理階段、編譯階段、匯編階段、鏈接階段。
1、預處理階段:
主要工作是將頭文件插入到所寫的代碼中,生成擴展名為「.i」的文件替換原來的擴展名為「.c」的文件,但是原來的文件仍然保留,只是執行過程中的實際文件發生了改變。(這里所說的替換並不是指原來的文件被刪除)
2、匯編階段:
插入匯編語言程序,將代碼翻譯成匯編語言。編譯器首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤後,編譯器把代碼翻譯成匯編語言,同時將擴展名為「.i」的文件翻譯成擴展名為「.s」的文件。
3、編譯階段:
將匯編語言翻譯成機器語言指令,並將指令打包封存成可重定位目標程序的格式,將擴展名為「.s」的文件翻譯成擴展名為「.o」的二進制文件。
4、鏈接階段:
在示例代碼中,改代碼文件調用了標准庫中printf函數。而printf函數的實際存儲位置是一個單獨編譯的目標文件(編譯的結果也是擴展名為「.o」的文件),所以此時主函數調用的時候,需要將該文件(即printf函數所在的編譯文件)與hello world文件整合到一起,此時鏈接器就可以大顯神通了,將兩個文件合並後生成一個可執行目標文件。
Ⅶ 求將C語言源文件轉換成目標文件的源代碼,萬分感謝!
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
typedef struct pnode //個人記錄結點類型
{
char name[8]; //姓名
char tel[16]; //電話號碼
char addr[30]; //住址
}personnode;
char filename[20]; //存儲通訊錄名稱數組
FILE *fp;
void creat() //初始輸入記錄
{
personnode *person;
person=(personnode*)malloc(sizeof(personnode));
printf("\n請輸入通訊錄名:");
scanf("%s",filename);
printf("---------------------------------------------\n");
if((fp=fopen(filename,"w"))==NULL) //打開文件
{
printf("\n沒有輸入通訊錄名,不能建立通訊錄!");
exit(1);
}
fprintf(fp,"%-10s%-20s%-50s\n","姓名","電話號碼","住址");
printf("\n請輸入姓名,電話號碼及住址(以空格隔開,以@結束)\n");
printf("---------------------------------------------\n");
scanf("%s",person->name);
while(strcmp(person->name,"@"))
{
scanf("%s%s",person->tel,person->addr);
fprintf(fp,"%-10s%-20s%-50s\n",person->name,person->tel,person->addr);
scanf("%s",person->name);
}
fclose(fp);
}
void output() //輸出通訊錄
{
personnode*person;
person=(personnode*)malloc(sizeof(personnode));
if((fp=fopen(filename,"r"))==NULL)
{
printf("\n不能打開通訊錄!");
exit(1);
}
printf("\n*********************************************\n");
printf("%24s\n","通訊錄");
while(!feof(fp))
{
fscanf(fp,"%s%s%s\n",person->name,person->tel,person->addr);
printf("%-10s%-20s%-50s\n",person->name,person->tel,person->addr);
}
fclose(fp);
printf("*********************************************\n\n");
}
void append() //增加記錄
{
personnode *person;
person=(personnode*)malloc(sizeof(personnode));
if((fp=fopen(filename,"a"))==NULL)
{
printf("\n不能打開通訊錄!");
exit(1);
}
printf("\n請輸入要添加的姓名,電話號碼及住址\n");
scanf("%s%s%s",person->name,person->tel,person->addr);
fprintf(fp,"%-10s%-20s%-50s\n",person->name,person->tel,person->addr);
fclose(fp);
}
void search() //查找記錄
{
int k=0;
char namekey[8];
personnode *person;
person=(personnode*)malloc(sizeof(personnode));
printf("\n請輸入需要查找的姓名:");
scanf("%s",namekey);
if((fp=fopen(filename,"rb"))==NULL)
{
printf("\n不能打開通訊錄!");
exit(1);
}
while(!feof(fp))
{
fscanf(fp,"%s%s%s\n",person->name,person->tel,person->addr);
if(!strcmp(namekey,person->name))
{
printf("\n\n已查到,記錄為:");
printf("%-10s%-20s%-50s\n",person->name,person->tel,person->addr);
k=1;
}
}
if(!k) printf("\n\n對不起,通訊錄中沒有此人的記錄。\n");
fclose(fp);
}
void dele() //刪除記錄
{
int k=0;
char m;
long offset1;
char namekey[8];
personnode *person;
person=(personnode*)malloc(sizeof(personnode));
printf("\n請輸入要刪除記錄的姓名:");
scanf("%s",namekey);
if((fp=fopen(filename,"r+"))==NULL)
{
printf("\n不能打開通訊錄!");
exit(1);
}
while(!feof(fp))
{
offset1=ftell(fp); //P302(C語言),ftell(fp)的值是fp所指文件中位置指針的當前指向
fscanf(fp,"%s%s%s\n",person->name,person->tel,person->addr);
if(!strcmp(namekey,person->name))
{
k=1;
break;
}
}
if(k)
{
printf("\n已查到,記錄為:");
printf("%-10s%-20s%-50s\n",person->name,person->tel,person->addr);
printf("\n確實要刪除?y/n\n");
scanf("%s",&m);
if(m='y')
{
fseek(fp,offset1,SEEK_SET); //P302,fseek()函數的作用是使位置指針移動到所需的位置,(SEEK_SET即0,頭文件)
fprintf(fp,"%-14s%-24s%-48s\n"," "," "," ");
printf("已經刪除!\n");
}
}
else
{
printf("\n對不起,通訊錄中沒有此人的記錄。\n");
}
fclose(fp);
}
main()
{
int m,flag=1;
creat();
while(flag)
{
printf("---------------------------------------------\n");
printf("\t\t1---添加\n");
printf("\t\t2---查找\n");
printf("\t\t3---刪除\n");
printf("\t\t4---輸出\n");
printf("\t\t5---退出\n");
printf("---------------------------------------------\n");
printf("\t請選擇(1-6)\n");
scanf("%d",&m);
switch(m)
{
case 1: append();break;
case 2: search();break;
case 3: dele();break;
case 4: output();break;
case 5: exit(0);
}
}
return 0;
}
這是我以前做的一個實驗,裡面就是把數據輸出到目標文件的,沒有什麼一段代碼直接丟到裡面去就直接能做好的,認真看下吧,尤其注意person=(personnode*)malloc(sizeof(personnode));
if((fp=fopen(filename,"a"))==NULL);這些語句
Ⅷ 我們最終利用C語言編成目標程序,而計算機能直接執行目標程序嗎
不能,需要經過編譯和鏈接兩個步驟,將.c後綴的文件轉成.EXE後綴的文件,才能運行
Ⅸ C語言採用解釋方式將源程序轉換為二進制的目標代碼嗎
不是,C語言採用編譯方式將源程序轉換為二進制的目標代碼。使用C語言編譯器來完成。
所謂C語言編譯器,就是把編程得到的文件,比如.c,.h的文件,進行讀取,並對內容進行分析,按照C語言的規則,將其轉換成cpu可以執行的二進制文件。其本質在於對文件的讀入,分析,及處理。
C語言編寫的程序代碼稱為源程序,對於計算機本身來說,它並不能直接識別由高級語言編寫的程序。C語言程序經C語言編譯程序編譯後,生成後綴為.obj的二進制文件(稱為目標文件)。
此.obj文件必須與系統提供的各種庫函數連接起來生成一個後綴為.exe的可執行文件才可以執行。C語言的可執行文件由一系列機器指令構成的。
(9)c語言編譯成目標語言擴展閱讀
解釋執行和編譯執行是計算機語言的執行方式。解釋執行由解釋器現場解釋執行,不生成目標程序。如BASIC便是解釋執行,一般解釋執行效率較低,低於編譯執行。
編譯執行由編譯程序將目標代碼一次性編譯成目標程序,再由機器運行目標程序。如:PASCAL,C,C++,delphi等語言。效率高於解釋執行。
Ⅹ C語言中編譯 生成 調試 測試 運行各是什麼意思有什麼區別
C語言中編譯 生成 調試 測試 運行的區別如下:
區別一:
從編譯方面來看:
編譯依賴於編譯器,英文是compile, vc中這一過程是將源代碼轉換成目標文件,如:obj文件,rc文件等。
區別二:
從生成方面來看:
生成指的是連接的過程,英文是build,依賴於鏈接器。vc中在這一階段將所有的目標文件和所有需要用到的組件組合成一個整體,例如需要生成的是windows系統下的PE可執行文件,鏈接器會依照特定格式將目標文件組合,最後生成PE格式的,exe或dll文件。
區別三:
從調試方面來看:
調試是所有或部分代碼編寫完成後,讓程序在調試器中運行,用這種手段對程序進行分析,找出並修正潛在問題。
區別四:
從運行方面來看:
運行就是讓程序在系統中運行。
(10)c語言編譯成目標語言擴展閱讀:
C語言的介紹:
C語言是目前流行的通用程序設計語言,是計算機專業人員和計算機愛好者開發軟體的首選開發工具。C語言源程序必須經過某種編譯工具翻譯成為目標機器語言程序才能夠在計算機上執行。
然而隨著程序編寫規模的擴大,順利編寫出正確的程序絕非一件容易的事情,早期的許多編譯工具僅僅提供翻譯功能,已滿足不了應用的要求,編程人員需要-種功能全面並高度集成的編譯環境。
程序是一段具有一定功能的代碼,編寫程序的目的是解決問題。當程序人員寫完程序後,其實並不起作用,只有當編寫的程序經過一系列的處理後,能夠解決問題時。
序才成為真正的程序,這一系列的處理過程,-般就是編輯、編譯、連接、調試與運行等。目前最成熟的C語言集成環境主要有Turbo C2.0和Turbo C 3.0( 簡稱TC30)或Borland C++3.1( 簡稱BC31)以及Visual C++ 6.0。