"Il vous suffit de générer soigneusement l'IR LLVM." Egor Bogatov à propos de Mono et .NET Core

Egor Bogatov est un développeur Microsoft de l'équipe Mono qui travaille sur Mono et l'intègre à .NET Core. Nous avons discuté avec lui de la façon de travailler au sein de Xamarin et de Microsoft, de l'amour du développement de jeux. Nous avons expliqué pourquoi les disques SSD sont le meilleur ami des développeurs et l'utilité des présentations de conférence n'est pas toujours en corrélation avec leur complexité. Comme toujours, l'entretien est mené par Oleg Chirukhin ( olegchir ) du groupe JUG.ru.


Présentation: à propos des démos chiffrées et comment entrer dans Xamarin


- Disons à Habr qui tu es, ce que tu fais.

- Je suis développeur, je travaille dans la pile .NET depuis une dizaine d'années, j'ai un peu travaillé en Java et écrit un peu sous Android.

Il a travaillé dans différentes entreprises: en commençant par l'externalisation, puis est passé à l'épicerie, comme Viber et Playtika. Ensuite, j'ai un peu freelancé, y compris en Java, et je suis allé travailler à Xamarin.

- Comment y es-tu arrivé?

- Je suis accro à .NET et Mono depuis très longtemps. J'aimais C #, mais je n'aimais pas la politique de Microsoft, qui la liait fortement à Windows. Par conséquent, j'ai suivi la mise en œuvre multiplateforme depuis sa création.

J'ai surveillé activement Mono, Xamarin, dès qu'il est apparu: j'ai aimé le concept lui-même. Participé à leurs compétitions et plusieurs fois pris la deuxième place. J'ai été remarqué et proposé de travailler en tant qu'entrepreneur, et Miguel de Icas s'est écrit lui-même, ce qui m'a complètement surpris, car pour moi, c'était une légende.

- Par où as-tu commencé?

- Miguel m'a invité à écrire une démo, qui comprenait un chat avec un cryptage de bout en bout pour les plates-formes mobiles. J'avais de l'expérience avec les applications de chat et j'aimais le sujet du cryptage, donc au début, ils m'ont emmené au backend, mais j'ai dit que je pouvais développer pour Android. Après cela, j'ai été engagé dans divers projets tiers Xamarin - je n'ai pas non plus été autorisé à accéder aux composants d'exécution.

Miguel a de nombreux projets intéressants. Parfois, il me semble qu'il s'agit d'un groupe de personnes sous le même nom. Eh bien, une personne ne peut pas tâtonner dans tout, répondre à tout le monde, être conscient de tout.

Plusieurs fois, j'ai fait une démo pour lui pour de grandes conférences telles que Xamarin Evolve et MS Build - c'est la plus grande conférence de développeurs chez Microsoft.

Et quelle était leur signification commerciale de ces démos, pourquoi sont-elles nécessaires?

Juste de la publicité publicitaire auprès de clients potentiels. Par exemple, l'une des démos a montré un exemple de la façon dont vous pouvez facilement intégrer la visualisation 3D dans une application régulière sur n'importe quelle plate-forme, et plusieurs entreprises sérieuses étaient intéressées par cette fonctionnalité.

A propos du travail: les tâches et l'éternel conflit "à distance ou au bureau"


"Maintenant qu'est-ce que tu fais?"

- J'ai été transféré à l'équipe d'exécution, c'est-à-dire directement à Mono. Ma principale responsabilité est de fusionner Mono et .NET Core, c'est-à-dire de se situer entre deux runtimes. Cela me permet de mieux comprendre .NET, car je suis tous ces types, en commençant par le plus basique et en terminant par le complexe, la recherche et la réflexion approfondie. En deux ans, nous avons réussi à constituer une bonne base d'expérience et à connaître tous les développeurs clés.

"Travaillez-vous à domicile?"

- Nous avons un petit bureau Microsoft à Minsk. J'y visite périodiquement, mais surtout depuis chez moi, je travaille.

- Et quoi de mieux: travailler au bureau ou à la maison?

