讨论 Java 相比其他编程语言(c++, go, rust 等)的缺点

2023-12-06 09:54:12 +08:00
 steelshadow39

本人学生,我自己是写 Java 的,最近发现身边技术能力远高于我的同学对于 Java 这门语言的态度并不友好。由于没有大型互联网项目的经验,所以还没有体会到 Java 相较于其他几种语言的瓶颈,自己能想到的缺点也就性能相对较弱,代码冗长(我本人觉得这种代码即注释挺方便理解的)。Java 的生态可能是最全的吧?并且现在互联网公司大头应该还是 Java (个人想法,我猜想一些公司仍然使用 Java 是因为换门语言的成本太高?所以求稳)。

想请教各位 V 友的看法,以及在国外编程语言的发展趋势是什么情况?

只做理性讨论,没有“XX 语言是最好的”这种想法,谢谢。

23521 次点击
所在节点    Java
162 条回复
chuck1in
2023-12-07 22:19:25 +08:00
Java 用来写业务是真的太棒了。没有哪个个语言有他棒。
hafuhafu
2023-12-07 22:24:43 +08:00
好像泛型比较费劲吧,因为历史包袱
dreamlike
2023-12-07 22:54:23 +08:00
void 不是类型导致的一系列泛型问题
举个例子 future<Void>, 说到泛型怎么能不提提经典的 function ,intfunction 呢?🤣
还有典中点只 arrays.sort 的各种重载
最后就是元编程能力,编译期 or 运行时元编程能力太弱 坐等 code reflection 实现,你可能说这跟我写 spring 有什么关系,请参考升级 jdk 但是不升级 spring 导致的 asm 版本问题 更何况 spring 自己依赖的 cglib 原始版本都没跟着版本兼容,还是 spring 自己魔改的,唉,要是 class file api 早点出来会有这事?
好特性出的太晚,远水解不了近渴
再吐槽下 openjdk group 对延迟到运行时 or 第一次使用时带来的冷启动问题,很多玩意本来就可以编译期搞定,结果一定要延迟到运行时,很多极其依赖于 jit ,说的就是你 lambda 和 switch!最后又得搞个 Leyden 擦屁股
omniversia
2023-12-08 00:05:51 +08:00
java 好学好上手,成熟工具,框架,解决方案多。出活快。
就是没有特别调优的话,启动慢,占内存,还有个 jvm 部署相对还是麻烦。
对于业务快速迭代和扩张的互联网企业来说还是挺适合的,能很容易的从单一系统迭代到复杂庞大的微服务系统,各种组件和解决方案很全。
go 跟 java 相似,好学好上手,但是更省内存,部署方便,在一些公司也在大量使用,就是普及度整体还是不如 java 。
rust 近几年吹得多,在高性能和底层领域开始有所展露,我个人持关注和观望态度
C++老牌语言,在众多底层领域,传统领域和有高性能,实时计算需求的领域地位还是暂时无法撼动的
elliottzhao87
2023-12-08 09:25:22 +08:00
现状是,Java 的下限很高,我这边有些脑子都不太清晰的人,写出来的东西居然也看起来有模有样的,稍微改一改也能用。
而同一个人,我让他写 Typescript 项目……惨不忍睹!
zhazi
2023-12-08 09:34:35 +08:00
@Nazz We do not go into too many details of JPA or Spring Data here. You can follow the “Accessing Data with JPA” guide from spring.io and read the Spring Data JPA and Hibernate reference documentation. 提示说的很明白,你不去看
whp1473
2023-12-08 09:49:54 +08:00
@CuChulainn SpringBoot3 已经正式支持 Gravlm 了,可以编译为向 Go 一样的服务,速度飞快,内存占用非常低,就是很多旧时代的依赖包目前不支持,老项目不好改
whp1473
2023-12-08 10:00:21 +08:00
历史缺点:
(1)语法啰嗦
(2)占内存
(3)启动慢
(4)编译后包大
(5)不能直接跑,要依赖 JVM
(6)对操作系统支持不好
(7)GUI 不好

