Microsoft Roslyn vs. CodeDom

D’après un communiqué de presse publié hier sur InfoWorld concernant le nouveau Microsoft Roslyn :

L’avantage le plus évident de ce type de compilateur “déconstruit” est qu’il permet d’appeler l’intégralité du processus de compilation à partir d’applications .Net. Hejlsberg a présenté un programme C # qui transmettait quelques extraits de code au compilateur C # en tant que chaînes; le compilateur a renvoyé le code d’assembly IL résultant en tant qu’object, qui a ensuite été transmis au Common Language Runtime (CLR) pour exécution. Voilà! Avec Roslyn, C # permet à un langage dynamic de générer et d’appeler du code à l’exécution.

J’ai pu le faire depuis la sortie de .NET 4 avec CSharpCodeProvider.ComstackAssemblyFromSource que j’utilise en fait dans un projet ASP.Net écrit il y a un certain temps et qui fait exactement cela – permet à un utilisateur de saisir du code dans une zone de texte, de choisir assemblys / namespaces à référencer, puis exécutez et affichez la sortie de ce code à la volée pour tester le code de l’environnement en direct sur Windows Azure.

Est-ce que CodeDom partie de / un précurseur de Roslyn? Quel est l’avantage particulier de Roslyn sur CodeDom ?

Disclaimer : Je travaille pour Microsoft sur l’équipe de Roslyn.

CodeDom est un précurseur de Roslyn, mais n’est que marginalement lié. Essentiellement, CodeDom est un moyen simple et (un peu) indépendant du langage de générer du code qui a été ajouté dans .NET 1.0 pour prendre en charge les concepteurs (à la WinForms). CodeDom étant une tentative de fournir un modèle unifié capable de générer du code en C #, VB et dans d’autres langages, il manque de haute fidélité avec les langages qu’il prend en charge (c’est pourquoi vous ne pouvez pas créer une instruction switch avec CodeDom). CSharpCodeProvider.ComstackAssemblyFromSource est simplement une enveloppe autour de l’exécution de csc.exe.

Roslyn est un animal complètement différent. Il s’agit d’une réécriture complète des compilateurs C # et VB à l’aide du code managé – C # en C # et VB en VB (les versions de csc.exe et vbc.exe fournies aujourd’hui sont écrites en code natif). L’avantage de les construire en code managé est que les utilisateurs peuvent référencer les vrais compilateurs en tant que bibliothèques à partir d’applications .NET (aucun wrapper nécessaire).

Lors de la construction de chaque composant du pipeline de compilation, nous avons exposé les API publiques:

  • Analyseur -> API de l’arbre de syntaxe
  • Table des symboles / Importation de métadonnées -> API de symbole
  • Binder -> API de liaison et d’parsing de stream
  • Emetteur IL -> Emettre API

Roslyn peut être utilisé comme générateur de code source C # et VB sophistiqué, mais c’est là que se termine la similarité avec CodeDom. Les API du compilateur Roslyn peuvent être utilisées pour parsingr le code, effectuer une parsing sémantique, comstackr et évaluer le code de manière dynamic, etc.

En plus des compilateurs, l’équipe Roslyn reconstruit également les fonctionnalités Visual Studio C # et VB IDE par-dessus les API publiques du compilateur. Ainsi, les API du compilateur sont suffisamment riches pour générer les outils de conception Visual Studio, tels que IntelliSense et la refactorisation de la méthode d’extraction. En outre, au niveau des couches situées au-dessus du compilateur, Roslyn propose des services d’parsing de niveau supérieur ou de transformation de données. Par exemple, il existe des services de mise en forme du code utilisant les règles de mise en forme C # et VB, ou la recherche de toutes les références à un symbole particulier dans une solution.

En réalité, il n’y a pas qu’un avantage particulier de Roslyn sur CodeDom. Là où CodeDom répondait à un besoin de génération de code très spécifique, Roslyn s’attaque à l’ensemble de l’espace des outils linguistiques en fournissant un cadre permettant de créer pratiquement n’importe quel outil de langage C # ou VB auquel vous pouvez penser.

CodeDom vous permet de comstackr – mais cela ne vous donne pas la possibilité d’obtenir vraiment des informations sur le code lui-même (autres que les erreurs de compilation). Fondamentalement, c’est une boîte noire où vous dites “comstackr ceci” et qui dit “j’ai réussi” ou “j’ai échoué, voici quelques erreurs”.

Roslyn vous permet d’inspecter et de créer le code à la volée. Cela inclut des choses comme être capable de voir / inspecter les commentaires dans une partie du code source, des informations détaillées sur la structure complète, etc. Vous pouvez parcourir et obtenir l’arborescence complète de la source que vous transmettez à Roslyn et effectuer une parsing détaillée ou transformations sur elle.

Étant donné la richesse et la richesse des informations de syntaxe, vous disposez d’un contrôle et d’une flexibilité supplémentaires. C’est ainsi que l’exemple fonctionne, par exemple, qui copie un bloc de code C # et le colle en tant que code VB.NET. Avec Roslyn, vous pouvez faire plus que simplement comstackr – vous pouvez également manipuler le code proprement. Cela devrait rendre beaucoup plus simple la génération d’outils, car des choses comme les refactorings peuvent être faites très simplement car l’outillage comprend la syntaxe complète, y compris les méta-informations (comme les commentaires), et peut simplement fonctionner directement avec lui.

Je vois une grande différence: avec CodeDom, chaque fois que vous comstackz du C # ou du VB.NET, cela se produit hors processus. CSC.exe ou VBC.exe sont les véritables travailleurs derrière la scène.

Si vous voulez créer un service, en termes d’architecture, d’évolutivité, d’isolation, etc. (vous mentionnez Azure), ce n’est pas très bon.

Avec Roslyn, c’est en cours.

Je suppose que c’est l’une des raisons pour lesquelles ils l’appellent “Comstackr en tant que service”.

De plus, CodeDom est une API relativement pauvre, qui manque de nombreuses fonctionnalités et qui n’est pas vraiment à jour, car elle a été conçue principalement pour prendre en charge la génération de code automatique par les concepteurs d’interface utilisateur Visual Studio. Je pense que Roslyn fera beaucoup mieux car c’est écrit par les gars qui écrivent les compilateurs. J’espère que cela fera la différence.

PS: Une différence notable par rapport à CSC.exe et VBC.exe: Roslyn semble être pure .NET (et utilise CCI ).

Roslyn permet un contrôle beaucoup plus fin de l’ensemble du processus – par exemple, vous pouvez parsingr la chaîne et même générer du code supplémentaire (à la volée dans le processus de compilation basé sur l’parsing), etc.

CodeDom “utilise simplement le compilateur” alors que Roslyn est “compilateur en tant que service avec un access complet aux sous-parties” … avec Roslyn, vous êtes “dans le compilateur” et pouvez voir à quoi ressemble le code du sharepoint vue du compilateur vous permettant de changer les choses de manière actuellement impossible.

Par exemple, vous pouvez utiliser Roslyn pour étendre C # – quelque chose de très pratique et bien meilleur que l’état actuel de la mise en œuvre de l’AOP.

Pour obtenir un aperçu de l’état actuel de Roslyn et des différents niveaux d’access et de contrôle qu’il fournit, voir http://msdn.microsoft.com/en-us/hh500769.

METTRE À JOUR

Microsoft vient de créer un nouveau CTP avec des fonctionnalités supplémentaires et de nombreux changements / ajouts d’API. Pour plus de détails, voir ici .