看到这个标题,一定认为这是一篇水文,其实也没有那么水,算是一篇大众科普文吧。
进入正题
一、介绍java
java是一门编程语言,最早由sun进行研发,研发的初衷是解决c和c++在底层操作并且进行编码的一些问题,当然也包括面向对象编程,所以java被设计成跨平台、可移植。其中有很长一段故事,有兴趣的自己去查阅相关资料。
二、sun jdk
众所周知,java运行在jvm虚拟机上,其中虚拟机又分很多种。到目前为止java代表的并不是jvm。
jvm可以理解成一个不透明的沙盒,提供了一些接口允许输入输出,当然也提供了一些基本的监控。java被当成了编写程序运行在jvm上的一门编程语言。
sun jdk主要分为bin、lib、 jre 、jre/lib 、 jre/bin 几大块:
bin是Java工具,可以调起java的一些可运行包,比如java的编译,最主要的是编译器(javac.exe)。
lib是java基础类库。
jre是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库,也就是说运行一个java程序只需要包含jre部分即可,但是jre只能运行,不能编译。
jre/lib是JVM标准实现及Java核心类库。
jre/bin相当于jvm,提供了编译后的二进制文件的运行环境。
可以看出 jdk是最全的包含了所有的java所需包括jre,而jre只有运行环境,其中jre包含jvm。
三、为了证明不是水文
回到本质上,jvm接受的是二进制文件,而不是指定java语言编写的二进制文件,所以使用其他语言比如python、c、c++、go等语言,只要能将其编译成jvm可理解的二进制文件,就能在jvm上运行,当然这个过程非常艰难,要知道难在哪,需要搞清楚java编译器编译出来的二进制文件的格式是怎么样的,这个问题我将在后续的java编译、指令重排中介绍。
当下对java程序员的技能水平考验的更多是jvm的了解和掌握程度,而非java语言特性。绝大多数jvm都是由c++或者c(c与c++历来不分家)编写,当然也有用java实现虚拟机的版本。要搞懂jvm不必去搞c,但是搞过c的人都知道写起c来跟写起java来,完全不是一回事,java给我们的是全套封闭式的环境,同时也是束缚程序员的一大壁垒。
![欢迎关注我的个人公众号](https://i-blog.csdnimg.cn/blog_migrate/99947f7b93de19315e9df8499028894e.jpeg)