导航:首页 > 源码编译 > 并不是所有编译器都有的过程

并不是所有编译器都有的过程

发布时间:2023-09-17 18:02:09

A. 简述将源程序编译成可执行程序的过程

一个源程序到一个可执行程序的过程:预编译、编译、汇编、链接。其中,编译是主要部分,其中又分为六个部分:词法分析、语法分析、语义分析、中间代码生成、目标代码生成和优化。

预编译:主要处理源代码文件中的以“#”开头的预编译指令。处理规则如下:

1、删除所有的#define,展开所有的宏定义。

2、处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。

3、处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。

4、删除所有的注释,“//”和“/**/”。

5、保留所有的#pragma 编译器指令,编译器需要用到他们,如:#pragma once 是为了防止有文件被重复引用。

6、添加行号和文件标识,便于编译时编译器产生调试用的行号信息,和编译时产生编译错误或警告是能够显示行号。

(1)并不是所有编译器都有的过程扩展阅读:

编译过程中语法分析器只是完成了对表达式语法层面的分析,语义分析器则对表达式是否有意义进行判断,其分析的语义是静态语义——在编译期能分期的语义,相对应的动态语义是在运行期才能确定的语义。

其中,静态语义通常包括:声明和类型的匹配,类型的转换,那么语义分析就会对这些方面进行检查,例如将一个int型赋值给int*型时,语义分析程序会发现这个类型不匹配,编译器就会报错。

B. 谁能简单阐述下java编译执行的过程

Java虚拟机(JVM)是可运行Java代码的假想计算机。

只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。

本文首先简要介绍从Java文件的编译到最终执行的过程,随后对JVM规格描述作一说明。

一.Java源文件的编译、下载、解释和执行

Java应用程序的开发周期包括编译、下载、解释和执行几个部分。

Java编译程序将Java源程序翻译为JVM可执行代码?字节码。

这一编译过程同C/C++的编译有些不同。

当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而产生的。

因此,在编译过程中,编译程序通过查表将所有对符号的引用转换为特定的内存偏移量,以保证程序运行。

Java编译器却不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保留在字节码中,由解释器在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址。

这样就有效的保证了Java的可移植性和安全性。

运行JVM字节码的工作是由解释器来完成的。

解释执行过程分三部进行:代码的装入、代码的校验和代码的执行。

装入代码的工作由"类装载器"(classloader)完成。

类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被其调用的类。

当类装载器装入一个类时,该类被放在自己的名字空间中。

除了通过符号引用自己名字空间以外的类,类之间没有其他办法可以影响其他类。

在本台计算机上的所有类都在同一地址空间内,而所有从外部引进的类,都有一个自己独立的名字空间。

这使得本地类通过共享相同的名字空间获得较高的运行效率,同时又保证它们与从外部引进的类不会相互影响。

当装入了运行程序需要的所有类后,解释器便可确定整个可执行程序的内存布局。

解释器为符号引用同特定的地址空间建立对应关系及查询表。

通过在这一阶段确定代码的内存布局,Java很好地解决了由超类改变而使子类崩溃的问题,同时也防止了代码对地址的非法访问。

随后,被装入的代码由字节码校验器进行检查。

校验器可发现操作数栈溢出,非法数据类型转化等多种错误。

通过校验后,代码便开始执行了。

Java字节码的执行有两种方式:

1.即时编译方式:解释器先将字节码编译成机器码,然后再执行该机器码。

2.解释执行方式:解释器通过每次解释并执行一小段代码来完成Java字节码程序的所有操作。

通常采用的是第二种方法。

由于JVM规格描述具有足够的灵活性,这使得将字节码翻译为机器代码的工作

具有较高的效率。

对于那些对运行速度要求较高的应用程序,解释器可将Java字节码即时编译为机器码,从而很好地保证了Java代码的可移植性和高性能。

二.JVM规格描述

