Java是一种面向对象的语言,是现今世界上最好的语言之一;
Java源代码的默认编译结果并非是本地机器指令,而是具有平台通用性的字节码,因此Java是一种一次编译,处处运行的语言;Java的源代码编译出来的字节码文件,是在Java虚拟机(jvm)中运行的,虽然不同平台的Java虚拟机的实现机制不尽相同,但是编译出来的字节码却是一样的;因此Java又是一种跨平台的语言, 并且能解决程序的安全性问题、跨平台移植性问题;
Java技术的核心就是JVM,JVM是由一组规范所定义的抽象计算机,JVM的主要任务就是负责将字节码装载到其内部,解释/编译为对应平台上的机器指令执行;目前市场上主流的虚拟机内部一般都包括编译器和解释器,这样设计的原因,通过解释器和编译器的协同工作,既可以保证程序的响应时间,又可以提高程序的执行性能,并且对编译器的工作压力也降低了一定程度的负载;这样就可以当虚拟机启动的时候,解释器可以首先发挥作用,而不必等待编译器全部编译完成再执行,这样就可以节省好多不必要的编译时间,并且随着程序运行时间的推移,编译器逐渐发挥作用,根据热点探测功能,将有价值的字节码编译为机器指令,以换取更高的程序执行效率;
知识普及到此结束;接下来我要讲的有三个方面:
1、Java程序编译和运行的大概讲解
2、Java程序的编译原理
3、Java程序的运行
一、Java程序的编译与运行概述
我们为了提升写代码的速度,我们每个人都有自己使用的编译器,当我们运行完一个程序后,我们的编译器文件夹中一会显示一个多出来的target(也可能是其他的),这个包下面的目录结构和我们的主程序包的结构是一样的,只不过每一个.java都变成了对应的.class文件;这些文件就是我们开篇提到的源程序编译出来的字节码文件,我理解的编译器的作用就是给程序员代码提示,和编译源代码的作用,当然Java也有自带的编译器;
大家都知道Java是在JVM上运行的,事实上在JVM上运行的是Java编译过后的字节码文件;上面提到了我们的JVM是一种抽象的计算机,那么JVM的位置是在哪的?JVM又是如何处理多个程序的呢?我的理解是这样的:大多数Java虚拟机的书籍上都说JVM在jre包下面,那我们就可以说是JVM对我们的体现就是一堆代码;当我们运行程序的时候对其进行调用,我们当前运行的程序就会创建一个虚拟机实例,然后进行各种分配;我们都知道虚拟机只有一个,而每一次的代码都要在这同一个虚拟机中进行运行;那虚拟机又是如何处理的呢?我对这一块的想法是这样的,Java是一门面向对象的语言,我们写代码的过程中,当我们需要某一个对象的时候我们会new一个,那么我认为这个思想对虚拟机也是这样的,我们每运行一个完整的Java程序
,我们的虚拟机就会new一个虚拟机实例;虚拟机是没有没有生命周期的,但是这些虚拟机实例是有生命周期的,我们的字节码文件开始运行的时候创建本程序的虚拟机实例,当程序结束的时候,虚拟机实例死亡;
二、Java程序字节码的编译原理
javac 编译器将Java代码编译成一个有效的字节码文件主要经过四个主要步骤:词法解析、语法解析、语义解析、生成字节码;
①词法解析:
将Java源码中的关键字和标示符等内容转换为符合Java语法规范的Taken序列,然后按照指定的顺序规则进行匹配校验,这就是词法解析;Taken序列是一组对应源代码字符集合的单词序列,简单的说,Taken序列就是一个枚举类型,其内部定义了许多符合Java语法规范并与源码字符集合相对应的枚举常量、
②语法解析:
指将词法解析后的Taken序列整合为一课结构化的语法树;
③语义解析
将之前语法解析步骤所产生的语法树扩充的更加完善,后续编译器会使用语义解析后的语法树直接生成字节码;
④生成字节码
调用compile()方法进行编译;compile()方法本身不具备执行编译的能力,而是在运行时调用其他的编译方法最终完成字节码的编译;
三、Java程序的运行
Java源码编译过后的有效的字节码文件在jvm中运行(见一);
相关推荐
这个名为“编译和运行Java程序的小工具”就是为了简化这一过程而设计的。下面将详细解释这款小工具的工作原理以及如何利用它来提升Java开发效率。 首先,Java程序的执行通常需要经过两个主要步骤:编译和运行。编译...
### Java程序编译与运行 Java是一种跨平台的编程语言,其源代码文件后缀为.java。一个Java程序要运行,需要经历编译和运行两个基本步骤。首先,Java源代码会被编译成Java字节码,这是一种中间表示,可以在任何安装...
其次,学生需要使用 Java 的编译器 javac 将源程序编译为字节码文件。例如,c:>javac example.java 如果源程序的语法正确,将生成与主文件名相同的而扩展名为 .class 的文件,例如,example.class 如果编译出错,...
标题中提到的"java反编译程序"通常指的是如Jad、FernFlower、Procyon等这样的反编译工具。它们能够解析.class文件,并尝试重构出接近原始的Java源代码。虽然反编译的结果可能与原始源代码不完全一致,但依然能提供...
Java程序的可逆性是其独特性质之一,由于其字节码的结构和设计,使得Java程序相对容易被反编译。反编译工具能够解析Class文件中的方法和变量名,甚至重构出接近源代码的代码,这为保护Java代码的知识产权带来了挑战...
JRE是运行已编译Java程序的必备组件,而JDK则增加了编译器和其他开发工具。 在Java编程中,开发者通常使用`javac`编译器将源代码(.java文件)编译为字节码(.class文件)。例如,如果有一个名为`Hello.java`的...
Java 自动编译运行 批处理程序 以下是自制的Java自动编译+运行批处理程序,请将它加入到Path中 它可以执行的指令有: t Java文件名 [/?][e][r]或[c] [a] 注意:请不要输入文件的扩展名 [/?] 读取本帮助信息 [/...
3. **运行与调试**:成功编译后的Java程序可以在服务器上运行,返回执行结果。部分在线编辑器还提供了运行控制台,显示程序输出,甚至支持简单的调试功能,如设置断点、单步执行等。 4. **版本控制**:为了便于多...
Java代码快捷编译运行工具是针对初学者设计的一款实用程序,旨在简化Java编程过程中常见的编译和运行步骤。对于刚接触Java编程的开发者来说,通过命令行(CMD)进行源码的javac编译和java运行可能会感到繁琐,而这款...
添加动态执行的编译环境 options 是个集合,添加内容,字符集,classpath等 * 6.传入JavaFileObject的java文件,是个集合,创建JavaSourceObject实现这个接口,Kind.SOURCE.extension = '.java' * 7.创建任务并...
Java程序在执行时,会先由Java编译器将源代码编译成字节码,这些字节码存储在.class文件中。Java虚拟机(JVM)再将字节码解释执行。而反编译就是逆向这个过程,通过特定的工具将字节码还原成接近原始的Java源代码。...
在DOS环境下编译和运行带有自定义包的Java程序是一项基础但重要的技能,尤其对于初学者来说。本文将详细讲解这个过程,并提供一些关键点和注意事项。 首先,理解Java的包(Package)机制至关重要。包是Java的一种...
在Java编程中,动态编译和运行类是一项重要的能力,特别是在需要实时更新代码或实现热部署的场景下。本文将深入探讨如何利用Java的API来动态编译.java源文件,并执行编译后的类。 首先,Java的`javac`命令行工具是...
总的来说,“小颖Java源代码反编译专家 V1.4终极版”作为一款强大的Java反编译工具,能够为开发者提供便利,尤其是在需要理解和调试无源代码的Java程序时。然而,使用任何反编译工具都应谨慎,并且始终尊重软件的...
在日常的软件开发过程中,开发者经常会遇到需要在命令行环境下编译和运行Java程序的情况。本文将详细介绍如何在DOS(Disk Operating System)环境下,通过命令行工具编译和运行Java程序。 #### 创建目录结构 在...
虽然反编译的结果可能与原始的.java文件略有不同,但大部分情况下仍然能理解代码的逻辑和结构。 JAD是另一个知名的Java反编译工具,它提供命令行接口,适合于自动化脚本或者集成到其他工具链中。FernFlower则是一个...
Java程序的编译和运行过程是学习Java编程的基础,也是理解其工作原理的关键。 一、Java程序的编译 在Java中,源代码文件通常以`.java`为扩展名,这些文件包含了Java类的定义。编译Java程序的步骤如下: 1. **编写...
GCJ编译器可以将Java程序编译成本地机器码,从而提高Java程序的执行速度。 四、使用gdb调试Java程序 在Linux中的GNU调试工具gdb可以用来调试Java程序。使用gdb调试Java程序可以帮助开发者快速定位和解决Java程序中...
通常情况下,Java程序在运行前需要通过`javac`命令将.java源文件编译成.class字节码文件,然后通过`java`命令执行。但在某些场合,我们可能希望在程序运行时动态地编译新的.java文件,以便快速响应代码变动。 Java...
文件列表中的`试验01`可能代表一个初学者的实践项目或实验,这通常涉及到创建、编译和运行一个简单的Java程序,以理解上述概念。这个实验可能包括创建一个简单的"Hello, World!"程序,以此来体验Java开发的基本流程...