Autor |
Beitrag |
dmeltz
Hält's aus hier
Beiträge: 7
|
Verfasst: Mo 23.11.09 20:13
Die erste Version des Programms Delphi2Cpp zur automatischen Konvertierung von Delphi Quellcode nach C++ ist erschienen:
www.texttransformer.de/Delphi2Cpp_ge.html
Bisher ist die Übersetzung auf den CBuilder zugeschnitten und Delphi-Features, die nach Delphi 4/5 eingeführt wurden, können noch nicht geparst werden.
Die Konvertierung erspart alle einfachen Ersetzungen und Umstellungen des Codes, die den weitaus größten Teil der Übersetzungsarbeit ausmachen. Außerdem werden eine Reihe weiterer komplexerer Übersetzungsschritte ausgeführt. In den meisten Fällen wird allerdings eine manuelle Nachbearbeitung des erzeugten Codes erforderlich sein. Mehr Details zu den einzelnen Übersetzungsleistungen sind hier aufgelistet:
www.texttransformer....i2CppDetails_ge.html
Die besten Ergebnisse erhält man, wenn in den Optionen die Pfade zur VCL gesetzt werden. Das kann auch die aktuellen VCL sein, optimal ist aber die VCL 4/5. Delphi2Cpp wird dann bei der Übersetzung der ersten Dateien relativ langsam, merkt sich aber die Informationen derjenigen Dateien, die bereits einmal geparst wurden, so dass es zunehmend schneller wird.
Delphi2Cpp basiert auf einem Delphi-Grammatik für das TextTransformer-Programm, die ich an anderer Stelle in diesem Forum vor einiger Zeit bereits präsentiert habe und die weiterhin frei verfügbar ist:
www.text-konverter.h...ne.de/Delphi_ge.html
www.texttransformer.de/
Die Grammatik wurde so erweitert, dass sie beim Parsen des Delphi-Codes einen Baum erzeugt, der bereits eine C++-Form hat. Dieser Baum muss dann schließlich nur noch so durchwandert werden, dass dabei der Code in lesbarer Form ausgegeben wird.
Das alles wurde mit den Mitteln des im TextTransformer integrierten Interpreters für eine Untermenge von C++ bewerkstelligt. Diese Beschränkung erklärt, warum der Übersetzer noch relativ langsam arbeitet. Ich habe mich noch nicht entschieden, ob ich zur Beschleunigung des Programms den TextTransformer Interpreter erweitern werde, oder ob ich schlicht einige Funktionen des vom TextTransformer exportierten C++-Codes überschreibe. Der erzeugte Code wurde mit dem CBuilder 6 zu dem fertigen Programm verarbeitet.
Das Programm ist Shareware und 30 Tage kostenlos zu testen. Lizenzen gibt es zu einem Einführungspreis von 58,- €, der in Anbetracht einer sich über Jahre hinziehenden Entwicklung sehr gering ist. Der Preis soll mit jedem relevanten Update weiter angehoben werden. Ich hoffe so auf Unterstützung durch frühzeitige Käufer. Folgende Updates sind für mindestens ein Jahr kostenlos.
In der Standardversion des Programms ist ein Dialog zur Auswahl von Dateigruppen deaktiviert, der in der der professional Version benutzbar ist.
Über Anregungen und Kritiken würde ich mich freuen.
|
|
Matclou
Beiträge: 24
|
Verfasst: Di 24.11.09 15:54
Klingt interessant
Ich als Laie wusste gar nicht, dass so etwas möglich ist
|
|
Jakob_Ullmann
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Di 24.11.09 18:51
Hallo!
Klingt schonmal interessant. Allerdings hätte ich ein paar Fragen sowie einen Kritikpunkt.
1. Kritik: Dein Formatierstil (C++) ist definitiv nicht "Standard" und mindert in meinen Augen auch die Lesbarkeit. Du solltest dich entweder an den Standard halten oder aber zumindest die Möglichkeit offen lassen, einen eigenen Formatierstil einzubringen.
Beispiel:
C#-Quelltext 1: 2: 3: 4:
| if ( SetActive ( ) ) { SetModified ( false ); } |
Ich würde eher etwas in der Richtung erwarten:
C#-Quelltext 1: 2: 3: 4:
| if (SetActive()) { SetModified(false); } |
Da wohl aber fast jeder in einem gewissen Maße irgendwo vom Standard abweicht, würde ich sogar die zweite Möglichkeit favorisieren.
2. Fragen
- Wie gehst du zum Beispiel mit dynamischen Arrays um? Würde mich mal interessieren
- Kann das Programm auch erkennen, dass eine Variable beispielsweise nur in einer for-Schleife gebraucht wird? Wäre nett, weil dann wohl so ziemlich jeder diese Möglichkeit favorisieren würde:
C#-Quelltext 1: 2: 3: 4:
| for (i = 0; i <= 1; i++) { ... } |
{ EDIT: Meinte natürlich for ( int i = 0; ...) }
Dasselbe gilt natürlich auch für andere Elemente, die C++ zu bieten hat und die das Programm auch nutzen sollte, z. B. den ternären Operator ( :?).
- Kann dein Programm auch mit Rechnungen umgehen? Z. B. eine Division von zwei Integern? Statt 1 / 3 sollte in der Übersetzung 1.0 / 3.0 stehen.
- So wie ich dich verstanden habe, soll das Programm ja irgendwann mal von der VCL wegkommen, oder? Für den Fall würde mich interessieren, wie du vor hast, sämtliche Funktionen in ihr Äquivalent zu übersetzen... Und wie sieht es zum Beispiel mit Compiler-Direktiven aus?
- Ergänzt das Programm auch Semikolons, die in Delphi weggelassen werden können / müssen (z. B. vor einem end; oder einem else) bzw. Klammern (z. B. SaveDialog1.Execute => SaveDialog1->Execute() ).
Toll wäre auch noch eine Möglichkeit, für bestimmte Stellen eigene Übersetzungen einzubringen. Z. B. per Kommentar.
Non-plus-ultra wäre eine Möglichkeit, untereinandergehörige Zeichen ungefähr zu erkennen und das zu berücksichtigen, da ja in C++ bestimmte Ersetzungen mehr / weniger Platz einnehmen.
Zuletzt bearbeitet von Jakob_Ullmann am Mi 16.06.10 15:03, insgesamt 1-mal bearbeitet
|
|
uall@ogc
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Di 24.11.09 19:18
Schöns wärs auch in die andere richtung, damit man sich c++ Structs direkt in Delphi übersetzen kann (und Funktionsheader etc)
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
Jakob_Ullmann
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Di 24.11.09 19:26
Das stimmt. Aber dann müsste ja ein struct in den meisten C-Dialekten als Klasse übersetzt werden, denn ein Delphi-record hat ja im Gegensatz zu C-structs keine eigenen Methoden.
Was mich aber auch mal interessieren würde: Wie wird Assembler gehandelt. In Delphi eingebettete asm ... end; sind mir in letzter Zeit öfter begegnet, aber soweit ich weiß unterstützt C++ dieses Feature ja nicht (oder?).
|
|
Critter
Beiträge: 328
Erhaltene Danke: 3
Windows 7
Delphi 7 Pro.
|
Verfasst: Mi 25.11.09 13:53
Hi,
Jakob_Ullmann hat folgendes geschrieben : | Das stimmt. Aber dann müsste ja ein struct in den meisten C-Dialekten als Klasse übersetzt werden, denn ein Delphi-record hat ja im Gegensatz zu C-structs keine eigenen Methoden. |
das kommt auf die Delphi Version an. Ich weiß nicht wann es eingeführt wurde aber in der D2007 Hilfe finde ich diesen Abschnitt:
Delphi 2007 hilfe hat folgendes geschrieben: | Records (erweiterte)
Zusätzlich zu den traditionellen Record-Typen lässt die Delphi-Sprache komplexere und “klassenähnliche” Record-Typen zu. Zu den Feldern können Records Eigenschaften und Methoden (einschließlich Konstruktoren), Klasseneigenschaften, Klassenmethoden, Klassenfelder und verschachtelte Typen haben. Weitere Informationen hierzu finden Sie in der Dokumentation zu Klassen und Objekten. Im Folgenden finden Sie eine Beispiel-Record-Typdefinition mit einigen “klassenähnlichen” Merkmalen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| type TMyRecord = record type TInnerColorType = Integer; var Red: Integer; class var Blue: Integer; procedure printRed(); constructor Create(val: Integer); property RedProperty: TInnerColorType read Red write Red; class property BlueProp: TInnerColorType read Blue write Blue; end;
constructor TMyRecord.Create(val: Integer); begin Red := val; end;
procedure TMyRecord.printRed; begin writeln('Red: ', Red); end; |
Obwohl Records nun einige der Merkmale von Klassen besitzen, gibt es wichtige Unterschiede zwischen Klassen und Records.
- Records unterstützen keine Vererbung.
- Records können variante Teile enthalten; Klassen nicht.
- Records sind Wertetypen, daher werden Sie bei der Zuweisung kopiert, per Wert übergeben und dem Stack zugewiesen, wenn sie nicht als global definiert sind oder explizit mit den Funktionen New und Dispose zugewiesen werden. Klassen sind Referenztypen, daher werden Sie bei der Zuweisung nicht kopiert, per Referenz übergeben und dem Heap zugewiesen.
- Records ermöglichen das Überladen von Operatoren auf Win32- und .NET-Plattformen; Klassen ermöglichen das Überladen von Operatoren nur bei .NET.
- Records werden automatisch mit einem Standardkonstruktor ohne Argumente erzeugt, Klassen dagegen müssen explizit erzeugt werden. Weil Records einen argumentlosen Standardkonstruktor haben, muss jeder benutzerdefinierte Record-Konstruktor ein oder mehr Parameter haben.
- Record-Typen können keine Destruktoren haben.
- Virtuelle Methoden (die mit den Schlüsselwörtern virtual, dynamic und message angegeben werden) dürfen in Record-Typen nicht verwendet werden.
- Im Gegensatz zu Klassen können Record-Typen auf der Win32-Plattform keine Interfaces implementieren; auf der .NET-Plattform können Records jedoch Interfaces implementieren.
|
critter
_________________ Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
|
|
Jakob_Ullmann
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Mi 25.11.09 18:25
Hallo!
Ich hab schon von jaenicke deshalb eine PN bekommen. Die Erweiterung finde ich sehr gut und das erspart dem Konverter sicher auch eine große Menge Arbeit.
Ich arbeite nur hauptsächlich mit Delphi 7 und habe mich immer geärgert, dass Delphi sowas nicht hat.
|
|
dmeltz
Hält's aus hier
Beiträge: 7
|
Verfasst: Mi 09.06.10 20:43
Zitat: | Matclou:
Ich als Laie wusste gar nicht, dass so etwas möglich ist |
Der Delphi-Parser, mit dem der Quellcode analysiert wird, kann kostenlos heruntergeladen und mit dem TextTransformer ausprobiert werden.
www.text-konverter.h...ne.de/Delphi_ge.html
In Delphi2Cpp wird beim Parsen aus dem Code ein Baum konstruiert und zwar so, dass die Textbestandteile gleich in die C++-Reihenfolge gebracht werden. Außerdem werden beim Parsen alle Typen registriert und resultierende Typen für alle Ausdrücke peu à peu berechnet. So ist jederzeit bekannt, ob es sich z.B. um einen Funktionsaufruf oder einen Zeiger etc. handelt und der Übersetzer kann entsprechend reagieren.
Zitat: | Jakob_Ullmann:
Dein Formatierstil (C++) ist definitiv nicht "Standard" |
Der Stil wurde mittlerweile verbessert. Mein Hauptaugenmerk liegt aber eindeutig auf der Qualität der Übersetzung, nicht auf dem Stil. Dafür gibt es automatische Codeformatierer.
Zitat: | - Wie gehst du zum Beispiel mit dynamischen Arrays um? |
Dynamische Arrays werden für den CBuilder durch die Klasse DynamicArray simuliert, für andere Compiler wird std::vector verwendet.
www.texttransformer....namic_arrays_ge.html
Die automatische Übersetzung stößt bei array Parametern allerdings an Grenzen: hier können nur entweder dynamische oder statische arrays übergeben werden.
Zitat: | - Kann das Programm auch erkennen, dass eine Variable beispielsweise nur in einer for-Schleife gebraucht wird?
- Statt 1 / 3 sollte in der Übersetzung 1.0 / 3.0 stehen. |
Das kann Delphi2Cpp z.Z. noch nicht. Die Bedeutung des ersten Punktes sehe ich nicht.
Zitat: | - So wie ich dich verstanden habe, soll das Programm ja irgendwann mal von der VCL wegkommen, oder? |
Die besten übersetzungsergebnisse erzielt Delphi2Cpp für den CBuilder. Der benutzt ja auch die VCL. Es gibt die Option den Code für andere C++-Compiler zu übersetzen. Dabei werden z.B. die properties aufgelöst. Hier ist aber oft noch viel manuelle Nachbearbeitung des Codes nötig. Insbesondere muss hier der Benutzer die Übersetzung der VCL-Funktionen im wesentlichen seber machen. Er kann es dann aber auf die von ihm gewünschte Weise tun. Compiler-Direktiven ignoriert Delphi2Cpp bisher.
Zitat: | - Ergänzt das Programm auch Semikolons, die in Delphi weggelassen werden können / müssen |
Ja!
Zitat: | Toll wäre auch noch eine Möglichkeit, für bestimmte Stellen eigene Übersetzungen einzubringen. Z. B. per Kommentar. |
Das ist in der professionellen Version möglich.
Zitat: | Jakob_Ullmann
Wie wird Assembler gehandelt. |
In C++ lässt sich Assembler ebenso einbinden wie in Delphi. Delphi2Cpp macht die entsprechende Übersetzung.
Es tut mir Leid, dass ich so spät antworte. Ich hatte nicht mitbekommen, dass es Antworten zu meinem Beitrag gab und habe das jetzt nur per Zufall entdeckt. Delphi2Cpp gibt es mittlerweile in der Version 1.3.0.
|
|
Webo
Beiträge: 577
Erhaltene Danke: 14
Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
|
Verfasst: Do 10.06.10 08:16
dmeltz hat folgendes geschrieben : | Es tut mir Leid, dass ich so spät antworte. Ich hatte nicht mitbekommen, dass es Antworten zu meinem Beitrag gab und habe das jetzt nur per Zufall entdeckt. Delphi2Cpp gibt es mittlerweile in der Version 1.3.0. |
Update doch einfach deinen Eingangspost jedesmal bei einer neuen Version, so bekommt dein Projekt mehr Aufmerksamkeit und wir sind über den aktuellen Stand der Dinge informiert.
Finde ich auf jedenfall eine interessantes Tool, ich werde es mir mal anschauen. Besonders praktisch, fange ich doch grade an C++ zu lernen
_________________ Man kann nur das aus dem Ärmel schütteln, was man auch vorher reingesteckt hat.
|
|
dmeltz
Hält's aus hier
Beiträge: 7
|
Verfasst: Do 10.06.10 19:21
Zitat: | Update doch einfach deinen Eingangspost jedesmal bei einer neuen Version |
Diesmal hatte ich es richtig gemacht und ein Häkchen bei "Thema beobachten" gesetzt. In den nächsten drei Monaten wird sich mit Delphi2Cpp wenig tun, weil ich mir erst einmal wieder einen Etat dazu verdienen muss. Für Support und Fragen stehe ich natürlich auch in dieser Zeit zur Verfügung.
Viel Spaß mit C++!
|
|
DbMaster
Hält's aus hier
Beiträge: 11
Windows 7
Delphi 2010, C#, C++ (VS 2010)
|
Verfasst: Do 29.07.10 09:48
Ich finde das ein hochinteressantes Projekt.
Was ich mich allerdings frage:
Warum machst Du das nicht für C#?
+ C# hat mehr Änlichkeiten zu Delphi als C++
+ C# ist die weitaus modernere Sprache
+ Wer tatsächlich Code konvertieren möchte, z.B. weil er das Vertrauen in die Delphi-Entwicklung verloren hat, wird IMO eher nach C# als nach C++ gehen wollen.
Just my 2 cents
|
|
dmeltz
Hält's aus hier
Beiträge: 7
|
Verfasst: Do 29.07.10 19:34
Zitat: | Warum machst Du das nicht für C#? |
Zunächst einmal ist C++ meine "Muttersprache", so dass mir die Übersetzung nach C++ am leichtesten fällt. Außerdem sitzt der CBuilder auf Delphi auf und hat eine Reihe spezieller C++-Erweiterungen, die die Übersetzung vereinfachen. Da ich selber mit dem CBuilder arbeite, habe ich mir für meine eigenen Zwecke einen solchen Übersetzer schon lange gewünscht.
Der zweite Grund ist, dass ein Teil der Entwicklung von einem Kunden finanziert worden ist, dar seinen Delphi-Code in einer speziellen Umgebung als C++-Code kompilieren muss. Ohne diese Finanzierung hätte ich den Konverter nicht machen können, da die Nachfrage nach einer so einem speziellen Software im Vergleich zum Aufwand der Herstellung sehr gering ist.
Möglich, dass die Nachfrage nach einem Übersetzer von Delphi nach C# größer wäre. Ich würde sehr gerne einen solchen Konverter oder einen nach Java entwickeln. Aber irgendwie muss ich auch meinen Lebensunterhalt verdienen ;-(
|
|
|