JVM的设计目标是提供一个基于抽象规格描述的计算机模型,为解释程序开发人员提很好的灵活性,同时也确保Java代码可在符合该规范的任何系统上运行。

JVM对其实现的某些方面给出了具体的定义,特别是对Java可执行代码,即字节码(Bytecode)的格式给出了明确的规格。

这一规格包括操作码和操作数的语法和数值、标识符的数值表示方式、以及Java类文件中的Java对象、常量缓冲池在JVM的存储映象。

这些定义为JVM解释器开发人员提供了所需的信息和开发环境。

Java的设计者希望给开发人员以随心所欲使用Java的自由。

JVM定义了控制Java代码解释执行和具体实现的五种规格,它们是:

JVM指令系统

JVM寄存器

JVM栈结构

JVM碎片回收堆

JVM存储区

2.1JVM指令系统

JVM指令系统同其他计算机的指令系统极其相似。

Java指令也是由操作码和操作数两部分组成。

操作码为8位二进制数,操作数进紧随在操作码的后面,其长度根据需要而不同。

操作码用于指定一条指令操作的性质(在这里我们采用汇编符号的形式进行说明),如iload表示从存储器中装入一个整数,anewarray表示为一个新数组分配空间,iand表示两个整数的"与",ret用于流程控制,表示从对某一方法的调用中返回。

当长度大于8位时,操作数被分为两个以上字节存放。

JVM采用了"bigendian"的编码方式来处理这种情况,即高位bits存放在低字节中。

这同Motorola及其他的RISCCPU采用的编码方式是一致的,而与Intel采用的"littleendian"的编码方式即低位bits存放在低位字节的方法不同。

Java指令系统是以Java语言的实现为目的设计的,其中包含了用于调用方法和监视多先程系统的指令。

Java的8位操作码的长度使得JVM最多有256种指令,目前已使用了160多种操作码。

2.2JVM指令系统

所有的CPU均包含用于保存系统状态和处理器所需信息的寄存器组。

如果虚拟机定义较多的寄存器,便可以从中得到更多的信息而不必对栈或内存进行访问,这有利于提高运行速度。

然而,如果虚拟机中的寄存器比实际CPU的寄存器多,在实现虚拟机时就会占用处理器大量的时间来用常规存储器模拟寄存器,这反而会降低虚拟机的效率。

针对这种情况,JVM只设置了4个最为常用的寄存器。

它们是:

pc程序计数器

optop操作数栈顶指针

frame当前执行环境指针

vars指向当前执行环境中第一个局部变量的指针

所有寄存器均为32位。

pc用于记录程序的执行。

optop,frame和vars用于记录指向Java栈区的指针。

2.3JVM栈结构

作为基于栈结构的计算机,Java栈是JVM存储信息的主要方法。

当JVM得到一个Java字节码应用程序后,便为该代码中一个类的每一个方法创建一个栈框架,以保存该方法的状态信息。

每个栈框架包括以下三类信息:

局部变量

执行环境

操作数栈

局部变量用于存储一个类的方法中所用到的局部变量。

vars寄存器指向该变量表中的第一个局部变量。

执行环境用于保存解释器对Java字节码进行解释过程中所需的信息。

它们是:上次调用的方法、局部变量指针和操作数栈的栈顶和栈底指针。

执行环境是一个执行一个方法的控制中心。

例如:如果解释器要执行iadd(整数加法),首先要从frame寄存器中找到当前执行环境,而后便从执行环境中找到操作数栈,从栈顶弹出两个整数进行加法运算,最后将结果压入栈顶。

操作数栈用于存储运算所需操作数及运算的结果。

2.4JVM碎片回收堆

Java类的实例所需的存储空间是在堆上分配的。

解释器具体承担为类实例分配空间的工作。

解释器在为一个实例分配完存储空间后,便开始记录对该实例所占用的内存区域的使用。

一旦对象使用完毕,便将其回收到堆中。

在Java语言中,除了new语句外没有其他方法为一对象申请和释放内存。