- Pour travailler à la maison, il faut beaucoup d'autodiscipline. J'essaie périodiquement de combiner cela avec les voyages, mais cela ne fonctionne pas très efficacement. Par exemple, j'ai besoin d'un ordinateur de bureau sain à part entière avec trois moniteurs. Sur un ordinateur portable, je ne peux pas travailler confortablement.

- Avez-vous besoin de cela pour les moniteurs ou la puissance de l'ordinateur est-elle importante?

- Et pour les moniteurs, et pour l'alimentation. J'ai périodiquement besoin de compiler différents runtimes: mono, coreclr, corert, tweak machines virtuelles, etc. Pour ce faire, j'ai besoin d'un processeur haut de gamme à part entière, et non d'un malentendu coupé par TPD, et, bien sûr, d'un SSD rapide.

- Autrement dit, si vous voulez travailler sur le code Mono, avez-vous besoin d'un ordinateur normal?

- Mono inclut le code source de .NET et .NET Core sous forme de sous-modules, donc à la fin il y a un grand nombre de fichiers qui doivent être déplacés rapidement d'une manière ou d'une autre, donc la chose la plus importante est un SSD rapide. Nous devons prendre quelque chose du Samsung 960 Pro et supérieur. Le goulot d'étranglement est toujours en IO.

- Décrivez votre journée de travail

- Je travaille à distance depuis Minsk. La majeure partie de mon équipe est aux États-Unis, bien qu'il y ait plusieurs personnes en Europe, il y a des gens au Japon, en Australie, même en Afrique. Une telle équipe distribuée. Nous communiquons principalement à Slack, organisons des rassemblements plusieurs fois par semaine. Nous nous réunissons périodiquement à Boston ou Redmond.

Les tâches sont pour la plupart assez abstraites. Par exemple, les types de port d'un espace de noms spécifique. Je peux prendre quelque chose en parallèle, aller sur GitHub et corriger quelques bugs. Je fais régulièrement quelque chose pour .NET Core - j'essaie d'optimiser ou de nettoyer quelque chose.

- Et d'où viennent les tâches, comment est-ce organisé? Un arriéré sans fin?

- Les tâches sont lancées par les utilisateurs et les chefs d'équipe, une fois par mois, nous avons une semaine de correction de bogues: nous ne passons qu'une semaine à corriger les bogues, vous jetez d'autres choses.

Le reste du temps, il est également conseillé de ne pas oublier les bogues, mais vous devez respecter les principaux objectifs, par exemple, mon objectif est de porter les principaux types de mscorlib et de rendre Mono / Xamarin conforme à la norme NET 2.1. Le portage de type ressemble généralement à jeter l'ancienne implémentation et à la remplacer par un lien vers le code dans le sous-module .NET Core avec adaptation.

À propos de Microsoft, Axes et Betrayal


- Eh bien, oui, la licence le permet. Et en effet, vous êtes dans la même entreprise.

- Oui, c'est vrai. Nous l'avons déjà fait auparavant. Mono faisait partie de certaines distributions, je pense qu'Ubuntu et GNOME avaient même Mono. Miguel a été informé qu'il laisserait tout le monde au monastère.

"Oui, je me souviens, Stallman l'a traité de traître."

«Ils avaient peur que les avocats de Microsoft viennent à tout moment et poursuivent tout le monde, ce que, heureusement, Microsoft n'a pas fait.

- Eh bien, oui, Microsoft a fait exactement le contraire - il a commencé à utiliser Linux à la maison.

- Microsoft est maintenant complètement différent avec le nouveau PDG, l'accent mis sur les technologies cloud nous a conduits dans le monde de l'open source et tout ce à quoi nous ne pouvions pas penser auparavant. Il est maintenant possible de télécharger Ubuntu WSL à partir du Marketplace en un seul clic, de déployer MS SQL Server sur Linux et de développer sous .NET depuis sous macOS.

- Autrement dit, vous pouvez écrire du code en toute sécurité sous des licences ouvertes et personne ne dira rien?

"Oui, bien sûr." Naturellement, avant de mettre un projet interne en open source, nous avons besoin d'un peu de bureaucratie, mais en général, je n'ai rencontré aucune interdiction d'utiliser quoi que ce soit.

