Java程序的编译与运行

阅读更多

        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中运行(见一); 

      jvm的生命周期

你可能感兴趣的:(Java)