J'ai récemment eu la chance de discuter avec Chris Bacon, qui a écrit DotNetAnywhere (une version alternative de .NET Runtime), et j'ai remarqué avec esprit:
... vous êtes probablement l'un des rares à avoir créé leur propre runtime .NET, ce qui est génial!
si nous excluons ceux qui ont un salaire, c'est-à-dire Ingénieurs Microsoft / Mono / Xamarin, il y en a très peu.

Il s'agit d'une traduction de Matt Warren ( A History of .NET Runtimes ). Afin de ne pas republier, je laisserai tel quel
Et puis j'ai pensé: combien d'exécutions .NET totales existent? Tout d'abord, j'ai fait ma propre liste, puis j'ai connecté une équipe de chercheurs très bien payés - mes abonnés - à ce cas:
Pour cet article, par le runtime .NET, je veux dire tout ce qui est implémenté sur la base de la norme ECMA-335 pour .NET (pour plus d'informations, voir ici ). Je ne sais pas s'il existe une définition plus précise ou un moyen de confirmer officiellement la conformité, mais dans la pratique, cela signifie que le runtime prend en charge les fichiers .NET exe / dll créés par n'importe quel compilateur C # / F # / VB.NET.
Dès que la liste était prête, je suis monté sur Wikipedia (voir la liste des sources). Le résultat est la séquence chronologique suivante:

Créateur de chronologie
(Pour la version interactive suivez le lien)
Si j'ai raté des runtimes, faites le moi savoir.
Pour faciliter la perception de la chronologie, j'ai placé chaque médium dans l'une des catégories suivantes:
- Cadres Microsoft .NET
- Autres Runtimes Microsoft
- Runtimes Mono / Xamarin
- Exécutions de compilation AOT
- Projets communautaires
- Projets de recherche
Le reste de l'article est consacré à une description détaillée des différents temps d'exécution. Pourquoi ils sont apparus, ce qu'ils peuvent et pourquoi les comparer.
Cadres Microsoft .NET
Le .NET Framework original de Microsoft est apparu à la fin des années 90 et n'est devenu que plus efficace depuis lors. Récemment, la société a quelque peu changé de cap en annonçant la sortie du framework .NET Core, qui se distingue par le code multiplateforme et open source. De plus, en développant la spécification .NET Standard, Microsoft a fourni l'interopérabilité entre les environnements d'exécution.
La spécification .NET Standard permet le partage de code. Il définit l'ensemble des API qui doivent être disponibles dans toutes les implémentations .NET pour se conformer à la norme. Cela garantit l'uniformité de toutes les exécutions .NET et empêche la fragmentation future.
Une petite digression: si vous voulez en savoir plus sur l'histoire de .NET, je vous recommande d' écouter Anders Halesberg ou de regarder un discours de Richard Campbell - c'est un conteur vraiment cool.
(Un podcast est également disponible . En outre, Campbell écrit un livre sur le même sujet . Si vous souhaitez en savoir plus sur l'historique de développement de l'ensemble de l'écosystème .NET, et pas seulement sur les temps d'exécution, consultez la page Légendes de .NET ).
Autres Runtimes Microsoft
Outre le noyau .NET Framework pour une utilisation généralisée, Microsoft a publié d'autres versions de l'environnement à des fins spéciales.
.NET Compact Framework
Les infrastructures Compact (.NET CF) et Micro (.NET MF) étaient des tentatives de création de versions d'exécution plus courtes pour les appareils à ressources limitées. Par exemple, .NET CF:
... conçu pour les appareils mobiles ou embarqués avec une quantité limitée de ressources, tels que les PDA, les téléphones mobiles, les contrôleurs industriels, les décodeurs, etc. Le framework .NET Compact utilise certaines des bibliothèques de la même classe que la version complète de .NET, ainsi que plusieurs bibliothèques créées spécifiquement pour les appareils mobiles, telles que les contrôles .NET Compact. Cependant, les bibliothèques ne sont pas une copie exacte de celles utilisées dans le .NET Framework. Ils sont réduits pour occuper moins d'espace.
.NET Micro Framework
Le framework .NET MF est encore plus petit et:
... est pour les appareils avec une quantité limitée de ressources qui ont au moins 256 Ko de mémoire et 64 Ko de RAM. Il comprend une version réduite du .NET CLR et prend en charge le développement C # et Visual Basic .NET, ainsi que le débogage (dans l'émulateur ou le matériel) à l'aide de Microsoft Visual Studio. NETMF implémente un ensemble de bibliothèques de base .NET (environ 70 classes et 420 méthodes). Des bibliothèques spéciales pour les applications intégrées ont été ajoutées. Il s'agit d'un logiciel open source gratuit publié sous la licence Apache 2.0.
Pour ceux qui veulent essayer le framework en action, Scott Hanselman a écrit un excellent guide sur le .NET Micro Framework - Hardware for Software People .
Silverlight
Malgré le fait que la plate-forme soit en mode support (ou même morte / se déplaçant vers le coucher du soleil, selon votre point de vue), il est intéressant de revenir à l'annonce d'origine et de voir à quoi Silverlight était destiné:
Silverlight est un module d'extension multi-plateforme et multi-navigateur conçu pour créer des applications Internet riches pour les navigateurs. Les pré-versions publiées cette semaine prennent en charge Firefox, IE et Safari sur Mac et Windows.
En 2007, Silverlight 1.0 a implémenté les fonctionnalités suivantes (la plateforme a même fonctionné sur Linux):
- prise en charge des codecs intégrés pour lire des fichiers vidéo VC-1 et WMV, ainsi que des fichiers audio aux formats MP3 et WMA dans un navigateur ...;
- Silverlight prend en charge la possibilité de télécharger et de lire progressivement du contenu multimédia à partir de n'importe quel serveur Web ...;
- Silverlight prend également en charge en option le streaming multimédia intégré ...;
- en utilisant Silverlight, vous pouvez créer des interfaces utilisateur et des animations multifonctionnelles, combiner des graphiques vectoriels et du HTML pour créer un contenu attrayant ...;
- Silverlight facilite la création de contenu vidéo interactif riche ...
De plus, comme suggéré dans les commentaires, Silverlight était sur le Symbian S60
Runtimes Mono / Xamarin
Mono est apparu à la suite de tentatives de Miguel de Icaz et d'autres développeurs pour faire fonctionner .NET sur Linux (de l' histoire ancienne de Mono ):
Peu importe qui a été le premier, car je pense que Mono est un moyen d'arriver à une fin: une technologie qui aide Linux à prendre pied sur les ordinateurs de bureau.
Le même article décrit comment tout a commencé:
Quant à Mono, les événements se sont déroulés approximativement comme suit.
Dès que la documentation .NET est sortie en décembre 2000, je me suis intéressée à cette technologie et j'ai commencé à l'étudier, comme tout le monde, à partir de l'interpréteur de bytecode. Cependant, j'ai rapidement rencontré un problème - le manque de spécifications pour les métadonnées .
Les dernières modifications apportées aux premières sources de machines virtuelles sont sorties le 22 janvier 2001. À cette époque, j'ai commencé à écrire des messages à l'aide de la liste de diffusion .NET et à demander les informations manquantes sur le format de fichier de métadonnées.
...
À la même époque, Sam Ruby tentait de convaincre les membres du comité ECMA de publier une description du format de fichier binaire, qui ne faisait pas partie de leurs plans. Je ne sais pas comment tout s'est développé, mais en avril 2001, l'ECMA a publié une description du format de fichier.
Au fil du temps, Mono ( maintenant Xamarin ) s'est étendu à d'autres plates-formes. Le cadre fonctionne sur Android et iOS / Mac. En février 2016, Microsoft a acquis Xamarin. Il convient de rappeler la collaboration de longue date entre Mono / Xamarin et Unity , visant à fournir un support pour C # dans Unity . Dans le même temps, Unity est désormais membre de la Fondation .NET.
Exécutions de compilation AOT
J'ai pris de tels environnements dans une catégorie distincte, car traditionnellement .NET utilisait la compilation JIT , mais avec le temps, plus d'implémentations avec AOT sont apparues.
Pour autant que je sache, le premier était le framework Mono, dans lequel la compilation AOT est apparue en 2006. En outre, Microsoft a récemment publié le .NET Native, et ils travaillent actuellement sur CoreRT , un environnement d'exécution .NET optimisé pour la compilation AOT.
Projets communautaires
Cependant, tous les environnements d'exécution .NET n'ont pas été développés par Microsoft ou par des sociétés qu'il a par la suite achetées. Il y a des projets mis en œuvre par les communautés.
- Le plus ancien d'entre eux est DotGNU Portable.NET . Son développement a commencé simultanément avec Mono dans le but de «créer un ensemble d'outils gratuits pour compiler et exécuter des applications dans le cadre de la CLI…».
- Deuxièmement, je nommerai DotNetAnywhere , développé par une seule personne, Chris Bacon. DotNetAnywhere est connu pour servir de runtime initial pour le projet Blazor. C'est également une excellente occasion de jeter un coup d'œil à ce qui constitue un runtime compatible .NET sans avoir à parcourir les millions de lignes de code qui composent CoreCLR !
- Vient ensuite CosmosOS ( un projet GitHub ), qui n'est pas seulement un runtime .NET, mais un système d'exploitation géré. Si vous voulez en savoir plus, je vous conseille de lire cette rubrique FAQ ou de regarder «sous le capot» . SharpOS est une autre tentative similaire.
- Enfin, je suis récemment tombé sur CrossNet . Ce runtime "analyse les assemblys .NET et génère du code C ++ non managé qui peut être compilé par n'importe quel compilateur C ++." Pour en savoir plus, consultez la documentation et l'exemple de code généré.
Projets de recherche
Passons maintenant aux runtimes .NET très peu connus. Il s'agit de projets de recherche Microsoft lancés afin de voir dans quelle mesure les fonctionnalités de l'environnement d'exécution géré peuvent être étendues et quelles tâches peuvent être résolues avec son aide. Certains résultats de recherche sont apparus dans les implémentations commerciales de l'environnement .NET, par exemple Span <T> est né du projet Midori .
Une implémentation de l'interface CLI (.NET Framework) de Microsoft, dans laquelle le code source est disponible sous la licence Shared Source. Bien que SSCLI ne soit pas adapté à une utilisation commerciale en raison des spécificités de la licence, avec son aide, les programmeurs peuvent analyser les fonctionnalités d'implémentation de nombreuses bibliothèques .NET et créer des versions modifiées de la CLI. Microsoft fournit la CLI de source partagée en tant que CLI de référence pédagogique.
Fait intéressant, avec la sortie de Rotor, la société a pu publier le projet Gyro , qui donne une idée de la façon dont les génériques sont apparus dans le runtime .NET .
Midori est le nom de code d'un système d'exploitation de code managé développé par Microsoft en collaboration avec Microsoft Research. Il a été signalé qu'il pourrait devenir une implémentation commerciale du système d'exploitation Singularity, un projet de recherche lancé en 2003 pour créer un système d'exploitation très fiable dans lequel le noyau, les pilotes de périphérique et les applications sont constitués de code géré. Il a été conçu pour le calcul parallèle et pourrait exécuter un programme distribué sur plusieurs nœuds simultanément. Il a également implémenté un modèle de sécurité basé sur l'exécution d'applications dans un environnement isolé. Microsoft a suggéré plusieurs façons de migrer de Windows vers Midori. Les travaux sur le système d'exploitation ont été interrompus en 2015, bien que de nombreuses idées mises en œuvre dans ce système soient tombées dans d'autres projets Microsoft.
Apparemment, la plupart des idées du projet Midori sont revenues dans le .NET Framework. Vous pouvez en savoir plus à ce sujet avec Joe Duffy dans une série d'articles sur Midori :
- Un conte de trois sécurités
- Objets en tant que capacités sécurisées
- Tout asynchrone
- Code natif sûr
- Le modèle d'erreur
- Culture de la performance
- 15 ans de simultanéité
Singularity est un système d'exploitation expérimental développé par Microsoft Research entre 2003 et 2010. Il était censé être un système d'exploitation très fiable dans lequel le noyau, les pilotes de périphérique et les applications sont constitués de code managé. La sécurité interne utilise la sécurité de type au lieu de la protection de la mémoire matérielle.
Et le dernier mais non le moins important environnement est Redhawk :
Nom de code de la version expérimentale et minimale du runtime de code managé qui est devenu CoreRT.
Références aux sources
Voici les articles de Wikipédia que j'ai utilisés pour créer l'échelle chronologique:
Plus d'options trouvées
Net60
Dans les commentaires, bmforce a suggéré qu'il y avait une autre plate-forme, Net60. Il n'y a pas beaucoup d'informations à ce sujet, mais a réussi à trouver une mention sur le forum + article sur CodeGuru :
Le .NET Compact Framework pour Symbian S60 3rd est enfin arrivé!
Par conséquent, vous pouvez programmer pour Symbian dans n'importe quel langage de Visual studio 2005. (Visual Basic, Visual C #, Visual C ++). DotNet (net60) lui-même est joint au message, vous devez le signer et l'installer sur le téléphone. Soit dit en passant, il peut exécuter des fichiers .exe écrits sur Windows Mobile .NET CF à partir de son propre dossier!
Clair de lune
Il n'y a aucune mention de Moonlight, qui est basé sur la version Mono - Opensource de Silverlight:
Moonlight est une implémentation open source de Silverlight, conçue principalement pour Linux et d'autres systèmes d'exploitation Unix / X11. La dernière version de Moonlight (Moonlight 4 Preview 1) prend en charge le jeu de fonctionnalités de base de Silverlight 3, ainsi que la compatibilité avec Silverlight 4.
Blazor
Le nouveau projet Blazor , qui a toutes les chances de réussir: .NET for Web Assembly, n'est pas non plus mentionné. Il est utilisé, par exemple, dans le projet Try .NET , une boîte à outils pour créer des exemples de code .NET pouvant être exécutés dans un navigateur.
PageFX
Cela me semble absolument fantastique, mais l'un des développeurs du projet PageFX m'a frappé et a laissé tomber le lien vers le référentiel où le traducteur de .NET CIL vers le bytecode Flash est stocké. C'est génial :) L'auteur de ce projet est @todysh
Plus de traductions d'articles de Matt Warren