“您只需要仔细生成LLVM IR。” Egor Bogatov关于Mono和.NET Core

Egor Bogatov是Mono团队的一名Microsoft开发人员,致力于Mono并将其与.NET Core集成。 我们与他讨论了如何在Xamarin和Microsoft内部工作,以及对游戏开发人员的热爱。 我们讨论了为什么SSD是开发人员最好的朋友,而会议演示的有用性并不总是与其复杂性相关。 与往常一样,采访由JUG.ru集团的Oleg Chirukhin( olegchir )进行。


简介:关于加密演示以及如何使用Xamarin


-告诉哈勃,你是谁,你做什么。

-我是一名开发人员,已经在.NET堆栈中工作了大约十年,我从事过Java方面的工作,并在Android下进行过一些编写。

他曾在多家公司工作:从外包开始,然后转而从事杂货店,例如Viber和Playtika。 然后我做了一些自由职业,包括Java在内,然后在Xamarin上工作。

-你怎么到那里的?

-我已经沉迷于.NET和Mono很长时间了。 我喜欢C#,但我不喜欢Microsoft政策,该政策与Windows紧密相关。 因此,自创建以来,我一直在关注跨平台的实现。

一出现,我就对Mono,Xamarin进行了积极监控:我喜欢这个概念本身。 参加了比赛,多次获得亚军。 我被发现并被提议担任承包商,Miguel de Icas写了自己,这让我感到完全惊讶,因为对我来说他是一个传奇。

-你从哪里开始的?

-Miguel邀请我编写了一个演示,其中包括针对移动平台的端到端加密聊天。 我有使用聊天应用程序的经验,并且喜欢加密这个话题,因此起初我被带到了后端,但是我说我可以为Android开发。 之后,我参与了多个第三方Xamarin项目-也不允许我进入运行时组件。

Miguel有许多有趣的项目。 在我看来,有时候这是一群同名的人。 好吧,一个人不可能在所有事情上摸索,回答所有人,意识到所有事情。

几次我为他的大型会议(例如Xamarin Evolve和MS Build)演示了一个演示-这是微软最大的开发者会议。

这些演示的商业意义是什么,为什么需要它们?

在潜在客户中只是广告技术。 例如,其中一个演示演示了一个示例,该示例演示了如何轻松地将3D可视化集成到任何平台上的常规应用程序中,并且这一机会吸引了该领域的多家知名公司。

关于工作:任务和永恒的争议“远程或办公室”


“现在你在做什么?”

-我被转到了运行时团队,即直接转到了Mono。 我的主要职责是合并Mono和.NET Core,也就是将它们合并在两个运行时之间。 这使我可以更好地理解.NET,因为我属于所有这些类型,从最基本的开始,以复杂,研究和透彻考虑结束。 在两年的时间里,我们设法建立了良好的经验基础,并认识了所有关键开发人员。

“你在家工作吗?”

-我们在明斯克设有一个小型Microsoft办公室。 我会定期去那里,但主要是在家工作。

-还有什么更好的:在办公室还是在家工作?

-要在家工作,需要很多自律。 我会定期尝试将此与旅行结合起来,但是效果并不十分理想。 例如,我需要一台具有三台显示器的功能完善的健康台式计算机。 在笔记本电脑上,我无法舒适地工作。

-显示器是否需要此功能?计算机功能是否重要?

-用于显示器和电源。 我定期需要编译不同的运行时:mono,coreclr,corert,调整虚拟机等。 为此,我需要一个成熟的高端处理器,而不是TPD所造成的误解,当然还需要一个快速的SSD。

-也就是说,如果您要处理Mono代码,是否需要一台普通计算机?

-Mono以子模块的形式包含.NET和.NET Core的源代码,因此最后,有大量文件需要以某种方式快速移动,因此最重要的是快速SSD。 我们需要从Samsung 960 Pro及更高版本中获取一些东西。 瓶颈始终在IO中。

-描述您的工作日

-我在明斯克远程工作。 我的团队大部分在美国,尽管欧洲有几个人,日本,澳大利亚甚至非洲都有人。 这样一个分散的团队。 我们主要通过Slack进行交流,每周举行几次集会。 我们定期在波士顿或雷德蒙德开会。

任务大部分都是抽象的。 例如,来自特定名称空间的端口类型。 我可以并行处理一些问题,转到GitHub并修复一些错误。 我会定期为.NET Core做一些事情-我尝试优化或清理某些内容。

-任务从何而来,它是如何组织的? 有无休止的积压吗?

-任务由用户和团队负责人启动,每个月一次,我们有一周的错误修复:整整一周,我们只进行错误修复,而您丢弃了其他东西。

建议在其余时间不要忘记bug,但是您需要遵守主要目标,例如,我的目标是从mscorlib移植主要类型,并使Mono / Xamarin符合NET Standard 2.1。 类型移植通常看起来像扔掉旧的实现,并用适应性替换为.NET Core子模块中的代码链接。

关于Microsoft,轴和背叛


-是的,许可证允许。 确实,您在同一家公司。

