开源的 TypeScript 也曾在微软内部遭到抵制,但如今 TypeScript 已经成为 Web 应用构建的主流语言。
 
微软的开源编程语言 TypeScript 是 JavaScript 的一种带有类型系统的变体,到今年 12 月已经有 10 年历史了。
 
如今,它已成长为开发人员构建可在浏览器中运行的应用时常用的语言。但时间倒退回 2010 年,彼时的 Type Script 却需要在依旧惧怕开源的微软公司文化中找到自己的出路。
TypeScript 的共同创始人之一,来自丹麦的微软软件工程师和技术研究员 Anders Hejlsberg 向 ZDNet 讲述了 2010 年的那一段历史。当时微软的首席执行官史蒂夫·鲍尔默领导的团队决定,开源战略是唯一可以赢得 JavaScript 开发人员支持的制胜法宝。
 
鲍尔默在 2001 年曾说过“开源就是一种癌症,Linux 是一种毒瘤”,称其威胁到了微软的所有知识产权。直到 2010 年,开源对于微软的高层管理人员来说仍然是一个棘手的问题。
Hejlsberg 说:“Linux 被视为对 Windows 的威胁,可事实证明,它恰恰相反。”
 
鲍尔默于 2014 年 8 月辞去首席执行官一职。如今,在微软首席执行官萨蒂亚·纳德拉的领导下,公司已经将业务重心转向了云计算,并热情地拥抱了开源社区,还收购了开源代码存储库 GitHub。
微软的其他主要开源项目包括流行的代码编辑器 Visual Studio Code(VSCode)、.NET Code 和 TypeScript。TypeScript 是 JavaScript 的超集,带有类型系统,代码可编译为 JavaScript。
自 2012 年正式发布以来,TypeScript 已成为浏览器应用程序前端开发的主导语言之一,Slack、Airbnb 以及微软自己都采用了 TypeScript,微软还用 TypeScript 构建了 VS Code。这种语言现在与 Java、JavaScript 和 Python 一道,在十大编程语言中占有一席之地。
 
但回到 2010 年,Hejlsberg 知道在微软的雷蒙德总部推销开源 TypeScript 的想法可能会是一个艰巨的挑战。随着这种编程语言迎来十周年纪念日,他回忆起微软彼时是如何看待开源代码的。
“圣诞节就是我们的 10 周年纪念。”Hejlsberg 告诉 ZDNet,“TypeScript 一开始实际上只是一个想法,看看我们是否可以在 JavaScript 方面做得更好”。
 
“我们构建了一些原型,然后将它们整合在一起。但是很明显,我们要吸引 JavaScript 社区的唯一方法就是开源。但在那时的微软讨论这个话题的氛围和今天是大相径庭的。”
 
Hejlsberg 的 TypeScript 团队当时的处境并不好,他们需要扭转高层的偏见,高层的那些人对 Hejlsberg 所做的事情有强烈的抵触情绪。虽然 Hejlsberg 没有提及任何当初反对 TypeScript 的高管的名字,但 Hejlsberg 指出, 当时在鲍尔默的领导下,微软对开源有着“非常矛盾”的态度,而且有一种“恐惧”心理。
 
Hejlsberg 说:“我们知道这是我们必须做的事情,但是我们没有这方面的经验。”
 
可是随着 TypeScript 的逐渐成熟,加上开源在微软主营业务从 Windows 到云的转变过程中获得了认可,该公司在 2014 年通过 GitHub 上的一个公共存储库将 TypeScript 转型为“开放式开发”模式。使用 GitHub,意味着 TypeScript 和 JavaScript 的开发社区可以影响这种编程语言的未来发展。
 
由于采用了这种全新的方法,他的团队现在与他们的客户,也就是使用 JavaScript 或 TypeScript 的开发人员之间实现了“零距离”。
 
Hejlsberg 解释说:“从技术意义上讲,开源是指你向人们提供你的源代码并放弃你的知识产权,这就是技术上的开源。但接下来是开放式开发,你实际上是在公开地完成整个开发过程。自 2014 年 TypeScript 移至 GitHub 以来,我们一直在这样做。”
 
