Java编程网

分享 Java Web 开发相关知识

Java已死-Java万岁

Java已经死了。离开沉没的船,科特林,戈朗,不管是什么,学习另一种语言!

是真的吗

历史

让我们先来看一下历史。从2005年左右开始,我一直在进行Java开发,从使用J2ME编程的嵌入式设备开始。Java SE(或J2SE)已经是1.5版,但是在J2ME中,该语言与Java 1.3兼容,并且仅支持JDK的一部分。例如,它甚至没有任何Map实现。

在撰写本文时,Java 13已经发布,这是一段艰难的旅程。自从Java 1.3在过去的17年中,我们已经添加了以下功能:

Java版本 精选功能
1.4 正则表达式,非阻塞I / O
5.0 泛型,注释
6 JAX-WS,JWM +编译器扩展
7 动态语言支持
8 Lambda,流,可选
9 模块系统,JShell
10 var 关键字,Graal
11 运行Java文件(如脚本)
12 切换表达式
13 文本块,类数据共享

NIO仍然是非阻塞式和反应式Web框架的基础。没有注释,Spring框架无法利用的面向方面的编程。编译器的扩展使Lombok成为可能。Lambda,流和可选参数使Java更加接近于函数式编程样式(尽管它仍然不是函数式语言),并允许减少样板数量。开关表达式在模式匹配的道路上迈出了一步(请参见下文)。动态语言支持使得将Ruby和Python等动态类型的语言引入JVM成为可能,或者至少变得更加容易。

资料来源:

Java = JVM +语言

当我们谈论“ Java”时,我们实际上应该谈论Java虚拟机(JVM)和Java语言。

运行Java应用程序时,*.java首先必须将Java源代码()编译为Java字节码(*.class),在所有平台上都是相同的,因此口号“写一次,到处运行”。字节码经过优化,可以被解释和快速运行,而不是像JavaScript那样直接解释Java源代码,例如

JVM本身是Java运行时的特定于平台的实现(例如Linux,Windows,Mac)。它基本上采用了先前生成的字节码,并在目标环境上运行它。在Java的早期版本中,字节码已被解释得相对较慢。从Java 1.3开始,作为即时(JIT)编译器的HotSpot VM已成为默认设置。它标识频繁运行的代码(即代码中的“热点”),并将字节代码编译为本机代码,这要快得多。

从那时起,Sun / Oracle的许多聪明人就以非常快的速度改进了JVM。“极快”是指与同等C ++实现相当甚至更快,因为JIT可以基于已知的CPU以及有关运行时实际代码和数据流的知识来生成更多优化的机器代码。

不要遵循炒作

这就是JVM生态系统蓬勃发展的原因,这为编译成Java字节码的整套新语言奠定了基础:

  • Groovy
  • Clojure
  • 吉顿
  • 斯卡拉
  • 科特林

还有很多其他人

最近,我在Twitter时间轴中找到了这个:

看起来很棒吧?首先,让我们看看它是什么。这是当月有关该语言的问题所占的百分比。因此,毫无疑问,Kotlin是一种相对较新的流行语言。因此,自然会有很多人在问问题。

但是,等等…一种语言不见了!Java呢?

《Java已死-Java万岁》

因此,Java的问题仍然是通过Scala的Kotlin的十倍。受欢迎程度如何?

《Java已死-Java万岁》
资料来源:TIOBE Index

尽管图表在下降,但是Java仍然排名第一(我知道,TIOBE的结果值得商))。让我们看看Kotlin和Scala分别在哪里……排名30和35。

好吧,工作机会呢?作为Java程序员,您无需花很长时间就能找到行业中一份体面的工作机会。可能有些语言会提供更高的薪水,但很难找到。

所以请不要误会我的意思:我喜欢新语言,尤其是当它们带来新概念时,这些概念可以扩大您的视野并推动其他语言更快地适应。去学习吧!

我已经学习并使用了很多不同的语言,从BASIC,Pascal,Assembler,C,Erlang,Scala和Python上的C ++开始。

例如,几年前,Scala被大肆宣传。人们说它将取代Java。尽管Scala具有一些非常吸引人的功能,但最终没有。

当前,Kotlin也被大量宣传。与Scala相比,它具有一些战略优势,因为它受到了JetBrains(IntelliJ的制造商)和Google(Kotlin是Android开发要使用的语言)的推动,这使其迅速获得了关注。当然,这是一种很棒的语言。但是与Scala类似,我不认为它将取代Java。

从Java切换到另一种语言时,总是存在问题。有些事情不能像使用Java那样工作,有些事情不兼容,有些工具不可用。无论是什么,这都会导致更少的人希望或成功转换。

