本篇来自周志明的<<深入理解java虚拟机>>

许多Java虚拟机的执行引擎在执行Java代码的时候都有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择,在本章中,我们先来探讨一下在解释执行时,虚拟机执行引擎是如何工作的。

解释执行

Java语言经常被人们定位为“解释执行”的语言,在Java初生的JDK 1.0时代 ,这种定义还算是比较准确的, 但当主流的虚拟机中都包含了即时编译器后,Class文件中的代码到底会被解释执行还是编译执行,就成了只有虚拟机自己才能准确判断的事情。再后来 ,Java也发展出了可以直接生成本地代码的编译器[如GCJ」(GNU Compiler for the Java )],而C/C++语言也出现了通过解释器执行的版本(如CINT) ,这时候再笼统地说“解释执行”,对于整个 Java语言来说就成了几乎是没有意义的概念,只有确定了谈论对象是某种具体的Java实现版本和执行引擎运行模式时,谈解释执行还是编译执行才会比较确切。

一、你可以说它是编译型的。因为所有的Java代码都是要编译的,.java不经过编译就什么用都没有。 
二、你可以说它是解释型的。因为java代码编译后不能直接运行,它是解释运行在JVM上的,所以它是解释运行的,那也就算是解释的了。 
三、但是,现在的JVM为了效率,都有一些JIT优化。它又会把.class的二进制代码编译为本地的代码直接运行,所以,又是编译的。

不论是解释还是编译,也不论是物理机还是虚拟机,对于应用程序,机器都不可能如人那样阅读、理解 ,然后就获得了执行能力。大部分的程序代码到物理机的目标代码或虚拟机能执行的指令集之前,都需要经过图8-4中的各个步骤。如果读者对编译原理的相关课程还有印象的话,很容易就会发现图8-4中下面那条分支,就是传统编译原理中程序代码到目标机器代码的生成过程,而中间的那条分支,自然就是解释执行的过程。

如今,基于物理机、Java虚拟机,或者非Java的其他高级语言虚拟机(HLLVM )的语 言 ,大多都会遵循这种基于现代经典编译原理的思路,在执行前先对程序源码进行词法分析和语法分析处理,把源码转化为抽象语法树( Abstract Syntax Tree,AST)。对于一门具体语言的实现来说,词法分析、语法分析以至后面的优化器和目标代码生成器都可以选择独立于执行引擎,形成一个完整意义的编译器去实现,这类代表是C/C++语言。也可以选择把其中一部分步骤(如生成抽象语法树之前的步骤)实现为一个半独立的编译器,这类代表是Java 语言。又或者把这些步骤和执行引擎全部集中封装在一个封闭的黑匣子之中,如大多数的JavaScript执行器。

图8-4 编译过程

Java语言中 ,Javac编译器完成了程序代码经过词法分析、语法分析到抽象语法树,再遍历语法树生成线性的字节码指令流的过程。因为这一部分动作是在Java虚拟机之外进行的, 而解释器在虚拟机的内部,所以Java程序的编译就是半独立的实现。

