24资源网

24资源分享网,分享资源,收集整理资源,有态度的分享资源网

JAVA语言具体是指什么呢?

avatar 小四 2023-01-22 10:03 41次浏览 0 条评论 编程

这是一个比较大的范围,狭义上,可能仅仅指编程语言的语法,但是会带来很多外延,以及曾经在这个外延里面,但是随着时间的发展,被踢出去的部分。先说最狭义的

JAVA语法

java本质上是一个编程语言以及工具的定义,官方会有规范,规范在这里

Java SE Specifications

这个规范分成两个部分,一个是java语言的规范,还有一个是jvm的规范,这个规范会每年更新两个版本,也就是现在java版本的发布频次,一年两次,数字在慢慢往上叠加

狭义的java,指的就是java语言本身,也就是这里java语言的规范

这个规范定义了java这个编程语言的语法,只有满足这个语言语法的东西,才叫做java

就比如java语言会要求你,所有package下面的文件,最外层,只能是class,java每一个源码的文件名,必需跟这个文件源码里面的唯一一个public的class同名,package名字就是文件夹的名字,全英文小写,不要出现大写,因为有些操作系统文件名和文件夹名不区分大小写,等等这些,java最核心的部分就在这里,这个部分定义了编程语言的语法

其实大多数人学的java,所谓的java,就是这个东西,你要学会怎么编写java,懂了这些之后,你就能跟java提供的工具合作,做出相对应的软件出来

但这个东西,其实是皮,是编程工具跟开发人员对接的接口,有了这个统一的规范之后,开发人员就知道,怎么跟编译工具交流,告诉编译工具,我要实现怎样一个软件,我提供源代码,编译工具负责将源代码编译成我想要实现的软件

值得称颂的一点就是,java的语法非常保守,轻易不新增语法,不管是关键字还是语法糖,java不说是所有语言中最少的,也是比较少的那一个,java的关键字和语法其实翻来覆去就那么点,所以从学习门槛上看,java的学习难度不说是最低吧,但也是非常接近最低的那一个

这么多年,能学会java的人,比比皆是,不同于那个照着书敲代码都无法运行的某知名c语言教材,java的教材呢,很少有出错的,因为java的语法比较少,所以配套的软件支持很强大,几乎所有的ide也就是编程环境,都能在最短时间内,提示你,哪里写错了,所以java的学习,除了教材以外,ide本身也是一个非常好的学习工具,我在大学学java的时候,很多知识看书是记不住的,是ide告诉我的,看书只能大概理解一下概念,真正的掌握和记忆,是通过ide上的实操掌握的,动手之后,对于工具的理解和记忆,会被强化,光看概念,死背,其实效果不怎么好的,所以编程学习一定要动手,有些东西没写过就是记不住

java的保守还体现在,java几乎所有的特性,都用英语单词来表达,java中别说关键字和语法糖了,就是各种符号,都非常少,应该也是非常接近最少的一个,就比如swift的compound types,java中都没有,哪怕是lambda这种,它都要给你搞一个functional interface出来,强迫你命名该类型,把swift里面的compound type给做成named type,java就几乎只有named type,而且几乎所有的type类型都是class,虽然现在还有primitive type,但是以后primitive type会变成primitive class,所以java几乎所有的类型/type,都是class,不管是interface,enum,record,annotation,functional interface还是以后要出现的value,primitive,这些都是class,通过这种方式,进一步降低了理解难度,反正都是class,理解了class之后,这事就解决了一半,剩下的无非是特殊的class,是不是简单很多?

很多语言会把函数跟class并列,比如swift的函数类型定义就是compound type,就不是named type,所以swift学习难度和门槛要比java高一点,而且swift没有gc,arc就有诸多讲究了

说到gc,这就要引入我们说的第二个规范,也就是

JVM规范

有了java规范之后,你就能依照这个规范,把java源代码写出来了,但是光有java源代码还不够啊,源代码本身只是文本,我们需要有一个能够理解该源代码,并且根据这个源代码制作生成我们想要实现的软件的这么一个工具