对内存进行释放和回收的工作是由Java运行系统承担的。

这允许Java运行系统的设计者自己决定碎片回收的方法。

在SUN公司开发的Java解释器和HotJava环境中,碎片回收用后台线程的方式来执行。

这不但为运行系统提供了良好的性能,而且使程序设计人员摆脱了自己控制内存使用的风险。

2.5JVM存储区

JVM有两类存储区:常量缓冲池和方法区。

常量缓冲池用于存储类名称、方法和字段名称以及串常量。

方法区则用于存储Java方法的字节码。

对于这两种存储区域具体实现方式在JVM规格中没有明确规定。

这使得Java应用程序的存储布局必须在运行过程中确定,依赖于具体平台的实现方式。

JVM是为Java字节码定义的一种独立于具体平台的规格描述,是Java平 *** 立性的基础。

目前的JVM还存在一些限制和不足,有待于进一步的完善,但无论如何,JVM的思想是成功的。

对比分析:如果把Java原程序想象成我们的C++原程序,Java原程序编译后生成的字节码就相当于C++原程序编译后的80x86的机器码(二进制程序文件),JVM虚拟机相当于80x86计算机系统,Java解释器相当于80x86CPU。

在80x86CPU上运行的是机器码,在Java解释器上运行的是Java字节码。

Java解释器相当于运行Java字节码的“CPU”,但该“CPU”不是通过硬件实现的,而是用软件实现的。

Java解释器实际上就是特定的平台下的一个应用程序。

只要实现了特定平台下的解释器程序,Java字节码就能通过解释器程序在该平台下运行,这是Java跨平台的根本。

当前,并不是在所有的平台下都有相应Java解释器程序,这也是Java并不能在所有的平台下都能运行的原因,它只能在已实现了Java解释器程序的平台下运行。

C. 编译器的工作分为哪几个阶段

编译器就是一个普通程序,没什么大不了的
什么是编译器?

编译器是一个将高级语言翻译为低级语言的程序。

首先我们一定要意识到编译器就是一个普通程序,没什么大不了的。

在没有弄明白编译器如何工作之前你可以简单的把编译器当做一个黑盒子,其作用就是输入一个文本文件输出一个二进制文件。

基本上编译器经过了以下几个阶段,等等,这句话教科书上也有,但是我相信很多同学其实并没有真正理解这几个步骤到底在说些什么,为了让你彻底理解这几个步骤,我们用一个简单的例子来讲解。

假定我们有一段程序:

while (y < z) {
int x = a + b;
y += x;
}
那么编译器是怎样把这一段程序人类认识的程序转换为CPU认识的二进制机器指令呢?

提取出每一个单词:词法分析
首先编译器要把源代码中的每个“单词”提取出来,在编译技术中“单词”被称为token。其实不只是每个单词被称为一个token,除去单词之外的比如左括号、右括号、赋值操作符等都被称为token。

从源代码中提取出token的过程就被称为词法分析,Lexical Analysis。

经过一遍词法分析,编译器得到了以下token:

T_While while
T_LeftParen (
T_Identifier y
T_Less <
T_Identifier z
T_RightParen )
T_OpenBrace {
T_Int int
T_Identifier x
T_Assign =
T_Identifier a
T_Plus +
T_Identifier b
T_Semicolon ;
T_Identifier y
T_PlusAssign +=
T_Identifier x
T_Semicolon ;
T_CloseBrace }
就这样一个磁盘中保存的字符串源代码文件就转换为了一个个的token。

这些token想表达什么意思:语法分析
有了这些token之后编译器就可以根据语言定义的语法恢复其原本的结构,怎么恢复呢?

原来,编译器在扫描出各个token后根据规则将其用树的形式表示出来,这颗树就被称为语法树。

语法树是不是合理的:语义分析
有了语法树后我们还要检查这棵树是不是合法的,比如我们不能把一个整数和一个字符串相加、比较符左右两边的数据类型要相同,等等。

这一步通过后就证明了程序合法,不会有编译错误。

