Java编译过程与cc++编译过程有何不同

合集下载

javac编译命令

javac编译命令

javac编译命令javac是Java编译器的命令行工具,用于将Java源代码文件编译成字节码文件。

本文将详细介绍javac编译命令的用法和参数,并提供一些实际示例。

我们需要安装Java开发工具包(JDK),它包含了javac命令和其他Java开发所需的工具和库。

安装完成后,我们就可以使用javac 命令来编译Java源代码了。

javac命令的基本用法如下:```javac [options] [source files]```其中,options是可选的编译选项,source files是需要编译的Java源代码文件。

下面是一些常用的javac编译选项:- `-d directory`:指定编译后的字节码文件存放的目录。

如果不指定该选项,默认会将字节码文件放在源代码所在的目录下。

- `-classpath path`:指定编译时所需的类路径,用于查找依赖的类和库文件。

path可以是一个目录,或者是多个目录和JAR文件的路径,用冒号(Windows系统使用分号)分隔。

- `-sourcepath path`:指定查找源代码文件的路径。

path可以是一个目录,或者是多个目录的路径,用冒号(Windows系统使用分号)分隔。

- `-encoding encoding`:指定源代码的字符编码。

如果不指定该选项,默认会使用平台的默认编码。

- `-g`:生成调试信息,包括局部变量表和源代码行号。

这对于调试和分析程序非常有用。

- `-nowarn`:关闭警告信息的输出。

如果不指定该选项,默认会输出警告信息。

除了上述选项,javac还支持其他一些高级选项,如限制编译器的警告级别、启用或禁用特定的编译特性等。

详细信息可以通过运行`javac -help`命令查看。

下面是一些实际的示例,演示了javac命令的使用:1. 编译单个Java源代码文件,并将字节码文件放在指定目录下:```javac -d bin HelloWorld.java```上述命令将HelloWorld.java编译成字节码文件,并将字节码文件存放在bin目录下。

编译的名词解释

编译的名词解释

编译的名词解释在计算机科学领域中,编译(compilation)是指将高级编程语言代码转换成机器语言代码的过程。

编译器(compiler)是执行这个转换过程的工具。

1. 什么是编译?编译是一种将高级编程语言(如C、Java等)转化为机器语言(由0和1组成的二进制代码)的过程。

高级编程语言使用人类容易理解的语法和结构,而机器语言则是计算机底层的指令集。

编译器的主要任务是将高级语言的代码转换成计算机能理解和执行的指令。

2. 编译器的作用编译器是一个重要的工具,它负责将高级编程语言的源代码分析、解释并转换成可执行的机器语言。

编译过程一般分为三个步骤:词法分析、语法分析和代码生成。

在词法分析阶段,编译器将程序源代码分解为一个个词法单元,如变量、函数、关键字等。

语法分析阶段会根据语法规则判断代码的正确性,并生成抽象语法树(AST)。

最后一步是代码生成,编译器利用之前生成的AST,将其转化为底层的机器指令。

3. 编译器的优势通过使用编译器,程序开发者可以使用高级编程语言来编写代码,而不需要了解底层的机器语言。

这使得开发变得更加友好和高效。

此外,编译器也可以进行优化,通过重写代码结构和指令顺序来提高程序的执行效率。

优化编译器可以使得程序在运行速度和资源利用方面都得到提升。

4. 编译与解释编译与解释是程序的两种执行方式。

与编译不同,解释是将高级编程语言代码逐行翻译成机器代码并立即执行,而不是事先将整个源代码转换为机器代码再执行。

解释型语言如Python、JavaScript等在执行过程中不需要编译,因此可以实现更加灵活的开发和调试。

5. 编译器的应用领域编译器广泛应用于各种计算机系统和软件开发中。

无论是操作系统、嵌入式系统还是应用程序,编译器都扮演着重要角色。

此外,编译器还被用于开发虚拟机、数据库系统等。

