您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

相比高人气的 Rust、Go,为何 Java、C 在工具层面进展缓慢?

时间:2022-07-18 14:34:22  来源:  作者:InfoQ
相比高人气的 Rust、Go,为何 Java、C 在工具层面进展缓慢?

 

2022年 Stack Overflow开发者调查结果已经正式公布。每当这个时候,开发者们都有一肚子的话要吐槽或表扬,开发者 Adam Gordon Bell 也不外如是。Bell 最关注的是最受欢迎和最不招人待见的编程语言。我们先简单看下调查结果:

 

  • 最受欢迎的高人气编程语言(2022):

 

Rust,Typescript,Python/ target=_blank class=infotextkey>Python,Go,C#,Kotlin,JAVAScript

 

  • 最不受待见的高人气编程语言(2022)

Ruby,C++,Java,php,C

 

为什么有的语言受欢迎、有的被讨厌

 

在上一次开发者调查报告时,Bell 提到当人们喜爱一种新的编程语言时,大家或多或少会抱有些许偏见,即认为新语言应该拿来开发新项目、旧语言则用于开发旧项目。但这明显忽略了另一个现实:语言工具本身也在不断改进。因此,Bell 写了一篇文章来论述了自己的观点,并将编程语言被喜欢的原因归结到了工具性发展上。

 

以 Go 和 Rust 为例,业界关于两者的争论从未停止,但两种语言的开发者工具在体验上非常相似:它们都非常现代,无论是测试、模糊测试、打包还是校验,它们都能提供相应的最佳工具标准包。 Bell 认为,Go 和 Rust 跟不受待见榜单中那些语言的最大区别,并不在于语法细节,而是工具选项和生态系统。正是如此,二者才能双双进入最受喜爱语言名单。

 

Bell 认为,随着时间的推移,编程语言的工具和开发者体验正在改善,但这种改善在新语言中体现得更加明显。总体来说,在创新成果出现之后,新语言会更快采用并加以标准化,最终提供超越老牌语言的效果。随着这类增量的积累,曾经的王牌语言就会显得陈旧而腐朽。

相比高人气的 Rust、Go,为何 Java、C 在工具层面进展缓慢?

 

“为什么不能交个朋友?”

 

网友 “crashorbit”指出了实际开发中存在的问题。“大多数从事系统工作的人都是短期的承包商,他们不了解问题所在,并且在交付了一个测试不佳的系统后很快就离开了。可能忽略了版本控制、自动化测试、文档更新、发布工程和预期的系统开发生命周期的其余部分。”

 

crashorbit 表示,中层管理者不懂系统工程,高级管理人员更感兴趣的是“完成”事情,而不是拥有可持续的系统工程实践。“坦率地说,我们很难区分一个设计良好的信息系统和一个基本可以工作但‘大风一吹’就会失败的系统。”

 

每年从事“软件工作”的人数都以几个百分点的速度增长。他们中的大多数人在非常垂直的环境中工作,经常在自己的桌面上编写电子表格或杂乱无章的应用程序。一些人编写的“脚本”只是做简单的事情。或者使用他们不理解的“机器学习”工具产生具有误导性的结果。

 

“我们以这种方式创造即时遗产。没有模块化、没有修订控制、没有部署策略,也没有灾难恢复计划。开发人员早已不在,更不用说系统工程师了。这就是我所说的‘传统阻力’的意思,这就是这个行业如此缓慢的原因。” crashorbit 表示。

 

开发者“fuddlesworth”表示自己所在的公司就已经被 React 16 “困住”,因为整个公司的核心 UI 组件都在使用 Enzyme 进行测试,一旦转变就要改动成千上万个测试。“我们不能再根据 React 来更新任何组件了,所以没有 bug 修复、新特性、性能改进等等。”

 