但经过一段时间学习,其实很多都有方案,只是一直 Java8 不向前学习确实没办法:
(1)语法啰嗦,接手老项目感动哭
(2)占内存,GraalVM SpringBoot3 Quarkus 是未来
(3)启动慢,GraalVM SpringBoot3 Quarkus 是未来
(4)编译后包大,GraalVM SpringBoot3 Quarkus 是未来
(5)不能直接跑,要依赖 JVM ,GraalVM SpringBoot3 Quarkus 是未来
(6)对操作系统支持不好,这个只能 Native 方法链接 C 之类的
(7)GUI 不好,IDEA 那家非常优秀成熟了,但大部分人又不学
zmal
2023-12-08 10:32:30 +08:00
语法层面的问题都不是大问题,大不了用 scala 、kotlin 。
Java 比较难改的是 JVM 层面的问题,比如:1.对象的属性是链式引用,没有结构体,在绝对性能场景下是劣势。2. 引以为傲的“一次编译到处运行” 、JIT 等技术在容器大时代下已经再不重要;启动慢、占用内存大的缺点被放大;等等。

换句话说,从生产角度讲,语法糖是无关紧要的;但 JVM 在现代场景下的劣势是所有 JVM 语言都要面对这些问题。

如果有一天 Java 被完全淘汰,那一定是 JVM 被淘汰了。
sotvokun
2023-12-08 11:18:23 +08:00
只从语言层面来看缺点的话,大概有以下几点:
1. Primitive Type 不是对象,不是对象就算了,也不像对象一样进行操作。
2. 没有值类型,到处都是引用类型,然后还没有 null-safety 的语言层面的配套设施。
3. 同上一条,因为都是引用类型,所以函数的传参在函数内部可能被修改,只能靠人为规范规避问题( C# 的话可以通过 ref/in/out 来显性标识)。
4. 没有原生的 getter/setter 支持,只能用 lombok 这种代码生成器来 hack 实现。
5. 标准库设计得稀烂。

单从语言层面上来看的话,Java 是一个彻底贯彻落实面向对象但是又仅此而已的语言……好处的话,语法糖很少,学起来很简单,所有人的写法都是差不太多的。对比 C++ 和 C# 这种,一个问题的解法每个人都可以写出自己的风格来,算是一种很强的优势了。

某种意义上来说 Java 在行业的应用和发展算是双向奔赴的结果,老板放心,打工人喜欢。

唯独不好的地方大概就是有如果你喜欢写代码的话,Java 这门语言用起来不会很开心。

和其他语言其他,C++ 的话就是自由,你想怎么写就怎么写,你甚至可以在 C++ 里面实现 Rust 的 trait 。Go 的话就是简单,写的时候没有任何心智负担,因为啥高级特性都没有。Rust 弥补了 C++ 中的部分缺点,用自由和编译速度换来了安全和更好的包管理。


来到更上层,大家其实都差不多,Java 的唯一优势就是这些年积累下来的生态比较丰富。但是这个优势又没那么大……出活速度不如 PHP, nodejs 快,速度不如 golang, Rust, C++ 快,那些引以为豪的生态,在绝大多数时候都不是一开始就需要考虑的问题。


不过语言这种东西顶多就是个工具,围绕他的一切事物甚至算不上知识。还是数据结构算法、系统设计、数据库设计,这些东西更重要。
Aresxue
2023-12-08 11:25:01 +08:00
1.语法,这点说实话 go 做的也一般,C#明显做的更好;
2.预占内存, jvm 的内存是直接分配的,对于中小项目内存的利用率不充分,这一点在稍大一点的企业级项目里并不是问题;
3.启动慢,其实本身 jvm 没有那么慢,传统应用慢主要受两个东西拖累,一个是 spring(用了太多反射以及 bean 必须串行注册),另一个是 UrlClassLoader 加载类的逻辑(这一点阿里自定义了一个 FastUrlClassLoader 优化了很多,实测应用启动时间可以降低 1/2~2/3);
4.对象头、字节对齐等各种操作导致在偏硬件的软件系统中性能很低下,没法充分利用寄存器,甚至容器到现在还不支持基本类型;

但我还是看好 java 的未来,庞大的生态,我心中最好的 VM(你可以永远相信 JVM)。官方也有一直在做事情:Loom 、Valhalla 、Amber ,虚拟线程也已经发布了,准备好埋葬异步编程回到 thread-per-request 的时代吧。
wanguorui123
2023-12-08 14:49:49 +08:00
JAVA 语言本身的缺陷:泛型残废、异步残废,其他的不算太大的问题,还有就是 Spring 框架的规范比较死板,某些注解 @也是一个大坑,稍不注意就掉下去,个人用比较喜欢 C#语法各方面支持的比较完善。
Mandelo
2023-12-08 15:07:35 +08:00
这种日经水贴应该进水生火热
higker
2023-12-08 23:17:04 +08:00
我只是觉得刚刚学习编程的话我还是建议 C 语言,因为这时你在学校有的是时间去研究各种项目的源代码,并且目前主流 OS 教材还是使用 C 。至于应用语言做服务器端开发只要支持网络编程都可以,但是我会推荐 Java ,目前企业里面使用的最多的 ,Java 在安卓 App 和服务器端都可以,Java 目前面临的问题是,要加新特性又要向前兼容,这才是不好搞的地方,至于某些刚刚出来的语言没有任何历史包袱嘲讽什么... 至于开发效率这个是取决于你能不能复制粘贴代码的问题。Java 刚刚入门确实需要写和传统编程语言不一样的东西例如 Class ,JVM 确实占内存,比较运行的时候还要跟踪程序状态做 JIT 也占用内存,现在可以 AOT 可以观察 GraalVM 这个项目,语言其次无法最后就是一个 AST 表达,主要是 JVM 这个东西,你研究 JS/TS 最后也是 V8 ,有虚拟机和运行时的语言好不了哪里去,因为运行时和虚拟机都是一个软件。但是某些人吹 Go ,Go 主要的特定可以认为把运行时这块一起打包成为 Native Code 了,不过目前 GraalVM 也是在做这个事情,GraalVM 是可以将 Java JS Py 这些一起打包为 Native Code ,看了这么多评论,感觉大家还在研究一些语言层面的东西,无非最后都是对于 CPU 指令而已,你如果要研究程序怎么从源代码到执行的这个过程才是有含量的。抛开这些第三方库和框架,还有是不是有很多公司使用这是关键,我希望国内程序员还是多上一些境外媒体看看,目前主流技术动态。
steelshadow39
2023-12-09 10:13:26 +08:00
@higker #154 研一,再一年找工作了,研究底层的时间确实不多了,个人发展方向也是后端应用。GraalVM 还有 Java21 新出的 loom ,virtual thread ,这些离普及还很远吧,我觉得公司做一套升级要考虑的太多了,求稳还是保守一些。当然个人可以提前开始学习了
higker
2023-12-09 17:39:59 +08:00
@steelshadow39 只是现在没有升级到 Java 21 LTS ,Java 17 占有比例已经比 Java 8 多了。
chuck1in
2023-12-09 21:03:33 +08:00
@higker 你说的是国外吧,国内还是 java8 的。
soft101team
2023-12-10 00:42:43 +08:00
内存吃的太多了~
5waker
2023-12-10 10:36:54 +08:00
说缺点的多,那我来补充下优点吧。(叠个甲,我最喜欢语言的是 rust )
在 docker 出来之前,Write once, run anywhere 这个特性对于开发人员真的太香了。想象下本地用 windows 开发出来的 jar 可以直接扔到 linux 服务器上运行是多么的惬意。不用考虑狗屎跨平台编译,或者连接特定编译机编译,最后上去发现 libc 版本不一致运行不了,一天下来省去的时间刚好够你喝一杯咖啡 =v=。
即使 docker 出来后,Write once, run anywhere 别的语言也能享受了,但那也只是在服务端。桌面端诸如 mc 、idea 、dbeaver 仍在享受这个优点。
从这个角度看,互联网行业在未来确实会逐渐放弃 java ,过大的产物(镜像 500 ~ 900mb )、特别吃内存,这些都是运营成本。降本增效迟早会砍到语言的头上。
也许未来 Java 应该深耕 gui 。
chuck1in
2023-12-11 15:50:52 +08:00
@5waker java 编译产物不就 20 来 mb 吗,你们怎么会这么大的?而且现在的 java 都是直接编译成二进制在电脑上运行的,没有什么虚拟机什么 write once run any where 的概念了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/997966

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX