导航:首页 > 源码编译 > java编译和解释流程图

java编译和解释流程图

发布时间:2022-05-16 23:20:58

㈠ 简述java程序的编辑编译和运行过程

第一步(编译): 创建完源文件之后,程序会先被编译为.class文件。Java编译一个类时,如果这个类所依赖的类还没有被编译,编译器就会先编译这个被依赖的类,然后引用,否则直接引用,这个有点象make。

如果java编译器在指定目录下找不到该类所其依赖的类的.class文件或者.java源文件的话,编译器话报“cant find symbol”的错误。

第二步(运行):java类运行的过程大概可分为两个过程:1、类的加载 2、类的执行。需要说明的是:JVM主要在程序第一次主动使用类的时候,才会去加载该类。也就是说,JVM并不是在一开始就把一个程序就所有的类都加载到内存中,而是到不得不用的时候才把它加载进来,而且只加载一次。

特别说明:java类中所有public和protected的实例方法都采用动态绑定机制,所有私有方法、静态方法、构造器及初始化方法<clinit>都是采用静态绑定机制。而使用动态绑定机制的时候会用到方法表,静态绑定时并不会用到。

(1)java编译和解释流程图扩展阅读:

Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来简单的说明整个流程。

Java代码编译:是由Java源码编译器来完成;

Java字节码的执行:是由JVM执行引擎来完成

Java程序从源文件创建到程序运行要经过两大步骤:

1、源文件由编译器编译成字节码(ByteCode)

2、字节码由java虚拟机解释运行。因为java程序既要编译同时也要经过JVM的解释运行,所以说Java被称为半解释语言( "semi-interpreted" language)。

㈡ 编译型和解释型的区别&amp;Java从编译到执行的过程

Java这个语言很非凡。
二、你可以说它是解释型的。因为java代码编译后不能直接运行,它是解释运行在JVM上的,所以它是解释运行的,那也就算是解释的了。
三、但是,现在的JVM为了效率,都有一些JIT优化。它又会把.class的二进制代码编译为本地的代码直接运行,所以,又是编译的。
像C、C++ 他们经过一次编译之后直接可以编译成操作系统了解的类型,可以直接执行的 所以他们是编译型的语言。没有经过第二次的处理 而Java不一样他首先由编译器编译成.class类型的文件,这个是java自己类型的文件 然后在通过虚拟机(JVM)从.class文件中读一行解释执行一行,所以他是解释型的语言,而由于java对于多种不同的操作系统有不同的JVM所以
Java实现了真正意义上的跨平台!
请观看下面两张图 了解一下Java的虚拟机机制:
(1)java语言的编译--解释---执行过程
(2)java的虚拟机
定义:编译型语言:把做好的源程序全部编译成二进制代码的可运行程序。然后,可直接运行这个程序。
解释型语言:把做好的源程序翻译一句,然后执行一句,直至结束!区别:编译型语言,执行速度快、效率高;依靠编译器、跨平台性差些。
解释型语言,执行速度慢、效率低;依靠解释器、跨平台性好。
个人认为,java是解释型的语言,因为虽然java也需要编译,编译成.class文件,但是并不是机器可以识别的语言,而是字节码,最终还是需要 jvm的解释,才能在各个平台执行,这同时也是java跨平台的原因。所以可是说java即是编译型的,也是解释型,但是假如非要归类的话,从概念上的定义,恐怕java应该归到解释型的语言中。

㈢ 编译型和解释型的区别&Java从编译到执行的过程

编译执行:

编译执行是一种计算机语言的执行方式。由编译程序将目标代码一次性编译成目标程序,再由机器运行目标程序(效率高于解释执行)

解释执行:

使用解释执行的程序我们一般称为解释程序。它将源语言直接作为源程序输入,解释执行解释一句后就提交计算机执行一句,并不形成目标程序。解释执行不依赖于平台。

Java从编译到执行的过程:




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

Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。本文首先简要介绍从Java文件的编译到最终执行的过程,随后对JVM规格描述作一说明。

