随着TypeScript在12月迎来10岁生日,它的共同创建者谈到了如何让微软拥抱开源,以及它如何成为构建Web应用程序的首选语言

2020-09-17 00:56:55

微软的开源编程语言Tyescript-JavaScript的另一个自我,但有一个类型系统-将于今年12月迎来10岁生日。

它已经成长为开发在浏览器上运行的应用程序的首选语言,但早在2010年,它就不得不在仍然害怕开源的微软公司文化中选择自己的道路。

TypeScript的联合创建者安德斯·海尔斯伯格(Anders Hejlsberg)是一名丹麦软件工程师,也是微软的技术研究员。他向ZDNet描述了2010年在时任微软首席执行官史蒂夫·鲍尔默(Steve Ballmer)的领导下,他的团队决定开源战略是赢得JavaScript开发人员支持的唯一途径。

鲍尔默在2001年称Linux是威胁到微软所有知识产权的毒瘤,而在2010年,微软的开源对最高管理层来说仍然是一个棘手的问题。

海尔斯伯格说,Linux被认为是对Windows的威胁,事实证明恰恰相反。

鲍尔默于2014年8月辞去首席执行官一职,此后他放弃了这一职位。如今,在微软首席执行官萨蒂亚·纳德拉的领导下,微软专注于云计算,公司热爱开源,并拥有开源代码库GitHub。

它的其他主要开源项目包括流行的代码编辑器Visual Studio Code(VS Code)、.NET Code和TypeScript,这是JavaScript的超集,具有编译成JavaScript的类型系统。

自2012年正式发布以来,TypeScript已经成为浏览器应用程序前端开发的关键语言,被Slake、Airbnb等公司采用,当然还有微软(Microsoft),后者在TypeScript中构建了VS Code。该语言现在与Java、JavaScript和Python一起稳居前10名编程语言之列。

但在2010年,海尔斯伯格意识到,在微软雷蒙德总部,将TypeScript作为开源项目推销可能是一件很难的事情。在编程语言即将问世10周年之际,Hejlsberg回忆起微软是如何战战兢兢地看待任何开放源码的。

他告诉ZDNet,圣诞节到来将是10年后。TypeScript实际上只是一个想法,让我们看看我们是否可以在JavaScript方面做得更好一点。

我们建造了一些原型,然后把它们拼凑在一起。但很明显,我们再次吸引JavaScript社区的唯一方式就是开源。而在当时,这与在当时的微软进行的对话是不同的。

海尔斯堡的打字团队实际上不得不与一群对我们应该在这里做什么有强烈意见的人一起运行,他说,但没有提到任何可能反对它的高管的名字。但他指出,当时在鲍尔默的领导下,微软对开源的态度非常矛盾,对此感到恐惧。

海尔斯伯格说:我们多少知道这是我们必须要做的事情,但我们没有这样做的经验。

但随着Typecript的成熟和开源在微软从Windows转向云计算的战略中获得认可,该公司将在2014年通过GitHub上的公共存储库将Tyescript转变为开放开发的模式。使用GitHub可以让TypeScript和JavaScript开发人员社区影响它的未来。

由于这种不同的方法,他的团队现在与其客户-使用JavaScript或TypeScript的开发人员-零距离。

Hejlsberg解释说,在技术意义上有开源,因为你把你的源代码给了别人,并赠送了你的知识产权,从技术上讲,这是开源的,Hejlsberg解释说,这是一种技术意义上的开源,因为你把你的源代码给别人,并赠送你的知识产权,从技术上讲,这是开源。

不过,还有开放式开发,整个开发过程实际上都是在公开的环境中进行的,自2014年Typecript迁移到GitHub以来,我们一直在这样做。

如今,微软于2018年以75亿美元收购的GitHub是由大约20名微软工程师组成的打字团队完成所有日常工作的地方,与我们的客户的亲密程度是我以前从未见过的。

Hejlsberg在Borland工作了一段时间后,自1996年以来一直在微软工作,构建Turbo Pascal编译器。在微软,他也是C#的首席架构师。

Hejlsberg说,在迁移到GitHub之前,打字用户会在开发者会议上提交错误或要求请求,但他的团队需要一年时间才能交付经常错过目标的新功能。

Typescript是微软在网络和公司的一个有趣的结合点上孵化出来的。随着Internet Explorer的份额被谷歌Chrome抢走,微软后来在2015年推出了搭载开源Chakra JavaScript引擎的Edge浏览器。但到那时,谷歌Chrome凭借其对网络标准的关注和名为V8的强大JavaScript引擎,已经成为浏览器战争的明显赢家。

