编译程序是一个语言处理程序,它可以把高级语言程序给翻译成某个机器的汇编语言程序或者是二进制代码程序,这个阶段叫做编译阶段,需要注意的是编译和运行是两个分开的阶段,也就是说我程序必须要全部翻译完毕之后,才能运行。但是在一个交互环境当中,并不需要将两个阶段给分开,也就是我们在使用解释程序的时候,它不需要在运行前就去把源程序翻译成目标代码,也可以在某台机器上运行程序,并生成结果
解释程序会去接受某个语言的程序并且立即去执行这个源程序,它的工作模式就是一个个的获取、分析并且去执行源程序的语句,一旦第一个语句分析结束之后,源程序就会开始运行并且去生成结果,它比较适合我们想以交互方式来工作的情况,也就是说我们希望在获取下一个语句之前了解每个语句的执行结果,允许执行时修改程序
解释程序其实有很多比如说BASIC语言解释程序、LISP语言解释程序、UNIX命令语言(shell)解释程序、数据库查询语言SQL解释程序以及java语言环境中的BYTECODE解释程序
解释程序的输入包括源程序和源程序的初始数据(输入数据),它不会生成目标代码,直接输出结果
编译程序和解释程序的存储组织有很大的不同,其中如果是编译程序处理时,在源程序被编译的阶段,存储区中要为源程序(中间形式)和目标代码开辟空间,要存放编译用的各种表格比如说符号表,在目标代码运行阶段,存储区中主要是目标代码和数据,编译所用的任何信息都不需要了
解释程序一般是把源程序一条语句一条语句的进行语法分析,转换为一种内部表示形式,存放在源程序区,就比如说BASIC解释程序就会将LET和GOTO这样的关键字表示为一个字节的操作码,标识符用其在符号表的入口位置表示。由于解释程序是允许在执行用户程序的时候修改用户程序的,所以这就要求在解释程序工作的整个过程中,源程序和符号表等内容始终存放在存储区内,并且存放的格式是要设计得易于修改和使用
解释程序的存储区内容如下所示
程序的解释是非常慢的,有的时候一个高级语言源程序的解释会比运行等价的机器代码程序慢100倍,所以如果我们对程序的运行速度要求很高的话,那么就不能采用解释执行的方式,还有就是解释程序的空间开销也是很大的
编译程序和解释程序是两类重要的高级语言处理程序,有些语言比如说BASIC、LISP、Pascal等既有编译程序,也有解释程序,java的语言处理环节中也是既有编译程序,也有解释程序,在java环境中java虚拟机可以对字节码进行解释运行,当然也可以采用即时编译程序(JIT),将字节码编译成本机机器代码然后执行,加快了效率
类加载器会将.class文件经过一些处理之后变成字节码在加载到内存中,也就是说会加载对应的类到jvm,关于字节码校验器,当类加载器将新加载的java平台类的字节码传递到虚拟机时,这些字节码首先要接受校验器的校验。校验器负责检查那些无法执行的明显有破坏性的操作。除了系统类之外,其他类都要被校验