2014 年就有人公开宣判 JavaScript 死刑,不是因为它不够好,而是因为 Web 平台终将进化到不再需要它。十年过去,这场演讲的每一个论点都在被验证。
这是什么
2014 年,软件工程师 Gary Bernhardt 在 PyCon 上发表了一场名为“The Birth and Death of JavaScript”的经典技术演讲。这场演讲后来被整理成文字稿,在 Hacker News 上引发持续讨论,至今仍被反复引用。
演讲的核心论点非常直接:JavaScript 是一个诞生于 10 天之内的“意外产物”,它的设计缺陷是结构性的,无法通过打补丁修复。随着 Web 平台性能提升、浏览器能力增强,以及更优系统语言(如 Rust、Go、Wasm 目标语言)的成熟,JavaScript 最终会被“编译目标”和“原生 Web 语言”双重夹击而消亡。
这不是一篇技术预言小说,而是一份基于 Web 技术演进逻辑的推演。演讲者不是要黑 JS,而是想提醒所有人:别把职业生涯押在一个注定被替代的中间层上。
为什么重磅
在 2014 年,JavaScript 正处于如日中天的阶段:Node.js 刚火,React 还没发布,ES6 还在草案阶段。敢在这个时间点说“JS 会死”,无异于在 2015 年说“比特币会崩”。
但 Bernhardt 的逻辑不是情绪宣泄,而是基于一个核心对比:
| 维度 | JavaScript 时代 | 未来(演讲预测) |
|---|---|---|
| 运行方式 | 解释执行,JIT 优化 | 编译到 Wasm / 原生字节码 |
| 类型系统 | 动态弱类型,隐式转换灾难 | 静态强类型,编译期检查 |
| 工具链 | 需要 Babel、Webpack 等转译 | 直接编译到 Web 目标 |
| 性能 | 受限于 JS 引擎优化上限 | 接近原生性能 |
| 生态依赖 | 必须学 JS 才能写 Web | 任何语言都能编译到 Web |
这个对比在今天看来已经部分成真:WebAssembly 于 2017 年正式发布,Rust 和 Go 都可以编译到 Wasm 运行在浏览器中。TypeScript 虽然没杀死 JS,但本质上是对 JS 的“投降式改良”——承认原生 JS 不够用。
技术亮点
1. “10 天设计”的诅咒
Brendan Eich 在 1995 年用 10 天创造了 JavaScript 的第一个版本。这不是黑历史,是事实。Bernhardt 指出,这个时间窗口决定了 JS 的底层缺陷:
- 没有模块系统:直到 ES6 才原生支持
import/export,之前全靠社区方案 - 全局作用域污染:
var声明的变量默认挂到window上 - 隐式类型转换:
[] + []等于空字符串,[] + {}等于"[object Object]"
这些不是“特性”,是设计妥协。后续所有“最佳实践”本质上都是在绕开这些坑。
// 经典面试题:猜猜输出什么?console.log(0.1+0.2===0.3);// falseconsole.log(typeofNaN);// "number"console.log([]==![]);// true2. “JavaScript 是汇编语言”的悖论
演讲中最反直觉的观点是:JavaScript 实际上已经变成了 Web 的“汇编语言”。开发者不再直接写汇编,而是写 C/Rust/TypeScript 然后编译成汇编。同理,未来开发者也不会直接写 JS,而是写更高级的语言,然后编译成 JS 或 Wasm。
这个类比在今天已经成立:TypeScript 编译到 JavaScript,Rust 编译到 Wasm,Dart 编译到 JavaScript。JS 正在从“开发语言”退化为“编译目标”。
3. 性能墙与 Wasm 的降维打击
Bernhardt 预测,当 Web 应用需要接近原生性能时(如游戏、视频编辑、3D 渲染),JS 的 JIT 优化天花板会成为瓶颈。而 Wasm 的出现直接绕过了这个限制:
- Wasm 是二进制格式,解析速度比 JS 快一个数量级
- Wasm 的指令集接近硬件,编译器可以做更激进的优化
- Wasm 的内存模型是线性的,没有 GC 暂停问题
// Rust 编译到 Wasm 的示例#[wasm_bindgen]pubfnfibonacci(n:u32)->u32{matchn{0=>0,1=>1,_=>fibonacci(n-1)+fibonacci(n-2),}}这段 Rust 代码编译成 Wasm 后,在浏览器中的执行速度比等效 JS 快 2-5 倍,且没有 GC 抖动。
4. 工具链的“自噬”现象
演讲还预言了一个讽刺现象:JS 的工具链会越来越复杂,最终反噬 JS 本身。为了弥补 JS 的缺陷,社区发明了 Babel、Webpack、ESLint、Prettier、Jest……这些工具本身是用 JS 写的,但它们的复杂度已经超过了大多数业务代码。
“你花在配置 Webpack 上的时间,比写业务逻辑的时间还多”——这句话在 2018 年之前是段子,之后是现实。
5. 消亡不是“消失”,而是“降级”
Bernhardt 特别强调:JS 的消亡不是像恐龙一样突然灭绝,而是像 COBOL 一样慢慢退居二线。JS 不会消失,但会从“Web 唯一语言”降级为“Web 兼容层语言”。
今天看,这个判断非常精准:
- 新项目首选 TypeScript 而非原生 JS
- 性能敏感模块用 Rust/Wasm 替代
- 框架层(React/Vue)正在抽象掉 JS 的 DOM 操作细节
- 边缘计算(Cloudflare Workers)支持多种语言编译到 JS
对 AI 工程师的启示
1. 别把技术栈当信仰,要当工具
AI 领域的技术更迭比 Web 更快。2018 年的 TensorFlow 1.x 和 2023 年的 PyTorch 2.0 几乎是两个世界。如果你把职业生涯押在某个框架或语言上,5 年后可能面临“技能贬值”。
可执行建议:每季度花 1 天时间,调研一个你当前技术栈的“替代方案”。不是要你立刻切换,而是保持对生态变化的敏感度。比如现在用 PyTorch,可以看看 JAX 或 MLX 在做什么。
2. 关注“编译目标”而非“开发语言”
AI 工程师经常纠结“用 Python 还是 C++ 写模型推理”。但更本质的问题是:你的模型最终运行在什么平台上?
- 如果目标是浏览器,考虑 ONNX Runtime Web 或 TensorFlow.js
- 如果目标是移动端,考虑 Core ML 或 TFLite
- 如果目标是边缘设备,考虑 Wasm 或 C 编译
可执行建议:在选型时,先确定“最终运行环境”,再反推“用什么语言开发”。不要因为“Python 好写”就强行把模型部署到浏览器。
3. 警惕“工具链膨胀”陷阱
AI 项目的工具链膨胀速度不亚于 Web 项目:Docker、Kubernetes、MLflow、Weights & Biases、DVC、Ray……每个工具解决一个问题,但组合起来就是运维噩梦。
可执行建议:每引入一个新工具,问自己三个问题:
- 这个工具解决的核心问题是什么?
- 不用它,有没有更简单的替代方案?
- 如果它 2 年后停止维护,我的迁移成本是多少?
参考链接
- 原文演讲(文字稿):https://www.destroyallsoftware.com/talks/the-birth-and-death-of-javascript
- Hacker News 讨论:https://news.ycombinator.com/item?id=7691071
- WebAssembly 官方文档:https://webassembly.org/
一深思AI · AI 情报站 · 2026-06-15