26 Januar 2024
Das Design und die Entwicklung des C#-zu-C+±Codeübersetzers wurden ausschließlich von CodePorting durchgeführt. Es erforderte viele Untersuchungen, die Anwendung mehrerer Ansätze und Tests, die sich je nach Speichermodell und anderen Aspekten unterschieden. Am Ende wurden zwei Lösungen ausgewählt. Eine davon wird derzeit für die C++-Veröffentlichungen von Aspose-Produkten verwendet.
Nun ist es an der Zeit, die Technologien zu erklären, die wir im Codeübersetzer verwenden. Der Übersetzer ist eine Konsolenanwendung, die in C# geschrieben ist und sich leicht in Skripte einbetten lässt, die typische Sequenzen wie Übersetzen-Kompilieren-Testen ausführen. Es gibt auch eine GUI-Komponente, mit der Sie dasselbe tun können, indem Sie auf die Schaltflächen klicken.
Die Syntaxanalyse wird von der NRefactory-Bibliothek in der veralteten Generation des Übersetzers und von Roslyn in der neuen durchgeführt.
Der Übersetzer verwendet mehrere AST-Baum-Durchläufe, um Informationen zu sammeln und C+±Code zu generieren. Für C+±Code wird keine AST-Repräsentation erstellt, stattdessen behandeln wir den Ausgabe-Code in reiner Textform.
Es gibt viele Fälle, in denen zusätzliche Informationen erforderlich sind, um den Übersetzer zu feinabzustimmen. Diese Informationen werden über Optionen und Attribute übergeben. Optionen werden auf das gesamte Projekt angewendet. Normalerweise werden sie verwendet, um den Namen des Klassenexportmakros oder die in C# verwendeten bedingten Symbole beim Parsen des Codes anzugeben. Attribute werden auf die Typen und Entitäten angewendet und bieten spezifische Informationen für sie, z. B.: Markieren, welche Klassenmitglieder const
oder mutable
Qualifikatoren im übersetzten Code erfordern oder welche Entitäten von der Übersetzung ausgeschlossen werden sollen.
C#-Klassen und -Strukturen werden in C+±Klassen umgewandelt. Ihre Mitglieder und der Quellcode werden in engste Analoga umgewandelt. Generische Typen und Methoden werden auf C++-Vorlagen abgebildet. C#-Referenzen werden in intelligente Zeiger (shared oder weak) übersetzt. Referenzklassen sind in der Bibliothek definiert. Weitere interne Details des Codeübersetzers werden in einem separaten Artikel beschrieben.
Das aus C# nach C++ übersetzte Projekt hängt also von unserer Bibliothek anstelle von .NET-Bibliotheken ab:
Um die Bibliothek für den Codeübersetzer und die übersetzten Projekte zu erstellen, verwenden wir Cmake. Derzeit unterstützen wir die Compiler VS 2017 und 2019 (Windows), GCC und Clang (Linux).
Wie bereits erwähnt, handelt es sich bei den meisten unserer .NET-Implementierungen um dünne Adapter über Drittanbieterbibliotheken, darunter:
Sowohl der Übersetzer als auch die Bibliothek sind mit vielen Tests abgedeckt. Die Bibliothekstests verwenden das GoogleTest-Framework. Die Übersetzertests sind größtenteils in NUnit/xUnit geschrieben und in mehrere Kategorien unterteilt, die sicherstellen, dass:
Wir verwenden GitLab als Versionskontrollsystem. Für die kontinuierliche Integration verwenden wir Jenkins. Die übersetzten Produkte sind als NuGet-Pakete und herunterladbare Archive verfügbar.
Während der Arbeit an diesem Projekt sind uns viele verschiedene Probleme begegnet. Einige davon waren erwartet, andere wurden auf dem Weg aufgedeckt:
Object
-Typ, und die meisten Bibliotheksklassen verfügen nicht über RTTI (Run-Time Type Information). Dadurch ist es unmöglich, .NET-Typen direkt auf STL-Typen abzubilden.yield
).Trotz all dem ist das Code-Übersetzer-Projekt aus technischer Sicht sehr interessant, und seine akademische Komplexität zwingt uns, ständig etwas Neues zu lernen.
Während der Arbeit am Code-Übersetzerprojekt ist es uns gelungen, ein System zu implementieren, das eine interessante akademische Aufgabe der Code-Übersetzung löst. Wir haben monatliche Veröffentlichungen von Aspose-Bibliotheken für die Sprache organisiert, für die sie ursprünglich nicht vorgesehen waren.
Es ist geplant, weitere Artikel über den Code-Übersetzer zu veröffentlichen. Der nächste Artikel wird den Konvertierungsprozess im Detail erläutern, einschließlich der Zuordnung konkreter C#-Konstruktionen auf C+±Äquivalente. Ein weiterer Artikel wird das Modell zur Speicherverwaltung behandeln.
Wir werden unser Bestes tun, um auf gestellte Fragen zu antworten. Wenn die Leser an anderen Aspekten der Code-Übersetzerentwicklung interessiert sind, können wir in Erwägung ziehen, weitere Artikel dazu zu schreiben.