一.Java源文件的编译、下载、解释和执行
Java应用程序的开发周期包括编译、下载、解释和执行几个部分。Java编译程序将Java源程序翻译为JVM可执行代码?字节码。这一编译过程同C/C++的编译有些不同。当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而产生的。因此,在编译过程中,编译程序通过查表将所有对符号的引用转换为特定的内存偏移量,以保证程序运行。Java编译器却不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保留在字节码中,由解释器在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址。这样就有效的保证了Java的可移植性和安全性。

运行JVM字节码的工作是由解释器来完成的。解释执行过程分三部进行:代码的装入、代码的校验和代码的执行。装入代码的工作由"类装载器"(class loader)完成。类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被其调用的类。当类装载器装入一个类时,该类被放在自己的名字空间中。除了通过符号引用自己名字空间以外的类,类之间没有其他办法可以影响其他类。在本台计算机上的所有类都在同一地址空间内,而所有从外部引进的类,都有一个自己独立的名字空间。这使得本地类通过共享相同的名字空间获得较高的运行效率,同时又保证它们与从外部引进的类不会相互影响。当装入了运行程序需要的所有类后,解释器便可确定整个可执行程序的内存布局。解释器为符号引用同特定的地址空间建立对应关系及查询表。通过在这一阶段确定代码的内存布局,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采用了"big endian"的编码方式来处理这种情况,即高位bits存放在低字节中。这同 Motorola及其他的RISC CPU采用的编码方式是一致的,而与Intel采用的"little endian "的编码方式即低位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解释器和Hot Java环境中,碎片回收用后台线程的方式来执行。这不但为运行系统提供了良好的性能,而且使程序设计人员摆脱了自己控制内存使用的风险。

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解释器程序的平台下运行。

㈤ java语言编译和解释执行的具体过程是怎样的

Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(ByteCode),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。

㈥ 简述Java应用程序的开发流程

分为网页和桌面的应用开发

网页或者桌面开发流程
项目启动1)、项目组成立(公司成员、客户成员)
2)、制定项目预期目标
3)、制定项目计划周期
4)、建立好项目组成员沟通机制


2、需求调研
1)、创建调研计划、协调调研时间
2)、收集客户资料,获取客户需求所有的资料都需要保留一份,资料中存疑的需要及时询问
3)、编写需求文档重点描述出客户的业务流程和性能要求。采用Word、Excel、Rose等形式。
4)、需求变更记录
5)、确定开发环境和运行环境
6)、扩展性要求
7)、与旧系统的接驳要求。
8)、估算出项目工作量本阶段需要一套需求管理系统来进行需求的管理。本阶段的需求文档也是用户测试的依据。


3、系统设计/详细设计一个系统可以分为基础平台和应用模块两部分。
1)、选择基础平台,无论是采用第三方平台还是自行开发平台,都需要深入了解,查看是否符合要求。
2)、应用模块设计(针对业务流程)
3)、中间件的采用或自行开发,需要深入了解。
4)、用户界面的设计如果用户界面设计完毕并确认,即可初步写出用户使用手册、管理员使用手册。
5)、变更记录本阶段的系统设计是集成测试的依据。

4、程序开发创建开发任务计划表、开发计划日程表
1)、优先编写测试用例
2)、按照编码规范编写代码
3)、按照文档注释规范注释以上形成开发文档。本阶段需要一套版本管理系统。本阶段的测试用例也是单元测试的依据。如果能做到,最好每日构建。

5、测试本阶段需要一套Bug管理系统,形成需求、设计、开发、测试互动。
1)、编写测试计划和测试方案
2)、功能测试单元测试、集成测试
3)、性能测试集成测试、压力测试如果能做到,最好能进行自动化测试。如果能做到,做分析统计工作。最后形成测试报告。
6、试用、培训、维护本阶段需要解决:
1)、解决异地修改和公司修改的同步问题。
2)、用户测试中的Bug修改问题,按照级别分为a)、程序Bugb)、设计变更c)、需求变更尽量按照a b c的顺序来进行修改,尽量避免b、c级的修改。最后形成安装手册、维护记录。

