热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

.net编译工具_微软是如何重写C#编译器并使它开源的

译者:王亮作者:MadsTorgersen原文:http:t.cnEPOG96ORoslyn是C#和VisualBasic.NET的开源编

译者:王亮
作者:Mads Torgersen
原文: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(已经退役的微软开源托管平台)发布的。

6e5614c9a4315d52b8fe0e095f0cd475.png

与此同时,.NET 基金会被宣布为 .NET 项目的大本营,包括 Roslyn。

开源 是一股清新的空气!尽管我们已经开始从 CodePlex 上获得开源的好处,但微软仍然存在一些程序上的开放源码障碍。今天,开放源码是我们在团队中工作的一个直接而完整的部分。

我们不再把 GitHub 当作一个出版场所——它只是我们工作的地方。

另外在其他方面,公司确实意识到我们不需要控制一切。很明显,CodePlex 出现在世界上并没有什么好的理由,Roslyn 加入了其他的项目,从 CodePlex 迁移到 GitHub,那时它实际上就是开源项目的大本营。不仅源代码,而且构建它的过程也都在 GitHub 上:我们不把它当作发布场所——它只是我们工作的地方。

6405a4af838858febe54bfe8a56f0d95.png

C# 语言设计和编译器实现过程现在是完全开放,有很多非微软的人参与,包括外部贡献者构建的整个语言特性。C# 的价值与日具增,不仅体现在功能和 Bug 修复的贡献,更体现在我们通过开放源码提供的即时、每日循环反馈所获得的洞察和过程的改进。

这是一个漫长而疯狂的旅程,对我来说,这是微软在过去十年经历的巨大变化的象征。Roslyn 的“金块”是在黑暗中诞生的,它是在开放思想的基础上发展起来的,如今通过开放源码的力量,它已经有了上百万种不同的用途。

你想亲自探索 Roslyn,或致力于 C# 语言设计吗?请访问:

https://github.com/dotnet/roslyn
https://github.com/dotnet/csharplang




推荐阅读
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • Carve库在Visual Studio2015中的编译方法及注意事项
    本文介绍了在Visual Studio2015中编译Carve库的方法及注意事项。首先下载Carve库,并使用Visual Studio2015打开,生成后在bin目录下会生成.lib文件。同时,本文还指出了之前在Visual Studio2017中编译的问题,并提醒需要根据对应的平台进行编译,否则会出现报错。详细的步骤和注意事项请参考原文链接。 ... [详细]
author-avatar
无与伦比的美丽MJ
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有