前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java是编译执行的语言”这句话对吗?

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

作者头像
Tencent JCoder
发布于 2019-03-04 02:44:54
发布于 2019-03-04 02:44:54
6750
举报
文章被收录于专栏:我的技术专栏我的技术专栏

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

  • Java语言本身,包括基础的语言特性,面向对象、放射、范型、lambda等等。
  • Java类库,包括核心类库如IO/NIO、网络、utils、安全、jdk等,以及在生产环境中常用的第三方类库。
  • Java虚拟机,包括java的内存管理机制、垃圾收集器、运行时、动态编译等
  • Java/JVM生态,包括了Java EE、Spring、HadoopSpark等等
  • Java工具,包括用来诊断性能如jmap、jstack等、编译器javac、sjavac、以及辅助工具如jlink、jar等。

这些内容无法在一个篇幅中都提到。本文从Java等基本特性开始,先来回答一个问题“Java是编译执行语言,这句话对吗?”,我们又该如何理解Java的“书写一次 ,到处执行”呢?

Java语言本身最显著的两大特性是“书写一次,到处运行(Write Once,run anywhere)“,以及垃圾收集。这两点都和C++有明显的区别。

”书写一次,到处运行“的能力是基于Java 虚拟机(JVM)的。Java源代码编译后生成的.class文件并不是最终的机器码,而是一种可以被JVM解析的格式,称为字节码。JVM将字节码翻译成机器码后执行机器码来运行程序。只要在不同的操作系统上安装好JVM后,.class文件便可以在这些JVM上运行。