编译技术的发展也推动了计算机科学的进步,使得开发者能够更好地利用硬件资源和提高软件性能。

6. 编译器与即时编译器编译器的一种特殊类型是即时编译器(Just-In-Time Compiler,简称JIT),它将源代码逐行地编译成机器码,在执行时动态地生成和优化。

什么是编译——精选推荐

什么是编译——精选推荐

什么是编译编译:简单来说就是计算机只能读取⼆进制指令0和1 ,不能理解我们开发的程序。

所以需要把我们开发的程序转换为机器可以读取的。

就是.Java⽂件变成.class⽂件对于同⼀个语句,有如下三种:⾼级语⾔、低级语⾔、机器语⾔的表⽰Java语⾔ a=b+1;汇编语⾔ mov -0xc(%ebp),%eaxadd $0x1,%eax mov %eax,-0x8(%ebp)机器语⾔ 8b 45 f4 83 c0 01 89 45 f8我们都知道,机器是只能做数字计算的,能够让机器去运算的、数字的语⾔就是机器语⾔,除此之外的所有计算机语⾔都是⾮机器语⾔。

这样的相对于机器语⾔的⾼级语⾔都需要⼀个转换,从⾼级、机器不可理解,转换为机器可理解的机器语⾔。

这样的⼀个转换过程就叫做编译(Compile),由编译器(Compiler)来完成。

由Java 转换为汇编语⾔这⼀过程是由汇编器(Assembler)来执⾏的。

Java和汇编语⾔转换为机器语⾔都是由编译器来完成的(把汇编语⾔成的过程称为汇编)这⾥⾯,Java是可跨平台的,也可以说是与平台⽆关的。

这⾥的平台有两种说法,⼀种是指计算机的体系(Architecture),另⼀种是指操作系统(Operate System),也可以是指两种的结合。

不同的平台,他们所需要的执⾏机器语⾔的指令集是不同的。

Java的跨平台性是指,只需要编写⼀份不需要修改的Java程序代码,就可以在不同体系、不同操作系统的计算机上运⾏。

这都要靠编译器的功劳,编译器将Java程序翻译为了适合当前计算机体系的机器语⾔。

下⾯说⼀下将Java语⾔编译为机器语⾔的整个过程:⾸先,我们写出⼀份Java程序代码,命名该代码为hello.Java,这个代码⽂件,我们称之为源代码(Srouce Code)。

然后我们运⾏编译器,对该源代码⽂件进⾏编译,在整个编译的过程中,编译器并不会执⾏该源代码,只是⽣成⼀份新的机器语⾔代码⽂件,如hello.class。

编程_gcc使用的方法

编程_gcc使用的方法

编程_gcc使用的方法gcc使用的方法1。

gcc包含的c/c++编译器gcc,cc,c++,g++,gcc和cc是一样的,c++和g++是一样的,(没有看太明白前面这半句是什么意思:))一般c程序就用gcc编译,c++程序就用g++编译2。

gcc的基本用法gcc test.c这样将编译出一个名为a.out的程序gcc test.c -o test这样将编译出一个名为test的程序,-o参数用来指定生成程序的名字3。

为什么会出现undefined reference to 'xxxxx'错误?首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得不对,你没有指定链接程序要用到得库,比如你的程序里用到了一些数学函数,那么你就要在编译参数里指定程序要链接数学库,方法是在编译命令行里加入-lm。

4。

-l参数和-L参数-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了。

好了现在我们知道怎么得到库名了,比如我们自已要用到一个第三方提供的库名字叫libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件)。

放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它放在/usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。

Calcite(一):javacc语法框架及使用

Calcite(一):javacc语法框架及使用

Calcite(⼀):javacc语法框架及使⽤ 是⼀个动态数据管理框架。

它包含许多组成典型数据库管理系统的部分,但省略了存储原语。

