热门关键词:
首页 综合资讯

C#翻身?微软重写开源的C#编译器!

导读: “我们把所有对于语言正确性和性能的要求都集中在一份代码中,使其拥有最佳的质量和最好的多样性——我们将重新定义“编译器”这个词。”Roslyn是C#和Visual Ba...

“我们把所有对于语言正确性和性能的要求都集中在一份代码中,使其拥有最佳的质量和最好的多样性——我们将重新定义“编译器”这个词。”

Roslyn是C#和Visual Basic.NET的开源编译器的项目名。十年来它从微软的封闭中走出来,变成现在的开源、跨平台、公开的语言引擎,支持一切使用C#的东西(包括VB,我认为它是C#带来的馈赠)。

在我2005年加入微软的时候,有过一次关于Roslyn项目的讨论,当时刚好是.NET 2.0发布前夕。那次讨论的内容是用C#重写C#。这种事情在编程语言中很常见,也是语言成熟的一个标志。但这样做还有个更现实、更重要的动机:作为C#的缔造者的我们竟然用的不是C#,而是C++!日常使用C#能改变你对C#的看法,这就是使用自家产品的好处。

客户期待新的编译器行为与旧编译器完全一致。使用C#重写编译器意味着连bug都要与旧编译器完全一致。

重写一个客户已使用多年的编译器有很多难点:新的编译器必须拥有完全一致的行为。编写新的C#编译器意味着连bug都要与旧编译器完全一致。而且这里说的还不仅仅是已知的bug,还有许多未知的bug和无意的编译器行为,由于被程序员发现并且利用(而且通常人们意识不到自己利用了这些行为),所以也必须原样实现才行。

这种级别的难度使得我们很多年来都不敢碰这个项目。

此外,尽管使用C#编写新的C#编译器可能会有很多好处,但其价值却很难展示给客户:新的编译器对现有客户有什么好处呢?也许,唯一在乎C#编译器是否用C#编写的人只有编译器团队自己了吧。

但同时,另一个问题也越来越明显,即所有使用了C#代码的工具都需要进行修改,尽管这部分工作具有重复性。除了编译器之外,我们的兄弟团队在开发Visual Studio中的C# IDE支持,他们也需要写一些代码(当时也是C++代码)来理解C#的语法和语义。

除此之外,微软和其他第三方如StyleCop、CodeRush等工具也越来越多,所有工具都要根据C#源代码文本实现。这些工具都有不同的bug,对C#的理解程度也不尽相同,也都做了不同的妥协和权衡取舍。这一切都需要越来越多的努力,只为了解决一个问题:理解源代码。

到此,我们终于能够提出项目的价值了:全世界只需要一份理解C#的代码,任何想开发代码工具的人都可以共享这份代码!

这样,客户价值就能体现在工具数量的增加,特别是现有工具的质量提高。我们把所有对于语言正确性和性能的要求都集中在一份代码中,使其拥有最佳的质量和最好的多样性。我们需要构建一个语言引擎!一个通用的、公开的C#代码API!我们将重新定义“编译器”这个词。

当然,要想为广义的C#社区开发API,很显然必须开发成.NET API,因此要用C#实现。所以,用C#自我编译C#的梦想可以作为意外收获顺带实现了。

于是,Roslyn从一个开放的思想中诞生了:将C#的内部工作共享给世界,使之可以通过程序访问。在一个无处不在封闭式文化中,这种想法是一个非常大胆的决定:我们要把知识产权无偿分享?我们要给那些不属于我们的工具开发商提供支持让他们跟我们竞争?

最后我们得出的结论是:增强生态环境,使之成为全世界最好的工具语言。这是为了C#和.NET的长期增长,而不是只为了眼前的利益和保护微软的财产。所以,就算不谈开源,考虑到成本和风险,Roslyn项目的通过对于微软也是件不容易的事儿。

当然,Roslyn项目并不是这么简单。Roslyn的愿景充满了野心,也充满了技术挑战,我们花了五年时间才实现。但这是另一个话题了。