㈦ java是编译型的还是解释型的

Java这个语言很非凡。 二、你可以说它是解释型的。因为java代码编译后不能直接运行,它是解释运行在JVM上的,所以它是解释运行的,那也就算是解释的了。 三、但是,现在的JVM为了效率,都有一些JIT优化。它又会把.class的二进制代码编译为本地的代码直接运行,所以,又是编译的。 像C、C++ 他们经过一次编译之后直接可以编译成操作系统了解的类型,可以直接执行的 所以他们是编译型的语言。没有经过第二次的处理 而Java不一样他首先由编译器编译成.class类型的文件,这个是java自己类型的文件 然后在通过虚拟机(JVM)从.class文件中读一行解释执行一行,所以他是解释型的语言,而由于java对于多种不同的操作系统有不同的JVM所以 Java实现了真正意义上的跨平台! 请观看下面两张图 了解一下Java的虚拟机机制: (1)java语言的编译--解释---执行过程 (2)java的虚拟机 定义:编译型语言:把做好的源程序全部编译成二进制代码的可运行程序。然后,可直接运行这个程序。 解释型语言:把做好的源程序翻译一句,然后执行一句,直至结束!区别:编译型语言,执行速度快、效率高;依靠编译器、跨平台性差些。 解释型语言,执行速度慢、效率低;依靠解释器、跨平台性好。 个人认为,java是解释型的语言,因为虽然java也需要编译,编译成.class文件,但是并不是机器可以识别的语言,而是字节码,最终还是需要 jvm的解释,才能在各个平台执行,这同时也是java跨平台的原因。所以可是说java即是编译型的,也是解释型,但是假如非要归类的话,从概念上的定义,恐怕java应该归到解释型的语言中。

㈧ JAVA程序的流程图

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Drawing extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
// 实例化一个文本域
JTextField tf = new JTextField();
// 设置两个按钮
JButton b1 = new JButton("开始");
JButton b2 = new JButton("停止");
boolean isGo = false;

public Drawing() {
b1.setActionCommand("start");// 在开始按钮上设置一个动作监听 start
JPanel p = new JPanel();// 创建一个面板容器,用于放置组件
// 将两个按钮添加到可视化容器上面,用add方法
p.add(b1);
p.add(b2);
// 在两个按钮上增加监听的属性,自动调用下面的监听处理方法actionPerformed(ActionEvent
// e),如果要代码有更好的可读性,可用内部类实现动作
// 监听处理。
b1.addActionListener(this);
b2.addActionListener(this);
// 将停止按钮设置为不可编辑(即不可按的状态)
b2.setEnabled(false);
// 将上面的文本域放在面板的北方,也就是上面(上北下南左西右东)
this.getContentPane().add(tf, "North");
// 将可视化容器pannel放在南边,也就是下面
this.getContentPane().add(p, "South");
// 设置用户在此窗体上发起"close"时默认执行的操作,参数EXIT_ON_CLOSE是使用
// System exit方法退出应用程序。仅在应用程序中使用
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(300, 200);// 设置面板大小,宽和高
this.setLocation(300, 300);// 设置面板刚开始的出现的位置
// 用指定名称创建一个新的定制光标对象,参数表示手状光标类型
Cursor cu = new Cursor(Cursor.HAND_CURSOR);
// 为指定的光标设置光标图像,即设置光标图像为上面所创建的手状光标类型
this.setCursor(cu);
// 将面板可视化设置为true,即可视,如果为false,即程序运行时面板会隐藏
this.setVisible(true);
// 设置面板的标题为欢迎
tf.setText("welcome to this program! ");
this.go();// 调用go方法

}

