"Sie müssen nur die LLVM-IR sorgfältig generieren." Egor Bogatov über Mono und .NET Core

Egor Bogatov ist ein Microsoft-Entwickler aus dem Mono-Team, der an Mono arbeitet und es in .NET Core integriert. Wir haben mit ihm darüber gesprochen, wie man in Xamarin und Microsoft arbeitet, über die Liebe zum Spieleentwickler. Wir haben diskutiert, warum SSDs der beste Freund eines Entwicklers sind und die Nützlichkeit von Konferenzpräsentationen nicht immer mit ihrer Komplexität korreliert. Das Interview wird wie immer von Oleg Chirukhin ( Olegchir ) von der JUG.ru Group geführt.


Einführung: Über verschlüsselte Demos und den Einstieg in Xamarin


- Sagen wir Habr, wer du bist, was du tust.

- Ich bin Entwickler, arbeite seit ungefähr zehn Jahren im .NET-Stack, habe ein bisschen in Java gearbeitet und ein wenig unter Android geschrieben.

Er arbeitete in verschiedenen Unternehmen: angefangen beim Outsourcing bis hin zum Lebensmittelgeschäft wie Viber und Playtika. Dann war ich ein wenig freiberuflich tätig, auch in Java, und ging zur Arbeit in Xamarin.

- Wie bist du dorthin gekommen?

- Ich bin schon sehr lange süchtig nach .NET und Mono. Ich mochte C #, aber die Microsoft-Richtlinie, die stark an Windows gebunden war, gefiel mir nicht. Daher verfolge ich die plattformübergreifende Implementierung seit ihrer Einführung.

Ich habe Mono, Xamarin, aktiv überwacht, sobald es erschien: Ich mochte das Konzept selbst. Hat an ihren Wettbewerben teilgenommen und mehrmals den zweiten Platz belegt. Ich wurde bemerkt und angeboten, als Auftragnehmer zu arbeiten, und Miguel de Icas schrieb sich selbst, was mich völlig überraschte, denn für mich war er eine Legende.

- Wo hast du angefangen?

- Miguel hat mich eingeladen, eine Demo zu schreiben, die einen Chat mit End-to-End-Verschlüsselung für mobile Plattformen beinhaltete. Ich hatte Erfahrung mit Chat-Anwendungen und mochte das Thema Verschlüsselung. Daher wurde ich zunächst zum Backend geführt, sagte aber, dass ich für Android entwickeln kann. Danach war ich an verschiedenen Xamarin-Projekten von Drittanbietern beteiligt - ich durfte auch nicht in die Laufzeitkomponenten einsteigen.

Miguel hat viele interessante Projekte. Manchmal scheint es mir, dass dies eine Gruppe von Menschen unter dem gleichen Namen ist. Nun, eine Person kann nicht in allem herumfummeln, allen antworten, sich über alles bewusst sein.

Mehrmals habe ich für ihn eine Demo für große Konferenzen wie Xamarin Evolve und MS Build erstellt - dies ist die größte Entwicklerkonferenz bei Microsoft.

Und welche kommerzielle Bedeutung hatten diese Demos? Warum werden sie benötigt?

Nur Werbetechnologie bei potenziellen Kunden. Eine der Demos zeigte beispielsweise ein Beispiel für die einfache Integration der 3D-Visualisierung in eine reguläre Anwendung auf jeder Plattform. Diese Gelegenheit war für mehrere seriöse Unternehmen in diesem Bereich von Interesse.

Über den Job: Aufgaben und der ewige Streit "Remote oder Büro"


"Was machst du jetzt?"

- Ich wurde zum Laufzeit-Team versetzt, dh direkt zu Mono. Meine Hauptverantwortung besteht darin, Mono und .NET Core zusammenzuführen, dh irgendwo zwischen zwei Laufzeiten zu liegen. Dies ermöglicht es mir, .NET besser zu verstehen, da ich alle diese Typen bin, beginnend mit den grundlegendsten und endend mit dem Komplex, der Forschung und gründlichen Überlegungen. In zwei Jahren haben wir es geschafft, eine gute Erfahrungsbasis aufzubauen und alle wichtigen Entwickler kennenzulernen.

"Arbeiten Sie von zu Hause aus?"

- Wir haben ein kleines Microsoft-Büro in Minsk. Ich besuche dort regelmäßig, aber meistens arbeite ich von zu Hause aus.

- Und was ist besser: im Büro oder zu Hause arbeiten?

