本文记录了JVM及Java生态中一些有意思的事情,希望能带给你一个耳目一新的Java。

Java真的有点老了,之前我们不觉得,但是当95后程序员看着一门比他们年纪还大的语言的时候,那种感觉,应该跟我这样的80后看到C++的感觉差不多。但是你也不要被这种“老”所误导,Java仍然是一门相当活跃的语言,这种活跃体现在官方发版和社区生态两个方面。尤其是2017年以后,Java也是发车式release,一年两班车,版本必须发,赶得上的特性就上,赶不上就等一下班。

diagramm-oracle-1-w438

我觉得喜欢技术的人,没人会抗拒这种激进的发版策略。但是公司就不一样了,现在我司所有的Java程序还跑在Java8上,还想在生产环境用Oracle的Java8的话就有风险了,不付费的话,更新补丁啥的想都不要想。

这就引出了我要讲的第一个地方:

除了Oracle的Java,还有的选么?

有,不仅有,而且非常多。这里我随便列几家(摘自sdk list java):

  • AdoptOpenJDK
  • Amazon
  • Azul Zulu
  • BellSoft
  • SAP
  • TravaOpenJDK

是不是有点意思了?

当然这都源于06年的时候,Sun公司做的一个无比英明的决定,就是搞开源版的Java,后来便有了OpenJDK项目,真是大写的服字。那年笔者刚上大学,不过还没等我大学毕业,Sun公司转眼就被Oracle给收购了,怎不令人唏嘘?

顺便再提一下这两天刚发生的有意思的事情:Apple公司不是在几天前(2020-11-11)刚刚发布了他们基于ARM架构的新Mac么,而就在前不久,微软站出来说给Java贡献代码,为了实现Java向Apple的新架构的适配。我还在新闻下面看到一个评论,大意是说曾几何时,微软的JVM还是特别厉害的JVM实现呢。

所以,Java虽然名义上是Oracle的,但因其开源的历史渊源,其实很多公司都对它投入了相当大心血,包括很多大佬级别的公司,比如华为公司也是贡献过不少代码的。这些全球顶尖的公司,共同维持着Java世界的秩序。现在Java的迭代速度又坐上火箭了,所以网上那些非要较真引战的伪技术帖,动不动就唱衰Java,我觉得还为时过早。

如果你是名前端程序员,想学学后端,技多不压身想法的话,我觉得后端学什么都挺好;但是如果你是打算吃后端这碗饭,我个人还是首推Java的。

但是Java写起项目来,仪式感真是太强了(贬义),对新人极度不友好。有时候别说是新人了,那种充满了仪式感的样板语言,还有言Java必Spring的无脑式安利,对老人也是一种摧残。

这里我推荐几个框架,让大家从Spring的樊笼中解放出来

  1. SparkJava
  • 上手难度:★☆☆☆☆
  • 学习曲线:★☆☆☆☆
  • 功能强大:★★☆☆☆
  • 场景推荐:入门学习或者个人微型项目使用

2.    Micronaut

  • 上手难度:★★☆☆☆
  • 学习曲线:★★★☆☆
  • 功能强大:★★★★☆
  • 场景推荐:有Java Web开发经验的团队使用

3.     Vert.x

  • 上手难度:★☆☆☆☆
  • 学习曲线:★★★☆☆
  • 功能强大:★★★★★
  • 场景推荐:有异步编程基础的个人或团队,需要应对高并发项目使用

4.    Quarkus

  • 上手难度:★★☆☆☆
  • 学习曲线:★★★★☆
  • 功能强大:★★★★★
  • 场景推荐:离不开Java生态,团队战力强,做云原生项目使用

以上几款框架都是发展态势非常好的框架,笔者多多少少也在项目里用过,所以就根据自己的经验做了推荐。具体还得各位看看文档,自己斟酌食用。

当你打开上面几个框架的官网,应该还会发现另外一个有意思的事情——几乎这些框架都支持多种语言。我个人最喜欢Vert.x,它也是最神勇的一个。来看看它支持的语言吧,下面是其官网的截图:

16054538781615-1

醒目的“Polyglot”,相当给力的多语言支持。这又是怎么回事呢?咱们开始下一个议题。

Java不止Java

我们都知道Java程序实际上是靠Java虚拟机,也就是JVM解释执行Java字节码运行的(当然也有例外,这个以后有机会展开说)。所以用什么语言写代码其实反而没那么重要,只要最后经过编译,能搞成字节码在JVM上执行就行了。微软也是这么干的鼻祖,近几年前端JS、TS也得编译编译,最后被浏览器执行,我觉得也都是这么个意思。

那么,在Java生态里,可以编译成字节码被JVM运行的语言有多少呢?我列几个给大家看看:

  • Ruby对应的JRuby
  • Python对应JPython
  • Groovy
  • Scala
  • Clojure
  • Kotlin

上面这几个兄弟,在JVM面前,跟老大哥Java语言基本上也平起平坐了,用起来都算方便的。可以根据自己的经验,比如之前用Ruby、Python什么的可以继续用着;而搞科研的一般Scala用得比较多,不过你要是没听过,基本也就别用了,曲高和寡啊;Kotlin现在如日中天,如果你除了是全栈,也想搞搞全端开发,Kotlin还是很推荐的;我自己呢,Groovy用得比较多,这是一款动静两相宜的语言,用过都说好。

对比一下上一小节的图片,唯独少了JavaScript,这又是怎么回事呢?这个又是个有意思的事了。

Java与JavaScript

网上经常拿雷锋与雷峰塔类比这哥俩,我是觉得说得有点太伤感情了。毕竟Java与JavaScript还是有不少历史渊源的,至少后者当年定名是为了蹭Java的热度来的,有兴趣的小伙伴可以自己查查当年的故事,也是不错的。

更何况现在地球人都知道Java是Oracle的,毕竟Oracle因为Google Android侵权Java而起诉的事情闹得沸沸扬扬也有年头了——9行代码引出的血案。但是JavaScript的商标属于哪个公司,不知道大家都知道么?答案还是Oracle

上面都是些历史或者商业上的事,跟技术到底有啥关系呢?其实也没啥关系。不过在JVM里面有个叫Nashorn的东西又是一个超神的存在,它居然是一个嵌在JVM里面的JavaScript引擎。说白了,JavaScript代码是可以跑在Java环境下的。来看下面的例子:

var hello = function() {
  print("Hello Nashorn!");
};

hello();

把上面的内容保存到hello.js文件里。如果你的电脑装过Java,可以通过jjs命令调用上面的脚本文件,如图:

16054567055477-1


惊不惊喜,意不意外?不过如果你安装了最新版本的Java 15的话,就不用了这个功能了,因为这个功能在15里被拿掉了。不过,考虑这个叫Nashorn的引擎从Java 8开始就一直存在了,至少从2014年到现在也有6年了,事实上不论是JavaScript程序员还是Java程序员都极少知道它的存在,建议你现在可以就地问问你身边写Java代码的朋友知不知道这回事;)

结语

好奇心重的小伙伴可能会问了:Nashorn被拿掉之后,Oracle难道就没什么后着?还有前面说Java主要就是JVM解释字节码执行代码的时候,留了个伏笔,暗示还有不一样的玩法存在。下一回,我来给大家讲讲目前一个超级有意思的项目,一个既能颠覆Java自己,又能影响整个语言生态的东西——GraalVM