它提供了⾏业标准的SQL解析器和验证器,具有可插⼊规则和成本函数的可⾃定义优化器,逻辑和物理代数运算符,从SQL到代数(以及相反)的各种转换。

以上是官⽅描述,⽤⼤⽩话描述就是,calcite实现了⼀套标准的sql解析功能,⽐如实现了标准hive sql的解析,可以避免繁杂且易出错的语法问题。

并暴露了相关的扩展接⼝供⽤户⾃定义使⽤。

其提供了逻辑计划修改功能,⽤户可以实现⾃⼰的优化。

(害,好像还是很绕!不管了)1. calcite的两⼤⽅向 从核⼼功能上讲,或者某种程度上讲,我们可以将calicite分为两⼤块,⼀块是对sql语法的解析,另⼀块是对语义的转化与实现; 为什么要将其分为⼏块呢?我们知道,基本上所有的分层,都是为了简化各层的逻辑。

如果我们将所有的逻辑全放在⼀个层上,必然存在⼤量的耦合,互相嵌套,很难实现专业的⼈做专业的事。

语法解析,本⾝是⼀件⽐较难的事情,但是因为有很多成熟的编译原理理论⽀持,所以,这⽅⾯有许多现成的实现可以利⽤,或者即使是⾃⼰单独实现这⼀块,也不会有太⼤⿇烦。

所以,这⼀层是⼀定要分出来的。

⽽对语义的转化与实现,则是⽤户更关注的⼀层,如果说前⾯的语法是标准规范的话,那么语义才是实现者最关⼼的东西。

规范是为了减轻使⽤者的使⽤难度,⽽其背后的逻辑则可能有天壤之别。

当有了前⾯的语法解析树之后,再来进⼀步处理语义的东西,必然⽅便了许多。

但也必定是个复杂的⼯作,因为上下⽂关联语义,并不好处理。

⽽我们本篇只关注语法解析这⼀块功能,⽽calcite使⽤javacc作为其语法解析器,所以我们⾃然主关注向javacc了。

与javacc类似的,还有antlr,这个留到我们后⾯再说。

calcite中,javacc应该属于⼀阶段的编译,⽽java中引⼊javacc编译后的样板代码,再执⾏⾃⼰的逻辑,可以算作是⼆阶段编译。

C语言编译器gcc命令如何操作步骤

C语言编译器gcc命令如何操作步骤

C语言编译器gcc命令如何操作步骤C语言是一种高级编程语言,由于其结构化编程,声明式语法,高效性和可靠性,被广泛用于很多领域。

gcc是一种C语言编译器,是Unix系统中最常用的编译器之一,它可以编译C、C++、JAVA等语言。

本文将为读者介绍对于gcc编译器的基本概念、相关命令以及实践操作步骤。

一、gcc基本概念1. 什么是编译器?先来了解一下编译器的作用。

编译器是将高级语言编写的程序转换成计算机可执行的机器语言的软件程序。

程序员可以使用高级语言编写程序,编译器将高级语言转换成计算机能够理解的机器语言。

2. 什么是gcc?GCC是GNU编译器集合(GNU Compiler Collection)的缩写。

它是一个重要的语言编译器,可以编译C、C++、JAVA等语言的程序。

gcc包含了一系列的编译器,每一个编译器都可以编译不同的语言,它不仅是Linux系统中的常用编译器,也被广泛使用于其他操作系统中。

3. gcc优点- 开源软件:可以透明、高效地利用计算机系统资源,让整个编译过程更灵活。

- 软件体积小:由于每次都是重新编译,因此gcc生成的二进制文件体积很小。

- 可移植性:gcc可以在不同的操作系统上进行编译。

同一份源代码,在不同的系统上编译,可以得到相同的结果。

- 动态链接库:gcc支持动态链接库,可以减少程序的代码冗余问题。

二、gcc常用命令以下是gcc编译器的常用命令:1. gcc -ogcc命令使用" -o"选项可以把源文件编译成可执行文件,例如:```$ gcc -o hello hello.c```上述命令的含义是将hello.c文件编译成hello可执行文件。