GitHub 在 2018 年被微软以 75 亿美元的价格收购,如今由约 20 位微软工程师组成的 TypeScript 团队的所有日常工作都在 GitHub 上完成,从而做到了“与客户保持从未有过的亲密关系”。
 
Hejlsberg 曾在 Borland 任职,自 1996 年以来一直在微软工作,负责构建 Turbo Pascal 编译器。在微软,他还是 C# 的首席架构师。
 
Hejlsberg 说,在迁移到 GitHub 之前,TypeScript 用户会在开发者大会上提交错误或需求请求,但他的团队往往需要一年的时间来交付新功能,结果经常会错过时机。

为什么要创建 TypeScript?

TypeScript 是在微软和 Web 走在重要路口的有趣关头诞生的。由于 Internet Explorer 的市场份额被谷歌 Chrome 攫取,微软在 2015 年使用开源 Chakra JavaScript 引擎打造了全新的 Edge 浏览器。但是到了这个时候,专注于 Web 标准,具备功能强大的 V8 JavaScript 引擎的谷歌 Chrome 显然已经赢得了浏览器大战。
 
“浏览器之战结束了,谷歌构建了 Chrome,HTML5 也在崛起。谷歌还构建了一个非常高效的 JavaScript 引擎,JavaScript 的效率大大提高了。每个人都开始意识到,浏览器将成为真正的应用的乐园。”Hejlsberg 回忆道。
 
那时,开发人员已开始为浏览器构建庞大的 JavaScript 应用程序,并努力用 JavaScript 编写它们,他说这种语言缺乏诸如模块、类等关键功能;而且,重要的是缺乏一种通过程序中的规则来建立秩序的类型系统。
 
然后是开发工具,比如 VS Code 这样的集成开发环境(IDE),它们可以提高开发人员的生产率。
 
“想一想我们开发工具强大能力的源泉(例如现代化的 IDE),包括 Visual Studio 或 WebStorm(来自 JetBrains)以及其他产品所拥有的的所有编程生产力特性(例如 VS Code 的 IntelliSense、代码定义、代码导航等等),都需要 IDE 能够推理出你正在处理的代码。我们都认为这是理所当然的需求。”他说,“类型系统是你推理代码的一种方法。它提供了在运行和部署代码之前检查代码的能力。如果编程语言没有类型,这几乎是不可能做到的。当时,开发人员正在做很多疯狂的事情,例如编写 Outlook.com 这样的大型项目。该产品曾经是用 C# 的一个变体编写的,然后使用称为 Script Sharp 的工具交叉编译到了 JavaScript 上。”
 
谷歌有一个类似的交叉编译工具,称为 Google Web Toolkit(GWT),该工具允许其开发人员使用 Java 编写代码并交叉编译为 JavaScript。通过这种方式,谷歌获得了成熟的开发工具链。他们可以获得具有项目功能、模块和类,以及 IntelliSense 和语句自动完成功能的 IDE,然后他们可以将 JavaScript 视为一种指令语言。
 
在 TypeScript 出现之前,微软打算将一种称为 Script Sharp 的工具转变为产品。但是 Hejlsberg 想知道这些开发人员是否愿意“屈服于此来编写 JavaScript”。那么,为什么不尝试解决 JavaScript 的实际问题呢?
Hejlsberg 说:“因为你肯定没法告诉人们说,用另一种语言编写代码可以为 JavaScript 建立最佳的开发体验。因此,我们开始研究如何解决这些问题,以为 JavaScript 构建更好的工具。这的确是 TypeScript 的起源。关键是要向语言中添加类型系统,而且还不能影响那些让 JavaScript 如此流行的东西。”
 
Hejlsberg 和他的公司决定建立一个“可擦除类型系统”,这个组件使 TypeScript 成为 JavaScript 的超集。在编译时,TypeScript 会删除所有类型并将代码还原回 JavaScript。
 
从某种意义上说,它是一个 type system,只存在于开发人员编程期间,在运行时就会消失。不过在运行的时候,它给你带来的只有好处,没有任何缺点。

TypeScript 的主要竞争对手有哪些?