开发者“alexiooo98”则认为,更好的工具当然非常受欢迎,但仅凭这个并不能完全解释为什么有些语言受到喜爱,而有些则令人恐惧。比如,(现代)PHP 有很好的工具,但令人恐惧。Python 的包管理器环境非常混乱,然而 Python 很受欢迎。

 

下面是 Bell 文中关于编程语言发展差异的详细描述,我们进行了翻译并做了不改变原意的些许修改。请注意,下文中提到的创新跟语言的语法或语义无关。

 

标准库

 

我不确定这到底是好事还是坏事,但扩展标准库确实让开发者无需安装任何第三方库,就能直接享受到 PHP、Python 和 Go 的大量现成功能。它们大部分都带有 json、http 客户端和服务器,甚至包括数据库访问机制。

——Amir Saeid

 

所谓标准库,就是语言所附带的常用内容库。C 有 libc、C++有 libcpp,但与如今常见的内置“电池”标准库相比,前面二位的库规模实在小得可怜。

 

我有点记不清了,但 1991 年诞生的 Python 似乎是第一种真正拥有广泛标准库的编程语言。Java 1.0(1996 年)也附带一个扩展标准库(Java Class 库),随后引发其他语言纷纷效仿。

 

这种无需自行构建、又不必接触第三方依赖项的便捷工具交付方式,实在是全世界开发者的一大福音。

 

标准库中的佼佼者:GoLang

 

大部分现代语言(不包括 JavaScript )现在都附带丰富的标准库。不过,Go 对标准库的强调仍然无人能及,它承诺向下兼容,而且非常关注性能和完善的具体实现。正因为如此,Go 开发者对标准库的依赖性远超其他社区,对标准库也普遍更为重视。

 

第三方工具包库

 

就在标准库成形的同时,万维网也开始迅速腾飞。事实证明,互联网确实是一套出色的协作平台。

 

如果我们的需求无法在标准库中得到满足、必须自行构建新功能,该怎么做?Perl 通过 CPAN 推广了全球工具包集合的概念,一切就从那时起彻底改变。公平地讲,任何用过 CPAN 并为它做出贡献的朋友,都能感受到它改变游戏规则的重大意义。

 

CPAN 于 1995 年推出(基于 CTAN),并于 2003 年达到顶峰。它的出现为使用软件完成工作的人们开辟出一条新的路径,就是将第三方组件拼接起来。现在,很多现代开发项目都会遵循这种模式。

 

从 2003 年开始,之后诞生的常用编程语言几乎全部附带某种第三方工具包库。这股风潮的缔造者就是 CPAN,它告诉全世界:“真正的”编程语言,必须要有第三方工具包管理策略。

 

旁注:向后移植

 

说到这里,有朋友可能会问,既然 CPAN 让 Perl 变得更好、也让后来的新语言都接受了第三方工具包管理器这个概念,那为什么之前的语言就没想着亡羊补牢、加上包管理器呢?

 

其实他们有想过,但语言的发展一旦经过特定阶段,之后再想达成一致意见似乎变得越来越难。我不知道为什么会这样,可能大多数人不喜欢做改变?

 

反正只要编程语言的习惯表达、基本模式和技术社区一旦建立,就很难再回头调整了。正是因为这个,所以 JavaScript 有 NPC、Rust 有 crates,而 C++却自己独占 dds、cpm、conan、pacm、spakc、buckaroo、hunter 和 vcpkg。就是因为达不成普遍共识,所以 C++这边才冒出了八种工具包管理器。

 

但标准库的向后移植倒是比较顺利,C++成功把一部分 STL 招至麾下,虽迟但到底完成了标准库的添加。所以说,老语言也可以搭载工具创新,只是难度会更大一些。

 

总之,在 CPAN 之后,强大的标准库已经能帮助开发者完成大部分任务。另外,易于使用且接受直接贡献的第三方工具包库也成了标配。没有这两样,语言将毫无生命力。

 

文档支持

 

相比高人气的 Rust、Go,为何 Java、C 在工具层面进展缓慢?

 

