Wie einen Side-by-Side-Compiler für .NET machen
-
09-06-2019 - |
Frage
Nikhil Kothari Script # ist ziemlich sicher eine der erstaunlichsten Konzepte, die ich in gesehen habe die JavaScript-Arena schon seit geraumer Zeit. Diese Frage ist nicht über JavaScript, sondern um die Sprache Kompilierung in der .NET-Laufzeit.
Ich bin eher daran interessiert, wie die .NET-Plattform, einer einen Compiler für eine Sprache schreiben kann, die bereits einen Compiler (wie C #) hat die separate Ausgabe von dem ursprünglichen Compiler generiert, während die ursprünglichen Compiler ermöglicht zu erzeugen Ausgang für die gleiche Quelle während der gleichen Erstellungsoperation, die ganze Zeit Referenzierung / als auch die Ausgabe des anderen Compiler.
Ich bin nicht ganz sicher, ob ich auch den Prozess gut genug, um zu verstehen, die Frage mit den richtigen Details zu fragen, aber das ist die Art, wie ich zur Zeit den Prozess zu sehen, wie pro Diagramme in dem Script # docs. Ich habe viele Dinge Gedanken über komplexe Sprache Design und Zusammenstellung beteiligt in der Lage sein kann, wie dieser Vorteil von Konzepten zu nehmen und ich bin daran interessiert, was andere Leute über die Konzepte denken.
-
Edit: Danke für die Kommentare, so weit; zu Ihrer Information, in seinem eigenen Recht, sehr interessant und ich mag es mehr erforschen, aber meine Frage ist eigentlich, wie ich in der Lage wäre meinen eigenen Compiler / s zu schreiben, die auf derselben Quelle zur gleichen Zeit ausgeführt werden können mehrere verschiedene Arten von (potentiell) voneinander abhängigen Ausgangs Herstellung des CLR verwenden. Script # dient als Beispiel, da es erzeugt JavaScript und eine Versammlung mit der gleichen C # Quelle, die ganze Zeit machen die kompilierte Assembly mit dem JavaScript zusammenarbeiten. Ich bin gespannt, was die verschiedenen Ansätze und theoretische Konzepte sind etwas dieser Art in der Gestaltung.
Lösung
Es ist wichtig zu erkennen, dass ein alle Compiler tut, ist (in diesem Fall C #) eine Ausgangssprache nehmen, analysieren sie so dass der Compiler hat eine Darstellung, die Sinn für sie und nicht die Menschen (das ist die abstrakte Syntaxbaum) macht, und macht dann eine naive Codegenerierung in die Zielsprache (MSIL ist das Ziel für die Sprachen, die auf der .NET-Laufzeit ausgeführt werden).
Nun, wenn das Skript # -Code in eine Baugruppe gedreht wird und interagiert mit anderen .NET-Code, die sich dieser Compiler bedeutet muss msil werden zu generieren. Skript # verwendet csc.exe für diese, die nur die Standard c # comiler ist. Nun JavaScript zu generieren, muss es entweder c # oder msil nehmen, analysieren sie und erzeugen Sie Javascript an den Browser zu senden. Die docs sagt es einen benutzerdefinierten c # hat -> js Compiler genannt ssc.exe.
Um die Dinge in Wechselwirkung treten konsequent sowohl auf der Client-Seite und die Server-Seite es eine Reihe von Referenzanordnungen hat, die in .NET geschrieben ist, sondern auch Javascript zusammengestellt. Dies ist kein Compiler spezifisches Problem allerdings ist dieser Bezug Baugruppen die Skript # Laufzeit ist. Die Laufzeit ist wahrscheinlich verantwortlich für viele der magischen Skript # Sie aber sind wahrzunehmen.
Andere Tipps
Also lassen Sie uns sagen, Sie C # in Javascript erstellen möchten. Sie fragen, ob Sie die Vorteile der vorhandenen C # Compiler, so dass anstelle der Kompilierung C # in Javascript direkt Sie tatsächlich konvertieren die MSIL erzeugt durch den C # -Compiler in Javascript nehmen?
Sicher, man kann das tun. Sobald Sie die MSIL binäre haben, können Sie tun, was Sie wollen es.
Microsoft hat ein Forschungsprojekt namens Volta , die unter anderem msil zu JavaScript kompiliert.
Entwickler-Toolset für Gebäude Multi-Tier-Webanwendungen mit bestehende und vertraute Werkzeuge, Techniken und Muster. Voltas deklarative Tier-Splitting ermöglicht Entwickler Architektur verschieben Entscheidungen über die Verteilung bis die allerletzten Moment verantwortlich. Auch dank einer gemeinsamen Programmierung Modell in mehreren Stufen, Volta ermöglicht neue End-to-End-Profilerstellung und Tests auf höheren Ebenen der Anwendungsleistung, Robustheit, und Zuverlässigkeit. Unter Verwendung der deklarativen Tier-Splitting, können Entwickler verfeinern Architekturentscheidungen auf dieser Basis Profildaten. Das spart Zeit und Kosten im Zusammenhang mit manuellen zugeordnet Refactoring. In der Tat Volta erweitert die NET-Plattform weiter zu ermöglichen, die Entwicklung von Software + Services Anwendungen unter Nutzung bestehender und vertraute Werkzeuge und Techniken.
Sie Architekt und bauen Sie Ihre Anwendung als .NET-Client Anwendung, die Zuordnung der Teile der die Anwendung, die auf dem Server ausgeführt Tier-und Client-Schicht spät in dem Entwicklungsprozess. Sie können Ziel entweder Web-Browser oder die CLR als Kunden und Volta übernimmt die Komplexität der Tier-Splitting. Das Compiler erstellt Cross-Browser JavaScript für das Client-Schicht, Web Services für die Serverebene, und alle Kommunikation, Serialisierung, Synchronisation, Sicherheit und andere vorformulierten Code, um die Reihen zu binden zusammen. In der Tat Volta bietet eine Best-Effort-Erfahrung in mehreren Umgebungen, ohne dass Anpassung der Anwendung an.