根据 Hejlsberg 的说法,TypeScript 的唯一真正竞争对手是 JavaScript,因为这两种语言都是运行前端应用程序的必备语言,而 WebAssembly 却模糊了原生应用程序和浏览器应用程序之间的界限。
 
他说:“但是 JavaScript 并不是真正的竞争者。它是我们的双胞胎或是另一个自我。
 
这个问题实际上是:是否存在与 JavaScript / TypeScript 竞争的语言?答案是肯定的也是否定的。但是你在这些列表上看到的每种语言通常都有相似点,例如 Python 已在机器学习和 AI 领域找到了很多用例,而 SQL 被用于创建数据库,C# 和 Java 在企业后端发光发热。
 
“JavaScript 和 TypeScript 是前端的运行方式。这是浏览器中唯一运行的语言,除了现在的 WebAssembly 之外。因此,这是完全自然而然的亲缘关系。如果要编写 Web 应用程序,你就会用 JavaScript 或 TypeScript 编写。”
 
像 JavaScript 一样,微软的 TypeScript 也会跟随 ECMAScript 标准的发展步伐,并且 TypeScript 的进展速度越来越快,以迎合喜欢纯 JavaScript 的开发人员。
 
Hejlsberg 说:“一旦功能进入 ECMAScript 标准化流程的第三阶段,我们就认为该功能已准备就绪,可以在 TypeScript 中采用,然后我们会与社区合作以合并拉取请求。”
 
在过去的两年中,TypeScript 团队改进了对 JavaScript js.doc 注释中类型注解的支持,从而“为那些不想使用 TypeScript 的人”带来更适合他们的 Type Script。
 
“由于 TypeScript 是 JavaScript 的超集,因此你也可以将 JavaScript 视为 TypeScript 的子集。这意味着我们整个 TypeScript 工具链非常乐于处理 JavaScript,并在 JavaScript 之上提供所有服务,”Hejlsberg 说。
 
“从某种意义上说,JavaScript 就像是没有类型注释的 TypeScript。因此,一种流行的 JavaScript 使用方式是,人们将类型注解放在注释(js.doc 注释)中,而不是直接在源代码中使用类型注解。编译器实际上可以从这些注释中获得很多信息。”
正因如此,在过去的几年中,Heijlsberg 和他的团队一直在增强对 js.doc 注释的支持,并增强直接使用 JavaScript 的能力。

原文链接

https://www.zdnet.com/article/typescript-creator-how-the-programming-language-beat-microsofts-open-source-fears/​www.zdnet.com
 
 
作者:ZDNet
译者:王强
策划:李俊辰
链接:TypeScript之父:JS不是竞争对手,曾在惧怕开源的微软文化中艰难求生
来源:微信公众号 | 前端之巅

