编程语言最终是如何去调用CPU的?
像java、c、c++、python等都属于高级语言,而高级语言是通过调用汇编语言,而汇编语言内部封装了很多操作指令,比如 add sub等,去操作机器指令,像cpu不同的型号或类型都有不同的指令,比如x86,x64是不一样,所以对应的机器指令也不一样,所以汇编语言所调用的指令也就不一样。
CPU只识别机器指令,所以高级语言是无法直接调用的,只能通过高级语言->汇编语言->机器指令->cpu
参考:https://baike.baidu.com/item/%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80/61826
Java如何实现跨平台?
经常有一句话这样讲,java的语言写出来的程序,一次编写到处运行,其实是因为java语言经过虚拟生成.class字节码文件,然后这个.class字节码文件是基于虚拟机运行的,所以也就是说,不管任何平台只要有装jvm(虚拟机)都可以运行java,所以就实现了“一次编写到位运行”。
参考:https://www.cnblogs.com/lujiahua/p/11404611.html
jvm所处位置与作用?
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
通过上图可知我们的程序是基于各大框架,而各大框架底层又是去调用Java最原始的API,而java api又遵循 jvm的规范,所以jvm可以说是最深层次。
参考:https://baike.baidu.com/item/JVM/2902369?fr=aladdin
jvm是如何实现跨语言?
随着java7的正式发布,jvm现在已经非常强大,不是只有java语言才能使用,只要遵循jvm的规范的字节码文件,就可以在jvm上面运行。jvm只关心"字节码"文件,不关心具体是由哪种语言实现,就类似CPU一样,不关心高级语言是什么,只在乎机器指令传过来啥。
参考:https://docs.oracle.com/javase/specs/jls/se11/html/index.html
Open jdk与Oracle Jdk的区别?
Oracle与OpenJDK之间比较 | Oracle JDK | OpenJDK |
---|---|---|
执照 | 它是根据GPL(通用公共许可证)许可证授权的 | 它是根据GNU GPL(通用公共许可证)许可证授权的 |
发展 | 由Sun Microsystems Inc.开发 | 由Oracle,OpenJDK和Java社区开发 |
性能 | 根据Sun JDK的开发和实现提供性能 | 提供由Oracle JDK之上的一些供应商开发的高性能 |
可扩展性 | 根据Sun的实施 | 可以使用其他库或Oracle JDK进行改进 |
费用 | Sun的官方执行许可证 | 开源和免费实施可供免费使用 |
速度 | 由Sun Microsystems Inc.开发 | 第三方供应商将通过进行一些调整来提高JVM的速度 |
操作系统 | 支持Windows,Linux,Solaris,MacOS | FreeBSD,Linux,Microsoft Windows,Mac OS X. |
便于使用 | 可以与任何应用程序开发一起使用 | 可以与任何应用程序开发和其他开源工具一起使用,以提高开源实现模型的性能。 |
自从jdk11以后open jdk和oracle jdk基本没什么太太差别,除了两者协议不一样,其他大致相关。
参考文章:
http://openjdk.java.net/
https://adoptopenjdk.net/migration.html
jdk与jre区别
上图以jdk8为主,因为现在国内大部分都是jdk8为主,可以看到jdk8包含了jre的功能,而jre没有 Tools 和 Tool APIs 。
参考:https://docs.oracle.com/javase/8/docs/
最后
jvm是一个极其复杂的虚拟机,里面可以说集成当今世界上各大高新技术,比如:各种算法、各种优化方案、各种各样的友好兼容以及与硬件交互的底层机器指令等等。