有了第三方工具包,接下来就是用简单的方式把它们记录下来。我遇到的最早文档版本就是 Javadoc。它让我能更轻松地在 Java Class 中找到自己需要的内容:只需在 Web 上的 Javadocs 中单击即可。之后,我们可以把 Javadoc 和 IDE 集成结合起来,快速使用自己之前从未见过的代码。由此,探索性编码成为了可能。

 

最强的文档工具:Rust 的 docs.rs

 

如今,Java 的 Javadocs 已经不再是业界标杆。Go 有 godoc,Julia 有 Documeter.jl,就连 hackage 也有很好的工具包文档。但纵观天下,最强的文档工具还要数 Rust 的 docs.rs。

 

一次编写,随处运行

 

我看到的一项改进是,J2EE 和 Web 服务器的标准化,成就了我们今天赖以生存的计算基础。Java 与 JVM 虽然做出开创,但我觉得它们并没得到充分的认可。在 Java 普及之后,开发平台与部署平台真正实现了互不干扰。如今每个人都习惯了这样的优势,但在 20 年前,这绝对是场革命性的颠覆。

——Cédric Beust

 

相比高人气的 Rust、Go,为何 Java、C 在工具层面进展缓慢?

 

Java 和 JVM 确实推动了跨平台开发的一路前行。开发环境不再需要跟生产环境紧密匹配。使用 JVM,我们可以将内容编译成 JAR,并随意运行在任何安装有 Java 虚拟机的环境当中。

 

后来的虚拟化和容器化进一步拓宽了随处运行的道路,但 Java 确实是第一种支持这类随处运行工作流的主要编程语言。

 

随处运行中的最强者:Zig

 

Java 方法当然不是完美的,首先就是 JIT 代码的启动速度很慢,另外是无法轻松调用非 Java 编写的代码。GraalVM 声称能够解决这些问题,但目前的主流趋势仍然是提前交叉编译。只要不包含 C 或 libc 依赖项,Rust 和 Go 就都能轻松实现随处运行。

 

但目前随处运行中的最强者似乎要数 Zig,它不仅能够轻松完成 Zig 程序的交叉编译,还能兼容由 Clang 或 GCC 构建的任何代码。

 

工具包管理器

 

有语言就有编译器,其中提供大量标记可用于灵活调用,但使用过程也是相当麻烦。所以出现了 Make 和 AUtotools 这类工具。而后来的第三方工具包生态系统,又让复杂度提升了一个量级。为了解决问题,出现了 Maven 和 pip。但与之对应,我们又遇上了编译器或运行时版本不统一的问题,于是不同的程序就需要匹配不同的工具包版本。Python 给出了自己的解决方案,就是 pipenv、妙手 ualenv 以及 conda 之类我压根理解不了的东西。

 

所有这一切让复杂度继续提升,导致新用户几乎跟不上节奏。因此,新的语言开始尝试把这些一切集中管理起来,简化开发流程。

 

我想说,工具包管理和 LSP 是我编程职业生涯中见证过的,真正改变游戏规则的两大重要因素。

——Ganesh Sittampalam

 

就像内置“电池”标准库扩展了语言的定义一样,现代工具包管理器也大大提高了开发者对于体验的预期。这种扩展的优势在于易上手、开发体验更好,缺点就是软件的打包、发布和构建会带来相应成本。语言作者需要在工具中投入大量时间来解决这些问题。

 

工具包管理器中的最强者

 

我认为 cargo 的一大核心优势,在于它与语言相伴而生。而以往的主动构建工具往往缺乏与整个平台的全面集成。

——Robert Masen

 

工具包管理器正在迅速发展。所以只要舍得投入工程时间,我们就能显著改善自己语言的上手和日常使用体验。于是,新项目在这方面的投入与日俱增。

 

