Question

Le Script # de Nikhil Kothari est probablement l'un des concepts les plus étonnants que j'ai vus dans l'arène JavaScript pendant un certain temps. Cette question ne concerne pas JavaScript, mais la compilation de langues dans le runtime .NET.

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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top