2. gcc -cgcc命令使用" -c"选项将源文件编译成目标文件。

目标文件是不可执行的文件,它包含了已经编译过的程序的一部分,这些程序可以用作最终的可执行文件中的一部分。

例如:```$ gcc -c hello.c```上述命令的含义是将hello.c文件编译成目标文件hello.o。

gcc-搜搜百科

gcc-搜搜百科gcc摘要由GNU之⽗Stallman所开发的linux下的编译器,全称为GNU Compiler ,⽬前可以编译的语⾔包括:C, C++, , Fortran, Java, and , 可以在其官⽅页⾯找到更加详细的信息GCC是⼀个原本⽤于Unix-like系统下编程的编译器。

不过,现在GCC也有了许多下的移植版本。

这要感谢Internet上众多程序员的共同努⼒。

*Win32 下的 GCC 详细可察看词条:GCC for Win32⽬录123456⽬录12345678910GCC是GNU公社的⼀个项⽬。

是⼀个⽤于编程开发的⾃由编译器。

最初,GCC只是⼀个C语⾔编译器,他是GNU C Compiler 的英⽂缩写。

随着众多⾃由开发者的加⼊和GCC⾃⾝的发展,如今的GCC以经是⼀个包含众多语⾔的编译器了。

其中包括 C,C++,Ada,Object C和Java等。

所以,GCC也由原来的GNU C Compiler变为GNU Compiler Collection。

也就是 GNU编译器家族的意思。

当然,如今的GCC借助于他的特性,具有了交叉编译器的功能,即在⼀个平台下编译另⼀个平台的代码。

直到现在,GCC的历史仍然在继续,他的传奇仍然被⼈所传颂。

Linux系统下的Gcc(GNU C Compiler)是GNU推出的功能强⼤、性能优越的多平台编译器,是GNU的代表作品之⼀。

gcc是可以在多种硬体平台上编译出的超级编译器,其执⾏效率与⼀般的编译器相⽐平均效率要⾼20%~30%。

Gcc编译器能将C、源程序、汇程式化序和编译、连接成可执⾏⽂件,如果没有给出可执⾏⽂件的名字,gcc将⽣成⼀个名为a.out的⽂件。

在Linux系统中,可执⾏⽂件没有统⼀的后缀,系统从⽂件的属性来区分可执⾏⽂件和不可执⾏⽂件。

⽽gcc则通过后缀来区别输⼊⽂件的类别,下⾯我们来介绍gcc所遵循的部分约定规则。

.c为后缀的⽂件,C语⾔源代码⽂件;.a为后缀的⽂件,是由⽬标⽂件构成的档案库⽂件;.C,.cc或.cxx 为后缀的⽂件,是C++源代码⽂件;.h为后缀的⽂件,是程序所包含的;.i 为后缀的⽂件,是已经预处理过的C源代码⽂件;.ii为后缀的⽂件,是已经预处理过的C++源代码⽂件;.m为后缀的⽂件,是Objective-C源代码⽂件;.o为后缀的⽂件,是编译后的⽬标⽂件;.s为后缀的⽂件,是汇编语⾔源代码⽂件;.S为后缀的⽂件,是经过预编译的汇编语⾔源代码⽂件。

GCC常用命令详解

GCC常⽤命令详解GCC(GNU Compiler Collection)是Linux下最常⽤的C语⾔编译器,是GNU项⽬中符合ANSI C标准的编译系统,能够编译⽤C、C++和Object C等语⾔编写的程序。

同时它可以通过不同的前端模块来⽀持各种语⾔,如Java、Fortran、Pascal、Modula-3和Ada等。

穿插⼀个玩笑: GNU意思是GNU’s not Unix⽽⾮⾓马。

然⽽GNU还是⼀个未拆分的连词,这其实是⼀个源于hacker的幽默:GNU是⼀个回⽂游戏,第⼀个字母G是凑数的,你当然可以叫他做ANU或者BNU。

