Roslyn 是 C# 和 Visual Basic.NET 开源编译器的代号。这篇文章将介绍它是如何从微软过去的十年至暗时刻走出来,成为开源跨平台的 C# 和 VB 公共语言引擎。

我于 2005 年加入微软,也就是在.NET 2.0 发布之前,当时微软内部已经开始在讨论 Roslyn 项目,这个项目是关于使用 C# 重写 C# 编译器。这对于一门编程语言来说是一件很正常的事情,证明语言已经开始成熟。但我们的动机则更为实际:作为 C# 的创建者,我们并没有使用 C# 编程,而是用 C++!

要重写一个用户已经使用了好几年的编译器,关键问题在于用户会希望新编译器的行为方式与旧编译器完全相同。为 C# 开发新的编译器意味着需要匹配旧编译器的缺陷。我说的不只是已知的缺陷,也包括那些未知的缺陷,以及开发人员已经发现并严重依赖的无意识行为,这些通常是在不知情的情况下发生的。

多年来,这些挑战导致我们无法开始这个项目。

虽然使用 C# 编写新的 C# 编译器会给语言团队本身带来很多好处,但这样能给用户也带来价值吗?新编译器如何给现有的用户带来帮助?也许唯一关心是否使用 C# 编写 C# 编译器的人就是编译器开发团队本身。

但与此同时,我们面临着另一个越来越严重的问题:基于 C# 的不同工具之间的存在大量的重复性工作。除了编译器,我们的姐妹团队在为 Visual Studio 提供 C# IDE 支持,他们必须通过编写大量的代码(他们当时主要也是在用 C++)来理解 C# 的语法和语义。

除此之外,还有很多来自微软和其他公司的工具,如 StyleCop、CodeRush,等等。这些工具都需要实现与 C# 源代码文本相关且对用户来说有意义的功能,并且都存在一些微妙的错误。它们对一些概念的理解处于不同的水平上,而且需要做出不同的折中和权衡。所有人都需要花费大量的精力来理解代码。

最后,我们提出了我们的价值主张:我们只需要一个 C# 代码库,并把它共享给任何一个想要基于代码库构建工具的人!可用工具的增加将给用户带来价值,特别是现有工具质量的提升。我们将语言正确性和性能方面的需求集中在同一个代码库上,并努力提升质量以及添加大量的功能。我们将会构建出一个语言引擎!这将为 C# 代码提供统一的公共 API:我们将重新定义“编译器”的含义。

当然,既然你在为 C# 社区构建 API,它就应该是使用 C#实现的.NET API。因此,使用 C#“引导”C# 的老想法借助这个机会得到了实现。

可以说,Roslyn 的诞生就是始于这种开放的心态:向世界开放 C# 语言的内部开发工作。在微软的封闭文化中,这本身就是一个大胆的主张:我们会免费分享这个知识产权吗?我们会助力那些工具开发商更好地与我们展开竞争吗?

我们希望增强生态系统并成为世界上最好的工具语言的想法最终赢得了胜利。我们想要的是 C# 和.NET 的长期增长,而不是为了短期变现和保护微软资产。因此,虽然说不上是开源,承担 Roslyn 项目的成本和风险对于微软来说也是一个重大的抉择。

当然,你不一定只是构建这些东西。Roslyn 有着雄心勃勃的愿景,充满了技术挑战,我们花了五年时间才实现。

在我们构建初始版本时,Roslyn 仍然是一个闭源项目。从 2009 年项目启动以来,我们一直希望我们的编译器是开源的,但微软还没有为开源做好准备。开发私有代码并提交专利的文化代表了微软自 20 世纪 70 年代以来的工作方式——虽然变革已经在悄然发生,但速度比我们团队所希望的要慢。

事实上,曾经有一段时间,我们感觉公司正朝着完全相反的方向发展。