- Vous avez des tâches qui nécessitent trois plates-formes à la fois?

- J'ai un ensemble complet: un ordinateur Windows, un MacBook avec macOS et un ordinateur portable avec Fedora. Aussi un tas de machines virtuelles, y compris WSL. Le plus souvent, les bogues sont divisés en deux types - Windows et non Windows, qui jouent à la fois sur macOS et Linux.

Comprendre .NET Core et Mono


- Quelles sont les directions que vous aimez et peuvent-elles être développées dans .NET Core et dans Mono?

- Personnellement, j'aime beaucoup l'accent mis sur la performance et la multiplateforme. Il améliore constamment les performances dans les conditions de combat, de Bing aux benchmarks publics tels que TechEmpower, dans lequel .NET Core fonctionne très bien à égalité avec les solutions basées sur Go, Java et C ++. Beaucoup de gens ont encore un stéréotype sur .NET en tant que technologies Windows uniquement avec une machine virtuelle de freinage - nous combattons avec succès ce stéréotype.
Notre équipe porte une grande attention aux scénarios AOT et à l'utilisation de LLVM comme backend pour générer du code machine. LLVM est un outil très puissant avec un grand nombre d'optimisations. Il suffit de générer soigneusement LLVM IR avec un nombre minimum de points de sécurité, afin de ne pas interférer avec ces optimisations. Personnellement, j'ai récemment écrit mon simple passage de transformation LLVM.

Il est également encourageant de constater que C # et .NET sont courants sur un pied d'égalité avec C ++ dans le développement de jeux, grâce à Unity et à d'autres moteurs dotés de scripts C #.
Il existe une direction potentiellement intéressante - la compilation de C # dans Web Assembly pour le navigateur.

- Je ne sais pas comment .NET, mais parfois je dois faire glisser un tas de bibliothèques standard pour la compilation. En Java, vous exécutez Hello World et vous avez 2000 classes chargées. Un grand nombre de mégaoctets sera chargé dans le navigateur. Qu'en pensez-vous?

- La taille minimale d'un runtime Mono avec une bibliothèque de base est d'environ deux mégaoctets. Mais même Apple a ce problème: les applications écrites en Swift font glisser chacun de ses runtimes. Alors que la technologie Mono-wasm est brute et basée sur l'exécution, qui a été compilée par AOT dans l'interpréteur WASM + pour le code utilisateur. Soit dit en passant, maintenant nous réécrivons le runtime de C en C ++, j'espère que cela n'affecte pas la taille à la fin.

- Avez-vous essayé de réécrire Mono en C # au lieu d'avantages ou de C?

- L'idée semble bonne, mais elle nécessiterait des ressources irréalistes et nous avons certains progrès à cet égard. L'équipe .NET Core a atteint un tel niveau de C # et .NET que le code positif est remplacé par C # afin de ne pas prendre un bain de vapeur avec des performances multiplateformes et en même temps, il ne perdra pas ses performances. Un exemple récent est la traduction de l'implémentation de l'analyse et de la conversion des types numériques et l'intégralité du Decimal a été réécrit en C #. Cela me rend très heureux et simplifie considérablement le travail de migration de code.

À propos de Garbage Collector


- J'ai vu le GC .NET Core qui fait peur aux enfants, car c'est un et demi mégaoctets de source en C ++! Un et demi mégaoctets, Karl! C'est combien de livres?!

- Oui, oui, alors que 47 contributeurs ont été notés dans ce fichier selon le github. Je ne suis pas un expert de Garbage Collector, mais en général, GC a une théorie assez générale telle que l'algorithme Mark-n-Sweep, qui est compliqué par les générations et tente d'éviter les arrêts complets du monde et de tout faire en parallèle avec le fil principal d'exécution.

- Avez-vous des plugins ou la possibilité de changer le Garbage Collector ou en est-il un?