Rust 的 cargo 和 rustup 文档在体量上已经基本看齐 rust book,而且就这还不足以涵盖所有 cargo 插件。无论是轻松切换语言的编译器版本、快速运行测试、执行代码覆盖与性能测试、获取供应商代码、生成说明文档、校验代码还是修复校验问题,这些以往存在于语言生态系统中的独立工具,如今都成为 Rust 中的开箱即用功能。Go 的情况也差不多。可以想见,后续出现的新语言要想百尺竿头更进一步,需要付出多少努力。

 

代码格式化器

 

代码格式化器早在 gofmt 之前就已经出现,就如同 CPAN 之前就已经出现了第三方工具包,但这一切的最终成熟需要等待一场颠覆社区标准的深刻变革。

 

例如,在 Go 之前出现的任何语言,都不可能像 Go 那样实现几乎 100%的样式一致性。这是因为之前的语言必须兼容原有代码,而 gofmt 则强制执行单一样式,且不提供任何调整选项。Go 之后的语言当然也就站在巨人的肩膀上,于是 Rust(rustfmt)和 Zig(zig fmt)同样采用强大的默认代码风格与随附的代码格式化器,并由此建立起开发者体验优势。

 

其实可以聊的还有很多,包括运行时改进,其基本相当于对语言的直接改进。IDE、LSP、模糊支持和重构工具等,则把侧重点放在了开发者这一边。但受篇幅所限,我们不可能无限延伸下去。

 

也有一些在语言创造者眼中必将改变世界的成果,最终从未得到广泛采用,或者只在某个特定领域拥有影响力。很明显,Jupyter notebook 与 REPL 就是典型。它们在某些应用领域特别关键,但在其他领域却毫无知名度。Smalltalk 基于图像的方法和 Mathematica/Wolfram 语言的语言集成数据虽然极具特色,但也更加小众。

 

总结

 

能帮助开发者顺利完成工作的工具,已经是编程语言可用性中的重要组成部分。而工具本身也在持续变化,标准不断提高。

 

整个过程基本就是:在出现新的开发者创新工具时,比较年轻的编程语言更有机会将成果融入自身生态系统,由此形成增量优势。随着时间推移,这些增量优势会推动开发者体验迎来质变。

 

于是乎,较新的语言可以用更明确、更精准的方法解决问题,而旧有语言则面临大量相互矛盾的方法、甚至完全没有可行的解决路线。所以,开发者们才会普遍认为,传统编程语言工具发展进度缓慢。

 

原文链接:

 

https://earthly.dev/blog/programming-language-improvements/