Windows 8 项目几乎占据了整个公司的资源。因为采用了新的编程模型,其触角已经触及到开发者工具和语言团队的内部,所有的东西都被极端地保护起来,而且不仅仅针对外部,甚至也针对公司内部。例如,我们当时开发的异步功能融合到 Windows 8 的编程模型中,我甚至不敢在内部发表设计说明,因为担心会意外泄漏有关 Windows 8 的信息让自己陷入麻烦之中!这给创新造成了一个糟糕的环境,对于我们开放 C# 编译器的愿望来说,这当然不是什么好兆头。

最终,在 Windows 8 步入正轨之后,微软开始转型并找到了新的方向。它的核心理念变得与原来完全不一样了,也就是我们今天所知道的微软。开源运动现在开始在微软内部占据一席之地。

F# 已于 2010 年发布,基于开源许可,并提供了自己的基础——F# Software Foundation。围绕它而成长起来的一个充满活力的社区让我们所有人都感到羡慕。我们的团队强烈要求为 Roslyn 提供开源许可,最后,在公司范围的出现了一个致力于实现这一目标的基础设施。

2012 年,微软成立了 Microsoft Open Tech,一个专门关注开源项目的组织。Roslyn 转到了 Microsoft Open Tech 之下,并正式成为开源软件。Roslyn 是一个非常适合开源的候选项目:开发者都是内部有名的开发者,而且项目本身很独立,没有太多的依赖,不太有可能造成许可冲突。

2014 年 4 月,在旧金山举行的微软“Build”开发者大会上,Anders Hejlsberg 将 Roslyn 作为开源项目进行展示,并于 4 月 3 日基于 Apache 2.0 许可发布在了 CodePlex(微软之前的开源托管平台)上。

与此同时,.NET Foundation 成为包括 Roslyn 在内的.NET 项目的家。

开放为微软带来了是一股清新的空气!在我们开始从 CodePlex 的开放性中获得好处的同时,微软也理顺了其余的开源障碍。今天,开源已经成为我们团队工作的一个直接且不可或缺的部分。

此外,在其他方面,微软意识到我们不需要控制一切。很明显,我们可能不需要 CodePlex 了,Roslyn 加入到了从 CodePlex 迁移到 GitHub 的项目行列,GitHub 是当时事实上的开源之家。不仅仅是源代码,就连构建过程都搬到了 GitHub 上:它不只是个发布代码的地方,我们把它当成工作的地方。

C# 语言设计和编译器实现的流程现在是完全开放的,有很多微软以外的实体或个人参与,包括由外部贡献者构建的全语言功能。C# 的价值是巨大的,不仅仅在于通过添加新功能和错误修复来发展项目,还包括我们通过开源提供的即时反馈闭环来获得见解和发展路线修正。

这是一段漫长而疯狂的旅程,在我看来,这是微软在过去十年中所经历的一个巨大的变化。Roslyn 从至暗时刻走出来,开放思想让它茁壮成长,并通过开源的力量演化成了现在这种具有广泛用途的项目。

Roslyn 和 C# 语言设计相关资源:

https://github.com/dotnet/roslyn

https://github.com/dotnet/csharplang

查看英文原文:https://medium.com/microsoft-open-source-stories/how-microsoft-rewrote-its-c-compiler-in-c-and-made-it-open-source-4ebed5646f98

原文地址:https://www.infoq.cn/article/O9Gb9hGfpR2yEX_T2zto

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

