【C#】微软的Roslyn 是个啥?

一、说明

        Roslyn 是微软重写的C#编译器并开源。

        Roslyn 是 C# 和 Visual Basic.NET 开源编译器的代号。以下是它如何在过去十年企业Microsoft的最黑暗中开始,并成为所有C#(和VB)的开源,跨平台,公共语言引擎,我将在本文的其余部分将其视为给定的)。

二、Roslyn的历史渊源

        当 在 2005 年加入 Microsoft 时,关于什么将成为 Roslyn 的第一次对话已经在进行中 — 就在 .NET 2.0 发布之前。那次谈话是关于用 C# 重写 C#。这是编程语言的正常做法;语言成熟的证明。但还有一个更实际和更重要的动机:作为 C# 的创建者,我们自己不是用 C# 编程,而是用C++编码!每天使用 C# 会让你对 C# 有不同的看法:这是“狗食”的力量。

客户将依赖于新编译器的行为方式与旧编译器完全相同。为 C# 编写新的编译器意味着尝试逐个错误地匹配旧的编译器。

        重写已经掌握在客户手中多年的编译器的挑战在于,这些客户将依赖于新编译器的行为方式与旧编译器完全相同。为 C# 编写新的编译器意味着尝试逐个错误地匹配旧的编译器。我说的不仅仅是已知的错误,还有开发人员发现并依赖的那些未知和意外的行为,通常是在不知不觉中。

        多年来,这一挑战的艰巨性使我们甚至无法开始这个项目。

        此外,虽然语言团队内部对用 C# 编写的新 C# 编译器有很多好处,但对客户的价值主张更具挑战性:新编译器将如何帮助现有客户?也许唯一关心 C# 是用 C# 编写的人是编译器团队的成员。

        在但与此同时,另一个问题越来越大:处理 C# 代码的不同工具之间的重复工作。除了编译器之外,我们的姊妹团队还在Visual Studio中构建对C#的IDE支持,他们还必须编写大量代码(当时也是C++)来理解C#语法和语义。

        除此之外,来自Microsoft和其他工具(如StyleCop,CodeRush等)的越来越多的工具都必须从平面C#源文本开始实现有意义的基于代码的工具。所有这些都会有微妙不同的错误,不同的理解水平,不同的妥协和权衡。所有这些都会花费大量的精力来达到原点:理解代码。

最后,我们的价值主张是:使世界上只需要有一个理解 C# 的代码库,每个想要在代码上构建工具的人都可以共享!

        最后,我们的价值主张是:使世界上只需要有一个理解 C# 的代码库,每个想要在代码上构建工具的人都可以共享!客户价值将来自可用工具的增加,特别是现有工具的质量。我们将把所有语言的正确性和性能要求放在一个代码库上,并花费一次精力来使其具有出色的质量和巨大的多功能性。我们将构建一个语言引擎!一个统一的、公共的 API 到 C# 代码:我们将重新定义“编译器”的含义。

        当然,一旦你为广泛的C#社区构建了一个API,它应该是一个.NET API,用C#实现,这有点麻烦。因此,在 C# 中“引导”C# 的旧梦想几乎是一个偶然的附带好处。

因此,Roslyn 诞生于一种开放的心态:共享 C# 的内部工作原理,供全世界以编程方式使用。这本身就是在仍然普遍封闭的文化中迈出的大胆一步。

        R因此,oslyn 诞生于一种开放的心态:共享 C# 语言的内部工作原理,供全世界以编程方式使用。这本身就是一个大胆的主张,在当时仍然普遍封闭的文化中Microsoft:我们会免费分享这些知识产权吗?我们会授权不是我们的工具制造商更好地与我们竞争吗?

        在这里为我们赢得胜利的论点是关于加强生态系统并成为地球上最好的工具语言。它们是关于 C# 和 .NET 的长期增长,而不是短期货币化和Microsoft资产保护。因此,即使没有提到开源,签署Roslyn项目的成本和风险对Microsoft来说也是一大而大胆的一步。

        当然,你不只是构建这样的东西。Roslyn 的愿景雄心勃勃,也充满了技术挑战,我们花了五年时间才实现它。但那是另一天的故事了。

