程序編譯器設計
Ⅰ 編譯器設計中通常用什麼描述程序設計語言的語法結構
程序設計語言用於書寫計算機程序的語言。
語言的基礎是一組記號和一組規則,根據規則由記號構成的記號串的總體就是語言。
在程序設計語言中,這些記號串就是程序。
程序設計語言有3個方面的因素,即語法、語義和語用。
語法表示程序的結構或形式,亦即表示構成語言的各個記號之間的組合規律。
但不涉及這些記號的特定含義,也不涉及使用者。
語義表示程序的含義,亦即表示按照各種方法所表示的各個記號的特定含義,
但不涉及使用者。
Ⅱ c語言程序設計:(VC編譯器)順序輸出26個英文大寫字母,並且重復輸出20次!
#include <stdio.h>
void main()
{ int i,j,s;
char ch;
printf("input ch:");
scanf("%c",&ch);
ch=ch-32;
s=ch-'A';
for(j=1;j<=20;j++)
{ for(i=0;i<26-s;i++)
printf("%c",(ch+i));
for(i=1;i<=s;i++)
printf("%c",'A'+i-1);
printf("\n");
}
}#include <stdio.h>
void main()
{ int i,j,s;
char ch;
printf("input ch:");
scanf("%c",&ch);
ch=ch-32;
s=ch-'A';
for(j=1;j<=20;j++)
{ for(i=0;i<26-s;i++)
printf("%c",(ch+i));
for(i=1;i<=s;i++)
printf("%c",'A'+i-1);
printf("\n");
}
}
Ⅲ c語言程序設計的常用c語言編譯器
有Microsoft Visual C++,Borland C++,WatcomC++ ,Borland C++ ,Borland C++ Builder,Borland C++ 3.1 for DOS,WatcomC++ 11.0 for DOS,GNU DJGPP C++ ,Lccwin32 C Compiler 3.1,Microsoft C,High C,Turbo C,Dev-C++,C-Free,win-tc 等等......
Ⅳ 編譯器設計的介紹
《編譯器設計(第2版)》1是編譯器設計領域的經典著作,主要從以下四部分詳解了編譯器的設計過程。第一部分涵蓋編譯器前端設計和建立前端所用工具的設計和構建;第二部分探討從源代碼到編譯器中間形式的映射,考察前端為優化器和後端所生成代碼的種類;第三部分介紹代碼優化,同時包含對分析和轉換的進一步處理;第四部分專門講解編譯器後端使用的演算法。 《編譯器設計(第2版)》適合作為高等院校計算機專業本科生和研究生編譯課程的教材和參考書,也可供相關技術人員參考。
Ⅳ 編譯器的歷史
20世紀50年代,IBM的John Backus帶領一個研究小組對FORTRAN語言及其編譯器進行開發。但由於當時人們對編譯理論了解不多,開發工作變得既復雜又艱苦。與此同時,Noam Chomsky開始了他對自然語言結構的研究。他的發現最終使得編譯器的結構異常簡單,甚至還帶有了一些自動化。Chomsky的研究導致了根據語言文法的難易程度以及識別它們所需要的演算法來對語言分類。正如Chomsky架構(Chomsky Hierarchy),它包括了文法的四個層次:0型文法、1型文法、2型文法和3型文法,且其中的每一個都是其前者的特殊情況。2型文法(或上下文無關文法)被證明是程序設計語言中最有用的,而且今天它已代表著程序設計語言結構的標准方式。分析問題(parsing problem,用於上下文無關文法識別的有效演算法)的研究是在60年代和70年代,它相當完善的解決了這個問題。它已是編譯原理中的一個標准部分。
有限狀態自動機(Finite Automation)和正則表達式(Regular Expression)同上下文無關文法緊密相關,它們與Chomsky的3型文法相對應。對它們的研究與Chomsky的研究幾乎同時開始,並且引出了表示程序設計語言的單詞的符號方式。
人們接著又深化了生成有效目標代碼的方法,這就是最初的編譯器,它們被一直使用至今。人們通常將其稱為優化技術(Optimization Technique),但因其從未真正地得到過被優化了的目標代碼而僅僅改進了它的有效性,因此實際上應稱作代碼改進技術(Code Improvement Technique)。
當分析問題變得好懂起來時,人們就在開發程序上花費了很大的功夫來研究這一部分的編譯器自動構造。這些程序最初被稱為編譯器的編譯器(Compiler-compiler),但更確切地應稱為分析程序生成器(Parser Generator),這是因為它們僅僅能夠自動處理編譯的一部分。這些程序中最著名的是Yacc(Yet Another Compiler-compiler),它是由Steve Johnson在1975年為Unix系統編寫的。類似的,有限狀態自動機的研究也發展了一種稱為掃描程序生成器(Scanner Generator)的工具,Lex(與Yacc同時,由Mike Lesk為Unix系統開發)是這其中的佼佼者。
在20世紀70年代後期和80年代早期,大量的項目都貫注於編譯器其它部分的生成自動化,這其中就包括了代碼生成。這些嘗試並未取得多少成功,這大概是因為操作太復雜而人們又對其不甚了解。
編譯器設計最近的發展包括:首先,編譯器包括了更加復雜演算法的應用程序它用於推斷或簡化程序中的信息;這又與更為復雜的程序設計語言的發展結合在一起。其中典型的有用於函數語言編譯的Hindley-Milner類型檢查的統一演算法。其次,編譯器已越來越成為基於窗口的交互開發環境(Interactive Development Environment,IDE)的一部分,它包括了編輯器、連接程序、調試程序以及項目管理程序。這樣的IDE標准並沒有多少,但是對標準的窗口環境進行開發已成為方向。另一方面,盡管在編譯原理領域進行了大量的研究,但是基本的編譯器設計原理在近20年中都沒有多大的改變,它正迅速地成為計算機科學課程中的中心環節。
在20世紀90年代,作為GNU項目或其它開放源代碼項目標一部分,許多免費編譯器和編譯器開發工具被開發出來。這些工具可用來編譯所有的計算機程序語言。它們中的一些項目被認為是高質量的,而且對現代編譯理論感興趣的人可以很容易的得到它們的免費源代碼。
大約在1999年,SGI公布了他們的一個工業化的並行化優化編譯器Pro64的源代碼,後被全世界多個編譯器研究小組用來做研究平台,並命名為Open64。Open64的設計結構好,分析優化全面,是編譯器高級研究的理想平台。
編譯器相關專業術語: 1. compiler編譯器;編譯程序 2. on-line compiler 連線編譯器 3. precompiler 預編譯器 4. serial compiler 串列編譯器 5. system-specific compiler 特殊系統編譯器 6. Information Presentation Facility Compiler 信息展示設施編譯器 7. Compiler Monitor System 編譯器監視系統
Ⅵ 設計一個中間代碼編譯器
int main()
{
string s;
cout<<"輸入程序,以「#」作為結束標志。"<<endl;
cin >> s;
translate(s);
ofstream coutf;
coutf.open("詞法.txt");
if(!coutf)
{ cout<<"Can not open input file:詞法.txt !"<<endl;
return 0;
}
int num;
turn=0;
num=buffer()-1; //單詞個數-1
int x=0;//計識別的單詞的個數
for(turn=1;turn<=num;turn++)//總循環,ch存放剛讀入的字元,strtoken[]存放已識別的標志付或保留字,turn是數組str[]的下標
{
ch=GetChar(turn);
ch=GetBC(ch);
if(IsLetter(ch))
{
while(IsLetter(ch)&&turn<=num||IsDigit(ch)&&turn<=num)
{
Concat();
ch=GetChar(++turn);
}
strToken[n]='\0';
ch=NULL;//此ch不是標志符中的符號
turn=turn-1;
kind=Reserve();
record[x]=new Word; record[x]->sort=kind;
coutf<<"(";
for(int i=0;i<n;i++)
{
record[x]->word[i]=strToken[i];
coutf<<record[x]->word[i];//輸出識別的標志符或保留字
}
coutf<<","<<kind<<")"<<endl;
record[x]->word[i]='\0';
clear();
x++;
}
else if(IsDigit(ch))
{
while(IsDigit(ch)&&turn<=num)
{
Concat();
ch=GetChar(++turn);
}
ch=NULL;
turn=turn-1;
kind=7;//如果是數字,則kind=7
record[x]=new Word;
record[x]->sort=kind;//將kind的值保存到sort
coutf<<"(";
for(int i=0;i<n;i++)
{
record[x]->word[i]=strToken[i];
coutf<<record[x]->word[i];
}
coutf<<","<<kind<<")"<<endl;
record[x]->word[i]='\0';
clear();x++;
}
else if(ch=='=')
{
kind=8;
record[x]=new Word;
record[x]->word[0]='=';
record[x++]->sort=kind;
coutf<<"(:=,"<<kind<<")"<<endl;
}
else
coutf<<"error input!"<<endl;
}
//////////////////////*語法分析*////////////////
int ana[MAX];//存放詞法分析得到的單詞序列的編號的序列
int m;
for(m=0;m<x;m++)
{
ana[m]=record[m]->sort;//將sort作為數組保存起來
}
int j=0;
ofstream coutp;
coutp.open("語法.txt");
if(!coutf)
{ cout<<"Can not open input file:語法.txt !"<<endl;
return 0;
}
Ⅶ 在程序設計中編輯器與編譯器分別是什麼意思啊謝謝
編輯器,是指對文本進行編輯的軟體,用來寫程序的。記事本,WORD(需保存為純文本),都可算是編輯器。現在大多數編程工具也都自帶有編輯器。
編譯器,是一種翻譯軟體。它將用一種語言編寫的程序,翻譯成另一種語言的程序,而保持功能不變。一般編譯器多數是將高級語言翻譯成低級語言。
Ⅷ 編譯器設計的作者簡介
作者:(印度)查托帕答雅 (Santanu chattopadhyay) 譯者:徐驍棟 王海濤
santanu Chattopadhy擁有計算機科學與工程專業博士學位,目前是IEEE(USA)會員,IIT Kha ragpur工學院的電子和電子通信工程系的副教授,曾擔任過IIT Guwahati學院的計算機科學與工程系的副教授。Chattopadhyay博士在IEEETransactions on computers、Transaction on CAD等國際期刊上發表了60多篇研究論文,曾協助完成了很多國際會議委員會的項目,其主要興趣在於編譯器、VLSf電路設計和測試學。另外,他還曾與他人合著了書