- Um zu Hause arbeiten zu können, braucht man viel Selbstdisziplin. In regelmäßigen Abständen versuche ich, dies mit Reisen zu kombinieren, aber es funktioniert nicht sehr effektiv. Zum Beispiel brauche ich einen vollwertigen, gesunden Desktop-Computer mit drei Monitoren. Auf einem Laptop kann ich nicht bequem arbeiten.

- Benötigen Sie dies für Monitore oder ist die Leistung des Computers wichtig?

- Und für Monitore und für die Stromversorgung. Ich muss regelmäßig verschiedene Laufzeiten kompilieren: Mono, Coreclr, Corert, Tweak Virtual Machines usw. Dazu brauche ich einen vollwertigen Top-End-Prozessor und kein Missverständnis durch TPD und natürlich eine schnelle SSD.

- Wenn Sie also am Mono-Code arbeiten möchten, benötigen Sie einen normalen Computer?

- Mono enthält den Quellcode für .NET und .NET Core in Form von Submodulen. Am Ende gibt es also eine große Anzahl von Dateien, durch die Sie schnell navigieren müssen. Das Wichtigste ist also eine schnelle SSD. Wir müssen etwas vom Samsung 960 Pro und höher nehmen. Engpass ist immer in IO.

- Beschreiben Sie Ihren Arbeitstag

- Ich arbeite von Minsk aus. Der Großteil meines Teams ist in den USA, obwohl es in Europa mehrere Leute gibt, gibt es Leute in Japan, Australien, sogar in Afrika. Solch ein verteiltes Team. Wir kommunizieren hauptsächlich in Slack und veranstalten mehrmals pro Woche Kundgebungen. Wir treffen uns regelmäßig in Boston oder Redmond.

Die Aufgaben sind meist ziemlich abstrakt. Zum Beispiel Porttypen aus einem bestimmten Namespace. Ich kann etwas parallel nehmen, zu GitHub gehen und einige Fehler beheben. In regelmäßigen Abständen mache ich etwas für .NET Core - ich versuche, etwas zu optimieren oder zu bereinigen.

- Und woher kommen die Aufgaben, wie ist das organisiert? Irgendein endloser Rückstand?

- Aufgaben werden von Benutzern und Teamleitern gestartet. Einmal im Monat haben wir eine Woche Bugfixing: Wir verbringen nur eine Woche damit, Bugfixes zu beheben. Sie werfen andere Dinge raus.

In der restlichen Zeit ist es auch ratsam, Fehler nicht zu vergessen, aber Sie müssen sich an die Hauptziele halten. Mein Ziel ist es beispielsweise, die Haupttypen von mscorlib zu portieren und Mono / Xamarin an NET Standard 2.1 anzupassen. Die Typportierung sieht normalerweise so aus, als würde die alte Implementierung weggeworfen und durch einen Link zum Code im .NET Core-Submodul mit Anpassung ersetzt.

Über Microsoft, Axes und Verrat


- Ja, die Lizenz erlaubt. Und in der Tat sind Sie in der gleichen Firma.

- Ja, das tut es. Das haben wir schon mal gemacht. Mono war Teil einiger Distributionen, ich denke Ubuntu und GNOME hatten sogar Mono. Miguel wurde gesagt, dass er alle ins Kloster entlassen würde.

"Ja, ich erinnere mich, Stallman nannte ihn einen Verräter."

„Sie hatten Angst, dass Microsoft-Anwälte jeden Moment kommen und alle verklagen könnten, was Microsoft glücklicherweise nicht tat.

- Nun ja, Microsoft hat genau das Gegenteil getan - es begann, Linux zu Hause zu verwenden.

- Microsoft ist jetzt mit dem neuen CEO völlig anders. Der Fokus auf Cloud-Technologien hat uns in die Welt von Open Source geführt und alles, woran wir vorher nicht denken konnten. Jetzt ist es möglich, Ubuntu WSL mit einem Klick vom Marktplatz herunterzuladen, MS SQL Server unter Linux bereitzustellen und unter .NET unter macOS zu entwickeln.

- Das heißt, Sie können sicher Code unter offenen Lizenzen schreiben und niemand wird etwas sagen?

- Ja natürlich. Bevor wir ein internes Projekt in Open Source umsetzen, brauchen wir natürlich ein wenig Bürokratie, aber im Allgemeinen habe ich keine Verbote für die Verwendung von irgendetwas erfüllt.

- Haben Sie Aufgaben, für die drei Plattformen gleichzeitig erforderlich sind?

- Ich habe ein ganzes Set: einen Windows-Computer, ein MacBook mit MacOS und einen Laptop mit Fedora. Auch eine ganze Reihe von virtuellen Maschinen, einschließlich WSL. In den meisten Fällen werden Fehler in zwei Typen unterteilt: Windows und Nicht-Windows, die sowohl unter MacOS als auch unter Linux ausgeführt werden.