我们花费了很多时间来构建初始版本,而此时Roslyn依然是个闭源项目。从2009年早期这个项目伊始,我们就制定了将编译器开源的愿景,但微软显然还没做好准备。私下开发再提交专利,这是微软从上世纪七十年代开始一贯如此的做法。尽管现在有所改变,但改变的速度显然比我们期待的要慢得多。

实际上,有段时间我们似乎觉得公司会完全走向相反的方向。

Windows 8项目似乎占用了整个公司的精力。随着新编程模型的出现,Windows 8的触角伸到了开发工具和语言团队中,每个人都被要求高度保密,不仅要对外部保密,而且在公司内部也要保密。比如,我们当时开发的异步功能需要协调Windows 8的编程模型,因此我甚至都不敢在内部发表设计上的说明,以免不小心泄露Windows 8的消息给自己带来麻烦!这种氛围非常不利于创新,当然对于我们希望让C#编译器开源也不是好兆头。

但最终,在Windows 8完成开发之后,公司开始转变到新的方向上,新的领导团队带来了完全不同的价值观,即我们今天的微软。开源活动像雨后春笋般在微软内部生根发芽。

F#于2010年以开源授权发布,并且成立了自己的基金会——F#软件基金会(https://fsharp.org/)。在它周围迅速成长起来的生机勃勃的社区得到了我们所有人的嫉妒。我们的团队继续努力推行Roslyn的开源产品授权,最后终于实现了。

2012年,微软建立了微软开源技术——一个专门关注开源项目的组织。Roslyn移交给了微软开源技术,从而正式成为开源项目。Roslyn非常适合开源:所有开发资源都属于内部并且广为人知,项目自身也没有太多可能造成授权冲突的依赖。

微软开源技术组织下CodePlex上的Roslyn项目

同时,公司还宣布.NET基金会成为包括Roslyn在内的.NET项目的总部。

成为开源给我们带来了美好的新鲜空气!在我们开始尽情享受CodePlex的开放时,微软的其他开源过程也已做好准备,而现在,开源已经深入人心,许多团队都在使用开源。

GitHub不仅是我们发布代码的地方,也是我们日常工作的场所。

此外,公司还意识到,我们不需要控制一切。很明显,CodePlex没有存在的理由,因此Roslyn同其他项目一起从CodePlex移动到了GitHub,当时GitHub已经成为开源项目事实上的家园。这样,不仅代码托管在GitHub上,而且整个构建过程都放在了GitHub上。GitHub不仅是我们发布代码的地方,也是我们日常工作的场所。

现在Roslyn放在了GitHub上

C#语言的设计和编译器的实现现在完全开源,有许多微软之外的人参加,其中还包含许多完全由外部贡献者构建的语言功能。这对C#有极高的价值,其中不仅有实现功能和修复bug的贡献,通过开源提供的日常反馈,我们还能获得及时的灵感和洞察。

这段旅程漫长又艰苦,而在我看来值得一提的是:微软在过去十年内做出的巨大改变。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

作者:Mads Torgerson,微软的C#首席架构师。

译者:弯月,责编:郭芮





文章标签:

