微软是如何重写C#编译器并使它开源的
译者:王亮
作者:Mads Torgersen (C# Language PM at Microsoft)
原文:http://t.cn/EPOG96O
译者的一些话:
看了大家的评论,有园友说我翻译的不好,这我是认同的。我必须得承认,我翻译的确实很生硬,这点我自己也能很明显得感觉得到。以前没有翻译过文章,这个国庆期间翻译了几篇,发现还是挺吃力的,容易理解的英文句子组合成中文总觉得别扭,我的经验和水平还有待很大的提高。非常真诚地感谢大家给出的反馈,这是对我最好的鞭策,以后一定努力给大家带来优质的内容。

Roslyn 是 C# 和 Visual Basic.NET 的开源编译器的代号。以下是它如何在过去十年微软公司最暗淡的环境中开始,并成为开源、跨平台、公共语言引擎的,这一切都是为了 C#(和 VB,下文同)。
当我在 2005 年加入微软的时候,第一次谈话就开始讨论了关于 Roslyn 将来会是什么样子——那时还是 .NET 2.0 发布之前。那次谈话是关于用 C# 重写 C#。这是编程语言的一种常规做法,是语言成熟一个标志证明。但是还有一个更实际和重要的动机:我们作为 C# 的创造者并不是用 C# 编程,而是用 C++ 编程!每天用 C# 工作让你对 C# 有不同的看法:这是“dogfooding”的力量。(译注:dogfooding 是内部试用或内部测试的意思。)
客户依赖新编译器的行为与旧编译器将完全相同。为 C# 编写新的编译器意味着尝试 bug-for-bug 地适配旧的编译器 。
重写客户多年来一直掌握的编译器的挑战在于,这些客户对新编译器的依赖行为与旧编译器完全相同。为 C# 编写新的编译器意味着尝试 bug-for-bug 地匹配旧的编译器。我说的不只是已知的 Bug,而是那些开发人员发现并开始依赖的未知和无意的行为,这些行为常常是在不知不觉中发生的。
多年来,这一挑战的巨大规模甚至阻止了我们开始这个项目。
另外,虽然使用 C# 编写的新 C# 编译器在语言团队内部会有很多好处,但对客户的价值主张更具挑战性:新的编译器如何帮助现有客户?也许唯一关心用 C# 编写 C# 的人是编译器团队的成员。
与此同时,另一个问题却越来越大:基于 C# 代码工作的不同工具之间的重复劳动。除了编译器,我们的隔壁团队还在 Visual Studio 中构建对 C# 的 IDE 支持,他们也需要编写大量的代码(当时也是用 C++ 编写的)来理解 C# 语法和语义。
除此之外,还有越来越多的来自微软和其他公司的工具,如 StyleCop, CodeRush 等,所有这些工具都必须从简单的 C#源码文本开始实现有意义的基于代码的工具。所有这些都有微妙和不同的 Bug,不同的理解层次,不同的妥协和权衡。所有的一切都将花费大量的精力来重新开始:理解代码。
到这,最后是我们的价值主张:只需世界上有一个理解 C# 的代码库,每个想在代码之上构建工具的人都可以共享它!
到这,最后是我们的价值主张:只需世界上有一个理解 C# 的代码库,每个想在代码之上构建工具的人都可以共享它!客户的价值将来自于可用工具的增加,特别是现有工具的质量。我们将把所有的语言正确性和性能需求都放在一个代码库上,并花费一次精力使其具有一流的质量和广泛的通用性。我们将建立一个语言引擎!C# 代码的统一公共 API:我们将重新定义“编译器”的含义。
当然,一旦你为庞大的 C# 社区构建了一个 API,那么它应该是一个用 C# 中实现的 .NET API,这是一种 slam-dunk(译注:指有大回报的行为)。因此,用 C# 中实现“启动”C#的旧梦想几乎只是一个偶然的附带好处。
Roslyn 诞生于一种开放的思想:共享 C# 的内部工作机制,让世界以编程的方式消费。这本身就是一个大胆的步骤,在这个仍然普遍封闭的文化中。
Roslyn 诞生于一种开放的思想:共享 C# 的内部工作机制,让世界以编程的方式消费。这本身就是一个大胆的步骤,在微软这个仍然普遍封闭的文化中:我们会免费分享这些知识产权吗?我们会授权那些不所于我们的工具制造商更好地与我们竞争?
关于加强生态系统和成为地球上最好的工具语言的辩论使我们赢得了今天成就。它们关注的是 C# 和 .NET 的长期增长,而不是微软的短期盈利和资产保护。因此,即使没有提到开源,注册 Roslyn 项目的成本和风险对微软来说也是一个巨大而大胆的步骤。
当然,你不能只做这样的东西。Roslyn 的设想雄心勃勃,也充满了技术挑战,我们花了五年时间才实现,但这是后面的故事。
自从 2009 年正式开始这个项目以来,我们就有了让编译器开源的想法,但是微软还没有准备好。
在我们构建初始版本的大部分时间里,Roslyn 仍然是一个闭源项目。自从 2009 年正式开始这个项目以来,我们就有了让编译器开源的想法,但是微软还没有准备好。在你的原始代码周围进行私有开发和申请专利的文化代表了微软自 20 世纪 70 年代以来的工作方式——尽管变化正在发生,但它发生的速度比我们团队希望的要慢。
事实上,有一段时间,公司似乎在朝着完全相反的方向发展。
Windows 8 项目基本上占据了整个公司。凭借其新的编程模型,它的触角深入到开发工具和语言团队,所有事情都笼罩在极度机密之中,不仅是对外部,甚至也对公司内部亦是如此。例如,我们当时正在开发的 async 特性与 Windows 8 编程模型是协调的,我甚至不敢在内部发布它的设计说明,因为我害怕不小心泄露了 Windows 8 的信息,这会给我带来麻烦!这为创新创造了一种可怕的氛围,这显然对我们开源 C# 编译器的希望来说并不是一个好兆头。
最终,在 Windows 8 运行完毕后,微软开始转型,找到了新的方向,朝着新的领导班子和非常不同的核心理念前进:我们今天所知道的微软。开源运动现在迅速在微软内部生根发芽。
F# 已于 2010 年发布,拥有开源许可和自己的基金会——F# 软件基金会。在它周围成长起来的充满活力的社区很快成为我们大家羡慕的对象。我们的团队大力推动为 Roslyn 提供开源生产许可证,以至最终在公司范围内的基础设施得以实现。
到 2012 年,微软创建了 Microsoft Open Tech:专门关注开源项目的组织。Roslyn 在微软开放技术公司的领导下,正式成为开源软件。开源是它的一个强有力的候选:开发资源都是内部的和众所周知的,并且项目本身独立存在,没有多少可能产生许可冲突的依赖关系。
2014 年 4 月,在旧金山举行的微软开发者构建大会上,Anders Hejlsberg 展示了 Roslyn 是一个开源项目,而 Roslyn 是在 Apache 2.0 许可下通过 CodePlex(已经退役的微软开源托管平台)发布的。

与此同时,.NET 基金会被宣布为 .NET 项目的大本营,包括 Roslyn。
开源是一股清新的空气!尽管我们已经开始从 CodePlex 上获得开源的好处,但微软仍然存在一些程序上的开放源码障碍。今天,开放源码是我们在团队中工作的一个直接而完整的部分。
我们不再把 GitHub 当作一个出版场所——它只是我们工作的地方。
另外在其他方面,公司确实意识到我们不需要控制一切。很明显,CodePlex 出现在世界上并没有什么好的理由,Roslyn 加入了其他的项目,从 CodePlex 迁移到 GitHub,那时它实际上就是开源项目的大本营。不仅源代码,而且构建它的过程也都在 GitHub 上:我们不把它当作发布场所——它只是我们工作的地方。

C# 语言设计和编译器实现过程现在是完全开放,有很多非微软的人参与,包括外部贡献者构建的整个语言特性。C# 的价值与日俱增,不仅体现在功能和 Bug 修复的贡献,更体现在我们通过开放源码提供的即时、每日循环反馈所获得的洞察和过程的改进。
这是一个漫长而疯狂的旅程,对我来说,这是微软在过去十年经历的巨大变化的象征。Roslyn 的“金块”是在黑暗中诞生的,它是在开放思想的基础上发展起来的,如今通过开放源码的力量,它已经有了上百万种不同的用途。
你想亲自探索 Roslyn,或致力于 C# 语言设计吗?请访问:
https://github.com/dotnet/roslyn
https://github.com/dotnet/csharplang
微软是如何重写C#编译器并使它开源的的更多相关文章
- 修改ZuulHandlerMapping私有变量pathMatcher,重写match方法,使url匹配兼容正则表达式。
一.起源 在mocksever中引入了spring cloud zuul做代理转发,如果请求的url和配置的mock规则匹配(精确匹配和模糊匹配),忽略,不做转发.如果mock配置的url和请求url ...
- 微软阵营企稳的利好消息:.NET开源、Visual Studio免费
今天各个IT社区,头版头条说的是微软.NET开源了.宇宙中最好的IED–Visual Studio Community 2013将免费提供给用户的消息. <宇宙中最强大的开发环境免费了!> ...
- 用 C# 编写 C# 编译器,先有鸡还是先有蛋?
前段时间翻译了一篇文章 微软是如何重写 C# 编译器并使它开源的,文章讲了微软用 C# 重写 C# 编译器的坎坷路,引发了一些童鞋的思考:用 C# 编写 C# 编译器(Roslyn),那么 C# 编译 ...
- 倍福TwinCAT(贝福Beckhoff)应用教程13.3 TwinCAT控制松下伺服 NC配合完整上位
这是TwinCAT教程的最后一节,简单讲述了以C#为上位,通过ADS控制TwinCAT下位,实现完整控制两轴模组的功能.可以发现,在上位层已经没有了运动控制的代码,不管是要执行哪种运动,无非是把目标参 ...
- GCC编译器ABI
ABI与EABI 1)ABI(Application Binary Interface for the ARM Architecture),描述了应用程序与cpu内核的低级接口. ABI允许编译好的目 ...
- TypeScript之父:JS不是竞争对手,曾在惧怕开源的微软文化中艰难求生
开源的 TypeScript 也曾在微软内部遭到抵制,但如今 TypeScript 已经成为 Web 应用构建的主流语言. 微软的开源编程语言 TypeScript 是 JavaScript 的一 ...
- 转:GCC,LLVM,Clang编译器对比
GCC,LLVM,Clang编译器对比 转自: http://www.cnblogs.com/qoakzmxncb/archive/2013/04/18/3029105.html 在XCode中, ...
- Matlab2014a 提示未找到支持的编译器或 SDK的解决方法
最近在写论文,用到了matlab版本的libsvm,在混合编译的时候遇到的一点小问题. 我电脑上装的是matlab2014a,window7 64位 >> mbuild -setup 错误 ...
- url重写后发布出错问题
iis7 配置urlrewriter重写失效的问题 在IIS7下,如果使用微软的 URLRewriter 重写控件则需要在WEB.CONFIG中配置以下信息 第一个配置: <configSect ...
随机推荐
- Mybatis sql映射文件浅析 Mybatis简介(三)
简介 除了配置相关之外,另一个核心就是SQL映射,MyBatis 的真正强大也在于它的映射语句. Mybatis创建了一套规则以XML为载体映射SQL 之前提到过,各项配置信息将Mybatis应用的整 ...
- -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal
java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型 也就是 ...
- webpack4.0各个击破(9)—— karma篇
webpack作为前端最火的构建工具,是前端自动化工具链最重要的部分,使用门槛较高.本系列是笔者自己的学习记录,比较基础,希望通过问题 + 解决方式的模式,以前端构建中遇到的具体需求为出发点,学习we ...
- arcgis 10.0中的server报错说工作站服务没有打开
大家好! 写这篇文章其实我也不知道该不该写,感觉问题其实也不是自己解决的,但是这个问题困恼了我2天,我还将arcgis10.0重装了一次. 下面也不多说了,主要是由于公司的需求,将自己的arcgis1 ...
- C#图片裁切,生成新图片
/// 图片裁剪,生成新图,保存在同一目录下,名字加_new,格式1.png 新图1_new.png /// </summary> /// <param name="pic ...
- php 爬虫框架
发现两款不错的爬虫框架,极力推荐下: phpspider 一款优秀的PHP开发蜘蛛爬虫 官方下载地址:https://github.com/owner888/phpspider 官方开发手册:http ...
- spring-boot的spring-cache中的扩展redis缓存的ttl和key名
原文地址:spring-boot的spring-cache中的扩展redis缓存的ttl和key名 前提 spring-cache大家都用过,其中使用redis-cache大家也用过,至于如何使用怎么 ...
- 转载:Linux服务器Cache占用过多内存导致系统内存不足最终java应用程序崩溃解决方案
原文链接: https://blog.csdn.net/u014740338/article/details/66975550 问题描述 Linux内存使用量超过阈值,使得Java应用程序无可用内存, ...
- 总结:web 发展的4个阶段
一.概述 随着人们的需求发展,web技术的发展也经历了多个阶段,下一个阶段总是伴随着解决上一阶段的问题,从静态文本.动态执行.动态自动生成文本,web应用,到web2.0,本文就详细描述这些阶段的特征 ...
- HttpWebRequest 改为 HttpClient 踩坑记-请求头设置
HttpWebRequest 改为 HttpClient 踩坑记-请求头设置 Intro 这两天改了一个项目,原来的项目是.net framework 项目,里面处理 HTTP 请求使用的是 WebR ...