Grundlegendes zu .NET Core und Mono


- Welche Richtungen mögen Sie und können sie in .NET Core und in Mono entwickelt werden?

- Ich persönlich lege großen Wert auf Leistung und plattformübergreifende Arbeit. Es verbessert ständig die Leistung unter Kampfbedingungen von Bing bis hin zu öffentlichen Benchmarks wie TechEmpower, bei denen .NET Core eine sehr gute Leistung gegenüber Go-, Java- und C ++ - basierten Lösungen erbringt. Viele Menschen haben immer noch ein Stereotyp über .NET als reine Windows-Technologie mit einer bremsenden virtuellen Maschine - wir bekämpfen dieses Stereotyp erfolgreich.
Unser Team legt großen Wert auf AOT-Szenarien und die Verwendung von LLVM als Backend für die Generierung von Maschinencode. LLVM ist ein sehr leistungsfähiges Tool mit einer Vielzahl von Optimierungen. Es ist nur erforderlich, LLVM-IR mit einer Mindestanzahl von Sicherheitspunkten sorgfältig zu generieren, um diese Optimierungen nicht zu beeinträchtigen. Persönlich habe ich kürzlich meinen einfachen LLVM-Transformationspass geschrieben.

Es ist auch ermutigend, dass C # und .NET zusammen mit C ++ in der Spieleentwicklung Mainstream sind, dank Unity und einigen anderen Engines, die über C # -Skripte verfügen.
Es gibt eine möglicherweise interessante Richtung - das Kompilieren von C # in Web Assembly für den Browser.

- Ich weiß nicht, wie in .NET, aber manchmal muss ich eine Reihe von Standardbibliotheken zum Kompilieren ziehen. In Java führen Sie Hello World aus und haben 2.000 Klassen geladen. Eine große Anzahl von Megabyte wird in den Browser geladen. Was denkst du darüber?

- Die Mindestgröße einer Mono-Laufzeit mit einer Basisbibliothek beträgt etwa zwei Megabyte. Aber auch Apple hat dieses Problem: In Swift geschriebene Anwendungen ziehen jede ihrer Laufzeiten. Während die Mono-Wasm-Technologie roh ist und auf der Laufzeit basiert, die von AOT im WASM + -Interpreter für Benutzercode kompiliert wurde. Übrigens, jetzt schreiben wir die Laufzeit von C nach C ++ um. Ich hoffe, dass dies am Ende keinen Einfluss auf die Größe hat.

- Haben Sie versucht, Mono in C # anstelle von Pluszeichen oder C umzuschreiben?

- Die Idee klingt gut, würde aber unrealistische Ressourcen erfordern, und wir haben hier einige Fortschritte erzielt. Das .NET Core-Team hat eine solche Stufe von C # und .NET erreicht, dass der positive Code durch C # ersetzt wird, um kein Dampfbad mit plattformübergreifender Leistung zu nehmen und gleichzeitig die Leistung nicht zu verlieren. Ein aktuelles Beispiel ist die Übersetzung der Implementierung des Parsens und Konvertierens numerischer Typen, und die gesamte Dezimalzahl wurde in C # neu geschrieben. Das freut mich sehr und vereinfacht die Arbeit der Codemigration erheblich.

Über Garbage Collector


- Ich habe den .NET Core GC gesehen, der Kindern Angst macht, weil er in C ++ eineinhalb Megabyte Quelle ist! Eineinhalb Megabyte, Karl! So viele Bücher ?!

- Ja, ja, während 47 Mitwirkende laut Github in dieser Datei vermerkt waren. Ich bin kein Garbage Collector-Spezialist, aber im Allgemeinen hat GC eine ziemlich allgemeine Theorie wie den Mark-n-Sweep-Algorithmus, der durch Generationen kompliziert wird und versucht, die vollständigen Stopps der Welt zu vermeiden und alles parallel zum Haupt-Thread der Ausführung zu tun.

- Haben Sie Plugins oder die Möglichkeit, den Garbage Collector zu ändern, oder ist es eines?