下⾯开始。

⼀.CC编译程序过程分四个阶段◆预处理(Pre-Processing)◆编译(Compiling)◆汇编(Assembling)◆链接(Linking)Linux程序员可以根据⾃⼰的需要让GCC在编译的任何阶段结束转去检查或使⽤编译器在该阶段的输出信息,或者对最后⽣成的⼆进制⽂件进⾏控制,以便通过加⼊不同数量和种类的调试代码来为今后的调试做好准备。

如同其他的编译器,GCC也提供了灵活⽽强⼤的代码优化功能,利⽤它可以⽣成执⾏效率更⾼的代码。

GCC提供了30多条警告信息和三个警告级别,使⽤它们有助于增强程序的稳定性和可移植性。

此外,GCC还对标准的C和C++语⾔进⾏了⼤量的扩展,提⾼程序的执⾏效率,有助于编译器进⾏代码优化,能够减轻编程的⼯作量。

⼆.简单编译命令我们以Hello world程序来开始我们的学习。

代码如下:/* hello.c */#include <stdio.h>int main(void){printf ("Hello world!\n");return 0;}1. 执⾏如下命令:$ gcc -o hello hello.c运⾏如下: $ ./hello输出: Hello,world!2. 我们也可以分步编译如下:(1) $ gcc –E hello.c -o hello.i//预处理结束//这时候你看⼀下hello.i ,可以看到插进去了很多东西。

MakeFile详解


引用其它的Makefile-实例



有这样几个Makefile:a.mk、b.mk、c.mk,还有 一个文件叫foo.make,以及一个变量$(bar),其 包含了e.mk和f.mk,那么,下面的语句: include foo.make *.mk $(bar) 等价于: include foo.make a.mk b.mk c.mk e.mk f.mk

在大多数时候,由于源文件太多,编译生成的中间目标文 件太多,而在链接时需要明显地指出中间目标文件名,这
对于编译很不方便,所以,通常要给中间目标文件打个包,
在Windows 下这种包叫“库文件”(Library File),也就 是 .lib 文件,在UNIX 下,是Archive File,也就是 .a 文件。
定义变量和引用变量
变量的定义和应用与Linux环境变量一样,变量名 要大写,变量一旦定义后,就可以通过将变量名 用圆括号括起来,并在前面加上“$”符号来进行 引用。 变量的主要作用: 1、保存文件名列表 2、保存可执行命令名,如编译器 3、保存编译器的参数 变量一般都在makefile的头部定义。按照惯例, 所有的makefile变量都应该是大写。
者,通常是你需要告诉编译器头文件的所在位置,只要所有的语法正
确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应 该对应于一个中间目标文件(O 文件或是OBJ 文件)。
孙钦东
程序的编译和链接

链接时,主要是链接函数和全局变量。链接器并不管函数
所在的源文件,只管函数的中间目标文件(Object File)。



clean: -rm -f $(EXEC) *.elf *.gdb *.o

C,Java和Python三门编程语言性能比较

C,Java和Python三门编程语⾔性能⽐较在编程中有许多语⾔,⽽不同的编程语⾔有时候也能实现相同的功能,那么不同语⾔之间的运⾏速度有多少差别呢?这⾥选择 , 和三门热门语⾔来做⽐较。

实验这⾥使⽤三种语⾔进⾏矩阵乘法。

矩阵的⼤⼩为2048 x 2048(即每个矩阵的乘法和加法运算为8,589,934,592),我为它们填充了0.0到1.0之间的随机值(使⽤随机值⽽不是对所有三种语⾔使⽤完全相同的矩阵的影响可以忽略不计)。

每个实验运⾏了五次,并计算了平均运⾏时间。