微软是如何使用 C# 重写 C# 编译器并将其开源的相关推荐

  1. 微软是如何使用C#重写C#编译器并将其开源的

    Roslyn是C#和Visual Basic.NET开源编译器的代号.这篇文章将介绍它是如何从微软过去的十年至暗时刻走出来,成为开源跨平台的C#和VB公共语言引擎. 我于2005年加入微软,也就是在 ...

  2. 微软向Linux社区开放60000多项专利:对开源微软是认真的

    10月10日,微软在博客中宣布正式加入开放创新网络(Open Invention Network, 简称"OIN"),向所有开源专利联盟的成员开放其专利组合. \\ 微软的加入意味 ...

  3. 华为开源平台harmonyos,华为开源平台上线 方舟编译器和鸿蒙系统开源

    原标题:华为开源平台上线 方舟编译器和鸿蒙系统开源 8月31日凌晨华为开源平台网站HUAWEI OpenSource(https://code.opensource.huaweicloud.com/e ...

  4. 微软rdp服务器,微软远程桌面 UWP 版本重写:使用 RDP 引擎,支持 ARM64

    据 Windowscentral 报道,Microsoft 已发布 Windows 10 远程桌面应用的 UWP 版本的重大更新. IT之家了解到,Microsoft 完全重写了客户端,使其使用与 i ...

  5. 黑客声称盗取微软GitHub账号500GB数据,网友:这些最终都会开源的

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 十三 发自 凹非寺 量子位 报道 | 公众号 QbitAI 最近被黑客攻击.数据泄露的 ...

  6. 微软 Azure 再下一城:收购 Kinvolk,改进开源 Linux

    微软正在以实际证明,做开源,他们是认真的.如今依靠开源,Azure 也再下一城. 整理 | 苏宓 出品 | CSDN(ID:CSDNnews) 4 月 29 日,微软宣布收购专注于构建和改进开源 Li ...

  7. 逃离被微软支配的恐惧,.NET开发者们Fork了一个开源分支

    编译 | 核子可乐.刘志勇 策划 | Tina "不用担心微软讨厌谁,或者本周有什么语言或框架被宣布死亡.相反,要拥抱进步,积极自我提高." 一个月前,微软从.NET 6 中悄悄删 ...

  8. 方舟编译器编译linux,华为开源方舟编译器,相关源码已开放下载?

    2019华为全球开发者大会将在8月9日-11日在华为松山湖基地召开.本次开发者大会邀请了1500位合作伙伴.5000名全球开发者,将是华为历来规模最大的一次会议.根据此前海报,方舟编译器将成为2019 ...

  9. 用C#写C#编译器,先有鸡还是先有蛋

    前段时间翻译的一篇文章 微软是如何重写C#编译器并使它开源的,文章讲了微软用C#重写C#编译器的坎坷路,引发了一些童鞋的思考:用C#编写C#编译器(Roslyn),那么C#编译器本身是由谁来编译的?C ...

最新文章

  1. mybatis 报错最终解决 :argument type mismatch
  2. Spring编程式和声明式事务实例讲解
  3. Le Chapitre VI
  4. 「12306奇葩验证码」反例背后的产品观
  5. 某计算机型号,某计算机的型号为486/33,其中33的含义是?
  6. 文献学习(part15)--Subspace Clustering via Good Neighbors
  7. ios android分享代码,快速插入代码块——iOS Android
  8. kernel---1
  9. python上的表白代码_用Python实现表白代码
  10. 单实例安装elastic和启动报错解决
  11. svn上文件符号的意思
  12. 2020年第三季度的垃圾邮件和网络钓鱼攻击分析
  13. android 手机 otg,对于安卓智能手机的OTG功能,你了解多少
  14. 数字抽奖小程序_2019年国庆节图书馆开放安排(附抽奖小程序)
  15. 1688获得店铺的所有商品教程
  16. 永磁同步电机弱磁控制建模仿真
  17. 谷粒商城--订单服务--高级篇笔记十一
  18. 让DIV内部内容撑开外层的div方法
  19. Vue双向绑定是怎么实现的?
  20. 酷比魔方 iwork10 旗舰版

热门文章

  1. 正则表达式 学习笔记4.3
  2. 总结之前做项目中要注意的一些书写规范
  3. 如何使用Instruments诊断App(Swift版):起步
  4. php如何读出xml的节点内容 两个例子
  5. AdonisUI - 用于 WPF 应用程序的轻量级 UI 工具包,提供经典但增强的 Windows 视觉效果...
  6. C# 运算符的优先级和关联性
  7. 如何在 Dapper.NET 中使用事务?
  8. 如何在不安装 Microsoft Office 的情况下生成 Excel 文件?
  9. 使用 ML.NET 进行保险价格预测
  10. 记一次 .NET 医院CIS系统 内存溢出分析