- Dans Mono, il existe plusieurs implémentations, et dans .NET Core, nous avons récemment créé une API publique qui vous permet de prendre quelques en-têtes, d'écrire votre propre HZ et de le connecter à n'importe quelle application d'une variable d'environnement. Par exemple, il y a un article sur la façon d'écrire ZeroGC pour .NET Core. Dans le monde des conteneurs, où il n'est pas nécessaire de retirer les ordures, cela peut être pertinent. En général, cela permet à quelqu'un, par exemple, de prendre l'implémentation actuelle et de l'optimiser autant que possible pour, par exemple, un développeur de jeu, de sorte qu'arrêter le monde et parcourir tous les objets ne provoque pas de fièvre FPS, par exemple, ou d'optimiser la consommation de mémoire, à mon avis, les gars de Samsung l'ont fait pour Tizen quelques modifications au GC.

- Le fait que Microsoft ait abandonné le contrôle total sur tout est bon, car le GC et le JIT sont un très bon outil de contrôle.

- Oui. Regardez la .NET Foundation - ce n'est pas seulement Microsoft. Là, Google, Red Hat, Samsung, Intel, en général, toutes les entreprises qui auparavant, semble-t-il, ne seraient pas aux côtés de Microsoft. Sauf si Apple est manquant.

À propos du support IDE


- A propos de l'IDE: quelle est sa qualité dans le réglage, dans le compilateur et dans le support IDE? Maintenant, il y a toutes sortes de choses comme Swift, où le compilateur donne très peu d'occasions d'inspecter la structure interne, le cache, autre chose. Et c'est une douleur sans fin, car lorsque vous faites votre propre réglage, vous devez réinventer le monde entier. À quel point est-ce bon avec Mono? Avez-vous votre propre IDE?

- Le compilateur C # Roslyn a été initialement écrit non seulement comme un compilateur C # en IL, mais aussi comme un backend IDE et un analyseur, il peut même digérer le mauvais code. Vous pouvez simplement afficher quelques vues et faire quelque chose en fonction de sa sortie, et il dira directement: "Montrez-moi le menu là-bas", "proposez une refactorisation", "ici vous avez un aperçu des changements", etc. .. "surlignez, proposer une refactorisation à l'utilisateur. Autrement dit, ce compilateur vous permet directement de créer rapidement votre IDE.

En fait, vous venez d'implémenter un ensemble d'interfaces pour votre interface graphique et vous disposez déjà d'un IDE qui prend en charge un large ensemble de refactoring et autres.

En général, de nombreux langages modernes fournissent AST, un arbre abstrait d'expressions de code. Par exemple, Clang permet d'obtenir un arbre abstrait à partir du code plus, en passant, nous utilisons cette fonctionnalité pour générer des liaisons C # pour le code C ++ et Objective-C.

- Avez-vous essayé d'utiliser Visual Studio Code pour quelque chose?

- Eh bien, je dirais que c'est mon outil le plus élémentaire.

- Disons que le mec veut ouvrir le référentiel Mono et le bloquer. De quoi a-t-il besoin pour cela?

- Sous Windows, ouvrez simplement la solution du runtime et la solution du btsl et construisez les deux. Grâce à une parallélisation efficace, msbuild devrait le faire en environ 5 minutes.Sur macOS et Linux, l'approche habituelle via Makefiles est utilisée.

Sur la préparation des rapports et quelques spoilers


- Vous venez sur DotNext avec le rapport, mais de quoi s’agira-t-il?

- Mon rapport consistera en un ensemble d'exemples intéressants de microoptimisations appliquées dans .NET Core par des développeurs et des contributeurs tiers, qui, je pense, peuvent également être utiles pour les programmeurs appliqués. Je ferai également attention aux exemples infructueux pour optimiser quelque chose, par exemple, lorsque les contributeurs veulent optimiser un cas particulier, mais cela se révèle latéralement sous forme de régression dans d'autres. Séparément, il y aura une douzaine de diapositives sur la nouvelle API SIMD.

Les gars d'Intel ainsi que les gars de Microsoft ont sorti en C # une API de bas niveau pour SIMD, qui vous permet d'écrire des algorithmes ultra-rapides sans compter sur le compilateur, qui, comme beaucoup le pensent, sera en mesure d'optimiser et de vectoriser tout lui-même - ce n'est pas le cas.

- Dans le cas général, cela est théoriquement impossible.

