「LLVM IRを注意深く生成する必要があります。」 Egor BogatovによるMonoおよび.NET Core

Egor Bogatovは、MonoチームのMicrosoft開発者であり、Monoに取り組んで.NET Coreと統合しています。 XamarinとMicrosoft内での作業方法、ゲーム開発者の愛情について彼と話しました。 彼らは、SSDが開発者の親友である理由について議論しました。会議のプレゼンテーションの有用性は、必ずしもその複雑さと相関するとは限りません。 いつものように、インタビューはJUG.ruグループのOleg Chirukhin( olegchir )によって行われます。




紹介:暗号化されたデモとXamarinの入手方法について



-あなたが誰であるか、あなたが何をしているのか、Habrに伝えましょう。



-私は開発者です。.NETスタックで約10年間働いています。Javaで少し働いて、Androidで少し書きました。



彼はさまざまな企業で働いていました。アウトソーシングから始めて、次にViberやPlaytikaなどの食料品店に切り替えました。 それから、Javaを含めて少しフリーランスになり、Xamarinで働き始めました。



-どうやってそこに着いたの?



-私は非常に長い間、.NETとMonoにはまっています。 私はC#が好きでしたが、Windowsに強く結び付けられたMicrosoftのポリシーは好きではありませんでした。 そのため、私はクロスプラットフォームの実装を最初から追ってきました。



XamarinのMonoが登場するとすぐに、積極的に監視しました。コンセプト自体が気に入りました。 彼らの大会に参加し、数回は2位になりました。 私は気づかれ、請負業者として働くことを申し出られました。ミゲル・デ・イカスは自分自身を書きました。



-どこから始めましたか?



-Miguelは、モバイルプラットフォーム向けのエンドツーエンド暗号化とのチャットを含むデモの作成を勧めました。 チャットアプリケーションの操作経験があり、暗号化のトピックが好きだったので、最初はバックエンドに連れて行かれましたが、Androidでも開発できると言いました。 その後、さまざまなサードパーティのXamarinプロジェクトに取り組みました-コンポーネント自体はランタイムに入ることができませんでした。



ミゲルには多くの興味深いプロジェクトがあります。 時々、これは同じ名前の人々のグループであるように思えます。 まあ、一人はすべてを手探りすること、全員に答えること、すべてに気づくことはできない。



Xamarin EvolveやMS Buildなどの大規模なカンファレンスのために、彼のために何度かデモを行いました。これはマイクロソフトで最大の開発者カンファレンスです。



そして、これらのデモの商業的意義は何でしたか、なぜ必要なのですか?



潜在的な顧客に技術を宣伝するだけです。 たとえば、デモの1つは、3Dビジュアライゼーションを任意のプラットフォームの通常のアプリケーションに簡単に統合する方法の例を示しており、いくつかの深刻な企業がこの機能に関心を示していました。



仕事について:タスクと永遠の紛争「リモートまたはオフィス」



「今何してるの?」



-私はランタイムチームに、つまり直接Monoに転送されました。 私の主な責任は、Monoと.NET Coreをマージすることです。つまり、2つのランタイムの間のどこかになります。 私はこれらのタイプのすべてであり、最も基本的なものから始まり、複雑で研究し、徹底的に検討するため、.NETをよりよく理解することができます。 2年間で、優れたエクスペリエンスベースを構築し、すべての主要な開発者を知ることができました。



「自宅で仕事をしていますか?」



-ミンスクに小さなマイクロソフトオフィスがあります。 私は定期的にそこを訪れますが、ほとんど家から仕事をしています。



-そして、何が優れている:オフィスで働くか、自宅で?



-自宅で仕事をするには、多くの自己鍛錬が必要です。 定期的にこれを旅行と組み合わせようとしていますが、あまり効果的ではありません。 たとえば、3台のモニターを備えた本格的な正常なデスクトップコンピューターが必要です。 ラップトップでは、快適に作業できません。



-モニターにこれが必要ですか、コンピューターの電源は重要ですか?



