
C、D
解释程序是一种语言处理程序,在词法、语法和语义分析方面与编译程序的工作原理基本相同,但在运行用户程序时,它直接执行源程序或源程序的内部形式(中间代码)。因此,解释程序并不产生目标程序,这是它和编译程序的主要区别。
解释程序它逐条地取出源程序中的语句,边解释,边执行。编译的话就是只要编译一次,下次再执行就不用再解释了。
扩展资料:
解释程序的工作方式非常适于人通过终端设备与计算机会话,如在终端上打一条命令或语句,解释程序就立即将此语句解释成一条或几条指令并提交硬件立即执行且将执行结果反映到终端,从终端把命令打入后,就能立即得到计算结果。
这的确是很方便的,很适合于一些小型机的计算问题。但解释程序执行速度很慢,例如源程序中出现循环,则解释程序也重复地解释并提交执行这一组语句,这就造成很大浪费。
对源程序边解释翻译成机器代码边执行的高级语言程序。所以,解释程序的功能是:解释执行高级语言程序。由于它的方便性和交互性较好,早期一些高级语言采用这种方式,如BASIC、dBASE。但它的弱点是运行效率低,程序的运行依赖于开发环境,不能直接在 *** 作系统下运行。
参考资料:
百度百科-解释程序
编译程序和解释程序2006年10月16日
星期一
14:26如果一个程序能够把某一种语言程序(称为源语言程序)改造成为另一种语言程序(称为目标语言程序),则这亲戚的程序称为“翻译程序”。如果源语言是“高级语言”(诸如FORTRAN、PASCAL等等),而目标语言是“低级语言”(如汇编语言或机器语言),则这样的翻译程序称为“编译程序”。
现在的计算机尚不能直接执行高级语言程序。执行一个高级语言程序大体上要分两步:第一步,把高级语言的源程序编译成低级语言的目标程序;第二步,运行这个目标程序。编译程序的典型工作过程是:输入源程序,对它进行加工处理,输出目标程序。加工处理是非常复杂的过程,它又可划分成以下几个阶段:源程序→词法分析→语法分析→产生中间代码→优化→目标代码生成→目标程序。
第一阶段是词法分析。承担词法分析任务的程序称为“扫描器”。词法分析的任务是:对构成源程序的字符串进行扫描和分解。第二阶段是语法分析。承担语法分析任务的程序称为“分析器”。语法分析的任务是:根据语法规则,把描扫器所提供的结果分析成各类语法范畴。第三阶段是产生中间代码。承担产生中间代码任务的程序称为“中间代码产生器”。其任务是:按照语法分析器所识别出的语法范畴,产生相应的中间指令。第四阶段是优化,即代码优化。优化的任务是对前阶段产生的中间代码进行加工变换,以便使生成的目标程序,能运行得更快更省(省内存)。第五阶段是目标代码生成。这一阶段的任务是:按照优化后的中间代码和其它有关信息生成目标程序。这种目标程序可以在计算机上直接执行。执行这个目标程序,就可得到一个高级语言程序的结果。
我们知道,所谓翻译程序是这样一种程序,它能够把用甲语言写的程序翻译成与之等价的用乙语言写的程序。这里的甲语言是该翻译程序的源语言,而乙语言则为该翻译程序的目标语言。对于编译程序而言,源程序是被加工的对象,而目标程序是加工后的结果。
在计算机上执行用某种高级语言写的源程序,通常有两种方式:一是编译执行方式,二是解释执行方式。
采用编译执行方式执行源程序时要分两大步:编译和运行。编译中的加工处理过程又可分为五个阶段。
解释执行方式与编译执行方式是不同的,其根本区别在于:编译方式把源程序的执行过程严格地分成两大步:编译和运行。即先把源程序全部翻译成目标代码,然后再运行此目标代码,获执行结果。解释方式则不然。它是按照源程序中语句的动态顺序,直接地逐句进行分析解释,并立即执行。所以,解释程序是这样一种程序,它能够按照源程序中语句的动态顺序,逐句地分析解释并执行,直至源程序结束。
与编译程序一样,解释程序也与源语言及计算机有关。同一台计算机上不同语言的解释程序是不同的;同一种语言在不同的计算机上的解释程序也可能不同。同一种高级语言的源程序,它可以采用解释执行方式,也可以采用编译执行方式。例如,BASIC语言有解释BASIC和编译BASIC之分。前者执行速度慢;后者执行速度快。编译程序和解释程序都属于系统程序。
#include <iostream>
#include <ctypeh>
#include <fstream>
#include <stringh>
#include <malloch>
using namespace std;
ifstream fp("sourcetxt",ios::in);
char cbuffer;
char key[13]={"if","else","for","while","do","return","break","continue","int","void"
,"main","const","printf"}; //关键字
char border[7]={ "," , ";" , "{" , "}" , "(" , ")" ,"//"}; //分界符
char arithmetic[6]={"+" , "-" , "" , "/" , "++" , "--"}; //运算符
char relation[7]={"<" , "<=" , "=" , ">" , ">=" , "==" ,"!="}; //关系运算符
char lableconst[80]; //标识符
int constnum=40;
int lableconstnum=0;
int linenum=1; //统计常数和标识符数量
int search(char searchchar[],int wordtype)
{
int i=0,t=0;
switch (wordtype)
{
case 1:
{ for (i=0;i<=12;i++) //关键字
{
if (strcmp(key[i],searchchar)==0)
return(i+1);
}
return(0);}
case 2:
{
for (i=0;i<=6;i++) //分界符
{
if (strcmp(border[i],searchchar)==0)
return(i+1);
}
return(0);
}
case 3:
{
for (i=0;i<=5;i++) //运算符
{
if (strcmp(arithmetic[i],searchchar)==0)
return(i+1);
}
return(0);
}
case 4:
{
for (i=0;i<=6;i++) //关系运算符
{
if (strcmp(relation[i],searchchar)==0)
return(i+1);
}
return(0);
}
case 5:
{
for (t=40;t<=constnum;t++) //常数
{
if (strcmp(searchchar,lableconst[t])==0)//判断该常数是否已出现过
return(t+1);
}
lableconst[t-1]=(char )malloc(sizeof(searchchar));//为新的元素分配内存空间
strcpy(lableconst[t-1],searchchar);//为数组赋值lableconst指针数组名
constnum++; //常数个数自加
return(t);
}
case 6:
{
for (i=0;i<=lableconstnum;i++)
{
if (strcmp(searchchar,lableconst[i])==0) //判断标识符是否已出现过
return(i+1);
}
lableconst[i-1]=(char )malloc(sizeof(searchchar));
strcpy(lableconst[i-1],searchchar);
lableconstnum++; //标识符个数自加
return(i);
}
default:cout<<"错误!";
}
}
char alphaprocess(char buffer) //字符处理过程
{
int atype;
int i=-1;
char alphatp[20];
while ((isalpha(buffer))||(isdigit(buffer)))
//这两个函数分别是判字符和判数字函数位于ctypeh中
{
alphatp[++i]=buffer;
fpget(buffer);
}
alphatp[i+1]='\0';//在末尾添加字符串结束标志
if (atype=search(alphatp,1))
cout<<"linenum: "<<linenum<<" String= "<<alphatp<<"\t\t\t"<<"关键字"<<endl;
else
{
atype=search(alphatp,6); //标识符
cout<<"linenum: "<<linenum<<" String= "<<alphatp<<"\t\t\t"<<"标识符"<<endl;
}
return(buffer);
}
char digitprocess(char buffer) //数字处理过程
{
int i=-1;
char digittp[20];
int dtype;
while ((isdigit(buffer)))
{
digittp[++i]=buffer;
fpget(buffer);
}
digittp[i+1]='\0';
dtype=search(digittp,5);
cout<<"linenum: "<<linenum<<" String= "<<digittp<<"\t\t\t"<<"数据"<<endl;
return(buffer);
}
char otherprocess(char buffer) //分界符、运算符、逻辑运算符、等
{
int i=-1;
char othertp[20];
int otype,otypetp;
othertp[0]=buffer;
othertp[1]='\0';
if (otype=search(othertp,3))
{
fpget(buffer);
othertp[1]=buffer;
othertp[2]='\0';
if (otypetp=search(othertp,3)) //判断该运算符是否是
//由连续的两个字符组成的
{
cout<<"linenum: "<<linenum<<" String= "<<othertp<<"\t\t\t"<<"运算符"<<endl;
fpget(buffer);
goto out;
}
else //单字符逻辑运算符
{
othertp[1]='\0';
cout<<"linenum: "<<linenum<<" String= "<<othertp<<"\t\t\t"<<"逻辑运算符"<<endl;
goto out;
}
}
if (otype=search(othertp,4)) //关系运算符
{
fpget(buffer);
othertp[1]=buffer;
othertp[2]='\0';
if (otypetp=search(othertp,4)) //判断该关系运算符是否是
//由连续的两个字符组成的
{
cout<<"linenum: "<<linenum<<" String= "<<othertp<<"\t\t\t"<<"关系运算符"<<endl;
fpget(buffer);
goto out;
}
else //单字符逻辑运算符
{
othertp[1]='\0';
cout<<"linenum: "<<linenum<<" String= "<<othertp<<"\t\t\t"<<"逻辑运算"<<endl;
goto out;
}
}
if (buffer=='!') //"=="的判断
{
fpget(buffer);
if (buffer=='=')
//cout<<"!= (2,2)\n";
fpget(buffer);
goto out;
}
else
{
if (otype=search(othertp,2)) //分界符
{
cout<<"linenum: "<<linenum<<" String= "<<othertp<<"\t\t\t"<<"分界符"<<endl;
fpget(buffer);
goto out;
}
}
if ((buffer!='\n')&&(buffer!=' '))
cout<<"错误!,字符非法"<<"\t\t\t"<<buffer<<endl;
fpget(buffer);
out: return(buffer);
}
void main()
{
int i;
for (i=0;i<=50;i++)
{
lableconst[i]=" ";//用于保存标识符
}
if (!fp)
cout<<"文件打开错误!!"<<endl;
else
{
fpget (cbuffer);
while (!fpeof())
{
if(cbuffer=='\n')
{
linenum++;
fpget(cbuffer);
}
else if (isalpha(cbuffer))
{
cbuffer=alphaprocess(cbuffer);
}
else if (isdigit(cbuffer))
{
cbuffer=digitprocess(cbuffer);
}
else
cbuffer=otherprocess(cbuffer);
}
}
cout<<"标识符个数是:"<<lableconstnum<<"分别是"<<endl;
i=0;
while(i<lableconstnum)
{
cout<<lableconst[i++]<<" ";
}
cout<<endl;
cout<<"完成\n";
getchar();
}
步骤如下:
编写设计环境,良好的编程习惯和风格不仅可以使程序代码更易于读懂和修改,更重要的是,它可以使程序的结构更加合理,有助于提高程序的执行效率。
结构设计:也就是对程序的整体框架进行设计,设计出我们需要使用的模块等等,并画出流程图。
用户界面设计:设计出用于与用户交互的输入输出界面。
代码设计:在这个步骤中,我们要进行代码的编写。
调试:对程序中正在发生或可能发生的各种错误进行处理。
维护:对程序进行升级,对原有错误进行修改。
程序执行原理:
程序设计语言编写的源程序转换到机器目标程序的方式有两种:解释方式和编译方式。
解释方式下,计算机对高级语言书写的源程序一边解释一边执行,不能形成目标文件和执行文件。
编译方式下,首先通过一个对应于所用程序设计语言的编译程序对源程序进行处理,经过对源程序的词法分析、语法分析、语意分析、代码生成和代码优化等阶段将所处理的源程序转换为用二进制代码表示的目标程序。
然后通过连接程序处理将程序中所用的函数调用、系统功能调用等嵌入到目标程序中,构成一个可以连续执行的二进制执行文件。调用这个执行文件就可以实现程序员在对应源程序文件中所指定的相应功能。
词法分析时单词的识别根据构词规则识别单词。
1、词法分析的任务
词法分析是编译的第一个阶段,其任务是:从左至右逐个字符地对源程序(用高级语言编写的)进行扫描,产生一个个单词符号,把字符串形式的源程序改造成为单词符号串形式的中间程序。
2、词法分析器
执行词法分析的程序称为词法分析程序,也称为词法分析器或扫描器。词法分析器的功能是输入源程序,输出单词符号。
3、词法分析的两种处理结构
(1)把词法分析程序作为主程序。即,把词法分析与语法分析明显分开,由词法分析程序将字符串形式的源程序改造成单词符号串形式的中间程序,以这个中间程序作为语法分析程序的输入。在这种处理结构中,词法分析和语法分析实际上是分别实现的。
(2)把词法分析程序作为语法分析程序调用的子程序。在进行语法分析时,每当语法分析程序需要一个单词时,便调用词法分析程序,词法分析程序每一次调用便从字符串源程序中识别出一个单词交给语法分析程序。词法分析和语法分析实际上是交替进行的。
1文法简略,没有实现的部分,可以在此文法的基础上进行扩充,本程序的采用自顶向下的LL(1)文法。
2可以自动实现求First
集和
Follow
集。
3处终结符外(有些硬编码的成分),终结符的文法可以自定义,也就是说读者可以自定义文法。
4为方便理解,C语言的文法描述写成中文。
5程序将词法分析和语法分析结合起来,词法分析的结果作为语法分析的输入。
6最终结果在控制台显示的有:词法分析、First集、Follow集、Select集,在preciateResulttxt
中写入了语法分析结果,在preciateTabletxt
中写入了预测分析表。
7文法的词素之间必须有空格分开。
zjb在编程中无意义。编程的正确意义:为了使计算机能够理解人的意图,就必须将需解决的问题的思路、方法和手段通过计算机能够理解的形式告诉计算机。使得计算机能够根据人的指令去工作,完成某种特定的任务。
编译方式:经过对源程序的词法分析、语法分析、语意分析、代码生成和代码优化等阶段将所处理的源程序转换为用二进制代码表示的目标程序。
编译方式下
首先通过一个对应于所用程序设计语言的编译程序对源程序进行处理,经过对源程序的词法分析、语法分析、语意分析、代码生成和代码优化等阶段将所处理的源程序转换为用二进制代码表示的目标程序,通过连接程序处理将程序中所用的函数调用、系统功能调用等嵌入到目标程序中,构成一个可以连续执行的二进制执行文件。调用这个执行文件就可以实现程序员在对应源程序文件中所指定的相应功能。
百度百科-编程
以上就是关于下面是关于解释程序和编译程序的叙述,正确的是()全部的内容,包括:下面是关于解释程序和编译程序的叙述,正确的是()、急!!!!!!!!解释程序与编译程序有什么区别,各举例!!!!!!、编译原理词法分析程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)