当前位置:首页 » 编程软件 » java编译可执行

java编译可执行

发布时间: 2022-08-11 10:23:52

㈠ 谁能简单阐述下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代码编译为可执行程序

如果打包成jar的话很好办 如果是exe的话就有点麻烦了 可参考:
想要把java生成可执行文件需要第三方软件的支持,不过在没有安装JDK的机器上是不可能运行JAVA程序的,哪怕是编译成为exe文件。

将Java应用程序本地编译为EXE的几种方法(推荐使用JOVE和JET)
1. 从www.towerj.com获得一个TowerJ编译器,该编译器可以将你的CLASS文件
编译成EXE文件。
2. 利用微软的SDK-Java 4.0所提供的jexegen.exe创建EXE文件,这个软件可以
从微软的网站免费下载,地址如下:
http://www.microsoft.com/java/download/dl_sdk40.htm
jexegen的语法如下:
jexegen /OUT:exe_file_name
/MAIN:main_class_name main_class_file_name.class
[and other classes]
3. Visual Cafe提供了一个能够创建EXE文件的本地编译器。你需要安装该光盘
上提供的EXE组件。
4. 使用InstallAnywhere创建安装盘。
5. 使用IBM AlphaWorks提供的一个高性能Java编译器,该编译器可以从下面的
地址获得:
http://www.alphaworks.ibm.com/tech/hpc
6. JET是一个优秀的Java语言本地编译器。该编译器可以从这个网站获得一个
测试版本:
http://www.excelsior-usa.com/jet.html
7. Instantiations公司的JOVE
http://www.instantiations.com/jove/...ejovesystem.htm
JOVE公司合并了以前的SuperCede,一个优秀的本地编译器,现在SuperCede
已经不复存在了。
8. JToEXE
Bravo Zulu Consulting, Inc开发的一款本地编译器,本来可以从该公司的
网页上免费下载的,不过目前在该公司的主页上找不到了。

㈢ 老鸟看过来:java怎么编译成可执行性文件

方法很多:
1。用jdk1.2的javac 命令
如:javac a.java
2.用JBuilder3.5,VJ++6.0,VisualCafe,VAJ等均可。

㈣ JAVA中编译后执行

你的意思是在UitraEdit设置java环境吗?如果你没有设置java环境,请看下面,如果设置好了,你就在高级->工具配置->输出(第三个选项),把显示dos窗口选上,那里有很多选项,自己选择喜欢的模式
=======================================

一、定义“编译java程序”
1、打开 高级->工具配置
2、我们先定义编译java的工具,先点击“插入” 按钮
3、在“菜单项目名称”上输入“编译java程序”(显示在菜单上的名称)
4、在“命令行”里输入javac %n%e(%n为文件名不带扩展名,%e为扩展名)
5、在“工作目录”上填 %p (表示文件所在目录)
(工具栏位图可以不添)
6、切换到“输出”项;
7、选择“输入到列表框”,表示讲命令的结果输出到列表框上
选择“捕获输出”复选框,表示讲执行的结果捕获,输出到下面的输出框里
8、点击“应用”按钮,“确定”,一个编译的菜单就做好了

二、定义“运行java程序”
同样的方法可以做运行java的菜单:
1、在“菜单项目名称”上输入“运行java程序”(显示在菜单上的名称)
2、在“命令行”里输入 java %n (%n为文件名不带扩展名,%e为扩展名)
3、在“工作目录”上填 %p (表示文件所在目录)
余下步骤和第一个配置一样
现在你打开高级菜单,发现最下面多了二个你刚才定义的菜单;

三、定义“编译+运行java程序”
根据上面的方法,你还可以定义其他工具比如定义一个把编译和运行合在一起的菜单
做一个批处理的文件run.bat,放在C:盘(其他地方也可以),内容如下
javac %1.java

java %1

然后按照上面的方法:
1、在“菜单项目名称”上输入“编译+运行java程序”(显示在菜单上的名称)
2、在“命令行”里输入 C:\run.bat %n (%n为文件名不带扩展名,%e为扩展名)
3、在“工作目录”上填 %p (表示文件所在目录)
余下步骤和第一个配置一样

四、自动完成
一般软件上都有自动完成的功能,UltraEdit也可以实现
1、先讲java中的关键字,各种类名,方法等名称写到一个文本文件上,以如下方式
class

private