- In Mono gibt es mehrere Implementierungen, und in .NET Core haben wir kürzlich eine öffentliche API erstellt, mit der Sie einige Header verwenden, Ihre eigene HZ schreiben und mit einer beliebigen Anwendung einer Umgebungsvariablen verbinden können. Als Beispiel gibt es einen Artikel zum Schreiben von ZeroGC für .NET Core. In der Welt der Container, in der es nicht erforderlich ist, Müll zu entfernen, kann dies relevant sein. Im Allgemeinen ermöglicht dies beispielsweise jemandem, die aktuelle Implementierung so weit wie möglich für beispielsweise einen Spielentwickler zu optimieren, sodass das Stoppen der Welt und das Durchlaufen aller Objekte beispielsweise kein FPS-Fieber verursacht oder den Speicherverbrauch optimiert. Meiner Meinung nach haben die Jungs von Samsung dies getan für Tizen ein paar Modifikationen am GC.

- Die Tatsache, dass Microsoft die vollständige Kontrolle über alles losgelassen hat, ist gut, da GC und JIT ein sehr gutes Steuerungswerkzeug sind.

- Ja. Schauen Sie sich die .NET Foundation an - es ist nicht nur Microsoft. Dort würden Google, Red Hat, Samsung, Intel im Allgemeinen alle Unternehmen, die früher anscheinend nicht neben Microsoft standen. Es sei denn, Apple fehlt.

Informationen zur IDE-Unterstützung


- Über die IDE: Wie gut ist die Optimierung, der Compiler und die IDE-Unterstützung? Jetzt gibt es alle möglichen Dinge wie Swift, bei denen der Compiler nur sehr wenige Möglichkeiten bietet, die interne Struktur, den Cache und etwas anderes zu überprüfen. Und das ist endloser Schmerz, denn wenn Sie Ihre eigenen Einstellungen vornehmen, müssen Sie die ganze Welt neu erfinden. Wie gut ist das mit Mono? Hast du eine eigene IDE?

- Der C # -Compiler Roslyn wurde ursprünglich nicht nur als C # -Compiler in IL geschrieben, sondern auch als IDE-Backend und -Analysator. Er kann sogar fehlerhaften Code verarbeiten. Sie können einfach einige Ansichten anzeigen und etwas basierend auf der Ausgabe tun, und er wird direkt sagen: "Zeigen Sie mir das Menü dort", "Refactoring anbieten", "Hier haben Sie eine Vorschau der Änderungen" usw. "Hervorheben, dem Benutzer Refactoring anbieten. “ Mit diesem Compiler können Sie Ihre IDE direkt erstellen.

Tatsächlich implementieren Sie nur eine Reihe von Schnittstellen für Ihre GUI, und Sie haben bereits eine IDE, die eine große Anzahl von Refactoring und dergleichen unterstützt.

Im Allgemeinen bieten viele moderne Sprachen AST, einen abstrakten Baum von Code-Ausdrücken. Zum Beispiel ermöglicht Clang das Abrufen eines abstrakten Baums aus dem Plus-Code. Übrigens verwenden wir diese Funktion, um C # -Bindungen für C ++ - und Objective-C-Code zu generieren.

- Haben Sie versucht, Visual Studio Code für irgendetwas zu verwenden?

- Nun, ich würde sagen, dass dies mein grundlegendstes Werkzeug ist.

- Angenommen, der Typ möchte das Mono-Repository öffnen und aufhängen. Was braucht er dafür?

- Öffnen Sie unter Windows einfach die Lösung der Laufzeit und die Lösung des BTSL und erstellen Sie beide. Dank der effizienten Parallelisierung sollte msbuild in etwa 5 Minuten fertig sein. Unter macOS und Linux wird der übliche Ansatz über Makefiles verwendet.

Über die Erstellung von Berichten und ein paar Spoilern


- Sie kommen mit dem Bericht zu DotNext, aber worum geht es?

- Mein Bericht wird eine Reihe interessanter Beispiele für Mikrooptimierungen enthalten, die in .NET Core von Entwicklern und Mitwirkenden von Drittanbietern angewendet werden. Ich denke, dies kann auch für angewandte Programmierer nützlich sein. Ich werde auch auf erfolglose Beispiele achten, um etwas zu optimieren, zum Beispiel wenn Mitwirkende einen bestimmten Fall optimieren möchten, es sich jedoch in anderen als seitlich in Form von Regression herausstellt. Separat wird es ein Dutzend Folien auf der neuen SIMD-API geben.

Die Jungs von Intel und die Microsoft-Jungs haben in C # eine Low-Level-API für SIMD herausgebracht, mit der Sie ultraschnelle Algorithmen schreiben können, ohne sich auf den Compiler verlassen zu müssen, der, wie viele Leute denken, alles selbst optimieren und vektorisieren kann - das ist nicht der Fall.

- Im allgemeinen Fall ist dies theoretisch unmöglich.