-是的 我们之前已经做到了。 Mono是某些发行版的一部分,我认为Ubuntu和GNOME甚至都有Mono。 有人告诉米格尔,他会让每个人到修道院去。

“是的,我记得斯托曼称他为叛徒。”

“他们担心微软的律师可能随时会来起诉所有人,所幸微软没有这样做。

-恩,是的,微软的做法恰恰相反-它开始在家中使用Linux。

-微软现在与新任首席执行官完全不同,对云技术的关注使我们进入了开源世界,这是我们以前无法想到的一切。 现在可以一键式从Marketplace下载Ubuntu WSL,在Linux上部署MS SQL Server并从macOS下在.NET下进行开发。

-也就是说,您可以在开放许可下安全地编写代码,而没人会说什么?

“是的,当然。” 自然,在将一些内部项目投入开源之前,我们需要一点官僚主义,但总的来说,我没有遇到任何禁止使用任何东西的禁令。

-您是否有同时需要三个平台的任务?

-我有一整套:一台Windows计算机,带macOS的MacBook和带Fedora的笔记本电脑。 还有一堆虚拟机,包括WSL。 大多数情况下,错误分为两种类型-Windows和非Windows,它们均在macOS和Linux上播放。

了解.NET Core和Mono


-您喜欢什么方向?可以在.NET Core和Mono中进行开发吗?

-就个人而言,我非常喜欢性能和跨平台。 从Bing到TechEmpower等公共基准,它在战斗条件下的性能不断提高,.NET Core与Go,Java和C ++解决方案一起可以很好地发挥性能。 许多人仍然对.NET有一个刻板印象,因为带有制动虚拟机的纯Windows技术-我们正在成功地克服这种刻板印象。
我们的团队非常关注AOT场景以及LLVM作为生成机器代码的后端的使用。 LLVM是一个非常强大的工具,具有大量的优化功能。 只需要仔细生成具有最少安全点数的LLVM IR,以免干扰这些优化。 我个人最近写了我的简单LLVM转换通行证。

同样令人鼓舞的是,由于Unity和其他一些具有C#脚本编制的引擎,C#和.NET以及C ++在游戏开发中成为主流。
有一个潜在的有趣方向-在Web Assembly中为浏览器编译C#。

-我不知道如何使用.NET,但是有时我不得不拖一些标准库进行编译。 在Java中,您运行Hello World,并且已加载2,000个类。 浏览器中将加载大量的兆字节。 您如何看待?

-具有基本库的Mono运行时的最小大小约为2 MB。 但是,即使苹果公司也有这个问题:用Swift编写的应用程序会拖拽其每个运行时。 Mono-wasm技术是原始的并且基于运行时,它是由AOT在WASM +解释器中为用户代码编译的。 顺便说一下,现在我们将运行时从C重写为C ++,我希望这最终不会影响大小。

-您是否尝试用C#代替plus或C重写Mono?

-这个想法听起来不错,但需要不切实际的资源,我们在这方面取得了一些进展。 .NET Core团队已经达到了C#和.NET的水平,正代码被C#取代,以免被跨平台所扫除,同时又不会失去性能。 最近的一个示例是解析和转换数字类型的实现的转换,并且整个Decimal已用C#重写。 这使我感到非常高兴,并大大简化了代码迁移的工作。

关于垃圾收集器


-我看到了.NET Core GC吓到孩子了,因为它是C ++中源的一半半字节! 一个半兆字节,卡尔! 这是几本书?

-是的,是的,根据github,该文件中记录了47位贡献者。 我不是垃圾收集器的专家,但总的来说,GC具有相当普遍的理论,例如Mark-n-Sweep算法,该算法因世代相传而变得复杂,并试图避免世界的完全停顿,并尽一切可能与执行的主线程并行进行。

-您是否具有插件或更改垃圾收集器的能力,或者是其中之一?

-在Mono中,有多种实现,在.NET Core中,我们最近提供了一个公共API,该API允许您使用几个标头,编写自己的HZ并将其连接到一个环境变量的任何应用程序。 例如,有一篇有关如何为.NET Core编写ZeroGC的文章。 在容器的世界中,不需要清除垃圾的情况可能很重要。 总的来说,这可以使某人例如采用当前的实现并为游戏开发者尽可能地对其进行优化,这样,例如,停止世界运行并遍历所有对象不会引起FPS发热,或者不优化内存消耗,在我看来,三星的家伙做到了。 Tizen对GC进行了一些修改。

-Microsoft放弃了对所有内容的完全控制的事实是件好事,因为GC和JIT是非常好的控制工具。

-是的 看看.NET Foundation-不仅仅是Microsoft。 在一般情况下,谷歌,红帽,三星,英特尔等所有似乎早先不会出现在微软旁边的公司。 除非苹果失踪。

关于IDE支持


-关于IDE:在调优,编译器和IDE支持方面有什么优势? 现在出现了诸如Swift之类的各种事物,其中编译器几乎没有机会检查内部结构,缓存等。 这是无尽的痛苦,因为当您进行自己的调音时,您需要重塑整个世界。 Mono的效果如何? 您有自己的IDE吗?