自从该项目在2009年认真启动以来,我们就有使我们的编译器开源的愿景,但Microsoft还没有准备好。

        F或者大多数时候我们在构建初始版本,Roslyn 仍然是一个闭源项目。自从该项目在2009年认真启动以来,我们就有使我们的编译器开源的愿景,但Microsoft还没有准备好。私下开发和围绕原始代码申请专利的文化代表了Microsoft自 1970 年代以来的工作方式——虽然变化正在酝酿之中,但它的发生速度比我们团队希望的要慢。

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

        Windows 8项目几乎接管了整个公司。凭借其新的编程模型,它的触角深入到开发人员工具和语言团队中,一切都被极端保密,不仅对外部,甚至在公司内部。举个例子,我们当时开发的异步功能是与 Windows 8 编程模型协调和纠缠在一起的,我甚至不敢在内部发布它的设计笔记,生怕不小心泄露了有关 Windows 8 的信息,给自己惹上麻烦!这为创新创造了一个可怕的气候,对于我们开源C#编译器的希望来说,这当然不是好兆头。

        E然而,在Windows 8运行完之后,该公司开始转型并找到了新的方向,走向新的领导层和截然不同的核心理念;我们今天所知道Microsoft。开源运动现在迅速开始在Microsoft内部扎根。

        F# 已于 2010 年发布,具有开源许可证和自己的基金会 - F# 软件基金会。围绕它成长的充满活力的社区很快成为我们所有人羡慕的对象。我们的团队大力推动 Roslyn 获得开源生产许可证,最终出现了全公司范围的基础设施,使之成为现实。

        到2012年,Microsoft创建了Microsoft开放技术;一个专注于开源项目的组织。Roslyn 转到Microsoft开放技术公司,并正式成为开源。它是一个很好的候选者:开发资源都是内部的和众所周知的,项目本身是独立的,没有很多可能造成许可冲突的依赖关系。

三、Roslyn横空问世

        2014 年 3 月,在旧金山举行的 Microsoft “Build”开发者活动中,Anders Hejlsberg 展示了 Roslyn 作为一个开源项目,Roslyn 于 2 月 0 日通过 CodePlex(Microsoft 年退役的开源托管平台)在 Apache <>.<> 许可下发布。

        Project Roslyn in CodePlex under Microsoft Open Tech

        与此同时,.NET Foundation被宣布为包括Roslyn在内的.NET项目的所在地。

        在户外呼吸着新鲜空气!即使我们开始从 CodePlex 的开放性中获益,Microsoft剩下的程序开源障碍也得到了理顺,今天开源是我们在许多团队中工作方式中直接且不可或缺的一部分。

我们不再将 GitHub 视为发布场所——它只是我们工作的地方。

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

        罗斯林今天在 GitHub 上

        C# 语言设计和编译器实现现在是完全开放的流程,有很多非Microsoft参与,包括由外部贡献者构建的整个语言功能。C# 的价值在于屋顶,不仅通过贡献功能和错误修复来扩展工作量,还通过开源提供的即时每日反馈循环获得的洞察力和课程更正。

        这是一段漫长而狂野的旅程,对我来说,这象征着Microsoft在过去十年中经历的巨大变化。Roslyn的掘金始于黑暗,在开放的想法上成长,并通过开源的力量在今天爆发出一百万种不同的用途。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

el-upload上传图片和视频,支持预览和删除

话不多说&#xff0c; 直接上代码&#xff1a; 视图层&#xff1a; <div class"contentDetail"><div class"contentItem"><div style"margin-top:5px;" class"label csAttachment">客服上传图片:</div><el…

教育新花样?看智慧教育如何出“花样”

智慧教育是物联化、智能化、感知化、泛在化的新型教育形态和教育模式。数字孪生可视化作为智慧教育的应用之一&#xff0c;优化了教育发展形态。本文以智慧教育浙江大学项目为例&#xff0c;介绍智慧教育的具体应用场景。 一、项目背景 &#xff08;一&#xff09;政策背景 …

springboot自动装配

SPI spi &#xff1a; service provider interface &#xff1a; 是java的一种服务提供机制&#xff0c;spi 允许开发者在不修改代码的情况下&#xff0c;为某个接口提供实现类&#xff0c;来扩展应用程序 将实现类独立到配置文件中&#xff0c;通过配置文件控制导入&#xff…

基于Ko-time的Springboot单体化调用链追踪实践

目录 前言 一、关于Ko-Time 1、是什么&#xff1f; 2、ko-time更新时间线 二、Ko-time怎么用&#xff1f; 1、依赖引入 2、配置集成 3、权限放行 三、链路追踪 1、系统运行 2、链路追踪 3、长时间调用模拟 总结 前言 熟悉微服务的老司机一定了解&#xff0c;在微服务模…

【C++】特殊类的设计 | 类型转换

文章目录 1. 特殊类的设计单例模式饿汉模式具体代码 懒汉模式具体代码 懒汉模式和饿汉模式的优缺点 2. C的类型转换C语言的类型转换C的类型转换static_castreinterpret_castconst_castdynamic_cast 1. 特殊类的设计 单例模式 设计模式是 被反复使用 多数人知晓 经过分类的、代…

React之生命周期

React之生命周期 旧版本&#xff0c;函数组件是没有生命周期的。新版本中通过useEffect触发函数的生命周期 一、基于类组件的生命周期 React的组件生命周期分为挂载阶段、更新阶段和销毁阶段。因为React的state不具有Vue的响应式&#xff0c;所以并没有create阶段 1、挂载阶段&…

第八章:list类

系列文章目录 文章目录 系列文章目录前言list的介绍及使用list的介绍list的使用list的构造函数list的迭代器list的容量list的成员访问list的增删改查 list与vector的对比总结 前言 list是STL的一种链表类&#xff0c;可以在常数范围内在任意位置进行插入和删除的序列式容器。 …

专访伊士曼中国区高管赵志伟:以创新应对新能源汽车后市场变化