- Ja, nirgendwo kann man sich von der unabhängigen Einfügung von Intrinsics lösen. Ich bezweifle, dass man in jeder Sprache die Multiplikation oder Transposition von Matrizen auf einfachen Typen beschreiben und erwarten kann, dass der Compiler die effektivsten SSE / AVX-Anweisungen ausgibt. Übrigens habe ich diese C # -Internics bereits in .NET Core angewendet, um System.Numerics.Matrix mithilfe von SSE zu optimieren, und die GetHexDigits-Funktion mithilfe von Lzcnt optimiert. Sie können es als Beispiel für die Verwendung der API in Ihren Projekten verwenden.

- Wenn Leute kommen, die etwas Kernhaftes entwickeln, kommen Leute, die auch daran interessiert sind, daran teilzunehmen. Gibt es einen Neuling Weg?
Jeder erstmalige Mitwirkende erhält viel Aufmerksamkeit und Hilfe. Viele einfache Aufgaben oder Fehler, die kein umfangreiches Wissen und hohe Prioritäten erfordern, können auf GitHub mit einem speziellen Label gekennzeichnet werden - „Up-for-Grabs“ oder „Gute erste Ausgabe“.

- Sie können zum Repository gehen, Probleme anhand dieser Tags finden und eine Person auswählen, die dem Geist nahe steht. Bei einigen Aufgaben geht es beispielsweise darum, einige Codeteile mit Tests zu versehen. Die Abdeckung durch Tests zu erhöhen, ist nur die perfekte erste Aufgabe. Ein guter Weg ist auch, etwas zu vergleichen, es mit anderen Laufzeiten zu vergleichen und herauszufinden, warum dieser oder jener Code langsamer ist als in .NET 4.x, zum Beispiel string.GetHashCode. Beim Benchmarking gibt es eine große Anzahl von Reden und Blog-Posts von Andrei Akinshin und Adam Sitnik über ein sehr praktisches Tool - BenchmarkDotNet, das Ihnen mit einer einfachen Handbewegung die Geschwindigkeit der Codeausführung mit einem Attribut anzeigt, es mit anderen Laufzeiten vergleicht, über Speicher erzählt und Assembler-Code anzeigt.

Das heißt, Die Mindestaktion besteht darin, alle Pull-Anfragen und -Aufgaben zu durchsuchen, Personen wie Matt Waren und Ben Adams auf Twitter zu abonnieren, die Kanäle corefx und coreclr auf Twitter aufzurufen und die BenchmarkDotNet-Dokumentation zu lesen.

- Ja. Ich habe jetzt das Up-for-Grabs-Tag gefiltert. Hier gibt es ungefähr 600 Probleme, einige davon ohne Kommentar, und Sie können sie übernehmen.

- Ja, das stimmt. In jüngerer Zeit führten sie einen Hackathon für das .NET Core-Team durch. Sie teilten ein paar Dutzend Probleme zu, und an einem Tag mussten sie repariert werden und einen Preis dafür bekommen.

- Es ist ausgezeichnet. Er hat viele interessante Dinge erzählt, jetzt möchte ich versuchen, ein Problem selbst zu lösen. Richtig, ich kenne C # nicht, das ist das Problem.

- C #, wie ich glauben möchte, eine ziemlich vorhersehbare Sprache, trotz der Menge an Zucker und Erfahrung in Java oder C ++. Ich denke, Sie können sogar zur Laufzeit etwas ziemlich schnell optimieren, Erfahrung in anderen Sprachen wird Ihnen sogar helfen auf Dinge von der anderen Seite.

- Ich schaue mir das .NET Core-Repository an und es sieht sehr anständig aus. Und die Leute kommunizieren wirklich in den Kommentaren, Diskussionen finden direkt statt.

- Ja, ziemlich aktiv. Es gibt 100 und 200 Kommentare. Und Sie können aus der Basisbibliothek der Klassen lernen, es gibt eine Menge interessanter Aufgaben, die jeder übernehmen kann.

- Vielen Dank für die Antworten! Treffen Sie mich bei DotNext.

Diesmal ist eine Minute Werbung ungewöhnlich, denn während wir das Interview vorbereiteten, gingen die Konferenzkarten aus. Möchten Sie die Berichte sehen und hatten keine Zeit, ein Ticket zu kaufen? Live-Streaming ist weiterhin auf der Website verfügbar.

Wenn Sie Fragen haben oder einen unglaublichen Wunsch haben, DotNext 2018 Moskau persönlich zu besuchen, schreiben Sie uns an tickets@dotnext.ru (möglicherweise gibt jemand das Ticket zurück und wir können Ihnen helfen).

Source: https://habr.com/ru/post/de430048/


All Articles