public

...

然后存为文本,命名为“java.txt”

2、选择菜单“高级->配置”,
在“编辑器”中选中“自动完成”,把“自动显示自动完成对话框”打上勾
选中“自动换行/制表符设置”,在“自动完成文件”中选择存放文本java.txt的路径
这是当你在输入单词的时候会自动弹出你所自定义的单词,很方便

㈤ Java如何编译执行

ava的一次编译到处运行是说,编译好的可执行程序,只要将它放到装有JVM的机器上就可以运行,你要在你的C,D,F盘的任何目录下都能javac...,java...哪就要保证这些地方有*.java文件和*.java文件所编译的*.class文件,你在DOC下只要找到相应的路劲就可以了,当然首先你是按了JVM的

㈥ java编译成可执行文件的问题

package com.yab.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DButil {
private static String username="scott";
private static String password="tiger";
private static String url="jdbc:oracle:thin:@192.168.1.100:1521:ORCL";
static{
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public static Connection getConn(){
Connection conn=null;
try {
System.out.println("--------------");
conn=DriverManager.getConnection(url, username, password);

} catch (SQLException e) {
// TODO Auto-generated catch block

e.printStackTrace();
System.out.println("没有获得连接");
}
return conn;
}

public static void free(Connection conn,PreparedStatement ps,ResultSet rs){
try{
if(rs!=null) rs.close();
if(ps!=null) ps.close();
if(conn!=null) conn.close();
}catch(Exception e){
e.printStackTrace();
}
}

public static void main(String[] args) throws SQLException {
DButil db=new DButil();
Connection conn=DriverManager.getConnection(url, username, password);
if(conn!=null){

System.out.println("连接成功");
}
System.out.println(db.getConn().getClass().getName());
}
}

㈦ java怎样编译成可执行程序exe

1. 从www.towerj.com获得一个TowerJ编译器,该编译器可以将你的CLASS文件编译成EXE文件。

2. 利用微软的SDK-Java 4.0所提供的jexegen.exe创建EXE文件,这个软件可以从微软的网站免费下载,地址如下:http://www.microsoft.com/java/download/dl_sdk40.htm
jexegen的语法如下:

jexegen /OUT:exe_file_name
/MAIN:main_class_name main_class_file_name.class
[and other classes]

3. Visual Cafe提供了一个能够创建EXE文件的本地编译器。你需要安装该光盘上提供的EXE组件。

4. 使用InstallAnywhere创建安装盘。

5. 使用IBM AlphaWorks提供的一个高性能Java编译器,该编译器可以从下面的地址获得:
http://www.alphaworks.ibm.com/tech/hpc

6. JET是一个优秀的Java语言本地编译器。该编译器可以从这个网站获得一个测试版本:
http://www.excelsior-usa.com/jet.html

7. Instantiations公司的JOVE
http://www.instantiations.com/jove/...ejovesystem.htm
JOVE公司合并了以前的SuperCede,一个优秀的本地编译器,现在SuperCede已经不复存在了。

8. JToEXE
Bravo Zulu Consulting, Inc开发的一款本地编译器,本来可以从该公司的网页上免费下载的,不过目前在该公司的主页上找不到了。

㈧ Java程序也可以编译成可执行陈旭,直接运行吗

java并不可以直接编译成.exe的可执行程序, java编译结果是.class字节码文件,字节码文件的执行必须依赖于jvm
就算使用 jar2exe之类的工具将java程序打包成了.exe可执行程序, 如果在一台没有装有jvm的电脑上,依旧是无法运行的

热点内容
html5canvas上传图片 发布:2025-02-08 00:20:44 浏览:168
安卓输入法哪个词库好 发布:2025-02-08 00:03:47 浏览:90
c存储过程数据集 发布:2025-02-08 00:03:42 浏览:925
qq卡的密码在哪里找 发布:2025-02-07 23:59:32 浏览:964
安卓为什么注册不了lysn 发布:2025-02-07 23:55:36 浏览:93
十个字母无压缩 发布:2025-02-07 23:54:51 浏览:380
java恶作剧小程序 发布:2025-02-07 23:53:48 浏览:673
openvas源码 发布:2025-02-07 23:48:14 浏览:318
面java 发布:2025-02-07 23:36:21 浏览:618
编译原理练习题第三章答案 发布:2025-02-07 23:35:05 浏览:753