从这个过程来看,字节码是在JVM中被解释执行的,那么“Java是解释执行的语言”这句话正确吗?这句话不太准确,常见的JVM,比如我们最经常使用的Oracle JDK提供的JVM,都提供了JIT(Just-In-Time)编译器,也就是通常所说的即时编译(https://en.wikipedia.org/wiki/Just-in-time_compilation)。为了提高热点代码的执行效率,在运行时,JVM会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,这种情况下,热点代码就属于“编译执行”而不是解释执行。JVM提供了不同的参数来对这两种模式进行指定,例如-Xint告诉JVM只进行解释执行,不对代码进行编译,这种模式就抛弃了JIT带来的性能上的优化。同时另一个参数-Xcomp则是告诉JVM不要进行解释执行,这种模式也叫做“最大优化级别”,但实际上也并不一定会高效。

总的来说,Java的“编译”和C/C++的编译含义是不同的。Java源代码编译后生成的.class文件中是字节码,而不是可以直接运行的机器码。JVM通过类加载器(class-loader)来加载字节码,进行解释执行或编译执行。除了上面说到的这两种编译模式外,还有一种编译模式称为AOT(Ahead-of-Time Compilation)(https://en.wikipedia.org/wiki/Ahead-of-time_compilation),AOT可以将字节码直接编译成机器码,在JDK 9中便引入了这些特性。更多的细节可以参考文档http://openjdk.java.net/jeps/295。

JVM本身是一个强大的平台,它除了使得Java源代码编译生成的字节码具备”书写一次,到处运行“的能力外,只要符合格式的字节码,都可以运行在JVM上,所以大量的JVM语言的字节码都可以在JVM上运行,例如Scala。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-02-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗?
Java 本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“书写一次,到处运行”(Write once, run anywhere),能够非常容易地获得跨平台能力;另外就是垃圾收集 (GC, Garbage Collection),Java 通过垃圾收集器(Garbage Collector)回收分配内存, 大部分情况下,程序员不需要自己操心内存的分配和回收。 JRE(Java Runtime Environment)或者 JDK(Java Development Kit)。 JRE,也就是 Java 运行环境,包含了 JVM 和 Java 类库,以及一些模块等。而 JDK 可以看作是JRE 的一个超集,提供了更多工具,比如编译器、各种诊断工具等。
葆宁
2019/04/18
5040
90% 的 Java 程序员都说不上来的为何 Java 代码越执行越快(1)- JIT编译优化
经常听到 Java 性能不如 C/C++ 的言论,也经常听说 Java 程序需要预热,那么其中主要原因是啥呢?
干货满满张哈希
2021/04/12
4790
90% 的 Java 程序员都说不上来的为何 Java 代码越执行越快(1)- JIT编译优化
聊一聊Java语言的跨平台性与Java虚拟机
Java语言的跨平台性是通过将源代码编译成平台无关的字节码文件,并且在每个平台上都有相应的JVM来执行字节码实现的。这样一来,Java程序可以在不同的操作系统上运行,只需要有适用的JVM即可。这种设计使得Java成为了一种开发跨平台应用的强大工具。
一凡sir
2023/08/12
7700
Java关于 JVM JDK 和 JRE 通俗的解答
Java虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。
赵哥窟
2020/01/02
7360
Java面试题(一)(基础概念与常识)
总体而言,Java语言具有简单易学、面向对象、平台独立、内存管理、强大的生态系统、高性能、安全性、多线程支持和丰富的开发工具等特点,使得它成为一种广泛应用于企业级应用开发、移动应用开发和互联网开发的编程语言。
程序员朱永胜
2023/08/17
1920
Java 基本功 (基础概念与常识)
主要涉及知识点: JVM JDK 和 JRE 最详细通俗的解答Oracle JDK 和 OpenJDK 的对比Java 和 C++的区别?什么是 Java 程序的主类 应用程序和小程序的主类有何不同?
Java宝典
2021/01/14
4880
Java 基本功 (基础概念与常识)
如何向面试官解释JVM
Java 虚拟机(Java Virtual Machine,JVM)是运行 Java 字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,使程序运行出相同的结果。
黑洞代码
2021/01/14
4220
如何向面试官解释JVM
OpenJDK 提议 Galahad 项目合并 GraalVM 的原生编译
作者 | Ben Evans 译者 | 张卫滨 策划 | 丁晓昀 OpenJDK提出了一个新的项目 ,代号为 Galahad,以便于将 GraalVM 社区版代码库中的一部分功能合并到 OpenJDK 中。 这是一项长期努力的最新进展,也就是在程序执行之前将 Java 应用编译为机器码的能力。乍看上去,这似乎有些奇怪,毕竟,一位新的 Java 开发人员最先了解到的一点就是“Java 不会编译成机器码,而是编译成 JVM 字节码”。 这句简单的格言有着深远的影响,其中最基础的就是,Java 平台依赖一个强大的
深度学习与Python
2023/03/29
4550
OpenJDK 提议 Galahad 项目合并 GraalVM 的原生编译
软件开发:动态编译、即时编译、预编译与静态编译的对比与分析
在现代软件开发中,编译技术对程序性能和开发效率有着至关重要的影响。不同的编译策略在提升程序性能、灵活性和开发效率方面各有优劣。本文将深入探讨四种常见的编译技术:动态编译(Dynamic Compilation)、即时编译(Just-In-Time Compilation, JIT)、预编译(Ahead-of-Time Compilation, AOT)和静态编译(Static Compilation),对它们的定义、工作原理、优缺点及应用场景进行全面分析和对比。
运维开发王义杰
2024/06/25
1.1K0
软件开发:动态编译、即时编译、预编译与静态编译的对比与分析
JVM-执行引擎
JVM设计者们的初衷仅仅只是单纯地为了==满足Java程序实现跨平台特性==,因此避免采用静态编译的方式直接生成本地机器指令,从而诞生了实现解释器在运行时采用逐行解释字节码执行程序的想法。
程序员阿杜
2021/07/14
8010
谈谈你对 Java 平台的理解声明提问正文
提问 谈谈你对 Java 最直观的印象是什么?是它宣传的 “Write once, run anywhere"? 谈谈你对 Java 平台的理解? Java 是解释执行,这句话正确吗? 正文 谈谈你对 Java 平台的理解? 一看到这个问题时很懵,对 Java 平台的理解?这是啥问题,面这么广,该说些啥。 一瞬间闪过脑袋的,无外乎:面向对象的高级编程语言?跨平台?三大特性?然后就没了~ 然后看了本讲的内容,浏览了评论区各大神的回答,才发现,自己的基础确实很薄弱。这个问题并没有固定的答案,但关键在于考核你对
请叫我大苏
2018/07/04
5590
Spring Boot3 新玩法,AOT 优化!
今天和小伙伴们来聊一聊 Spring6 中的一个新特性 AOT(Ahead of Time),这也是目前在学习 Spring6 源码视频的小伙伴的一个提问,其实还是挺有代表意义的,因此松哥整理一篇文章来和大家聊一聊这个话题。
江南一点雨
2024/01/17
2.4K1
Spring Boot3 新玩法,AOT 优化!
吃透这套BAT大厂Java面试题,拿offer成功率再翻一番
优点 : 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix 等一般采用面向过程开发,性能是最重要的因素。
美的让人心动
2019/05/15
5180
linux和windows系统开发语言,java 运行机制,编译原理(C/C++的源码到机器语),编译器和解释器,C/C++与Java的区别
windows:汇编、C、VB、C++; linux:汇编、C;linux gui主要有两大类:gtk是C和C++的,qt是C++的。
zhangjiqun
2024/12/16
1200
linux和windows系统开发语言,java 运行机制,编译原理(C/C++的源码到机器语),编译器和解释器,C/C++与Java的区别
Spring6 AOT 提前编译
JIT和AOT 这个名词是指两种不同的编译方式,这两种编译方式的主要区别在于是否在“运行时”进行编译
鱼找水需要时间
2023/06/24
3330
Spring6 AOT 提前编译
Java虚拟机编译原理二:Java的类加载过程
在开始探寻类加载过程之前,有必要阐述一下这三者之间的关系,三者属于包含关系
浩说编程
2021/08/17
3310
Java虚拟机编译原理二:Java的类加载过程
HotSpot(热点最新的一种的java虚拟机)详解
SUN的JDK版本从1.3.1开始运用HotSpot虚拟机, 2006年底开源,主要使用C++实现,JNI接口部分用C实现。
IT小马哥
2020/03/18
4K0
初识JVM(简单易懂),解开JVM神秘的面纱
在Java的世界里,Java虚拟机(JVM)扮演着至关重要的角色。它不仅是Java程序运行的环境,更是实现“一次编写,到处运行”的关键。本文将深入探讨JVM的核心组成部分,从类加载到执行引擎,解开JVM神秘的面纱。
人不走空
2024/02/20
1870
初识JVM(简单易懂),解开JVM神秘的面纱
从java文件到字节码
本文来说一下,我们开发好的.java文件是源码文件,并不能交给机器直接执行,需要将其变成字节码甚至是机器码文件。那么静态编译器是如何把源码转化成字节码的呢?
田维常
2019/09/10
9920
从java文件到字节码
JVM系列第4讲:从源代码到机器码,发生了什么?
在上篇文章我们聊到,无论什么语言写的代码,其到最后都是通过机器码运行的,无一例外。那么对于 Java 语言来说,其从源代码到机器码,这中间到底发生了什么呢?这就是今天我们要聊的。
陈树义
2018/12/11
1.2K0
推荐阅读
相关推荐
谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗?
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文