-モニター用、電源用。 モノラル、coreclr、corert、仮想マシンの調整など、さまざまなランタイムを定期的にコンパイルする必要があります。 これを行うには、TPDによる誤解を避けるための本格的なトップエンドプロセッサと、もちろん高速SSDが必要です。



-つまり、Monoコードで作業する場合、通常のコンプが必要ですか?



-Monoには、.NETおよび.NET Coreのソースコードがサブモジュールの形式で含まれているため、最終的には何とかしてすばやく移動する必要がある膨大な数のファイルがあるため、最も重要なことは高速SSDです。 Samsung 960 Pro以上から何かを取り出す必要があります。 ボトルネックは常にIOにあります。



-勤務日を説明してください



-私はミンスクから遠隔で働いています。 私のチームの大半はアメリカにいますが、ヨーロッパには数人の人がいますが、日本、オーストラリア、さらにはアフリカにも人がいます。 そのような分散チーム。 私たちは主にSlackでコミュニケーションを取り、週に数回集会を開催しています。 ボストンまたはレドモンドで定期的に会います。



タスクはほとんどかなり抽象的なものです。 たとえば、特定のネームスペースからのポートタイプ。 並行して何かを取り、GitHubに移動していくつかのバグを修正できます。 定期的に.NET Coreに対して何かを行います-何かを最適化またはクリーンアップしようとします。



-そして、タスクはどこから来たのですか、これはどのように構成されていますか? 無限のバックログはありますか?



-タスクはユーザーとチームリーダーによって開始されます。月に1回、バグ修正の週があります。バグ修正の修正に1週間しかかかりません。



残りの時間もバグを忘れないことをお勧めしますが、主な目標を遵守する必要があります。たとえば、私の目標はmscorlibから主要な型を移植し、Mono / XamarinをNET Standard 2.1に準拠させることです。 型の移植は、通常、古い実装を捨てて、.NET Coreサブモジュール内のコードへのリンクに置き換えて置き換えるように見えます。



Microsoft、Axis、Betrayalについて



-まあ、はい、ライセンスで許可されています。 そして実際、あなたは同じ会社にいます。



-はい、そうです。 これは以前に行いました。 Monoは一部のディストリビューションの一部でした。UbuntuとGNOMEにもMonoがあったと思います。 ミゲルは、すべての人を修道院の下に置くと言われました。



「はい、覚えています、ストールマンは彼を裏切り者と呼びました。」



「彼らは、マイクロソフトの弁護士がいつでも攻撃し、全員を訴える可能性があることを恐れていたが、幸い、マイクロソフトはそうしなかった。」



-まあ、はい、Microsoftはまったく逆のことをしました-自宅でLinuxを使い始めました。



-マイクロソフトは現在、新しいCEOとは完全に異なっています。クラウドテクノロジーに焦点を当てたおかげで、オープンソースの世界と、これまで考えもしなかったすべての世界に私たちを連れてきました。 ワンクリックでマーケットプレイスからUbuntu WSLをダウンロードし、LinuxにMS SQL Serverを展開し、macOSから.NETで開発できるようになりました。



-つまり、オープンライセンスで安全にコードを書くことができ、誰も何も言わないでしょうか?



「はい、もちろん。」 当然のことながら、内部プロジェクトをオープンソースにする前に、少しの官僚主義が必要ですが、一般的に、私は何かを使うことに関するいかなる禁止事項も満たしていませんでした。



-一度に3つのプラットフォームを必要とするタスクがありますか?



-私は、Windows上に1台のコンピューター、macOSを搭載したMacBook、Fedoraを搭載したラップトップのセットを用意しています。 また、WSLを含む多数の仮想マシン。 ほとんどの場合、バグは2種類に分けられます-Windowsと非Windows、これらはmacOSとLinuxの両方で動作します。



.NET CoreとMonoについて



-あなたが好きな方向性は何ですか?また、.NET CoreとMonoで開発できますか?