Tags:Rust   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Rust编程语言的内存安全与性能:如何平衡?
Rust编程语言自诞生以来,就以其独特的内存安全特性和高性能而备受瞩目。然而,如何在保证内存安全的同时,实现高效的性能,一直是Rust开发者们面临的挑战。本文将深入探讨Rust的内...【详细内容】
2024-04-12  Search: Rust  点击:(12)  评论:(0)  加入收藏
聊聊Rust里面的数据类型
嘿,朋友们!今天我们来聊聊Rust里面的数据类型。你知道吗?Rust的数据类型可是很重要的哦,它们帮助我们定义变量和函数可以处理什么样的数据。基本数据类型首先,让我们来看看Rust提...【详细内容】
2024-04-11  Search: Rust  点击:(9)  评论:(0)  加入收藏
Rust 标准库 1.77.2 发布,修复高危漏洞
IT之家 4 月 10 日消息,Rust 的优势之一就是安全,但这并不代表该编程语言就没有漏洞。安全专家近日发现了追踪编号为 CVE-2024-24576 的漏洞,攻击者利用 Rust 标准库中的一个安...【详细内容】
2024-04-10  Search: Rust  点击:(12)  评论:(0)  加入收藏
在Rust中使用Serde的详细指南
在处理HTTP请求时,我们总是需要在一种数据结构(可以是enum、struct等)和一种可以存储或传输并稍后重建的格式(例如JSON)之间来回转换。Serde是一个库(crate),用于高效、通用地...【详细内容】
2024-03-26  Search: Rust  点击:(18)  评论:(0)  加入收藏
Rust 写脚手架,Clap你应该知道的二三事
有感而发最近,在和前端小伙伴聊天发现,在2024年,她们都有打算入局Rust学习的行列。毕竟前端现在太卷了,框架算是走到「穷途末路」了,无非就是在原有基础上修修补补。所有他们想在...【详细内容】
2024-03-11  Search: Rust  点击:(31)  评论:(0)  加入收藏
前端开始“锈化”?Vue团队开源JS打包工具:基于Rust、速度极快、尤雨溪主导
Vue 团队已正式开源Rolldown —— 基于 Rust 的 JavaScrip 打包工具。Rolldown 是使用 Rust 开发的 Rollup 替代品,它提供与 Rollup 兼容的应用程序接口和插件接口...【详细内容】
2024-03-09  Search: Rust  点击:(23)  评论:(0)  加入收藏
Rust中的数据可视化指南
可视化是数据分析和解释的一个关键方面。虽然Rust主要以其性能和安全特性而闻名,但它也为数据可视化提供了强大的工具。在这个全面的指南中,我们将深入研究Rust中的数据可视化...【详细内容】
2024-03-07  Search: Rust  点击:(35)  评论:(0)  加入收藏
如何在Rust中操作JSON,你学会了吗?
sonic-rs ​还具有一些额外的方法来进行惰性评估和提高速度。例如,如果我们想要一个 JSON​ 字符串文字,我们可以在反序列化时使用 LazyValue​ 类型将其转换为一个仍然带有斜...【详细内容】
2024-02-27  Search: Rust  点击:(51)  评论:(0)  加入收藏
记一次Rust内存泄漏排查之旅
在某次持续压测过程中,我们发现 GreptimeDB 的 Frontend 节点内存即使在请求量平稳的阶段也在持续上涨,直至被 OOM kill。我们判断 Frontend 应该是有内存泄漏了,于是开启了排...【详细内容】
2024-02-27  Search: Rust  点击:(15)  评论:(0)  加入收藏
Rust 最受欢迎的这些库
今天分享主题是,关于一些值得注意的 Rust 库,这些库可以根据它们的功能和在编码中的受欢迎程度进行选择。什么是 Rust 库?在 Rust 中,常被称为 “crate” 的库,是一个打包的单元...【详细内容】
2024-02-19  Search: Rust  点击:(54)  评论:(0)  加入收藏
▌简易百科推荐
Meta如何将缓存一致性提高到99.99999999%
介绍缓存是一种强大的技术,广泛应用于计算机系统的各个方面,从硬件缓存到操作系统、网络浏览器,尤其是后端开发。对于Meta这样的公司来说,缓存尤为重要,因为它有助于减少延迟、扩...【详细内容】
2024-04-15    dbaplus社群  Tags:Meta   点击:(3)  评论:(0)  加入收藏
SELECT COUNT(*) 会造成全表扫描?回去等通知吧
前言SELECT COUNT(*)会不会导致全表扫描引起慢查询呢?SELECT COUNT(*) FROM SomeTable网上有一种说法,针对无 where_clause 的 COUNT(*),MySQL 是有优化的,优化器会选择成本最小...【详细内容】
2024-04-11  dbaplus社群    Tags:SELECT   点击:(3)  评论:(0)  加入收藏
10年架构师感悟:从问题出发,而非技术
这些感悟并非来自于具体的技术实现,而是关于我在架构设计和实施过程中所体会到的一些软性经验和领悟。我希望通过这些分享,能够激发大家对于架构设计和技术实践的思考,帮助大家...【详细内容】
2024-04-11  dbaplus社群    Tags:架构师   点击:(2)  评论:(0)  加入收藏
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(5)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(9)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(16)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(14)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(9)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(15)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(10)  评论:(0)  加入收藏
站内最新
站内热门
站内头条