开发者称Rust有望取代C成为通用系统编程语言
来源标题:Rust Is the New C
一篇技术文章认为,Rust是当今唯一能像C一样覆盖所有设备和程序类型的语言,而C仍稳居Redmonk语言榜前十。文章回顾C在70年代随微计算机革命普及的历史,讨论Rust接替C的可能性。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
生活在70年代一定很疯狂吧?
那个十年刚开始的时候,电子计算器还只出现在实验室里,但到了1974年,它们已经进入了千家万户。像Pong这样的电子游戏把计算机的力量带给了普通大众,到了70年代末,微计算机革命似乎意味着每个家庭都会拥有一台电脑,就像他们突然都有了计算器一样。
在这样的背景下,C语言诞生了,最初是为PDP-11编写的,然后被移植到了几乎每一台曾经被制造出来的计算机上。我常常幻想那些恰好在那个完美时机——也就是一开始——就接触C语言的人的生活是怎样的。在这个视频里,我会把C和C++统称为“C”。请见谅。
在他们学会了这门相对小巧的语言之后,他们本可以花上几十年只写C,一门语言(勉强算一门语言)搞定所有设备上的所有程序!C顽固地拒绝离开Redmonk的前十大语言榜单——按GitHub项目和StackOverflow标签排名。一切都曾经是——而且在很大程度上仍然是——用C写的:
但今天只有一门语言能做到所有这些,而它不是C。让我们想象一下她的职业生涯一直走到今天会是什么样子:
对于UNIX兼容的操作系统,以下内容是定义好的: — https://www.rfc-editor.org/rfc/rfc3875#section-7.2
CGI规范在编写时就假设使用C,即使在1.1版本中也是如此,最后一版修订于2004年——okcupid.com至今仍是用C写的!C对所有的web应用至关重要,直到今天依然如此:如果你深入每一个Python、Ruby和JavaScript应用的内部,幕后真正的力量是用C编写的大型模块。
整个职业生涯只用一门语言,对比一下昨天刚出来的12个新的JavaScript预处理器!Grace的职业生涯听起来轻松多了,不是吗?(当然,空指针除外。)
这是我对你未来的推销——如果你今天就开始学Rust。
“Lisp开发者知道一切事物的价值,却不知道任何事物的成本” *这自然适用于所有其他语言
让我们退一步:为什么C统治了我们的行业?简而言之,底层可移植性。为什么它至今仍然如此重要?底层可移植性;一次编写,到处编译。在C之前,人们的共识是:如果你想要可移植性,就必须牺牲底层能力和速度,反之亦然:如果你想编写需要快速运行的操作系统和游戏,你就必须为你的特定架构编写底层汇编,然后几乎完全重写以适应每一台新机器。
1 虽然可以用C/Zig写web代码,但那并不好玩 2 WebAssembly对Go来说不是原生的,需要tinygo编译器 3 你可以在Go中调用GPU函数,但你可以用Rust编写它们
(以上都非常粗略,请不要太当真。)
这让我想到我们今天的处境:作为通用软件开发人员,我们用JavaScript做浏览器开发,用Python、Ruby或Node.js写后端代码,而裸机代码仍然需要C,或者如果你运气好的话,也许Zig。如果你想做iOS或Windows应用开发,Apple或Microsoft有一些价格非常合理的工具包等着你。
今天只有一门语言能让你追随Grace Pointer的脚步,它不再是C,也不是JS。随着web开发转向高级语言,把C抛在了身后,Rust是唯一一门能全能的语言。是的,其中一些应用在其他语言中也能实现,C也可以,但没人会认为那很有趣。
“如果你几乎从不添加任何东西,你得到的是C。如果你几乎从不移除任何东西,你得到的是C++。”
C极其严肃地对待向后兼容性,其发展速度只有亲妈才爱得起来。高级语言往往有一种“管他呢,发了再说”的态度。当新特性被添加时,如果你想用它们,你就得跟上发展的步伐。(React开发者知道我在说什么。)
Rust从C和C++中吸取了教训,避开了中间路线的妥协,而是同时采取了二者的量子叠加态。它既毫不妥协地向后兼容,又毫不妥协地向前兼容。这由Rust的Edition系统来保证,确保期望不同Rust版本的库仍然可以在同一个项目中一起编译。
向前兼容性在不太正式的层面上还通过宏系统得到了增强。
let n = await!(some_future_computation);
大致展开为:
let mut future = IntoFuture::into_future($expression); let mut pin = unsafe { Pin::new_unchecked(&mut future) }; let n = loop { match Future::pollborrow(&mut pin), &mut ctx { Poll::Ready(item) => break item, Poll::Pending => yield,
Rust RFC-2394 “await! 是一个编译器内置功能,为日后决定其确切语法留出空间。”
就像在Lisp中一样,Rust的宏让整个语言在编译时可用,在将生成的代码传递给编译器之前重写语法。这是一个极其强大的技巧,值得单独讨论,详见我的Witchcraft视频。
向前兼容性的一个具体例子是await!宏,它被引入Rust用于测试,同时社区正在弄清楚他们是想要像JavaScript那样的await关键字,还是对future使用.await。后者胜出了,但测试它不需要对核心语言做任何改动——宏允许新语法作为一个库存在。
以下是2025年你学习Rust这门单一语言后能构建的所有东西的速通:
#[component] pub fn button() -> impl IntoView { let (count, set_count) = signal(0); view! { <button on:click=move |_| { set_count.update(|n| *n += 1); }> "Click me: " {count} </button>
在你们——我可爱的观众——决定我应该成为一名YouTuber之前,我是一名web开发者。这是我发布用户可交互程序最喜欢的方式。
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。