iwata GS-01 | 飞宇g6 plus | google pixel 3XL | gopro hero | onkyo ns-6170 | 华硕rog g703 | lg v30s | gfx50r | SX740 HS | vivonex星迹版 | v-moda remix | iPhone XS | dmc-fx500 | ATH-DSR5BT | ryzen 32200ge | canon g7x | madgaze x5 | Intel H310C | Klipsch X20i | Nikon D500 | rayo r4 | nokia8 sirocco | fs700 | H310C | GL503VS | sx740 hs | peak design | xz3 compact | amd b450 | 松下fz2500 | HTC UUltra | MINT TL70 | Artisul D16 | Lumix GX9 | EF 200-600mm | sony a6300 | lg v40 | instant magny | 8x max | Table Z2 | ux331ual | nikonZ6 | TG-Tracker | yashica35 | nikon d3500 | Zotac MEK1 | EF-M32 | xpg spectrix | helio a22 | rog g703 | Xperia XZ3 | lg v30+ | sony A7000 | kirin 970 | IER-M9 | ux370ua | gear s3 | 2990WX | Laowa 24mm | oneplus 5t | lg g6+ | piega coax 711 | AirPods 2 | mrg g2000 | zte axon7 | iwata GS-01 | i99900k | htc u11+ | 8848m5 | SLT-A99V | lg g5 | oppo r9 | TY-AK1 | rtx 2080 | s8800 | FEIYUG6 Plus | Ryzen 5 | Aumeo Audio | VAIOs11 | 26 AF-2 | Ps4 pro | Parrot ANAFI | metz m400 | LG G7 | Leica M-E | voyager 4 | vivo x21i | nikon Z6 | iXM 100MP | poco f1 | mavic 2 | cats41 | note9 S pen | htc blot | LargeSense LS911 | PEP 572 | ty-ak1 | thieye i60+ | i7 8086k | lumia 940xl | sony a6000 | moto z3 | Dyson V10 | AMD 2990X | vivo y75s | am pro30 | gpu turbo | aps-c | a6300 aps-c | a6300 | 90mm Macro | rtx2080 | AF-P 70-300mm VR | gtx1180 | mtk6737 | Sony SBH90C | sbh90c | SUGARY12 | nexum aqua+ | ryzen3000 | dysonV10 | Prostereo H2 | msige73 | note9 | 360 n7 | lg q6 | gopro 7 | oppo r17 | oppo r17 pro | vivo x5 | r6 neckband | xa2 plus | cats60 | 华为p21 | nokia7 plus | lgv30 | LITHRONE G37 | dmp z1 | M1803E6E | leagoo s10 | tab s4 | aftershokz | mad gaze x5 | xps 13 | int 2228 | DP-UB9000 | ie800s评测 | h370 | FINsix | asus fx504 | IMX309AQJ | mix2s AI相机 | 松下GH3 | B360主板 | Aurex TY-AK1 | 尼康28-300 | FE-Mount | agmx3 | 华为maters | vivoy75s | 150-400mm Pro | eos1100D | 魅族x8 | Fz2500 | msige73评测 | Dell XPS 132018 | Mate20 | sonyWI-SP500 | piegacoax711 | SonySBH90C | Kanton DX35 | lyratrio评测 | SocialMapper | note10 vivonex | B450 store MI | Elf Open Go | VersaceUnique | 飞宇g6plus | 技嘉H310 | 技嘉B360 | lx100ii | HIMO助力自行车 | Metz 26AF-2 | nikon p1000 | gopro fusion | camfi pro | FastFoto FF-680W | X-Trans cmos | af-p70-300 | Nikon af-p70-300 | MOE轮胎 | breakthrough滤镜 | applestore电视墙 | moto p30 | int 2228 | pubg mobile模拟器 | LargeSense | LargeSense LS911 | LargeSense | GandCrab4.0 | sunmobile | 16TH | 16TH 16THP | ux390 | ux490 | durakey | SONY DMP-Z1 | IER-Z1R | DMP-Z1 | entune3.0 | Ryzen52400G | Kanton DX35 | Ultimate Lens Hood | lgg7 hifi | elfopengo | Meltano | 4G-AC68U | dell cinema | 56Gpam4 | G7ThinQ | 72700x | NS-6170 | nove3 | sega | lgg7+ | nissin i60 | g703bi | fortnite | mqa 2L | R52400g | low-code | APP Obscura 2 | IBM groupon | acoustune | blincam眼镜 | iOS12.0Beta5 | 16A5339E | ambie wireless | NanoSound | pccw csl | RDMA技术原理 | Veydra | BWM Turbo Concept | snapdragon NPU120 | vGPU | cats60 | 锐龙r32200g | V30+ | neptune convertible | rog g703 | BitoPro | Metabones Speedbooster | Instant Magny 35 | CNVi | RNG纪念键帽 | Lastolite | 耳机 | mavic 2 | bigquery ml | nexstgo | RHEL7.5 | r32200g | Nokia | 联想z5 | oppo r15 | VIVONEX | coin otaku | ELF OpenGo | iPhone 9 | Surface Go | Galaxy Note8 256G | Intel CNVi | Nexstgo PRIMUS | pep572 | i78700 | i78700K | i7 8700 | i7 8700k