Comment faire un compilateur côte à côte pour .NET
-
09-06-2019 - |
Question
Je suis plutôt intéressé à savoir comment, en utilisant la plate-forme .NET, on peut écrire un compilateur pour un langage qui possède déjà un compilateur (comme C #) qui générera une sortie séparée du compilateur original tout en permettant au compilateur original de générer la sortie pour la même source pendant la même opération de construction, tout en référençant / utilisant également la sortie de l'autre compilateur.
Je ne suis même pas tout à fait sûr de bien comprendre le processus pour poser la question avec les bons détails, mais c'est la façon dont je vois actuellement le processus, comme indiqué dans les diagrammes du Script # docs. J'ai réfléchi à beaucoup de choses impliquant la conception et la compilation de langages complexes pouvant tirer parti de concepts de ce type, et ce que les autres pensent de ces concepts m'intéresse.
-
Edit: Merci d'avoir commenté jusqu'à présent; vos informations sont, en elles-mêmes, très intrigantes et je voudrais en faire plus, mais ma question est de savoir comment je pourrais écrire mon propre compilateur / s pouvant être exécuté sur la même source au même moment produire de multiples types de sorties (potentiellement) interdépendantes à l’aide du CLR. Script # sert d'exemple, car il génère du JavaScript et un assembly en utilisant la même source C #, tout en faisant en sorte que l'assembly compilé coopère avec le JavaScript. Je suis curieux de savoir quelles sont les différentes approches et concepts théoriques pour concevoir quelque chose de cette nature.
La solution
Il est important de réaliser que tout ce qu'un compilateur fait est de prendre un langage source (C # dans ce cas), analysez-le pour que le compilateur ait une représentation qui ait du sens pour lui et non pour les humains (c'est l'arbre de la syntaxe abstraite), et effectue ensuite une génération de code naïf dans la langue cible (msil est la cible des langues exécutées sur le runtime .NET).
Maintenant, si le code # de script est transformé en un assemblage et interagit avec un autre code .NET, cela signifie que ce compilateur doit générer msil. script # utilise csc.exe pour cela, qui est simplement le comiler standard c #. Maintenant, pour générer le javascript, il faut soit c # ou msil, l'analyser et générer du javascript pour l'envoyer au navigateur. Les docs disent qu'il a un c personnalisé - > Compilateur JS appelé ssc.exe.
Pour que les choses interagissent de manière cohérente à la fois côté client et côté serveur, il dispose d'un ensemble d'assemblys de référence écrits en .NET mais également compilés en javascript. Ce n'est pas un problème spécifique au compilateur, cependant, ces assemblys de référence sont le script # runtime. Le moteur d’exécution est probablement responsable d’une grande partie du script # magique que vous percevez cependant.
Autres conseils
Disons que vous voulez compiler C # en Javascript. Vous vous demandez si vous pouvez tirer parti des compilateurs C # existants. Ainsi, au lieu de compiler C # en Javascript directement, vous convertissez réellement le fichier MSIL généré par le compilateur C # en Javascript?
Bien sûr, vous pouvez le faire. Une fois que vous avez le binaire MSIL, vous pouvez faire ce que vous voulez.
Microsoft a un projet de recherche intitulé Volta , qui compile, entre autres, msil en JavaScript.
un ensemble d'outils de développement pour la construction applications Web multi-niveaux utilisant outils existants et familiers, techniques et modèles. Volta & # 8217; s la division déclarative en niveaux permet les développeurs de reporter l'architecture décisions sur la distribution jusqu'à la dernier moment responsable possible. Aussi, grâce à une programmation partagée modèle sur plusieurs niveaux, Volta permet un nouveau profilage de bout en bout et tester des niveaux plus élevés de performances applicatives, robustesse, et la fiabilité. Utiliser le déclaratif la division en niveaux, les développeurs peuvent affiner décisions architecturales basées sur cette profilage des données. Cela fait gagner du temps et coûts associés au manuel refactoring. En effet, Volta s'étend la plate-forme .NET pour permettre davantage le développement de logiciels + services applications, en utilisant des logiciels existants et outils et techniques familiers.
Vous architectez et construisez votre application en tant que client .NET application, attribuer les portions de l'application qui s'exécute sur le serveur niveau et niveau client tard dans la processus de développement. Vous pouvez cibler soit les navigateurs Web ou le CLR en tant que clients et Volta gère le complexités de la division en niveaux. le compilateur crée multi-navigateur JavaScript pour le niveau client, Web services pour le niveau serveur, et tous communication, sérialisation, synchronisation, sécurité et autres code passe-partout pour lier les niveaux ensemble. En effet, Volta offre une expérience au mieux dans plusieurs environnements sans nécessiter adaptation de l'application.