@ryanlpeterman:Anders Hejlsberg (@ahejlsberg) 是 TypeScript 和 C# 的创造者,我向他询问了 TypeScript 编译器如何通过…
摘要
Anders Hejlsberg 在播客节目中解释了用 Go 语言重写 TypeScript 编译器以获得 10 倍性能提升的决策,并探讨了 AI 对软件工程的影响。
查看缓存全文
缓存时间: 2026/08/17 16:19
Anders Hejlsberg (@ahejlsberg) 是 TypeScript 和 C# 的创造者,我与他探讨了 TypeScript 编译器如何通过 Go 语言重写实现 10 倍性能提升,以及他对 AI 如何影响软件工程的见解。
本期内容涵盖: • 编译器重写如何带来 10 倍性能提升 • 为何选择 Go 而非 Rust • 迁移过程中为何未采用大语言模型 • AI 对软件工程影响的预测
观看渠道: • YouTube - https://youtube.com/watch?v=cywK3XYYJ2o… • Spotify - https://open.spotify.com/episode/1thvWd3ClYQHvaUX9qKckk?si=pmojE4jTSPmHVnm4fydbFg… • Apple Podcasts - https://podcasts.apple.com/us/podcast/the-peterman-pod/id1777363835… • 文字稿 - https://developing.dev/p/creator-of-typescript-10x-faster…
感谢本期赞助商支持: • WorkOS:通过简洁易用的 API 快速实现应用企业级能力,支持 SSO、SCIM、RBAC 等功能,详情访问 https://workos.com • Atlassian Jira:整合您常用的智能代理与模型,高效协同完成工作,详情访问 https://jira.dev
章节导航: 00:00 开场 00:48 为何用 JavaScript 编写编译器 07:29 为何改用 Go 重写编译器 14:49 大语言模型在大型迁移中的应用 20:12 JavaScript 为何如此流行 26:32 后端开发中使用 JavaScript 的理由 32:59 构建编程语言需要什么 37:06 十年后编程语言会减少吗 42:57 实践工程与委派开发 49:14 高速工具链为何愈发重要 51:16 AI 软件工程预测 58:52 技术挑战性最高的工作 01:02:04 必读书籍推荐 01:03:50 给年轻自己的建议 01:05:00 结语
TypeScript编译器迁移至Go:性能、并发与语言选择
摘要: Anders Hejlsberg 阐述了 TypeScript 编译器从 JavaScript 迁移至 Go 的核心动因——追求性能突破与共享内存并发能力,并详细说明了选择 Go 而非 Rust 的技术考量,以及项目中 AI 的有限应用场景。
初始架构:为何选择 JavaScript 开发编译器
TypeScript 最初的原型(早期代号 Strata)采用 C 语言开发,源自 IE 浏览器的 JavaScript 解析器。但团队最终决定用 JavaScript 重写编译器,主要基于以下优势:
- 生态系统内自举:在目标生态系统内实现自托管开发,比外部开发更具优势。团队每日使用自建的 TypeScript 工具链,便于直接发现问题和优化性能。
- 全平台兼容性:JavaScript 可在任何环境运行,包括浏览器。这使得 TypeScript 编译器天然支持全平台(在 WebAssembly 普及前,原生编译器无法在浏览器运行)。
- 运行时性能:当时 JavaScript(借助 V8 等引擎)性能已接近原生代码的 2-3 倍内。Anders 指出,编译器性能更依赖算法优化,而非单纯依赖运行时环境。
原生重写的必然性:突破性能与扩展瓶颈
尽管具备上述优势,团队仍决定用原生代码重写编译器,主要解决 JavaScript 环境的根本限制:
- 性能差距:JavaScript 未针对编译器这类计算密集型任务优化(更适用于 UI 开发),与原生代码存在 2-3 倍性能损耗。
- 并发限制:JavaScript 本质是单线程模型。虽然 Web Workers 可实现并行,但无法共享内存,只能通过消息传递(如 JSON 序列化)通信。这导致无法充分利用现代多核 CPU 的并行计算能力,随着摩尔定律转向核心数量增长,此限制成为关键瓶颈。
语言选型:为何最终选择 Go?
团队评估多种语言后选定 Go,原因如下:
- 移植优先于重写:目标是保留现有 TypeScript 编译器的精确语义与算法,确保向后兼容。这要求新语言必须兼容原 JavaScript 代码库的核心假设。
- Go 满足核心需求:
- 垃圾回收:原代码库依赖垃圾回收机制、循环数据结构及闭包,Go 原生支持这些特性。
- 共享内存并发:Go 内置优秀的 goroutine 与 channel 机制,可直接利用多核 CPU 实现共享内存并发。
- 原生编译与跨平台:Go 可生成健壮的原生代码,支持所有主流平台。
Rust 的局限性:作为系统级语言,Rust 在此项目中存在两个关键短板:
- 内存管理模型:Rust 通过所有权和借用检查器实现内存管理,禁止循环引用,而 TypeScript 编译器中广泛存在循环数据结构(如带父指针的语法树、相互引用的符号表)。
- 收益有限:在代码生成质量或并发收益方面,Rust 相对 Go 无明显优势,但会显著增加移植复杂度和工作量。
TypeScript 编译器的特殊性
TypeScript 编译器(转换器)与传统原生编译器(如 Clang)存在根本差异:
- 输出目标:生成 JavaScript 或 ECMAScript 代码,而非机器码。
- 核心功能:编译阶段主要移除类型注解,将 TypeScript 还原为 JavaScript。早期的语法降级(如将
class转换为兼容旧版的构造函数)因环境版本统一已不再必要。 - 类型检查目的:类型检查完全服务于开发工具链(代码补全、重构、导航),运行时类型信息会被完全擦除,不影响代码行为。
- 渐进式类型系统:允许代码部分添加类型、部分使用
any且跳过检查,这是其独特语言特性。 - 优化重点:与优化运行时性能的传统编译器不同,TypeScript 编译器的优化目标是提升开发者或 AI 的开发效率。
移植过程与 AI 应用
TypeScript 至 Go 的移植项目历时两年,结合手工重构、自动化工具与有限 AI 辅助:
- 核心组件手工重写:扫描器与解析器由团队手工重写。
- 自动化翻译工具:开发了语法层翻译工具,将 TypeScript 转换为 Go 代码。生成的代码存在语法错误且无法直接编译(类型处理方式不同),但提供了相同代码结构基础,后续再进行重构与数据结构调整。
- AI 的有限应用:因项目启动时大语言模型能力有限,AI 仅在局部范围内偶尔用于辅助代码转换。Anders 认为,直接让 AI 翻译 50 万至 100 万行代码并不可靠,仍需人工逐行检查以防止“幻觉输出”。他建议更有效的方式是让 AI 编写确定性转换程序,将随机性控制在程序流程内。
结语
TypeScript 编译器迁移至 Go 的决策,是追求更高运行时性能、利用多核硬件能力,同时保持向后兼容性的务实选择。这一过程体现了语言选型在工程中的权衡——Go 在垃圾回收、原生并发和开发效率方面的综合优势,使其成为此次特定移植任务的理想目标。
来源:https://www.youtube.com/watch?v=cywK3XYYJ2o
相似文章
为什么微软没有使用LLMs进行最近的Typescript原生Go重写 Anders Hejlsberg(Typescript创造者)…
Anders Hejlsberg 解释了为何微软避免直接使用 LLMs 将 TypeScript 重写为 Go,转而倡导利用 AI 构建确定性翻译工具。
@ryanlpeterman: TypeScript 最初是如何创建的 — Anders Hejlsberg(TypeScript 和 C# 的创造者):"TypeScript 的诞生方式是……"
Anders Hejlsberg 解释了 TypeScript 的起源,描述了它如何从 C# 演变而来,因为 Outlook.com 团队请求更好的 JavaScript 工具支持。
@ryanlpeterman: 今年AI会写出超过90%的代码吗?Anders Hejlsberg(TypeScript、C#的创造者):“对于某些类别的应用来说……”
Anders Hejlsberg,TypeScript和C#的创造者,讨论今年AI是否会写出超过90%的代码,指出AI可以处理某些应用类别的所有代码,但无法像TypeScript编译器那样编写高质量代码,并表达了不希望AI完全取代人类编码的愿望。
@GergelyOrosz: Anders Hejlsberg (@ahejlsberg) 是一位活着的传奇:他创造了 Turbo Pascal、Delphi、C# 和 TypeScript(如今 TypeScript 是…
对 Anders Hejlsberg(Turbo Pascal、Delphi、C# 和 TypeScript 的创造者)的一次访谈的详细摘要,涵盖了他的职业生涯、设计哲学以及关于软件工艺和人工智能的见解。
@ryanlpeterman: 人工智能会取代初级软件工程师吗?Anders Hejlsberg (TypeScript、C# 的创建者): "嗯,如果会的话,那么如何…
Anders Hejlsberg 认为,人工智能不太可能完全取代初级软件工程师,因为高级工程师仍然至关重要,但角色正朝着监督人工智能代理的方向发展。