因此,下次您会听到诸如“ Mega Corp.使用新的XYZ语言”之类的消息时,并不意味着整个公司都会这样做。也许只是一个拥有100.000名员工的一两个团队。当一种新语言具有Java所没有的“强大的新功能”时,这并不意味着它可以轻松地替代Java,JVM,社区和Java的工具。

那么,为什么Java如此成功呢?

我认为这是几个不同因素的结果:

  • 该语言相对易于学习,并且语法与C和C ++类似
  • 语言相对稳定,向后兼容(Java 9,哦,Java 9)
  • 它仍然能够适应新的范例和技术
  • JVM是一个非常不错的快速运行库(请参见上文)
  • 许多大型公司都在此上开展业务,这仅意味着:就业机会(见上文)
  • 您几乎可以找到任何已经解决的问题,这些都是带有允许商业使用的许可证的开源库
  • 工具很棒

未来

因此,在了解了现状之后,让我们看一下未来。计划在下一发行版中包含许多有前途的项目。

已经有一些深入的文章,所以我在这里只简单地提及它们。

织机

我认为,Project Loom是JVM和语言中最具颠覆性的功能之一。乍一看似乎并不有趣:织布机又会带来“纤维”。JVM的轻量级线程。那为什么要打扰呢?

与线程不同,您可以在单个内核上运行数百万个具有较低内存占用量的光纤。使用Fibers,您可以构建连续性和尾部调用优化,进而允许构建看起来非同步但不阻塞线程的非阻塞代码。这意味着没有代码因链接的回调或可观察变量而混乱,例如在vert.x或RxJava中很常见。我在这里写过:

https://dev.to/stealthmusic/dont-drink-too-much-reactive-cool-aid-20lk

圣杯

我认为,Graal是改变游戏规则的另一位候选人。感恩实际上不是一个单一的“东西”。有GraalVm编译器实现了JVM的新编译器扩展API,以用纯Java编写的JIT编译器替换现有的JIT编译器。然后是GraalVM本机映像,该映像允许将Java代码编译成本机二进制文件,从而可以大大减少内存使用量,并将应用程序的启动时间从几秒增加到几毫秒。

尽管这听起来很棒,并且您已经可以尝试,但仍处于早期阶段。我自己尝试过,它还远没有投入生产甚至不能简单使用。它与大量使用反射的框架或库(Spring,Hibernate)不能很好地配合使用。没有进一步的了解,Graal会将带有JPA的Spring Boot应用程序编译为具有备用解决方法的本机映像,该备用方法只是在映像中捆绑并运行JVM和JDK,而这并没有给您带来上述优势。

虽然弹出了MicronautQuarkus之类的框架,它们可以充分利用本地图像的潜力,而且我知道Spring团队也在努力使其与Graal一起使用。

这可能允许在golang当前流行的区域中使用Java应用程序,并且必须快速启动并降低内存使用量。

琥珀色

Project Amber将数据类和密封类型引入Java。它是一种语言功能,它尝试减少创建POJO时所需的样板代码:一些字段,getter,setter。它将允许您编写类似的内容record Point(int x, int y) { }

Amber带来的功能还将使实现模式匹配更加容易。

模式匹配有两种思路。第一个是switch表达式,它已作为Java 12的预览版发布,允许直接将switch表达式的结果分配给变量,例如

instanceOf中的模式匹配将使处理未知类型和渲染instanceOf过时的类型转换变得更加容易。

然后是对象解构,它允许将对象或列表的一部分提取到其组件中:

int eval(Node n) {
    return switch(n) {
        case IntNode(int i) -> i;
        case NegNode(Node n) -> -eval(n);
        case AddNode(Node left, Node right) -> eval(left) + eval(right);
        case MulNode(Node left, Node right) -> eval(left) * eval(right);
    };
}

这代替了实现上述代码所需的许多代码混乱。

真正很酷的是方法中的模式匹配(不确定是否计划):

    int multiply(0, int b) { return 0}
    int multiply(int a, 0) { return 0}
    int multiply(int a, int b) { return a * b}

瓦尔哈拉

Valhalla项目尝试允许不可变(并发性很好)的无引用对象。例如,数组当前是对其值的引用列表,而不是值本身的列表。它还将允许使用基本类型(int例如)作为泛型类型。例如,List<int>而不是List<Integer>

结论

因此,总而言之,我真的不认为Java已经死了。它拥有活跃的社区,丰富的生态系统(包括工具),大量的库和框架,能够适应和发展,同时又向后兼容(主要是向后兼容),并且仍在行业中广泛使用。


在Unsplash上​​拍摄Shoot N’Design的封面照片

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注