编译器工作的五个步骤(在编译过程中,进行类型分析和检查是( )阶段一个主要工作)
本文目录
- 在编译过程中,进行类型分析和检查是( )阶段一个主要工作
- java程序运行的五个步骤
- 汇编编译器的工作和生成可执行文件的执行过程是怎样的
- 高级语言的编译过程,经过哪几个步骤
- 编译器有什么用
- 编译程序都有哪些
- 编译器本身是如何进行测试的
- 编译器的工作方法
在编译过程中,进行类型分析和检查是( )阶段一个主要工作
【答案】:C一般编译程序工作过程包括词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成,以及出错处理和符号表管理。词法分析阶段是编译过程第一阶段,这个阶段任务是对源程序从前到后(从左到右)逐个字符地扫描,从中识别出一个个“单词”符号。语法分析任务是在词法分析基础上,根据语言语法规则将单词符号序列分解成各类语法单位,如“表达式”、“语句”和“程序”等。语义分析阶段主要分析程序中各种语法结构语义信息,包括检查源程序是否包含语义错误,并收集类型信息供后面代码生成阶段使用。只有语法和语义都正确源程序才能被翻译成正确目标代码。由于编译器将源程序翻译成中间代码工作是机械、按固定模式进行,因此,生成中间代码往往在时间上和空间上有很大浪费。当需要生成高效目标代码时,就必须进行优化。
java程序运行的五个步骤
1、Java程序从源文件创建到程序运行要经过两大步骤:1、源文件由编译器编译成字节码(ByteCode) 2、字节码由java虚拟机解释运行。因为java程序既要编译同时也要经过JVM的解释运行,所以说Java被称为半解释语言( "semi-interpreted" language)。
第一步(编译): 创建完源文件之后,程序会先被编译为.class文件。Java编译一个类时,如果这个类所依赖的类还没有被编译,编译器就会先编译这个被依赖的类,然后引用,否则直接引用,这个有点像make。如果java编译器在指定目录下找不到该类所其依赖的类的.class文件或者.java源文件的话,编译器话报“cant find symbol”的错误。
编译后的字节码文件格式主要分为两部分:常量池和方法字节码。常量池记录的是代码出现过的所有token(类名,成员变量名等等)以及符号引用(方法引用,成员变量引用等等);方法字节码放的是类中各个方法的字节码。
第二步(运行):java类运行的过程大概可分为两个过程:1、类的加载 2、类的执行。需要说明的是:JVM主要在程序第一次主动使用类的时候,才会去加载该类。也就是说,JVM并不是在一开始就把一个程序就所有的类都加载到内存中,而是到不得不用的时候才把它加载进来,而且只加载一次。
2、下面是程序运行的详细步骤:
在编译好java程序得到Main.class文件后,在命令行上敲java Main。系统就会启动一个jvm进程,jvm进程从classpath路径中找到一个名为Main.class的二进制文件,将Main的类信息加载到运行时数据区的方法区内,这个过程叫做Main类的加载。
然后JVM找到Main的主函数入口,开始执行main函数。
main函数的第一条命令是Animal animal = new Animal("Puppy");就是让JVM创建一个Animal对象,但是这时候方法区中没有Animal类的信息,所以JVM马上加载Animal类,把Animal类的类型信息放到方法区中。
加载完Animal类之后,Java虚拟机做的第一件事情就是在堆区中为一个新的Animal实例分配内存, 然后调用构造函数初始化Animal实例,这个Animal实例持有着指向方法区的Animal类的类型信息(其中包含有方法表,java动态绑定的底层实现)的引用。
当使用animal.printName()的时候,JVM根据animal引用找到Animal对象,然后根据Animal对象持有的引用定位到方法区中Animal类的类型信息的方法表,获得printName()函数的字节码的地址。
开始运行printName()函数。
汇编编译器的工作和生成可执行文件的执行过程是怎样的
汇编器,先生成目标代码,其中有一些数据,代码,还有一些表(重定位表等)然后调用链接器,链接成可执行文件。早期的汇编器,只负责生成目标代码,链接器是一个独立的程序。需要手工分别作汇编,和链接现在的汇编器,可以合并这两步,直接调用链接器,是直接生成可执行文件。伪指令是汇编命令,是用来操作汇编器的命令。不是指令,不生成对应的代码。CPU只能识别二进制代码,数据通过加载器的加载,或者烧写器的烧写,初始化,有些代码,会在加载时重新定位。代码也可能是烧写的,比如BIOS代码。对于PC:操作系统的启动代码,是由BIOS中的专门代码;从磁盘的固定位置,加载在内存的固定位置的。操作系统的其他部分,是由操作系统的启动代码加载的。
高级语言的编译过程,经过哪几个步骤
开发C程序有四个步骤:、编译、连接和运行。
任何一个体系结构处理器上都可以使用C语言程序,只要该体系结构处理器有相应的C语言编译器和库,那么C源代码就可以编译并连接到目标二进制文件上运行。
1、预处理:导入源程序并保存(C文件)。
2、编译:将源程序转换为目标文件(Obj文件)。
3、链接:将目标文件生成为可执行文件(EXE文件)。
4、运行:执行,获取运行结果的EXE文件。
扩展资料:
将C语言代码分为程序的几个阶段:
1、首先,对源代码文件进行测试。以及相关的头文件,比如Stdio。H.CPP预处理为。我的文件。预编译。该文件不包含任何宏定义,因为所有宏都已展开,且包含的文件已插入。我提起。
2、编译过程是对预处理后的文件进行词法分析、语法分析、语义分析和优化,生成相应的汇编代码文件。这个过程通常是整个程序的核心部分,也是最复杂的过程之一。
3、汇编程序不直接输出可执行文件,而是输出目标文件。汇编程序可以调用LD来生成可运行的可执行程序。也就是说,您需要链接到大量文件以获得最终可执行文件“a.out”。
4、在链接过程中,其他目标文件中定义的函数调用指令需要重新调整,而其他目标文件中定义的变量也存在同样的问题。
编译器有什么用
编译器是一种计算机程序,它会将某种编程语言写成的源代码转换成另一种编程语言。它主要的目的是将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序,翻译为计算机能解读、运行的低阶机器语言的程序,也就是可执行文件。编译器将原始程序作为输入,翻译产生使用目标语言的等价程序。源代码一般为高级语言,如Pascal、C、C++、C# 、Java等,而目标语言则是汇编语言或目标机器的目标代码,有时也称作机器代码。一个现代编译器的主要工作流程如下:源代码→ 预处理器→ 编译器→ 汇编程序→ 目标代码→ 链接器→ 可执行文件,最后打包好的文件就可以给电脑去判读运行了。
编译程序都有哪些
编译程序有哪些主要构成成分?它们各自的主要功能是什么? 数据结构 分析和综合时所用的主要数据结构,包括符号表、 常数表和中间语言程序。 符号表由源程序中所用的标识符连同它们的属性组成, 其中属性包括种类 (如变量、 数组、 结构、 函数、 过程等)、类型(如整型、实型、字符串、复型、标号等),以 及目标程序所需的其他信息。常数表由源程序中用的常数组成, 其中包括常数的机内表示, 以及分配给它们的目标程序地址。 中 间语言程序是将源程序翻译为目标程序前引入的一种中间形式 的程序, 其表示形式的选择取决于编译程序以后如何使用和加工 它。 常用的中间语言形式有波兰表示、 三元组、 四元组以及间接 三元组等。 分析部分 源程序的分析是经过词法分析、语法分析和语 义分析三个步骤实现的。 词法分析由词法分析程序 (又称为扫描 程序)完成,其任务是识别单词(即标识符、常数、保留字,以 及各种运算符、标点符号等)、造符号表和常数表,以及将源程 序换码为编译程序易于分析和加工的内部形式。 语法分析程序是 编译程序的核心部分, 其主要任务是根据语言的语法规则, 检查源程序是否合乎语法。 如不合乎语法, 则输出语法出错信息; 如 合乎语法, 则分解源程序的语法结构, 构造中间语言形式的内部 程序。 语法分析的目的是掌握单词是怎样组成语句的, 以及语句 又是如何组成程序的。 语义分析程序是进一步检查合法程序结构 的语义正确性, 其目的是保证标识符和常数的正确使用, 把必要 的信息收集和保存到符号表或中间语言程序中, 并进行相应的语 义处理。 综合部分 综合阶段必须根据符号表和中间语言程序产生 出目标程序,其主要工作包括代码优化、存储分配和代码生成。 代码优化是通过重排和改变程序中的某些操作, 以产生更加有效 的目标程序。 存储分配的任务是为程序和数据分配运行时的存储 单元。 代码生成的主要任务是产生与中间语言程序符等价的目标 程序, 顺序加工中间语言程序, 并利用符号表和常数表中的信息 生成一系列的汇编语言或机器语言指令。 结构 编译过程分为分析和综合两个部分, 并进一步划分为 词法分析、语法分析、 语义分析、 代码优化、存储分配和代码 生成等六个相继的逻辑步骤。 这六个步骤只表示编译程序各部分 之间的逻辑联系, 而不是时间关系。 编译过程既可以按照这六个 逻辑步骤顺序地执行, 也可以按照平行互锁方式去执行。 在确定 编译程序的具体结构时, 常常分若干遍实现。 对于源程序或中间 语言程序, 从头到尾扫视一次并实现所规定的工作称作一遍。 每 一遍可以完成一个或相连几个逻辑步骤的工作。 例如, 可以把词 法分析作为第一遍; 语法分析和语义分析作为第二遍; 代码优化 和存储分配作为第三遍; 代码生成作为第四遍。 反之, 为了适应 较小的存储空间或提高目标程序质量, 也可以把一个逻辑步骤的 工作分为几遍去执行。 例如, 代码优化可划分为代码优化准备工 作和实际代码优化两遍进行。 一个编译程序是否分遍 , 以及如何分遍 , 根据具体情况而定。 其判别标准可以是存储容量的大小、 源语言的繁简、 解题范围的 宽窄, 以及设计、 编制人员的多少等。 分遍的好处是各遍功能独 立单纯、相互联系简单、逻辑结构清晰、优化准备工作充分。缺 点是各遍之中不可避免地要有些重复的部分, 而且遍和遍之间要 有交接工作,因之增加了编译程序的长度和编译时间。 一遍编译程序是一种极端情况, 整个编译程序同时驻留在内 存 , 彼此之间采用调用转接方式连接在一起 ( 图 2) 。当语法分析 程序...... c编译程序是什么? D 编译程序 这是一类很重要的语言处理程序,它把高级语言(如FORTRAN、COBOL、Pascal、C等)源程序作为输入,鸡行翻译转换,产生出机器语言的目标程序,然后再让计算机去执行这个目标程序,得到计算结果。 实在不明白用排除法 编译程序是什么意思啊 你是想知道这个概念的意思么,有点笼统不好给你讲的。你说的编译程序是编程么,编程就是驾驭机器 编译程序是什么意思?编译是什么意思? 把用高级程序设计语言书写的源程序,翻译成等价的计算机汇编语言或机器语言书写的目标程序的翻译程序。编译程序属于采用生成性实现途径实现的翻译程序。它以高级程序设计语言书写的源程序作为输入,而以汇编语言或机器语言表示的目标程序作为输出。编译出的目标程序通常还要经历运行阶段,以便在运行程序的支持下运行,加工初始数据,算出所需的计算结果。编译程序的实现算法较为复杂。这是因为它所翻译的语句与目标语言的指令不是一一对应关系,而是一多对应关系;同时也因为它要处理递归调用、动态存储分配、多种数据类型,以及语句间的紧密依赖关系。但是,由于高级程序设计语言书写的程序具有易读、易移植和表达能力强等特点,编译程序广泛地用于翻译规模较大、复杂性较高、且需要高效运行的高级语言书写的源程序。 目前最常用的作C语言编译程序的软件是什么? 如果你用Turbo C的话,不需要太高配置,基本的DOS能跑的系统他就能跑。 如果你用VC++6.0跑的话,那么最低也得赛扬II一级别,256M内存,然后WIN98系统,硬盘至少2G空间 如果你用Visual Studio200X跑的话,建议奔腾四的机器,而且内存要大,至少512M,XP环境,如果要加载SQL SERVER的话,内存还要更大,至少1G,否则服务挂不动,而且硬盘最好留5G空间,可以安装一些MSDN。方便查阅。 其次,还有个GCC编译器,可以下载一个环境,配置一下,这是LINUX下的C编译器,效率很高,而且出来的OBJ没有垃圾数据,推荐,这个跟TC环境差不多 目前主流的C语言编译软件是什么 vc++ 6.0比较老 但是适合初学者学习 初学者足够了 vs 2010 、vs 2012不错, 软件稍大, eclipse 也可以 不过不太常用 如果是初学者建议 vc++6.0 或者 vs 2012 编译程序的优点是什么啊?解释程序的优点又是什么? 5、编译程序和解释程序 高级语言程序同样要翻译成二进制程序才能执行。 耿级语言的两种执行方式: (1)解释方式:翻译一条,执行一条 特点:慢,但占空间小 (2)编译方式:翻译成目标程序,然后运行目标程序 特点:快,但占用空间大 (考点) 编译软件具体是什么啊?为属于系统软件啊 以上回答是什么乱七八糟的水平! 计算机常识,操作系统,数据库管理系统,编译软件都属于系统软件。 没有为什么,这就是个定义。规定就是这样。原因我想可能是因为这些软件都没有特定的应用吧。。都是为了辅助其它应用软件而存在。所以定义为系统软件。 编译原理---程序执行的两种方式是什么 解释执行和编译执行,前者过程简单,后者执行速度快
编译器本身是如何进行测试的
编译器最重要的性质就是保证语义的正确。比如,从高级语言翻译到机器指令之后,指令必须正确的表达原来程序的意思。所以一般编译器测试都包含一些源程序,用来覆盖可能出现的各种情况。基本的原则是:原来程序的结果 = 编译后机器指令运行的结果。机器指令运行的结果很容易知道,运行一下就知道了。可是原来程序的结果你怎么知道呢?为了解决这个“原来程序语义”的问题,最好是写一个解释器,准确无误的表达原来的代码的语义。所以我们的要求就是:高级语言解释器(源程序) = 机器执行(机器代码)由于处理器其实就是一个用来执行机器代码的解释器,这里有一个很美好的对称关系:interp1(L1) = interp2(L2)另外还有一个问题,就是编译器一般需要经过多个转化步骤(叫做 pass)才能最后编译为机器指令。比如,L2 = pass1(source)L3 = pass2(L2)L4 = pass3(L3)Ln = passN(Ln-1)machine_code = codegen(Ln)由于源程序经过了很多步骤猜得到最后的机器指令,如果你使用上面的公式,就会出现以下一些情况:1. 知道结果错了,但是却不知道到底是哪一个 pass 错了。2. 结果没有错,但是中间却有 pass 实际上是错的。但是由于之前的 pass 把输入程序的一些结构给“优化”掉了,所以错的那个 pass 其实没能得到触发错误的那个数据结构。所以测试没能发现错误。如果以后前面的那个 pass 被修改,错误就会暴露出来。这是非常难以发现的潜伏的危险。为了防止这些情况出现,一些编译器(比如 Chez Scheme 和 Kent Dybvig 的课程编译器)使用了对每一个 pass 进行测试的做法。具体的方法就是为每一个中间语言都写一个解释器,把这语言的语义完全的表示出来。这样我们就需要检查一组等式:L2 = pass1(source)高级语言编译器(源程序) = interp2(L2) // 测试 pass1 的正确性L3 = pass2(L2)interp2(L2) = interp3(L3) // 测试 pass2 的正确性这样一来我们就能独立的判断每一个 pass 的正确性了。这些是基本的语义测试原理。另外除了语义,可能还有一些“表面”一些的测试,它们看代码本身,而不只看它的语义。比如尾递归优化的测试应该确保输出程序的尾递归得到正确的处理,等等。这些是语义测试检查不到的,因为尾递归没有正确处理的程序大部分也能输出正确的结果。普通的单元测试方法也可以用来测试一些编译器里的辅助函数,但那些不是编译器特有的,所以就不讲了。另外,就像所有测试的局限性一样,你没法枚举所有可能出现的输入,所以以上的测试方法其实也不能保证编译器的完全正确。
编译器的工作方法
首先编译器进行语法分析,也就是要把那些字符串分离出来。然后进行语义分析,就是把各个由语法分析分析出的语法单元的意义搞清楚。最后生成的是目标文件,也称为obj文件。再经过链接器的链接就可以生成最后的EXE文件了。有些时候需要把多个文件产生的目标文件进行链接,产生最后的代码。这一过程称为交叉链接。
本文相关文章:
net混淆工具(.net软件,用什么软件加密狗加密,能防止代码反编译)
2024年9月7日 10:05
java编译找不到符号怎么解决(Java编译错误:找不到符号)
2024年9月6日 18:45
编译和解释的区别是什么?Java源文件和编译后的文件扩展名分别为
2024年9月1日 10:30
tc编译器怎么用啊,有知道的没?TC3.0、TC2.0、VC6.0分别什么区别阿
2024年8月27日 06:40
compileerror的意思(一个程序编译通过了 但在acm系统下提示compile error)
2024年8月24日 15:40
dll文件可以看到源代码吗(问一下高手 c++dll文件如何反编译 看源代码啊)
2024年8月23日 15:15
excel activex控件(Excel插入Activex控件,提示编译错误,缺少:语句结束代码有问题吗)
2024年8月14日 15:50
python编译成二进制(python的程序可以编译成二进制可执行文件么)
2024年8月7日 00:00
vs2019编译器下载(使用vs2019如何只编译一个c++文件)
2024年8月1日 01:55
函数指针优化(Debug编译通过,Release编译报错,为什么)
2024年7月27日 19:25
有哪些防止反编译 Java 类库 jar 文件的办法?android app怎么防止反编译
2024年7月19日 04:45
strchr函数用法返回值(C中的strchr函数怎么使用 我百度上找的代码都过不了编译语言)
2024年7月12日 04:17
qt添加msvc编译器(QT中如何把msvc编译器换成mingw编译器)
2024年7月12日 00:14
vbscript学习工具(微软公司出品的一套可视化编程工具, 语法基于Basic. 脚本语言, 就是不编译成二进制)
2024年7月11日 22:11
更多文章:
哪几款CRM系统免费又好使用的呢?有哪些免费的轻量级在线CRM系统
2024年5月6日 04:29
疾风剑豪bug(LOL中,看到有网友录制亚索新BUG无CD连Q,我对线时却哭了,具体怎么操作)
2024年7月23日 23:21
solidworks2012安装方法(如何安装solidworks201264位)
2024年5月5日 15:35
台式电脑没有无线网卡怎么连wifi(台式电脑没有无线网卡能用无线网吗)
2024年7月2日 10:40
autodesksmoke(视频剪切,特效,合并,转换,哪个软件好用、易学)
2024年7月2日 23:57
起点中文网手机版(起点中文网手机版为什么显示有这么多评论但是点进去却只有那两条如何看到全部的评论)
2024年7月2日 12:01
粉末游戏鸟玩家有什么用?App Store里面有什么好玩的体育类手机游戏
2024年5月10日 01:22