TypeScript之父:JS不是竞争对手,曾在惧怕开源的微软文化中艰难求生的更多相关文章

  1. js/jquery获取当前页面URL地址并判断URL字符串中是否包含某个具体值

    js/jquery获取当前页面URL地址并判断URL字符串中是否包含某个具体值本文介绍jquery/js获取当前页面url地址的方法,在jquery与js中获取当前页面url方法是一样的,因为jque ...

  2. js多个元素随机且不重叠分布在页面中

    最近,公司要做一个类似挖矿的项目,大概其是当用户登录进入首页后,如果用户有已经生成的原力值,则在其点击原力值后可以类似蚂蚁森林那样收集原力值,当用户将所有的原力值收集完毕后开始提醒用户新的原力值正在生 ...

  3. Hadoop之父Doug Cutting:Lucene到Hadoop的开源之路

    Hadoop之父Doug Cutting:Lucene到Hadoop的开源之路 Doug Cutting,凭借自己对工作的热情和脚踏实地的态度,开创了Lucene和Nutch两个成功的开源搜索引擎项目 ...

  4. 使用vscode写typescript(node.js环境)起手式

    动机 一直想把typescript在服务端开发中用起来,主要原因有: javascript很灵活,但记忆力不好的话,的确会让你头疼,看着一月前自己写的代码,一脸茫然. 类型检查有利有敝,但在团队开发中 ...

  5. Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架

    开发四年只会写业务代码,分布式高并发都不会还做程序员?   Nest.js 6.0.0 正式版发布了.Nest 是构建高效.可扩展的 Node.js Web 应用程序的框架.它使用现代的 JavaSc ...

  6. TypeScript引入moment.js报错“无法找到moment模块”及解决方法

    npm i moment下载moment完成后,在ts文件中引入 import * as moment from "moment"; 结果疯狂报错,未找到moment模块. 一开始 ...

  7. js判断当前页面在移动设备还是在PC端中打开

    方法一: var isPC = function () { var userAgentInfo = navigator.userAgent.toLowerCase(); var Agents = ne ...

  8. Node.js连接Mysql,并把连接集成进Express中间件中

    引言 在node.js连接mysql的过程,我们通常有两种连接方法,普通连接和连接池. 这两种方法较为常见,当我们使用express框架时还会选择使用中间express-myconnection,可以 ...

  9. js中的全局变量和静态变量的使用, js 的调试?- 如果js出错, js引擎 就会停止, 这会 导致 后面的 html中 refer 该函数时, 会报错 函数为定义!!

    效果里面的函数, 如show, hide,slideDown等, 这些都叫 "效果"函数, 但是里面可以包含动画, 也可以 不包含动画. 动画,是指 元素 的内容 是 逐渐 显示/ ...

随机推荐

  1. SparkStreaming支持的业务场景

    目前而言SparkStreaming 主要支持以下三种业务场景: ➢ 无状态操作:只关注当前的DStream中的实时数据.例如:只对当前DStream中的数据做正确性校验.(下一条与上一条数据无关) ...

  2. 【转】在Python的struct模块中进行数据格式转换的方法

    这篇文章主要介绍了在Python的struct模块中进行数据格式转换的方法,文中还给出了C语言和Python语言的数据类型比较,需要的朋友可以参考下 Python是一门非常简洁的语言,对于数据类型的表 ...

  3. log4j升级到log4j2

    log4j升级到log4j2 1.导入依赖 log4j2应尽量使用同一版本,否则可能出现不兼容的情况 <!-- log4j2 start --> <!-- log4j-1.2-api ...

  4. 跨站请求伪造(csrf)的防护手段

    CSRF CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造. CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求. 造成的问题:个人隐私泄露以及财产安全. CS ...

  5. 深入理解C++中的new/delete和malloc/free动态内存管理

    malloc/free和new/delete的区别 malloc/free是C/C++标准库的函数:new/delete是C++操作符. malloc/free只是动态分配内存空间/释放空间:new/ ...

  6. IDEA导入Eclipse的快捷键KeyMap

    说在前面的话 现在由于IDEA编辑器越来越火,因此很多程序员都从eclipse转入IDEA,转入后确实发现很强大的编辑器,但是一直为快捷键而忧愁,因为eclipse毕竟跟随了自己好多年了,突然更换编辑 ...

  7. wampserver64 apache2.4版本局域网互相访问总结

    wampserver64  apache2.4版本局域网互相访问总结 背景:在我的电脑上给算法组开发了一个工具,需要在局域网环境下其他同事都能访问到,搞了一下午终于搞定,于是整理了这篇文档,给其他同行 ...

  8. 【学习中】Unity<中级篇> Schedule

    章节 内容 签到 Unity3D 实战技术第二版视频教程(中级篇) 1.游戏引擎发展史 2.Unity发展史 3.3D图形学与必要组件 5月19日 4.核心类_GameObject类 5月19日 5. ...

  9. 面试【JAVA基础】阻塞队列

    1.五种阻塞队列介绍 ArrayBlockingQueue 有界队列,底层使用数组实现,并发控制使用ReentrantLock控制,不管是插入操作还是读取操作,都需要获取锁之后才能执行. Linked ...

  10. JavaScript 的 this 指向和绑定详解

    JavaScript 中的 new.bind.call.apply 实际这些都离不开 this,因此本文将着重讨论 this,在此过程中分别讲解其他相关知识点. 注意: 本文属于基础篇,请大神绕路.如 ...