这个工具就是

JDK

jdk就是java development kit,翻译过来就是java开发工具集,kit就是成套工具的意思,这个名字是不是就很直观?java开发套件

jdk包含有jvm,jdk是jvm的超集,以前还有jre的概念,jre包含有jvm,jdk又包含有jre,不过现在jre因为能够被自由滴扩展和删减,所以现在已经不怎么用jre这个概念了,jre是java runtime,java运行时,不怎么用的概念就不展开了,以免误导

就剩下jvm和jdk,jvm是jdk的子集,是jdk的一部分,全称就是java virtual machine,java虚拟机

前面说了,jvm有一个规范,这个规范定义了什么呢?

定义了java经过编译之后的字节码的格式,以及怎么解释并执行这些字节码,也就是

JIT编译器

jit就是just in time,即时的意思,jit编译器就是即时编译并执行的机器

jvm除了jit编译器以外,还定义了gc的机制,所以jvm规范里面包含有一个jit编译器的规范,以及gc的规范

那么不同的厂家,就可以根据同一个jvm规范,制作出不同的jvm

早些年很多公司都有自己的jvm,比如bea的jrockit

,苹果也有自己的jvm,现在这些jvm都因为各种原因,被合并到官方主流的jvm中去或者消失了,那现在主要的jvm

就是sun最初制作的jvm,也就是hotspot,hotspot里面的jit编译器,叫做c1&c2,c1最早是针对client客户端,c2则是针对服务器端,但是现在都混用了,值得注意的是,现在出现了hotspot里面c1&c2以外的jit编译器,那就是graal jit,不同的jit编译器,可以通过jvmci机制在同一个jvm中替换jit

graal jit

作为c1&c2的替代品,就可以通过jvmci替换c1&c2,以后随着graal jit并入openjdk,用户可以通过一个option参数,选择使用graal jit还是传统的c1&c2,graal jit是纯java实现的,java开始自举了

jvmci的内容在这里:JEP 243: Java-Level JVM Compiler Interface

jvm中除了jit以外,还有

GC,垃圾回收

不同的jvm,gc自然也就不一样

hotspot常见的gc有官方制作的zgc,以及red hat制作的shenandoah

,还有g1,以及现在被删除的cms,你在网上看到的很多所谓的gc调优经验,基本上都是针对cms的,现在随着cms都被删除,所以这些经验基本上就没用了,过时了,你看,我们写的这些内容,经常会告诉你,哪些东西被删除了,过时了,现在不用了,你可以根据这些去甄别,网络上哪些内容,是过时的

现在除了官方的hotspot以外,还有一个比较著名的虚拟机,就是ibm产的openj9

,openj9的gc就跟hotspot不一样,所以如果你要用zgc,shenandoah这些,你要注意选择hotspot,openj9有自己的一套gc机制,用法不一样

所以jvm里面jit和gc都是可以选择的,而且jvm本身也是可以被替换的,这就是规范的好处,有了规范,很多东西都可以做成可替换的,不管是jit还是gc,甚至jvm

jvm在实际生产中的作用就是,解释并执行字节码文件

那前面说了java规范只定义了java源代码,那把源代码翻译成字节码的工作谁来做呢?

这就说到jdk了,jdk是jvm的超集,那jdk多出来什么东西呢?就是一些工具,比如把源代码翻译成字节码的工具,这就是jdk的一部分,而不是jvm的一部分,这个叫做javac,c就是编译compile的首字母,编译java源码的命令,也叫做javac,就跟工具同名

也就是说,jdk = javac + jvm

javac负责将java源代码翻译成字节码,jvm负责将字节码翻译之后执行

那为什么要把java源码的执行分成这两个部分呢?

为了

跨平台

javac翻译之后的字节码,是可以在不同平台上,被不同平台上的jvm所执行的

不同平台上的jvm是不一样的,因为不同操作系统和不同cpu的代码格式以及指令都不一样,为了兼容不同平台,所以java会把跨平台的部分(字节码)和不跨平台部分(jvm)分离,这样如果用户换了一个平台,那么只需要更换程序中不跨平台的部分,也就是jvm就好了

