@ryanlpeterman:Anders Hejlsberg (@ahejlsberg) 是 TypeScript 和 C# 的创造者,我向他询问了 TypeScript 编译器如何通过…

X AI KOLs Timeline 新闻

摘要

Anders Hejlsberg 在播客节目中解释了用 Go 语言重写 TypeScript 编译器以获得 10 倍性能提升的决策,并探讨了 AI 对软件工程的影响。

Anders Hejlsberg (@ahejlsberg) 是 TypeScript 和 C# 的创造者,我向他询问了 TypeScript 编译器如何通过用 Go 重写而变得快 10 倍,以及他对 AI 如何影响软件工程的看法。 本期内容包括: • 重写编译器如何使其快 10 倍 • 为什么选择 Go 而不是 Rust • 为什么迁移过程没有使用 LLMs • 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 使用 LLMs 进行大型迁移 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 结束语
查看原文
查看缓存全文

缓存时间: 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 重写编译器,主要基于以下优势:

  1. 生态系统内自举:在目标生态系统内实现自托管开发,比外部开发更具优势。团队每日使用自建的 TypeScript 工具链,便于直接发现问题和优化性能。
  2. 全平台兼容性:JavaScript 可在任何环境运行,包括浏览器。这使得 TypeScript 编译器天然支持全平台(在 WebAssembly 普及前,原生编译器无法在浏览器运行)。
  3. 运行时性能:当时 JavaScript(借助 V8 等引擎)性能已接近原生代码的 2-3 倍内。Anders 指出,编译器性能更依赖算法优化,而非单纯依赖运行时环境。

原生重写的必然性:突破性能与扩展瓶颈

尽管具备上述优势,团队仍决定用原生代码重写编译器,主要解决 JavaScript 环境的根本限制:

  1. 性能差距:JavaScript 未针对编译器这类计算密集型任务优化(更适用于 UI 开发),与原生代码存在 2-3 倍性能损耗。
  2. 并发限制:JavaScript 本质是单线程模型。虽然 Web Workers 可实现并行,但无法共享内存,只能通过消息传递(如 JSON 序列化)通信。这导致无法充分利用现代多核 CPU 的并行计算能力,随着摩尔定律转向核心数量增长,此限制成为关键瓶颈。

语言选型:为何最终选择 Go?

团队评估多种语言后选定 Go,原因如下:

  • 移植优先于重写:目标是保留现有 TypeScript 编译器的精确语义与算法,确保向后兼容。这要求新语言必须兼容原 JavaScript 代码库的核心假设。
  • Go 满足核心需求
    • 垃圾回收:原代码库依赖垃圾回收机制、循环数据结构及闭包,Go 原生支持这些特性。
    • 共享内存并发:Go 内置优秀的 goroutine 与 channel 机制,可直接利用多核 CPU 实现共享内存并发。
    • 原生编译与跨平台:Go 可生成健壮的原生代码,支持所有主流平台。

Rust 的局限性:作为系统级语言,Rust 在此项目中存在两个关键短板:

  1. 内存管理模型:Rust 通过所有权和借用检查器实现内存管理,禁止循环引用,而 TypeScript 编译器中广泛存在循环数据结构(如带父指针的语法树、相互引用的符号表)。
  2. 收益有限:在代码生成质量或并发收益方面,Rust 相对 Go 无明显优势,但会显著增加移植复杂度和工作量。

TypeScript 编译器的特殊性

TypeScript 编译器(转换器)与传统原生编译器(如 Clang)存在根本差异:

  1. 输出目标:生成 JavaScript 或 ECMAScript 代码,而非机器码。
  2. 核心功能:编译阶段主要移除类型注解,将 TypeScript 还原为 JavaScript。早期的语法降级(如将 class 转换为兼容旧版的构造函数)因环境版本统一已不再必要。
  3. 类型检查目的:类型检查完全服务于开发工具链(代码补全、重构、导航),运行时类型信息会被完全擦除,不影响代码行为。
  4. 渐进式类型系统:允许代码部分添加类型、部分使用 any 且跳过检查,这是其独特语言特性。
  5. 优化重点:与优化运行时性能的传统编译器不同,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

相似文章