-C#编译器Roslyn最初不仅是用IL编写的C#编译器,还是IDE后端和分析器,它甚至可以消化不良代码。 您可以简单地显示一些视图并根据其输出执行某些操作,他将直接说:“在此向我显示菜单”,“提供重构”,“在这里可以预览更改”,等等。“突出显示,向用户提供重构。” 也就是说,此编译器直接允许您快速创建IDE。

实际上,您只需为GUI实现一组接口,并且您已经拥有一个支持大量重构之类的IDE。

通常,许多现代语言都提供AST,即代码表达的抽象树。 例如,Clang使从加号代码中获取抽象树成为可能,顺便说一下,我们使用此功能为C ++和Objective-C代码生成C#绑定。

-您是否尝试过使用Visual Studio Code做任何事情?

-好吧,我会说这是我最基本的工具。

-假设该家伙想打开Mono存储库并将其挂起。 他需要什么?

-在Windows上,只需打开运行时解决方案和btsl解决方案,并同时构建它们。 由于高效的并行化,msbuild可以在大约5分钟内完成操作。在macOS和Linux上,使用通过Makefiles的常规方法。

关于报告的准备和一些破坏者


-您将带着该报告来到DotNext,但这将是什么呢?

-我的报告将包含一组有趣的示例,这些示例由开发人员和第三方贡献者在.NET Core中进行了微优化,我认为它们也对应用程序程序员有用。 我还将关注未成功的示例来优化某些内容,例如,当贡献者想要优化特定案例时,却以其他形式的回归形式横摆。 另外,新SIMD API上将有许多幻灯片。

英特尔的员工以及Microsoft的员工在C#中带来了SIMD的低级API,它使您无需依赖编译器就可以编写超快速算法,正如许多人认为的那样,编译器本身可以优化和向量化所有内容,而事实并非如此。

-一般情况下,从理论上讲这是不可能的。

-是的,无处不摆脱内在函数的独立插入。 我怀疑任何一种语言都无法描述简单类型上矩阵的乘法或换位,并且期望从编译器到输出的最有效的SSE / AVX指令。 顺便说一句,我已经在.NET Core中应用了这些C#内部函数来使用SSE优化System.Numerics.Matrix,并使用Lzcnt优化了GetHexDigits函数。 您可以将其用作在项目中使用API​​的示例。

-当有人来开发一些核心产品时,也有兴趣参加的人来了。 有什么新手方法吗?
任何初次贡献者都会得到很多关注和帮助,许多不需要广泛知识和高优先级的简单任务或错误都可以在GitHub上标记为特殊标签-“ up-for-grabs”或“ good first issue”。

-您可以转到存储库,通过这些标签查找问题,然后选择一个精神密切的人。 例如,许多任务是关于用测试覆盖一些代码。 增加测试的覆盖范围只是完美的首要任务。 另一个不错的方法是对某些东西进行基准测试,将其与其他运行时进行比较,并尝试弄清楚为什么该代码或该代码比.NET 4.x中的工作速度慢,例如string.GetHashCode。 关于基准测试,Andrei Akinshin和Adam Sitnik上有大量演讲和博客文章,介绍了一个非常方便的工具-BenchmarkDotNet,它使用简单的手势即可显示具有一个属性的代码执行速度,将其与其他运行时进行比较,介绍内存并显示汇编代码。

即 最少的动作是浏览所有拉动请求和任务,在Twitter上订阅Matt Waren和Ben Adams之类的人,在Twitter上转到corefx和coreclr频道,并阅读BenchmarkDotNet文档。

-是的 我现在过滤了up-for-grabs标签,这里大约有600个问题,有些根本没有评论,您可以接受。

-是的,没错。 最近,他们为.NET Core团队进行了黑客马拉松。 他们分配了几十个问题,一天之内就必须修复并获得奖品。

-太好了。 他讲了很多有趣的事情,现在我想尝试自己解决一些问题。 是的,我不知道C#,那是问题所在。

-我想相信,尽管有很多糖并且具有Java或C ++的经验,但C#是一种相当可预测的语言,我认为您甚至可以很快地在运行时开始进行优化,其他语言的经验甚至可以为您提供帮助在另一边的事情上。

-我正在查看.NET Core存储库,它看起来非常不错。 人们在评论中进行真正的交流,直接进行讨论。

-是的,非常活跃。 有100和200条评论。 您可以从类的基础库中学习,任何人都可以执行很多有趣的任务。

-非常感谢您的回答! 在DotNext与我见面。

这次,一分钟的广告将是不寻常的,因为在我们准备采访时,会议票已经用完了。 是否想查看报告并且没有时间购买票? 该站点上仍提供实时流媒体。

如果您有任何疑问或想要亲自前往DotNext 2018莫斯科的不可思议的愿望,请给我们发送电子邮件至tickets@dotnext.ru(也许有人会退回门票,我们会为您提供帮助)。

Source: https://habr.com/ru/post/zh-CN430048/


All Articles