-個人的には、パフォーマンスとクロスプラットフォームに重点を置いています。 BingからTechEmpowerなどの一般的なベンチマークまで、戦闘条件でのパフォーマンスが常に向上します。このベンチマークでは、.NET CoreがGo、Java、C ++ベースのソリューションとともに非常によく機能します。 多くの人々は、制動仮想マシンを備えたWindows専用の技術として、.NETについてのステレオタイプをまだ持っています。このステレオタイプに苦労しています。

私たちのチームは、AOTシナリオと、マシンコードを生成するためのバックエンドとしてのLLVMの使用に細心の注意を払っています。 LLVMは、膨大な数の最適化を備えた非常に強力なツールです。 これらの最適化に干渉しないように、最小数のセーフポイントでLLVM IRを慎重に生成する必要があるだけです。 個人的に、私は最近簡単なLLVM変換パスを書きました。



UnityおよびC#スクリプトを使用する他のエンジンのおかげで、ゲーム開発ではC ++および.NETがC ++とともに主流であることもまた勇気づけられます。

潜在的に興味深い方向があります-ブラウザ用のWebアセンブリでC#をコンパイルします。



-.NETでの方法はわかりませんが、コンパイルのために標準ライブラリの束をドラッグする必要がある場合があります。 Javaでは、Hello Worldを実行し、2,000のクラスをロードしています。 大量のメガバイトがブラウザーにロードされます。 これについてどう思いますか?



-ベースライブラリを備えたMonoランタイムの最小サイズは約2メガバイトです。 しかし、Appleにもこの問題があります。Swiftで記述されたアプリケーションは、そのランタイムをそれぞれドラッグします。 Mono-wasmテクノロジーは未加工でランタイムに基づいていますが、これはユーザーコード用にWASM +インタープリターでAOTによってコンパイルされました。 ところで、今度はランタイムをCからC ++に書き換えます。これが最終的にサイズに影響しないことを願っています。



-プラスやCではなくC#でMonoを書き直そうとしましたか?



-アイデアは良さそうに見えますが、非現実的なリソースを必要とするだけであり、これについてはある程度の進歩があります。 .NET Coreチームは、クロスプラットフォームでスイープされないようにプラスコードがC#に置き換えられ、同時にパフォーマンスを失わないようなレベルのC#および.NETに達しました。 最近の例は、数値型の解析および変換の実装の翻訳であり、Decimal全体がC#で書き直されました。 これは私をとても幸せにし、コード移行の作業を大幅に簡素化します。



ガベージコレクターについて



-私は子供を怖がらせる.NET Core GCを見ました。それは1.5メガバイトのC ++ソースだからです! 1.5メガバイト、カール! これは何冊の本ですか?!



-はい、はい、githubによると、このファイルには47人の貢献者が記録されています。 私はガベージコレクターのスペシャリストではありませんが、一般にGCにはMark-n-Sweepアルゴリズムなどのかなり一般的な理論があります。これは世代によって複雑になり、世界の完全な停止を回避し、実行のメインスレッドと並行してすべてを実行しようとします。



-プラグインまたはガベージコレクターを変更する機能はありますか?



-Monoにはいくつかの実装があり、.NET Coreでは最近、いくつかのヘッダーを取得して独自のHZを記述し、1つの環境変数の任意のアプリケーションに接続できるパブリックAPIを作成しました。 例として、.NET Core用のZeroGCの作成方法に関する記事があります。 ゴミの除去が不要なコンテナの世界では、それが関連する場合があります。 一般的に、これにより、たとえば誰かが現在の実装を取得して、たとえばゲーム開発者向けに可能な限り最適化できるため、世界を停止してすべてのオブジェクトを実行してもFPSフィーバーが発生したり、メモリ消費が最適化されたりすることはありませんTizenの場合、GCでのいくつかの変更。



-Microsoftがすべてを完全に制御できるようにしたという事実は、GCとJITが非常に優れた制御ツールだからです。