浏览器之战已经结束,谷歌制造了Chrome,HTML5正在上演。Google还构建了一个非常高效的JavaScript引擎,JavaScript的效率大大提高了。海尔斯伯格回忆说,每个人都开始意识到,浏览器将成为真正的应用程序的构建之地。

到那时,开发人员已经开始为浏览器构建巨大的JavaScript应用程序,并努力用JavaScript编写这些应用程序。他说,JavaScript语言缺乏模块、类等关键功能,更重要的是,缺乏通过程序中的规则创建顺序的类型系统。

然后是开发人员工具,如集成开发环境(IDE),如VS Code,用于提高开发人员的工作效率。

他说:如果你想想是什么驱动了我们的开发工具,比如我们都认为理所当然的现代IDE,比如Visual Studio或WebStorm(来自JetBrains)以及其他产品,我们拥有的所有程序员生产力功能,比如VSCode的智能感知(IntelliSense)、代码定义和代码导航,都需要IDE能够对你正在处理的代码进行推理。

类型系统是您对代码进行推理的一种方式。它是在运行和部署代码之前检查代码的能力。在一种几乎不可能的语言中没有类型是不可能的。

当时,开发人员正在做疯狂的事情,比如编写像Outlook.com这样的整个产品,它一度是用C#的变体编写的,而C#的变体正在使用一种名为Script Sharp的工具交叉编译成JavaScript。

Google有一个类似的交叉编译工具,称为Google Web Toolkit(GWT),它允许其开发人员用Java编写并交叉编译成JavaScript。

如此一来,(谷歌)就可以获得成熟的开发工具。他们可以得到一个真正的IDE,包括项目功能、模块和类,以及智能感知和语句完成,然后他们就可以将JavaScript视为一种指令语言,他说。

在TypeScript出现之前,微软希望将名为Script Sharp的工具转化为产品。但海尔斯伯格想知道这些开发人员是否愿意如此努力地用JavaScript编写代码。那么,为什么不尝试用JavaScript来解决真正的问题呢?

他说,因为你肯定不会通过告诉人们用不同的语言编写来为JavaScript打造一流的开发体验。

因此,我们开始研究我们可以做些什么来解决这些问题,以便为JavaScript构建更好的工具。这确实是打字稿的起源。关键是要在语言中添加一个类型系统,而不是去掉最初让JavaScript如此流行的所有东西。

Hejlsberg和他的公司决定建立一个可擦除的字体系统--这个组件使TypeScript成为JavaScript的超集。在编译时,TypeScript将删除所有类型并将其返回给JavaScript。

从某种意义上说,它是一个只在开发人员体验期间存在的类型系统,但它在运行时就消失了。但他解释说,当你跑步时,它会给你带来所有的好处,而没有任何缺点。

据Hejlsberg称,TypeScript唯一真正的竞争对手是JavaScript,因为两者现在都是运行前端应用程序的首选语言,而WebAssembly正在模糊本地应用程序和浏览器应用程序之间的界限。

但JavaScript并不是真正的竞争对手。这是我们的双胞胎或另一个自我,他说。

问题真的是,有没有能与JavaScript和/或打字稿竞争的语言?有,也没有。但你在这些列表上看到的每一种语言通常都有一个亲和点。比如Python在机器学习和人工智能中有很多用处,SQL被用来创建数据库,而C#和Java在企业后端非常重要。

你知道,JavaScript和TypeScript是前端的运行方式。除了WebAssembly Now之外,它是浏览器中唯一运行的语言。因此,这是一种完全自然的亲和力。如果你要写一个Web应用程序,你要用JavaScript或打字稿来写。

与JavaScript一样,Microsoft TypeScript也跟踪ECMAScript标准的发展,并且越来越多的TypeScript被开发来迎合喜欢纯JavaScript的开发人员。

他说:一旦一项功能达到ECMAScript标准化过程的第三阶段,我们就会认为它已经准备好在打印脚本中采用,然后我们会与社区合作,合并一个拉取请求。

在过去的两年里,TypeScript团队一直致力于通过改进对JavaScript js.doc注释中的文字注释的支持,为那些不想要TypeScript的人构建TypeScript。

因为TypeScript是JavaScript的超集,所以您也可以将JavaScript视为TypeScript的子集。这意味着我们的整个TypeScript工具链都非常乐意处理JavaScript,并在JavaScript之上提供所有服务,Hejlsberg说。

从某种意义上说,JavaScript就像没有类型注释的文字脚本。因此,使用JavaScript的一种流行方式是,人们将类型批注放在注释(js.doc注释)中,而不是直接在源代码中使用类型批注,编译器实际上可以从这些注释中派生出大量信息。

因此,在过去的几年里,我们实际上已经增强了对js.doc评论的支持,并且增强了我们直接使用JavaScript的能力。