- Oui, nulle part où échapper à l'insertion indépendante des intrinsèques. Je doute que dans n'importe quel langage, on puisse décrire la multiplication ou la transposition de matrices sur des types simples et attendre les instructions SSE / AVX les plus efficaces du compilateur pour les produire. Soit dit en passant, j'ai déjà appliqué ces intrinsèques C # dans .NET Core pour optimiser System.Numerics.Matrix à l'aide de SSE et optimisé la fonction GetHexDigits à l'aide de Lzcnt. Vous pouvez l'utiliser comme exemple d'utilisation de l'API dans vos projets.

- Lorsque des gens qui développent quelque chose de fondamental viennent, des gens qui sont également intéressés à y participer viennent. Y a-t-il un moyen pour les débutants?
Tout contributeur pour la première fois reçoit beaucoup d'attention et d'aide, de nombreuses tâches simples ou bogues qui ne nécessitent pas de connaissances approfondies et des priorités élevées peuvent être marqués avec une étiquette spéciale sur GitHub - «à gagner», ou «bon premier numéro».

- Vous pouvez aller dans le référentiel, trouver des problèmes par ces balises et choisir une personne proche dans l'esprit. Par exemple, plusieurs tâches consistent à couvrir certains morceaux de code avec des tests. Augmenter la couverture avec des tests n'est que la première tâche parfaite. Un autre moyen est également de comparer quelque chose, de le comparer avec d'autres runtimes et d'essayer de comprendre pourquoi tel ou tel code est plus lent qu'en .NET 4.x, par exemple string.GetHashCode. En ce qui concerne l'analyse comparative, il existe un grand nombre de discours et d'articles de blog d'Andrei Akinshin et d'Adam Sitnik sur un outil très pratique - BenchmarkDotNet, qui, d'un simple mouvement de la main, vous montrera la vitesse d'exécution du code avec un attribut, le comparera avec d'autres temps d'exécution, parlera de la mémoire et montrera le code assembleur.

C'est-à-dire l'ensemble d'actions minimum consiste à parcourir toutes les demandes et tâches d'extraction, à vous abonner à des gens comme Matt Waren et Ben Adams sur Twitter, à accéder aux canaux corefx et coreclr sur twitter et à lire la documentation de BenchmarkDotNet.

- Oui. J'ai maintenant filtré la balise up-for-grabs, il y a environ 600 problèmes ici, certains sans commentaire du tout et vous pouvez les prendre.

- Oui, c'est vrai. Plus récemment, ils ont organisé un hackathon pour l'équipe .NET Core. Ils ont attribué une douzaine de numéros, et en un jour ils ont dû être corrigés et obtenir un prix pour cela.

- C'est super. Il a dit beaucoup de choses intéressantes, maintenant je veux essayer de résoudre moi-même un problème. C'est vrai, je ne connais pas C #, c'est ça le problème.

- C #, comme je veux le croire, un langage assez prévisible malgré la quantité de sucre et ayant une expérience en Java ou C ++, je pense que vous pouvez même commencer à optimiser quelque chose assez rapidement en runtime, l'expérience dans d'autres langages vous aidera même sur les choses de l'autre côté.

- Je regarde le référentiel .NET Core et il a l'air très décent. Et les gens communiquent vraiment dans les commentaires, les discussions ont lieu directement.

- Oui, assez actif. Il y a 100 et 200 commentaires. Et vous pouvez apprendre de la bibliothèque de base des classes, il y a beaucoup de tâches intéressantes que n'importe qui peut entreprendre.

- Merci beaucoup pour les réponses! Retrouvez-moi à DotNext.

Cette fois, une minute de publicité sera inhabituelle, car pendant que nous préparions l'interview, les billets pour la conférence étaient épuisés. Vous voulez voir les rapports et vous n'avez pas eu le temps d'acheter un billet? La diffusion en direct est toujours disponible sur le site .

Si vous avez des questions ou un incroyable désir de visiter DotNext 2018 Moscou en personne, écrivez-nous à tickets@dotnext.ru (peut-être que quelqu'un vous rendra le billet et nous pouvons vous aider).

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


All Articles