-はい。 .NET Foundationを見てください-それはマイクロソフトだけではありません。 そこにはグーグル、レッドハット、サムスン、インテル、一般に、以前はマイクロソフトの隣にいないと思われるすべての会社がありました。 Appleが見つからない限り。



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に関するスライドが12枚あります。



Intelの人たちは、Microsoftの人たちとともにC#でSIMDの低レベルAPIを持ち出しました。これにより、コンパイラに依存せずに超高速アルゴリズムを書くことができます。



-一般的な場合、これは理論的に不可能です。



-はい、組み込み関数の独立した挿入から逃れる場所はありません。 どの言語でも、単純型で行列の乗算または転置を記述でき、コンパイラからの最も効率的なSSE / AVX命令が出力されることを期待できるとは思いません。 ところで、SNETを使用してSystem.Numerics.Matrixを最適化し、Lzcntを使用してGetHexDigits関数を最適化するために、これらのC#組み込み関数を.NET Core内に既に適用しました。 プロジェクトでAPIを使用する例として使用できます。



-何か中核となるものを開発している人々が来るとき、これに参加することに興味がある人々も来ます。 初心者向けの方法はありますか?

初めて寄稿者が多くの注意と助けを受けた場合、GitHubの特別なラベル(「アップグラブ」または「良い最初の問題」)で、広範な知識と高い優先度を必要としない多くの単純なタスクまたはバグをマークできます。



-リポジトリにアクセスして、これらのタグで問題を見つけ、精神的に近い人を選択できます。 たとえば、かなりの数のタスクは、テストでコードの一部をカバーすることに関するものです。 テストのカバレッジを増やすことは、完璧な最初のタスクです。 また、良い方法は、何かをベンチマークし、他のランタイムと比較し、このコードまたはそのコードが.NET 4.xより遅い理由を見つけようとすることです。たとえば、string.GetHashCodeです。 ベンチマークでは、非常に便利なツールであるAndrei AkinshinとAdam Sitnikからの多数のスピーチとブログ投稿があります-BenchmarkDotNetは、簡単な手のジェスチャーでコードの実行速度を1つの属性で示し、他のランタイムと比較し、メモリについて説明し、アセンブラコードを示します。



つまり 最低限のアクションは、すべてのプルリクエストとタスクを閲覧し、TwitterでMatt WarenやBen Adamsのような人をフォローし、twitterでcorefxおよびcoreclrチャンネルに移動し、BenchmarkDotNetのドキュメントを読むことです。



-はい。 現在、up-for-grabsタグをフィルター処理しました。ここには約600の問題があり、コメントのないものもあります。



-はい、そうです。 最近では、.NET Coreチームのためにハッカソンを実施しました。 数十の問題を割り当てましたが、1日で修正して賞をもらう必要がありました。



-それは素晴らしい。 彼は多くの興味深いことを話してくれたので、今は自分で問題を解決したいと思っています。 確かに、私はC#を知らない、それが問題です。



-C#、私が信じたいように、砂糖の量にかかわらずかなり予測可能な言語であり、JavaまたはC ++での経験があるため、実行時にかなり迅速に何かの最適化を開始でき、他の言語の経験も役立つと思います他方では。



-今、.NET Coreリポジトリを見ていますが、非常にまともです。 そして、人々は本当にコメントでコミュニケーションを取り、議論が直接行われています。



-はい、かなり活発です。 100と200のコメントがあります。 また、クラスのベースライブラリから学ぶことができます。誰でもできる面白いタスクがたくさんあります。



-答えてくれてありがとう! DotNextで会いましょう。



今回は、インタビューの準備中に会議のチケットがなくなったため、1分間の広告は異常です。 レポートをご覧になり、チケットを購入する時間がありませんでしたか? ライブストリーミングは引き続きサイトで利用できます。



DotNext 2018モスクワを直接訪問したいという質問や信じられないほどの希望がある場合は、tickets @ dotnext.ruにご連絡ください(誰かがチケットを返してくれるかもしれません。



All Articles