大概流程如下图:

这里多说一嘴,现在除了javac以外,jdk也开始提供其他java源代码的编译和执行方式,分别是:

解释执行,就是直接拿到java源码就编译执行了,不生成字节码了,这个工具就是jshell

,以及单个java源码文件的机制,这个就跟很多脚本机制类似了

直接编译成机器码,这个叫做aot,graal的native image就是aot编译器,这个也准备并入openjdk,但是这是以后的事了,前面说了jvm的考虑是为了跨平台,aot之后,因为没有jvm了,所以编译产物也就不能跨平台了,好处是启动快,内存占用少,坏处就是不能跨平台,而且编译的速度也挺慢的,所以除非分发的渠道(比如移动端的app store)本身要求你这么干,一般还是不这么干

JDK里面除了javac,jvm等编译工具和执行工具以外,还有一个重要的组成部分,那就是事先写好的工具,包,也就是依赖,普通用户只需要import这些工具,就能用其它程序员已经实现了的功能

这里面包括string字符串,以及相应的工具,集合(例如list,map,set等等)还有xml处理等工具,jdk自身会提供一部分标准包

以前jvm+标准包,就是jre,但是后来因为jre可以被定制,用户可以根据需要,增加或者删除标准包,所以jre这个东西呢,在不同的系统中,会是不一样的东西,所以现在一般都不再强调jre这个概念

依赖仓库

除了标准包以外,java还有一个非常庞大的依赖系统,就是依赖仓库,甚至有专门的搜索引擎,在这里

MVN REPOSITORY可以看到,上面已经索引了超过3000万个jars,所谓的jar就是java的字节码文件的打包压缩,jar其实是zip的同义词,你把jar后缀改成zip,就能解压缩了,拆开来看看,里面是不是都是各种.class文件

所以这些庞大的类库,构成了整个生态,广义的java,就包括这些东西

在maven仓库里面,有各种公司生产的各种依赖,数量上极为庞大,上面的依赖基本上都是开源共享的,你完全可以按需使用,基本上不收你的钱,也收不到

一个成熟的开发人员,应该学会在这些依赖中淘金

java现在的开发,除了标准的jdk以外,其他依赖就从maven仓库中找了,用户要使用这些仓库中的类库,也很简单,只需要在maven等build工具中,加入一行依赖的声明,maven等build工具就会自动下载这些依赖,然后用户就可以在项目中直接import这些依赖中的类了

这里可能还有一个模块化的概念,对于模块化的项目,如果你要访问maven下载的类,你还需要在模块化的描述文件也就是module-info.java中,添加路径访问的权限,如果不想麻烦的话,直接把你写的模块设置为open就可以访问了

所以严格说起来,现在访问maven仓库中的依赖,大概分为三步走

在maven等build工具的描述文件中(maven就是pom.xml了)添加依赖,前面给出的搜索引擎中有依赖的配置,直接拷贝黏贴就好了在模块化描述文件module-info.java中,添加对应的模块描述,并赋予权限,如果嫌权限麻烦,直接把自己写的模块设置为open在代码中import对应的api

模块化还在推进当中,虽然现在一些框架还没完成模块化,但是已经取得了喜人的进展,像log工具,json处理工具,jvm其他语言,比如kotlin等,都已经完成了模块化,下面就看netty

,spring等常用工具什么时候完成模块化

值得注意的是,因为社区庞大,所以有些公司已经等不及了,像oracle就已经打算做一个替代netty的工具,叫做nima,该工具就支持模块化,而netty支持模块化的时间还犹未可知,目前已知trustin lee已经回归netty开发,具体进度要看他的开发情况

另外spring刚完成了native image的支持,目前也未知什么时候可以支持模块化,但是oracle已经做出了一个对应框架,叫做helidon,这个框架支持模块化和native image,所以不管spring,netty这些做不做,会有其他人完成类似的功能,这就是社区大的好处,普通用户的选择可以有很多。

               
发表评论