Java语言是 解释执行 的语言吗相关推荐

  1. java语言特点解释类_Java语言特点

    Java语言特点 引导语:Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言.那么你知道Java语言的特点吗,以下是百分网小编分享给大家的Java语言特点,欢迎阅读! Java语言的特点 1 ...

  2. 一段话系列-Java是否是解释执行语言?

    2019独角兽企业重金招聘Python工程师标准>>> Java是半执行半解释执行语言,首先,Java会由Javac编译成字节码,这是编译:然后字节码会交由JVM中的解释器进行解释执 ...

  3. python语言是解释执行的、因此执行速度比编译型语言慢_解释型语言的特点与理解...

    解释型语言是什么?对比编译型语言有什么区别? 为了将高级语言转换成计算机能识别的机器语言,需要一个'翻译'过程.即编译或者解释 编译型语言 编译型语言的程序只要经过编译器编译之后, 每次运行程序都可以 ...

  4. c语言列子解释6,c语言:输入俩个复数的实部与虚部,计算俩个复数之积,声明怎么声明?...

    这个是一个列子,可以参考下 struct complex{ float rmz; //实部 float lmz;//虚部 }; //产生一个复数. complex getAComplex(float ...

  5. “Java是编译执行的语言”这句话对吗?

    现在让你谈谈对Java平台的理解,你是否会感觉内容过于庞大?这个问题是比较宽泛的,Java发展到现在已经不仅仅是语言这么简单了,Java平台涉及的,包括但不仅限于下面提到的这些内容: Java语言本身 ...

  6. java语言中解释方式是什么意思,Java语言快速入门·简答T

    1 面向对象与面向过程有什么区别? 面向对象编程:既然面向的是对象,那么强调的自然就是--对象,那么对象多了,就会抽象出相应的类(对象是类的实例化),所以 · 程序是由类组成 · 程序运行的时候去调用 ...

  7. java 编译运行原理_Java编译和解释执行对比及原理解析

    编程语言分为低级语言和高级语言,机器语言.汇编语言是低级语言,C.C++.java.python等是高级语言. 机器语言是最底层的语言,能够直接执行.而我们编写的源代码是人类语言, 计算机只能识别某些 ...

  8. java 编译 解释执行_关于Java的编译执行与解释执行

    编程语言分为低级语言和高级语言,机器语言.汇编语言是低级语言,C.C++.java.python等是高级语言. 机器语言是最底层的语言,能够直接执行.而我们编写的源代码是人类语言, 计算机只能识别某些 ...

  9. 静态语言和动态语言,解释和编译

    前提 通过高级语言编写的源码,我们能够轻松理解,但对于计算机来说,它只认识二进制指令,源码就是天书,根本无法识别.源码要想执行,必须先转换成二进制指令. 所谓二进制指令,也就是由 0 和 1 组成的机 ...

最新文章

  1. A simple Test Client built on top of ASP.NET Web API Help Page
  2. ecshop订单-》待付款,待发货,待收货,收货确认
  3. ASP.NET Master Page
  4. 你不是一个人在战斗!有人将吴恩达的视频教程做成了文字版
  5. LeetCode 566 Reshape the Matrix 解题报告
  6. 社区发现 实践_实践社区可以为您的组织做什么
  7. [leetcode]_Best Time to Buy and Sell Stock I II
  8. 8.运输层(2)---TCP
  9. Android Studio 生成*.aar文件及使用方法
  10. js高级学习笔记(b站尚硅谷)-11-变量提升与函数提升
  11. HP ProLiant DL380 G6内存错误导致WHEA-Logger 47报警的解决
  12. 3mx转osgb_如何将无人机Las点云数据转为Osgb数据
  13. J2ME、J2SE、J2EE 小讲
  14. 如何使用pr制作视频人物运动残影特效
  15. Linux的任督二脉之内存管理线上微信群直播报名(2018.1.29-2.2)
  16. 正宇丨青松气质 红梅品格
  17. 全新UI众人帮任务帮PHP源码/悬赏任务抖音快手头条点赞源码/带三级分销可封装小程序
  18. 2015阿里移动推荐算法大赛总结
  19. 回头再说 008 瞬
  20. Abaqus中批量对节点施加集中力荷载

热门文章

  1. java接口的一些理解(未完待续)
  2. 笔记本搞双系统-安装Ubuntu过程没有出现选择试用-安装、没有选择“安装类型”页面、安装类型页面为空等问题解决
  3. EDI 对接CommerceHub OrderStream
  4. java对接杉德支付完整代码
  5. 国产系统UOS上的可视化大屏电子看板系统
  6. Hive 练习(带数据)
  7. 计算机为什么能做翻译,为什么计算机能翻译?
  8. 大脑懒惰比身体懒惰更难克服
  9. 梅捷主板去掉启动自检_持续交付–第五部分–启动–自检
  10. Vue项目使用拦截器和JWT验证 完整案例