public void go() {
// 这里是死循环,也就是说用户不点击停止按钮的话他一直循环出现随机数,直到用户点
// 击停止按钮循环才能推出,具体流程在actionPerformed方法中控制。
while (true) {
// 上面所定义的isGo的初始值为false,所以程序第一次到此会跳过
if (isGo == true) {
String s = "";
// 产生7个随机数
for (int j = 1; j <= 7; j++) {
// 每个随机数产生方式,这里定义灵活,可以自由定义随机数产生的方式
int i = (int) (Math.random() * 36) + 1;
// 如果产生的随机数小于10的话做处理:这里就牵扯到一个重要的概念,简单叙述一下:
if (i < 10) {
s = s + " 0" + i;
/*
* 当一个字符串与一个整型数项相加的意思是连接,上面的s = s + " 0" +
* i的意思是字符串s链接0再连接整型i值,而不会导致0和整型的i相加,
* 产生的效果为s0i,由于s为空字符串(上面定义过的),所以当i小于零时,在个位数前面加上0,比如产生的随机数i为7的话,显示效果为
* 07.
*/
} else {
// 如果产生的随机数比10打的话,那么加上空格显示,即数字和数字之间有个空格
s = s + " " + i;
}
// 以上循环循环七次,以保证能出现7个随机数
}
// 将产生的随机数全部显示在文本域上,用文本域对象tf调用它的
//设置文本的方法setText(String)实现。
tf.setText(s);
}
try {
// 以下为线程延迟
Thread.sleep(10);
} catch (java.lang.InterruptedException e) {
e.printStackTrace();
}

}

}
// 以下是上面设置的事件监听的具体处理办法,即监听时间处理方法,自动调用
public void actionPerformed(ActionEvent e) {// 传入一个动作事件的参数e
// 设置字符串s来存储获得动作监听,上面的start
String s = e.getActionCommand();
/*
* 以下这个条件语句块的作用为:用户点击开始后(捕获start,用方法getActionCommand()),将命令触发设置为true,从而执行上面的go方法中的循环体(因为循环体中要求isGo参数为true,而初始为false)。
* 执行循环快产生随机数,并将开始按钮不可编辑化,而用户只可以使用停止按钮去停止。如果用户按下停止时,也就是没有传入参数“start”的时候,
* 执行else语句块中的语句,isGo设置为false,将不执行上面go中的循环语句块,从而停止产生随机数,并显示,并且把开始按钮设置为可用,而把
* 停止按钮设置为不可用,等待用户按下开始再去开始新一轮循环产生随机数。
*/
// 如果捕获到start,也就是用户触发了动作监听器,那么下面处理
if (s.equals("start")) {
isGo = true; // 设置isGo为true
b1.setEnabled(false); // 将开始按钮设置为不可用
b2.setEnabled(true); // 将停止按钮设置为可用
} else {
isGo = false; // 将isGo设置为false,isGo为循环标志位
b2.setEnabled(false); // 设置停止按钮为不可用(注意看是b2,b2是停止按钮)
b1.setEnabled(true); // 设置开始按钮为可用
}

}

public static void main(String[] args) {
new Drawing();// 产生类的实例,执行方法
}
// 圣诞平安夜了,祝朋友开心快乐!
}

阅读全文

与java编译和解释流程图相关的资料

热点内容
光遇安卓怎么转ios教程小米 浏览:959
python儿童 浏览:42
程序员毕业半年后被辞退 浏览:641
开发板系统编译 浏览:390
pdf安装包下载 浏览:48
如何配置foxmail邮箱服务器 浏览:971
python解释器编译器源代码 浏览:113
服务器ip地址正确为什么连不上 浏览:82
飞天开放平台编程指南 浏览:114
文件夹向上一级 浏览:878
apachelinux配置域名 浏览:786
王者荣耀体验服服务器出错是什么意思 浏览:824
程序员对联意思 浏览:550
php追加txt 浏览:519
java验证码jsp 浏览:753
色铅笔画动漫pdf 浏览:260
a文件编译so 浏览:347
单片机power怎么改成接地 浏览:219
https是什么app 浏览:371
androidstudio优化设置 浏览:436