1.C代码1 #include <stdlib.h>2 #include <stdio.h>3 #include <time.h>45#define n 204867double A[n][n];8double B[n][n];9double C[n][n];1011int main() {1213//populate the matrices with random values between 0.0 and 1.014for (int i = 0; i < n; i++) {15for (int j = 0; j < n; j++) {1617 A[i][j] = (double) rand() / (double) RAND_MAX;18 B[i][j] = (double) rand() / (double) RAND_MAX;19 C[i][j] = 0;20 }21 }2223struct timespec start, end;24double time_spent;2526//matrix multiplication27 clock_gettime(CLOCK_REALTIME, &start);28for (int i = 0; i < n; i++) {29for (int j = 0; j < n; j++) {30for (int k = 0; k < n; k++) {31 C[i][j] += A[i][k] * B[k][j];32 }33 }34 }35 clock_gettime(CLOCK_REALTIME, &end);36 time_spent = (_sec - _sec) + (_nsec - _nsec) / 1000000000.0;37 printf("Elapsed time in seconds: %f \n", time_spent);38return0;39 }2.Java代码1import java.util.Random;23public class MatrixMultiplication {4static int n = 2048;5static double[][] A = new double[n][n];6static double[][] B = new double[n][n];7static double[][] C = new double[n][n];89public static void main(String[] args) {10//populate the matrices with random values between 0.0 and 1.011 Random r = new Random();12for (int i = 0; i < n; i++) {13for (int j = 0; j < n; j++) {14 A[i][j] = r.nextDouble();15 B[i][j] = r.nextDouble();16 C[i][j] = 0;17 }18 }1920long start = System.nanoTime();21//matrix multiplication22for (int i = 0; i < n; i++) {23for (int j = 0; j < n; j++) {24for (int k = 0; k < n; k++) {25 C[i][j] += A[i][k] * B[k][j];26 }27 }28 }2930long stop = System.nanoTime();31double timeDiff = (stop - start) * 1e-9;32 System.out.println("Elapsed time in seconds: " + timeDiff);33 }34 }3.python代码1import random2import time34 n = 204856#populate the matrices with random values between 0.0 and 1.07 A = [[random.random() for row in range(n)] for col in range(n)]8 B = [[random.random() for row in range(n)] for col in range(n)]9 C = [[0 for row in range(n)] for col in range(n)]1011 start = time.time()12#matrix multiplication13for i in range(n):14for j in range(n):15for k in range(n):16 C[i][j] += A[i][k] * B[k][j]1718 end = time.time()19print("Elapsed time in seconds %0.6f" % (end-start))如何编译与运⾏#Cgcc MatrixMultiplication.c -o matrix./matrix#Javajavac MatrixMultiplication.javajava MatrixMultiplication#Pythonpython MatrixMultiplication.py运⾏时间根据这些结果,C⽐Java慢2.34倍,Python⽐Java慢33.34倍。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java编译过程与c/c++编译过程有何不同
这里向大家描述一下Java编译原理和Java编译过程与c/c++编译过程不同,Java编译程序将java源程序编译成jvm可执行代码--java字节码。

你对Java编译过程和编译原理,Java编译程序将java源程序编译成jvm可执行代码--java字节码,并且Java编译器却不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将些符号引用信息保留在字节码中,由解释器在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址,这样就有效地保证了java的可移植性和安全性。

Java编译原理
1、Java编译过程与c/c++编译过程不同
Java编译程序将java源程序编译成jvm可执行代码--java字节码.
c/c++编译过程:
当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而生成的。

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

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

2、jvm工作原理
运行jvm字符码的工作是由解释器来完成的。

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

装入代码的工作由“类装载器classloader”完成。

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

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

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

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

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

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

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

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

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

校验器可以发现操作数栈益处、非法数据类型转化等多种错误。

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

java字节码的执行有两种方式:
1)即时编译方式:解释器先将字节编译成机器码,然后再执行该机器码。

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

本节关于Java 编译的内容介绍到这里,请关注本节其他相关报道。

相关文档
最新文档