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

640?wx_fmt=png

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(微软之前的开源托管平台)上。

640?wx_fmt=jpeg

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

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

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

640?wx_fmt=jpeg

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
640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317388.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P3332 [ZJOI2013]K大数查询(整体二分做法)

P3332 [ZJOI2013]K大数查询 题意: 题解: 利用整体二分来做,这个题和P3834 【模板】可持久化线段树 2的区别在于本题的修改是区间修改,所以将里面的树状数组改成线段树就行,区间修改区间查询 但是不知道为什么我调了一阵子也不对…

[APIO2020]交换城市(交互+kruskal重构树)

[APIO2020]交换城市 description solution 如果u,vu,vu,v存在于一条链上(只有两个点度数为111其余点度数为222)则无解,否则必有解 如图,不管是哪个点度数>2>2>2,都可以有解 以蓝色为例,第二个…

P3320:寻宝游戏(生成树)

解析 大结论题… 实在是不知道这题和虚树有半毛钱关系吗… 引理 给出一个按照dfs排列的点集S{a1,a2…ak} 它们的极小联通子树的边权和的二倍等于∑dis(a1,a2)dis(a2,a3)...dis(ak−1,ak)dis(ak,a1)\sum dis(a_1,a_2)dis(a_2,a_3)...dis(a_k-1,a_k)dis(a_k,a_1)∑dis(a1​,a2​…

P5333-[JSOI2019]神经网络【dp,容斥】

正题 题目链接:https://www.luogu.com.cn/problem/P5333 题目大意 给出nnn棵树,第iii棵树有kik_iki​个点,每棵树上的每个点和其它树上的所有点都有连边。 求这棵树有多少条哈密顿回路。 答案对998244353998244353998244353取模。 ∑i1nki≤5000\sum…

如何在ASP.NET Core程序启动时运行异步任务(1)

原文:Running async tasks on app startup in ASP.NET Core (Part 1)作者:Andrew Lock译者:Lamond Lu背景当我们做项目的时候,有时候希望自己的ASP.NET Core应用在启动前执行一些初始化逻辑。例如,你希望验证配置是否合…

扫描线讲解

参考文章: 线段树扫描线(有关扫描线的理解) 线段树扫描线(基本原理) 扫描线 第二个文章里面的图很生动: 我总结一下就是:将所给图形的横坐标全部记录,纵坐标记录为扫描线 然后对与…

P5400-[CTS2019]随机立方体【二项式反演,计数】

正题 题目链接:https://www.luogu.com.cn/problem/P5400 题目大意 有一个nmln\times m\times lnml的三维网格,要在每个格子处填上一个数,要求填的数中1∼nml1\sim n\times m\times l1∼nml都恰好出现了一次。 一个极大值被定义为这个格子比其他与它至…

「CEOI2019」魔法树(DP+差分启发式合并)

「CEOI2019」魔法树 description solution 设dpi,j:idp_{i,j}:idpi,j​:i子树在jjj时刻的最大果汁量,显然dpi,jdp_{i,j}dpi,j​在jjj是单调递增的 dpi,jmax⁡(dpi,j,dpi,j−1)dp_{i,j}\max(dp_{i,j},dp_{i,j-1})dpi,j​max(dpi,j​,dpi,j−1​) iii不收获 dpi,j∑…

梁迪:我为MVP骄傲,《微软最有价值专家奖励计划介绍》附专题视频

题记:有些事情,比 MVP 更加不朽,浩气长空,日月星汉,我们为 MVP 和那些心目中的“MVP”感到骄傲。微软 MVP 是一种追求,不必要去强求,但 MVP 必定是俱乐部发展的根基础。火车跑得快全凭车头带&am…

CF1472(div3):总结

文章目录前言A. Cards for Friends题意简述解析代码B. Fair Division题意简述解析代码C. Long Jumps题意简述解析代码D. Even-Odd Game题意简述解析代码E. Correct Placement题意简述解析代码F. New Years Puzzle题意简述解析代码G. Moving to the Capital题意简述解析代码前言…

How Much Memory Your Code Is Using? Gym - 101955J

How Much Memory Your Code Is Using? Gym - 101955J 题意: t组数据,每组数据会有n个定义类型的方式,给你每个类型所占字节,问一共占了多少字节,最终答案按照Kibibyte单位输出,并向上取整 题解&#xf…

P3295 [SCOI2016]萌萌哒(DP+倍增)

P3295 [SCOI2016]萌萌哒 description solution 强制部分区间相同,很容易就想到了并查集,直接暴力并查集合并是O(n2)O(n^2)O(n2)的 只需要考虑那一个数据结构将其转化成O(nlog⁡n)O(n\log n)O(nlogn)的 树之类的就不考虑了,一段一段的区间…

CF1677D-Tokitsukaze and Permutations【结论】

正题 题目链接:https://www.luogu.com.cn/problem/CF1677D 题目大意 对于一个排列pip_ipi​,定义一个序列vF(p)vF(p)vF(p),其中vi∑j1i−1[pj>pi]v_i\sum_{j1}^{i-1}[p_j>p_i]vi​∑j1i−1​[pj​>pi​]。 一次冒泡排序为依次对1∼n−11\sim…

【恭贺新春】2019年春节放假

2019年放假通知致全体微友: 2019年2月5日(正月初一)至2月8日(正月初四)春节放假,共4天,小编停止更新公众号信息。敬请相互转告。值此新春佳节到来之际,“dotNet跨平台”给大家拜个…

模板:圆方树

所谓圆方树,就是又圆又方的树 (逃) 前言 树有很多良好的性质,也可以上许多算法和数据结构 但我们对于一般图却没有太多办法… 然而,对于有些关注连同性、路径并&交的一般图问题,我们可以用圆方树&…

C - Insertion Sort Gym - 101955C

C - Insertion Sort Gym - 101955C 题意: t组数据,每组数据给你n,k,q,让你求存在多少合法的1~n排列 合法要求: 对排列的前k项进行排序,使得整个序列中最长的递增子序列长度为n-1 题解&#x…

P8330-[ZJOI2022]众数【根号分治】

正题 题目链接:https://www.luogu.com.cn/problem/P8330 题目大意 给出一个长度为nnn的序列aaa,你可以选择其中一个区间将其加上任意整数,要求这个序列的众数出现次数最多。 输出最多次数和可能的众数。 1≤n≤2105,1≤ai≤109,∑n≤51051\leq n\leq …

华为云.NET Core支持情况调查

各大公有云都提供了开发者开发的SDK,今天我们来看看华为云对.NET Core的支持情况怎么样? .NET SDK地址 https://developer.huaweicloud.com/sdk#.NET华为云的.NET SDK相比其他语言少的可伶,而且这几个SDK还不支持.NET Core。SDK的支持实在太差…

[2021-07-19 内测NOIP] 操作(状压DP),异或(字典树),等级(线段树),矩阵(DP)

[2021-07-19 内测] NOIP操作descriptionsolutioncode异或descriptionsolutioncode等级descriptionsolutioncode矩阵descriptionsolutioncode操作 description 有n堆石子,每堆石子都有一定的数量,第i堆石子的数量用Ai表示。 任意两堆石子均可合并&…

codeforces:1361(div1)1362(div2):总结

文章目录前言1362-A. Johnny and Ancient Computer解析1362-B - Johnny and His Hobbies解析1362-C - Johnny and Another Rating Drop解析1361-A Johnny and Contribution解析1361-B - Johnny and Grandmaster解析1361-C - Johnny and Megans Necklace解析1361-D - Johnny and…