D. 编译程序的工作过程一般可以划分为哪5个基本阶段,还自始至终伴随进行哪两项工作

1、编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;中间代码生成;代码优化;目标代码生成。

2、编译程序的工作过程一般自始至终伴随进行信息表管理和出错处理两项工作。

主要是进行词法分析和语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。

(4)并不是所有编译器都有的过程扩展阅读:

解释程序是一种语言处理程序,在词法、语法和语义分析方面与编译程序的工作原理基本相同,但在运行用户程序时,它直接执行源程序或源程序的内部形式(中间代码)。因此,解释程序并不产生目标程序,这是它和编译程序的主要区别。解释程序的工作过程如下:

1、由总控程序完成初始化工作。

2、依次从源程序中取出一条语句进行语法检查,如有错,输出错误信息;如果通过了语法检查,则根据语句翻泽成相应的指令并执行它。

3、检查源程序是否已经全部解释执行完毕,如果未完成则继续解释并执行下一条语句,直到全部语句都处理完毕。

E. C语言文件的编译与执行的四个阶段并分别描述

开发C程序有四个步骤:编辑、编译、连接和运行。

任何一个体系结构处理器上都可以使用C语言程序,只要该体系结构处理器有相应的C语言编译器和库,那么C源代码就可以编译并连接到目标二进制文件上运行。

1、预处理:导入源程序并保存(C文件)。

2、编译:将源程序转换为目标文件(Obj文件)。

3、链接:将目标文件生成为可执行文件(EXE文件)。

4、运行:执行,获取运行结果的EXE文件。

(5)并不是所有编译器都有的过程扩展阅读:

将C语言代码分为程序的几个阶段:

1、首先,源代码文件测试。以及相关的头文件,比如stdio。H、由预处理器CPP预处理为.I文件。预编译的。文件不包含任何宏定义,因为所有宏都已展开,并且包含的文件已插入。我归档。

2、编译过程是对预处理文件进行词法分析、语法分析、语义分析和优化,生成相应的汇编代码文件。这个过程往往是整个程序的核心部分,也是最复杂的部分之一。

3、汇编程序不直接输出可执行文件,而是输出目标文件。汇编程序可以调用LD来生成可以运行的可执行程序。也就是说,您需要链接大量的文件才能获得“a.out”,即最终的可执行文件。

4、在链接过程中,需要重新调整其他目标文件中定义的函数调用指令,而其他目标文件中定义的变量也存在同样的问题。

F. 编译程序都有哪些

编译程序有哪些主要构成成分?它们各自的主要功能是什么?
数据结构

分析和综合时所用的主要数据结构,包括符号表、

常数表和中间语言程序。

符号表由源程序中所用的标识符连同它

们的属性组成,

其中属性包括种类

(如变量、

数组、

结构、

函数、

过程等)、类型(如整型、实型、字符串、复型、标号等),以

及目标程序所需的其他信息。常数表由源程序中用的常数组成,

其中包括常数的机内表示,

以及分配给它们的目标程序地址。



间语言程序是将源程序翻译为目标程序前引入的一种中间形式

的程序,

其表示形式的选择取决于编译程序以后如何使用和加工

它。

常用的中间语言形式有波兰表示、

三元组、

四元组以及间接

三元组等。

分析部分

源程序的分析是经过词法分析、语法分析和语

义分析三个步骤实现的。

词法分析由词法分析程序

(又称为扫描

程序)完成,其任务是识别单词(即标识符、常数、保留字,以

及各种运算符、标点符号等)、造符号表和常数表,以及将源程

序换码为编译程序易于分析和加工的内部形式。

语法分析程序是

编译程序的核心部分,

其主要任务是根据语言的语法规则,

检查源程序是否合乎语法。

如不合乎语法,

则输出语法出错信息;



合乎语法,

则分解源程序的语法结构,

构造中间语言形式的内部

程序。

语法分析的目的是掌握单词是怎样组成语句的,