受访人&#xff1a;伊士曼高性能膜事业部中国区商务总监赵志伟 新能源汽车发展至规模化阶段&#xff0c;以贴膜、保养维修为主的后市场产业迎来快速崛起&#xff0c;新能源消费者在汽车贴膜、改装和养护领域也表现出比燃油车更高频的需求度。 作为一家全球特种材料公司&#x…

MySQL~DQL查询语句

一、DQL:查询语句 1、排序查询 语法&#xff1a; order by 子句 ​ order by 排序字段1 排序方式1 &#xff0c;排序字段2 排序方2... 排序方式&#xff1a; ASC&#xff1a;升序[默认] DESC&#xff1a;降序 在SQL语句中永远排序最后 注&#xff1a; 如果有多个排序条…

立创EDA学习

学习树莓派3B的板子发现有个扩展板比较好&#xff0c;自己最好画一个&#xff0c;反正免费。 学习视频&#xff1a;立创EDA&#xff08;专业版&#xff09;电路设计与制作快速入门。 下载专业版&#xff0c;并激活。【分专业版和标准版&#xff0c;专业版也是免费的】 手机…

学习自动化测试该怎么学?6个步骤轻松拿捏

自动化测试作为脱离手工测试的基本核心内容&#xff0c;其重要性不言而喻了&#xff0c;而且我们来看近期大厂的一些招聘信息显示&#xff0c;基本上自动化测试是必备前提&#xff0c;没有这个基本就不用谈后面的问题了&#xff0c;下面我们通过联想集团的一个软件测试工程师的…

购物车功能实现(小兔鲜儿)【Vue3】

购物车 流程梳理和本地加入购物车实现 购物车业务逻辑梳理拆解 整个购物车的实现分为两个大分支, 本地购物车操作和接口购物车操作由于购物车数据的特殊性,采取Pinia管理购物车列表数据并添加持久化缓存 本地购物车 - 加入购物车实现 添加购物车 基础思想&#xff1a;如果…

Ceph社区上游正式合入openEuler原生支持,并通过CI持续验证

作为覆盖全场景应用、支持多样性算力的面向数字基础设施的开源操作系统&#xff0c;openEuler始终遵循“上游优先”的策略&#xff0c;帮助上游开源软件原生支持openEuler&#xff0c;让openEuler系操作系统的用户可以在开发、集成、使用这些开源软件或基于这些开源软件的产品和…

市面上的ipad国产触控笔怎么样?精选的性价比电容笔

要知道&#xff0c;真正的苹果品牌的那款原装电容笔&#xff0c;光是一支电容笔就价格近千元。实际上&#xff0c;平替电容笔对没有太多预算的用户是个不错的选择。一支苹果品牌的电容笔&#xff0c;价格是平替品牌的四倍&#xff0c;但电容笔的书写效果&#xff0c;却丝毫不逊…

idea如何解决导入的项目不是Maven工程(文件下面没有蓝色的方格)二

简介&#xff1a; Maven项目导入&#xff0c;idea不识别项目 解决方法&#xff1a; 选中pom.xml -- 右键 -- Add as Maven Project

技术实力加速企业上云,联想混合云获评专有云优秀案例入选混合云全景图四大方向

7月25-26日&#xff0c;由中国信息通信研究院、中国通信标准化协会联合主办的第十届可信云大会在京顺利召开。大会重磅发布了云计算白皮书&#xff08;2023年&#xff09;、《混合云产业全景图&#xff08;2023&#xff09;》、中国算力服务研究报告、中国云计算发展指数报告等…

Golang速成

目录 Golang 语言特性Golang的优势Golang 的应用场景Golang 的不足 基础语法变量的声明常量与 iotastring字符串遍历strings 包bytes 包strconv 包unicode 包 循环语句range 函数多返回值init 函数闭包import 导包匿名函数 指针defer切片 slice数组sliceslice 操作… mapmap 的…

MySQL InnoDB死锁原因及改善建议(InnoDB Deadlocks)

死锁是事务型数据库中一种现象&#xff0c;为了在高并发环境下不出错&#xff0c;数据库引入了"锁"这一数据结构来控制资源的并发访问&#xff0c;但也会导致死锁。 目录 一、死锁概念 1.1 死锁的原因 1.2 死锁监测 二、死锁演示 2.1 死锁生成过程 2.2 死锁信息查看 …

EtherNet/IP转Modbus网关以连接AB PLC

本案例为西门子S7-1200 PLC通过捷米特Modbus转EtherNet/IP网关捷米特JM-EIP-RTU连接AB PLC的配置案例。 网关分别从ETHERNET/IP一侧和MODBUS一侧读写数据&#xff0c;存入各自的缓冲区&#xff0c;网关内部将缓冲区的数据进行交换&#xff0c;从而实现两边数据的传输。 网关做为…

vue 实现拖拽效果

实现方式&#xff1a;使用自定义指令可以实现多个面板拖拽互不影响 1.自定义指令 js directives: {// 拖拽drag(el) {el.onmousedown function (e) {let x e.pageX - el.offsetLeftlet y e.pageY - el.offsetTopdocument.onmousemove function (e) {el.style.left e.pag…