程序编译器设计
Ⅰ 编译器设计中通常用什么描述程序设计语言的语法结构
程序设计语言用于书写计算机程序的语言。
语言的基础是一组记号和一组规则,根据规则由记号构成的记号串的总体就是语言。
在程序设计语言中,这些记号串就是程序。
程序设计语言有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电路设计和测试学。另外,他还曾与他人合着了书