以及语句

又是如何组成程序的。

语义分析程序是进一步检查合法程序结构

的语义正确性,

其目的是保证标识符和常数的正确使用,

把必要

的信息收集和保存到符号表或中间语言程序中,

并进行相应的语

义处理。

综合部分

综合阶段必须根据符号表和中间语言程序产生

出目标程序,其主要工作包括代码优化、存储分配和代码生成。

代码优化是通过重排和改变程序中的某些操作,

以产生更加有效

的目标程序。

存储分配的任务是为程序和数据分配运行时的存储

单元。

代码生成的主要任务是产生与中间语言程序符等价的目标

程序,

顺序加工中间语言程序,

并利用符号表和常数表中的信息

生成一系列的汇编语言或机器语言指令。

结构

编译过程分为分析和综合两个部分,

并进一步划分为

词法分析、语法分析、

语义分析、

代码优化、存储分配和代码

生成等六个相继的逻辑步骤。

这六个步骤只表示编译程序各部分

之间的逻辑联系,

而不是时间关系。

编译过程既可以按配伏激照这六个

逻辑步骤顺序地执行,

也可以按照平行互锁方式去执行。

在确定

编译程序的具体结构时,

常常分若干遍实现。

对于源程序或中间

语言程序,

从头到尾扫视一次并实现所规定的工作称作一遍。



一遍可以完成一个或相连几个逻辑步骤的工作。

例如,

可以把词

法分析作为第一遍;

语法分析和语义分析作为第二遍;

代码优化

和存储分配作为第三遍;

代码生成作为第四遍。

反之,

为了适应

较小的存储空间或提高厅颤目标程序质量,

也可以把一个逻辑步骤的

工作分为几遍去执行。

例如,

代码优化可划分为代码优化准备工

作和实际代码优化两遍进行。

一个编译程序是否分遍

,

以及如何分遍

,

根据具体情况而定。

其判别标准可以是存储容量的大小、

源语言的繁简、

解题范围的

宽窄,

以及设计、

编制人员的多少等。

分遍的好处是各遍功能独

立单纯、相互联系简单、逻辑结构清晰、优化准备工作充分。缺

点是各遍之中不可避免地要有些重复的部分,

而且遍和遍之间要培袜

有交接工作,因之增加了编译程序的长度和编译时间。

一遍编译程序是一种极端情况,

整个编译程序同时驻留在内



,

彼此之间采用调用转接方式连接在一起

(



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)编译方式:翻译成目标程序,然后运行目标程序 特点:快,但占用空间大 (考点)
编译软件具体是什么啊?为属于系统软件啊
以上回答是什么乱七八糟的水平!

计算机常识,操作系统,数据库管理系统,编译软件都属于系统软件。

没有为什么,这就是个定义。规定就是这样。原因我想可能是因为这些软件都没有特定的应用吧。。都是为了辅助其它应用软件而存在。所以定义为系统软件。
编译原理---程序执行的两种方式是什么
解释执行和编译执行,前者过程简单,后者执行速度快

阅读全文

与并不是所有编译器都有的过程相关的资料

热点内容
php登陆次数 浏览:742
python字符转成数字 浏览:822
海川用的是什么服务器 浏览:374
口才是练出来的pdf 浏览:458
云服务器哪个公司性价比高 浏览:515
源码论坛打包 浏览:556
php怎么做成word 浏览:690
python批量生成密钥 浏览:490
程序员要不要考社区人员 浏览:150
app的钱怎么充q币 浏览:813
android银行卡识别 浏览:751
怎么在app投放广告 浏览:11
手机文件管理怎么看app名称 浏览:192
程序员学数学哪本书最全 浏览:784
macd实战选股公式源码 浏览:644
加密芯片的计算方法 浏览:191
手机存储为什么找不到微信文件夹 浏览:697
msf端口迁移命令 浏览:880
工商app积分怎么查询 浏览:146
铁路app怎么买火车票 浏览:311