到今年12月,微软的开源编程语言 TypeScript 就要满十周岁了,这是JavaScript 的另一种带有类型系统的编程语言。
如今,TypeScript 已成为构建在浏览器中运行的应用时最常使用的编程语言,但早在 2010 年的时候,微软的公司文化仍然对开源充满了恐惧,而 TypeScript 不得不一路披荆斩棘另辟蹊径。
TypeScript 的作者之一、丹麦的微软软件工程师、微软技术研究员 Anders Hejlsberg 表示,在 2010 年,微软以首席执行官史蒂夫·鲍尔默为首的领导团队认为,开源是赢得 JavaScript 开发人员的唯一方法。
在 2001 年的时候,鲍尔默曾经称 Linux 为“癌症”,因为 Linux 威胁到了微软的所有知识产权,而在 2010 年,对于微软的高层管理人员来说,开源仍然是一个棘手的问题。
Hejlsberg 表示:“ 当时 Linux 被视为对 Windows 的威胁,而事实恰恰相反。”
2014 年 8 月,鲍尔默辞去了首席执行官一职,并自此放下了对 Linux 的敌意。而如今,在首席执行官 Satya Nadella 的领导下,微软一直专注于云计算,同时也开始拥抱开源,并收购了开源代码存储库 GitHub。
微软主要的开源项目包括流行的代码编辑器 Visual Studio Code、 NET Code 和 TypeScript 等。TypeScript 是 JavaScript 的超集,其类型系统可编译为 JavaScript。
自2012年正式发布以来,TypeScript 已成为浏览器应用程序前端开发的主要语言,Slack、Airbnb 以及微软都采用了 TypeScript,就连 VS Code 也是用 TypeScript 构建的。如今,该语言已与 Java、JavaScript 和 Python 等一起荣登十大编程语言。
但在2010年的时候,Hejlsberg 知道,在微软的 Redmond 总部力推 TypeScript 的开源项目难度非常大。如今在 TypeScript 即将迎来十周年之日,Hejlsberg 回顾了当初微软对开源的恐惧。
他表示:“到今年圣诞节,TypeScript 就满十周岁了。最初 TypeScript 实际上只是一个想法,我们想试试看能否进一步提升 JavaScript。”
“我们构建了一些原型,然后将它们整合在一起。但是很明显,吸引 JavaScript 社区的唯一方法就是开源。当时,我们在微软开展了一场与众不同的讨论。”
Hejlsberg 负责的 TypeScript 团队“撑起了一杆大旗,我们一群人对于应该干些什么有着自己强烈的看法。”虽然没有说明当时持反对意见的主管,但他指出,当时在鲍尔默的领导下,微软内部非常矛盾,而且对开源充满了恐惧。
Hejlsberg 表示:“我们知道我们必须这么做,但是我们没有经验。”
但随着 TypeScript 的成熟,以及微软开始逐步接受开源,而 Windows 也开始向云转变,2014 年 TypeScript 终于通过 GitHub 上的公共代码库转变成了“开放式开发”的模型。使用 GitHub 可以让 TypeScript 和 JavaScript 开发人员社区影响其未来。
由于采用了不同的方法,现在 Hejlsberg 的团队与客户(即使用 JavaScript 或 TypeScript 的开发人员)之间实现了“零距离”。
Hejlsberg 解释说:“从技术的角度来看,开源指的是向人们提供源代码并放弃你的知识产权,理论上这样才是开源。”
“但是开放式开发实际上指的是,公开整个开发过程,自 2014 年 TypeScript 移至 GitHub 以来,我们一直在这样做。”
如今,由微软的20位工程师组成的 TypeScript 团队所有的日常工作都在 GitHub 上完成,从而实现了“与客户的亲密接触,这是我从未见过的事情”。(2018年,GitHub 被微软以75亿美元的价格收购)。
自 1996 年以来,Hejlsberg 一直在微软任职,他曾负责构建 Turbo Pascal 编译器,还曾担任微软 C# 的首席架构师。
Hejlsberg 说,在迁移到 GitHub 之前,TypeScript 用户需要在开发者大会上提交错误或需求请求,但是他的团队需要一年的时间才能交付新功能,因此可能会错过最佳时机。
1为什么要创建 TypeScript?
TypeScript 是微软在互联网上拼搏的紧要关头产生的。由于 Internet Explorer 的市场份额输给了 Google Chrome,后来 2015 年微软使用开源Chakra JavaScript 引擎启动了 Edge 浏览器。但当时,专注于网络标准且功能非常强大的 JavaScript 引擎 V8 的 Google Chrome 已成为浏览器大战的赢家。
Hejlsberg 回忆道:“当时浏览器大战已经结束了,Google 构建了 Chrome,而 HTML5 也正式来到了。Google 还构建了一个非常高效的 JavaScript 引擎,JavaScript 的效率大大提高了。每个人都开始意识到,浏览器将成为应用构建的平台。”
那时,开发人员已开始为浏览器构建庞大的 JavaScript 应用,但遇到了许多困难,他说,但这种语言缺乏模块、类等关键功能,而且更重要的是缺乏类型系统,无法在程序中按照规则建立秩序。
很多开发人员的工具,例如 VS Code 这样的集成开发环境(IDE),都可以提高开发人员的生产率。
他表示:“想想看开发工具(例如现代 IDE)中我们认为理所应当的强大功能,例如 Visual Studio 或 WebStorm(JetBrains)以及其他产品中所有关系到程序员生产力的功能,例如 VSCode 的 IntelliSense、代码定义和代码导航,这一切都需要 IDE 能够推理你的代码,才能正常使用。”
“类型系统是推理代码的一种方法。其功能是在运行和部署代码之前检查代码。如果某种语言中没有类型,这些功能几乎是不可能的。”
“当时,开发人员正在做疯狂的事情,例如编写整个产品,例如Outlook.com,该产品曾经是用一种C#的变体编写的,后来他们又使用一种名为Script Sharp的工具交叉编译到JavaScript。”
Google有一个类似的交叉编译工具,名叫Google Web Toolkit(GWT),该工具允许开发人员使用Java编写代码,然后交叉编译为JavaScript。
他说:“Google通过这种方式获得了成熟的开发人员工具。他们的IDE拥有项目功能、模块和类,以及IntelliSense和语句启动补齐,然后他们可以将JavaScript视为一种指令语言。”
在TypeScript出现之前,微软打算将一款名为Script Sharp的工具转变为产品。但是,Hejlsberg怀疑这些开发人员不愿意“倒退至使用JavaScript的年代”。那么,为什么不尝试使用JavaScript来解决真正的问题呢?
他说:“你总不能告诉人们通过使用另一种语言来体验JavaScript开发的最佳实践。”
“因此,人们开始研究如何解决这些问题,以及怎样才能为JavaScript构建更好的工具。而这就成为了TypeScript的起源。关键是要向JavaScript语言添加类型系统,同时又不能影响让JavaScript如此流行的因素。”
Hejlsberg团队决定建立一个“可擦除的类型系统”,该组件让TypeScript成为了JavaScript的超集。在编译时,TypeScript会删除所有类型并将控制权交还给JavaScript。
他解释说:“从某种意义上说,这是一个类型系统,但仅存在于开发期间,在运行时就会消失。但是,它带来了诸多优势,却没有任何缺点。”
TypeScript 的主要竞争对手是什么?
根据Hejlsberg的说法,TypeScript唯一的竞争对手就是JavaScript,因为这两种语言都是运行前端应用程序的必备语言,而WebAssembly只是模糊了原生应用与浏览器应用之间的界限。
他说:“但是JavaScript并不是真正的竞争对手。因为我们是相辅相成的关系,或者说是另一个自我。”
真正的问题是,“JavaScript和TypeScript有竞争对手吗?”可以说有,也可以说没有。每种编程语言通常都有相似点,例如Python已在机器学习和AI中找到了很多用途,而SQL用于创建数据库,而C#和Java则主要服务于企业后端。
“JavaScript和TypeScript的主要用途在前端,也是唯一能运行在浏览器中的语言,除了WebAssembly之外。因此,二者之间自然非常亲近。如果要编写Web应用程序,你肯定会选择使用JavaScript或TypeScript。”
与JavaScript一样,微软的TypeScript也遵循了ECMAScript标准的发展,而且我们会开发出越来越多的TypeScript功能,希望喜欢纯JavaScript的开发人员也能够喜欢TypeScript。
他表示:“在某个功能进入ECMAScript标准化流程的第三阶段后,我们就认为该功能已准备就绪,可以在TypeScript中采用,然后我们会与社区合作,合并请求。”
在过去的两年中,TypeScript团队改进了对JavaScript js.doc注释中类型注释的支持,他们努力“为那些不想使用TypeScript的人”构建TypeScript。
Hejlsberg说:“由于TypeScript是JavaScript的超集,因此你也可以将JavaScript视为TypeScript的子集。这意味着我们的整个TypeScript工具链都非常乐于处理JavaScript,并在JavaScript之上提供所有服务。”
“从某种意义上说,JavaScript就像没有类型注释的TypeScript。因此,JavaScript的一种流行的使用方式是,人们将类型注释放在注释(js.doc注释)中,而不是直接在源代码中使用类型注释。而编译器可以从这些注释中获得很多信息。”
“因此,在过去的几年中,我们增强了对js.doc注释的支持,并增强了直接使用JavaScript的能力。”