Einführung
Seit den 70er Jahren hat sich das vereinfachte Englisch entwickelt, dessen Zweck es ist, eine Teilmenge der Sprache zu bestimmen, die für eine Vielzahl von Nicht-Muttersprachlern der Sprache verständlich ist. Empfohlen zum Beispiel für die technische Dokumentation. Automatische Übersetzer für eine solche Teilmenge arbeiten offensichtlich korrekter und generieren im Idealfall Text, für den kein manuelles Korrekturlesen erforderlich ist.
Wenn Sie diesen Ansatz auf C # anwenden, um Code automatisch in andere Programmiersprachen zu konvertieren, können Sie eine Teilmenge der Sprachkonstrukte, Systembibliotheken und Technologien auswählen, die möglicherweise in eine Vielzahl anderer Sprachen übersetzt werden könnten. Darüber hinaus handelt es sich bei der Konvertierung nicht um eine einmalige (Migration), sondern um eine konstante Erweiterung der Integrationsfunktionen des Projekts in C #, sodass Sie jederzeit einen Arbeitscode in einer anderen Sprache erhalten können, ohne dass eine Bearbeitung erforderlich ist.
Lassen Sie mich vorstellen: UniSharping
Die Einschränkung von C # .NET zur Lösung dieses Problems wurde als U # (Universal Sharp) bezeichnet, und der Konvertierungsprozess und sein Tool wurden als UniSharping bezeichnet . Ausführbare Module, Einstellungen und Dokumentationen sind auf GitHub verfügbar. Das System ist kostenlos für den nichtkommerziellen Gebrauch (Non-Commercial Freeware).
Um plattformübergreifend zu arbeiten, hat Microsoft das .NET Framework bereits in Bezug auf Bibliotheken und Technologien eingeschränkt: .NET Core. Es ist wie der erste Schritt in die richtige Richtung, U # macht den zweiten Schritt zur "Cross-Programmierbarkeit".
Es gab nur wenige U # -Beschränkungen in den Sprachkonstrukten - dies sind Goto- und Case-Goto-Atavismen sowie Ausbeute, die im automatischen Modus nicht angemessen modelliert wird. Es wird nicht empfohlen (obwohl es möglich ist), struct zu verwenden, es gibt Nuancen mit Namen - all dies wird in einem separaten Dokument ausführlich beschrieben. Der U # -Parser gibt Fehler und Warnungen aus. Um eine korrekte Generierung zu gewährleisten, sollten Sie den C # -Quellcode so anpassen, dass sie im Idealfall vollständig verschwinden. Wenn Sie die Originalversion noch behalten müssen, können Sie die Präprozessor-Direktiven #if JAVA || verwenden PHP ... #else ... #endif. Diese Einschränkungen gelten auf der Ebene der U # -Engine und unterliegen keiner externen Korrektur sowie der Liste der unterstützten Sprachen.
Die Einschränkungen auf der Ebene der Systembibliotheken sind jedoch nicht streng festgelegt und werden extern durch spezielle Textdateien konfiguriert, die festlegen, wie eine bestimmte Klasse und ihre Mitglieder in die entsprechende Sprache übersetzt werden sollen. Wenn es ein direktes Analogon gibt, wird angezeigt, wenn die Situation komplizierter ist, wird entweder ein Teil des Codes der endgültigen Sprache geschrieben oder im Allgemeinen eine spezielle (Dienst-) Klasse, die das gewünschte Problem löst. In sehr schwierigen Fällen müssen Sie auf Motorebene „fest codieren“, aber solche Situationen sind ziemlich selten (etwa ein Dutzend). Die Vorgehensweise zum Einrichten von Systemklassen und deren Mitgliedern wird in einem separaten Dokument beschrieben. Hier ist eine Liste der unterstützten C # -Klassen und ihrer Mitglieder mit Analoga in Java und Python in der aktuellen Version auf der Website. Es gibt auch eine Online-Demo .
Was die Technologie betrifft, ist die Liste jetzt auf die Konsolenanwendung und Unit-Tests (UnitTest) beschränkt. Nun, einzelne Lib-Projekte werden als Sonderfall in die entsprechenden Konstrukte der gewünschten Sprache übersetzt.
Für eine erfolgreiche Übersetzung muss das Quell-C # -Projekt (Lösung) einen Startteil haben, der die Funktionalität innerhalb des Quell-C # überprüft. Es ist gut, wenn dies ein umfangreiches System von automatischen Tests ist (Standard-UnitTest in verschiedenen Implementierungen oder selbst geschrieben), aber es sollte mindestens eine Konsolenanwendung vorhanden sein, die beim Starten ohne Benutzereingriff ordnungsgemäß funktioniert. Die Notwendigkeit hierfür liegt auf der Hand: Nach der Generierung in die endgültige Sprache können Sie die Leistung sofort überprüfen. Im Idealfall sollten alle Tests ähnlich wie C # funktionieren.
Projektgeschichte
Die Idee eines solchen Konverters gibt es schon lange. Mein Hauptprojekt zur Verarbeitung natürlicher Sprache SDK Pullenti ist ein idealer Kandidat für die Konvertierung: eine große Menge komplexer und sich ständig verbessernder Codes. Um mich in Java zu integrieren, musste ich es in Webdienste, TCP-Server usw. einbinden.
Letzten Sommer habe ich die Zeit und Energie gefunden, um die erste Option zu schaffen. Er übersetzte das Pullenti-Projekt sowohl in Java als auch in Java.
In den nächsten sechs Monaten entwickelte sich der Konverter für mehrere interne Projekte im Unternehmen, hauptsächlich durch die Erweiterung der Systemklassen.
Im Frühjahr 2018 kam die Idee, Python zu unterstützen, das bis zum Sommer implementiert wurde. Die Aufnahme einer zweiten Sprache war in der ursprünglichen Version jedoch nicht vorgesehen und stellte sich als ungeschickt heraus. Im Sommer musste ich den Motor komplett überarbeiten, um das Potenzial mehrerer Endsprachen zu nutzen. Außerdem wurden Einstellungen für Systemklassen aus dem Hardcode in externe Textdateien verschoben. Ich hoffe, dass dieses Set ohne Ihre Hilfe nicht erweitert wird.
Weitere Pläne sind wie folgt:
- Ziehen Sie Python auf die Java-Ebene. Python wird jetzt auf Pullenti-Ebene unterstützt, aber Java ist bei anderen Projekten im Vergleich dazu weit fortgeschritten.
- unterstützt PHP zumindest auf Pullenti-Projektebene.
- unterstütze C ++. Ja, mir ist klar, dass dies sehr schwierig ist, da beim Freigeben des Speichers unklar ist, welcher Zeiger ein Link ist und für welchen Löschvorgang ausgeführt werden soll. Aber es gibt Ideen ...
Wer kann nützlich sein
Meistens diejenigen, die potenziell plattformübergreifende SDKs in C # entwickeln. Dank des UniSharping-Konverters kann das SDK auch zu einer „Cross-Software“ werden, die den Kreis potenzieller Benutzer erweitert.
In letzter Zeit haben sich die STR-Positionen in Russland verstärkt, was in den meisten Regierungsbehörden und einigen großen Unternehmen obligatorisch geworden ist. Erklären Sie, dass .NET Core auch nicht immer funktioniert, da es sich um "Microsoft" handelt. Lassen Sie ein Unternehmen sein Informationssystem in C # entwickeln. Um das Produkt in das "Open Source-Unternehmen" einzuführen, können Sie den logischen Teil des Projekts (Back-End) auswählen, es bei Bedarf automatisch in Releases konvertieren und den visuellen Teil (Front-End) in Open Source-Software umwandeln. Das heißt, die Entwicklung in C # und nur im Front-End von Java fortzusetzen.
Ich schließe nicht aus, dass eine Konvertierung von Webprojekten grundsätzlich möglich ist (natürlich mit Einschränkungen), aber ich habe nicht die erforderlichen Fähigkeiten und Informationen dafür. Wenn jemand eine solche Gelegenheit sieht, ist es durchaus möglich, sie in UniSharping zu implementieren.
Ich stelle fest, dass für ein wirklich komplexes C # -Projekt die Unterstützung von Java oder einer anderen Sprache einige Anstrengungen erfordert, um den Code zu ändern, den tragbaren Teil im Projekt hervorzuheben und ihn mit Komponententests zu „umkreisen“. Das Einrichten noch nicht unterstützter Systemklassen und -methoden und das Beheben von Fehlern von UniSharping selbst (mit meiner Hilfe) ist immer noch die Arbeit. Der Prozess konvergiert jedoch, und am Ende erwartet das Projekt einen programmierübergreifenden Bonus.