Konvertierung von C/C++ nach Pascal/Lazarus?

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
KreuzBlick
Beiträge: 36
Registriert: Fr 3. Mai 2019, 17:45
OS, Lazarus, FPC: Win8.1 (L 2.2.4 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Saarland

Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von KreuzBlick »

Hallo zusammen,

obwohl überzeugter Lazarus-Programmierer, habe ich mich breitschlagen lassen, bei einem älteren Projekt, dass in C/C++ programmiert ist, "ein wenig Wartung" zu machen. :shock: Leider übersteigt das bei weitem meine Möglichkeiten, obwohl ich mich in C/C++ bereits etwas eingearbeitet habe. Das Projekt läuft bei mir unter Win8.1 in Visual Studio 2005, ich kann übersetzen und debuggen. Aber das Projekt ist noch deutlich älter , ursprünglich wohl in C programmiert (vergangenes Jahrhundert), dann mit C++ aufgepeppt. Man kann sich vorstellen, dass der Quelltext sehr schwer zu lesen ist. Änderungen sind Glücksache. Ideen zu verwirklichen, die mit Lazarus schnell realisiert wären, sind in diesem Projekt so gut wie unmöglich. Wenn das Projekt noch länger leben soll, an neue Anforderungen angepasst, müsste es eigentlich von Grund auf neu programmiert werden. Leider sind auch die zugehörigen Dateiformate nicht richtig dokumentiert. Ich habe dazu nur den Quelltext. Pflichtenheft wäre sozusagen das vorhandene Programm.

Nun war eine vage Idee von mir, beim Neuprogrammieren Lazarus zu verwenden. Die verwendeten Formulare sind visuell relativ schnell nachgebaut, aber die Funktionalität müsste dann ergänzt werden. Nun ist meine Frage, ob es dazu Hilfen gibt, um von C/C++ nach Pascal zu übersetzen. Ich habe bereits h2pas.exe entdeckt, das Headerdateien in Pascaldateien übersetzt, wobei es viele Fehlermeldungen gibt. Außerdem gibt es z.T. freie und z.T. käufliche Programme, die angeblich cpp-Dateien in pas-Dateien umwandeln können. Mir ist klar, dass da noch viel Nachbearbeitung zu machen ist, aber ein wenig Zeitersparnis wäre vielleicht schon drin.

Meine Frage ist also, ob sich damit schonmal jemand beschäftigt hat, gibt es Erfahrungen oder Anleitungen? Auch für kleine Hinweise wäre ich dankbar, ich würde dann hier über meine Erfahrungen berichten.
Viele Grüße
Gerold

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von Warf »

Ich hab selbst noch nicht mit solchen transpilern (Sprach zu Sprach compilern) gearbeitet, arbeite mittlerweile aber recht viel mit C, C++ und auch Pascal und wäre eher skeptisch wie gut das funktioniert, bzw. ob du wirklich das was dabei rauskommt haben möchtest.

Das einfache ist C nach pascal zu übersetzen, was meist funktioniert. Solange das program nicht C spezifische dinge (z.B. den volatile modifikator für variablen) benötigt (was die meißten C programme eigentlich nicht sollten) sollte C eigentlich recht simpel übersetzt werden können.
Bei C++ sieht das schonmal ganz anders aus, da gibts ne ganze reihe dinge die in Pascal einfach nicht funktionieren, da die sprachen z.T. ein fundamental anderes Design haben. Mehrfachvererbung wäre so ein beispiel, was du zwar in Pascal recht simpel simulieren kannst, aber dann ist es meißt besser das Design zu ändern, sodass du das gar nicht benötigst.

Da kommt es komplett auf das Design des Programmes an, im allgemeinen Fall würde ich davon ausgehen das nach dem transpilen, wenn er überhaupt funktioniert, extrem unschöner und schwer zu lesender Code rauskommen. Jetzt sind programme die in C angefangen wurden und mit C++ erweitert wurden normalerweise recht prozedual aufgebaut. Ich nen es gerne C mit klassen, also C code in dem man ein paar standardklassen wie std::vector oder so verwendet. Das lässt sich recht einfach zu Pascal übersetzen, solang die Standardklassen die verwendet wurden Pascal äquivalente haben (z.B. std::vector entspricht TVector aus der GVector Unit).

Mal ganz davon abgesehen kannst du davon ausgehen das beim transpilen der Code immer unleserlicher wird, wenn also der C code schon nicht der schönste ist, wird der daraus resultierende Pascalcode möglicherweise komplett unverständlich sein, selbst wenn er tut was erwartet.
Was ich also auf keinen fall machen würde ist das gesammte projekt durch nen transpiler zu jagen und danach nur noch lokal ein paar änderungen zu machen. Damit erzeugst du dir, selbst wenn es funktioniert, nur unleserlichen Code.
Was du machen sollstest ist die Grundstruktur des Programmes in Lazarus zu bauen, sodass es gut strukturiert und leserlich ist. Dann für die algorithmen die in die Funktionen kommen, kannst du den C code nehmen, transpilen, und dann so zurrechtstutzen das es in dein Framework passt.
Wie gut der transpiler funktioniert, musst du rausfinden, ich würde mich aber auch darauf gefasst machen das du den größten Teil per Hand übersetzen musst.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von af0815 »

Wenn würde ich mich auf das konvertieren der Header beschränken und den Rest 'per Hand' machen. Beim arbeiten mit h2pas sieht man normalerweise eh schon wo der Teufel im Detail steckt. Bei den Headerübersetzen habe ich meistens mit ein paar verschiedenen gearbeitet, da jeder Headerübersetzer so seine Stärken und Schwächen hat. Ev. sollte man Markros in den Headerdateien auflösen bzw. diese vereinfachen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

KreuzBlick
Beiträge: 36
Registriert: Fr 3. Mai 2019, 17:45
OS, Lazarus, FPC: Win8.1 (L 2.2.4 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Saarland

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von KreuzBlick »

Danke für eure Hinweise. Mir ist inzwischen beim genaueren Hinsehen auch klar geworden, dass da doch eine gewaltige Menge Handarbeit drin steckt. Mal sehen, wie weit ich komme.
Viele Grüße
Gerold

KreuzBlick
Beiträge: 36
Registriert: Fr 3. Mai 2019, 17:45
OS, Lazarus, FPC: Win8.1 (L 2.2.4 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Saarland

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von KreuzBlick »

Hallo,

ich habe mal mit der Übertragung angefangen. Dabei kommen solche Sachen vor wie hier:

Code: Alles auswählen

char test_id[20];
... 
i = 0;
while (test_id[i])
{
   if (islower(test_id[i]))
   {
      test_id[i] = _toupper(test_id[i]);
   }
   i++;
}   
 

Das habe ich das übersetzt als:

Code: Alles auswählen

var test_id: String;
...
uppercase(test_id);


Jetzt suche ich eine passende einfache Übersetzung für

Code: Alles auswählen

while (fgets (pbuf, 9999, fp) != NULL)
{
...
}

Wahrscheinlich muss ich mir selbst eine entsprechende Routine schreiben, die aus einer Textdatei 9999 einzelne Zeichen liest, dabei am Dateiende aufhört, und diese Zeichen so zu einem String zusammensetzt, dass bei einem Zeilenwechsel der Zusammenbau des Strings beendet wird.

Mein Hauptproblem ist aber noch ein ganz anderes, was allerdings mit Lazarus nichts zu tun hat. Das ursprüngliche C/C++ Programm läuft vor allem auf neueren Rechnern nicht mehr und meldet dabei einen Side-by-Side-Fehler. Was man dazu an Lösungen so findet, läuft i.d.R. darauf hinaus, das Programm neu zu installieren und/oder die Laufzeitbibliotheken zu erneuern. Leider hilft das alles nichts. Dass es solche Fehler bei Lazarus (hoffentlich) nicht gibt, tröstet da nur wenig.
Viele Grüße
Gerold

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von Warf »

Wenn ich das richtig verstanden hab willst du eigentlich TStrings.LoadFromFile implementieren? (Also ne textdatei zeile für zeile lesen)

Zu dem ersten, falls es relevant wird das der String genau 20 chars lang ist (also eigentlich genau 19 mit 0 terminierung), kannst du auch short strings verwenden:

Code: Alles auswählen

var test_id: String[20];

BeniBela
Beiträge: 308
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von BeniBela »

Modern wäre es ja eigentlich das Projekt nach Rust oder Kotlin zu konvertieren

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von fliegermichl »

BeniBela hat geschrieben:Modern wäre es ja eigentlich das Projekt nach Rust oder Kotlin zu konvertieren


Na das hab ich mal eben nicht gelesen im LAZARUSforum :-)

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 331
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von Niesi »

BeniBela hat geschrieben:Modern wäre es ja eigentlich das Projekt nach Rust oder Kotlin zu konvertieren


Der fliegermichl hat da sicher schon mal Recht.

Was mich aber interessiert: was ist an der Konvertierung ins Lazarus 2.0.2 vom 16. April 2019 denn "unmodern"? Also, außer, dass dies dann vielleicht nicht so toll "Schick schick schickimicki" oder "Hipp Hipp Hippsterle" wäre?

Und noch interessanter ist für mich Deine Begründung dafür, welche SACHLICHEN Gründe denn GEGEN die Verwendung von Lazarus und Free-Pascal sprechen?
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von mschnell »

BeniBela hat geschrieben:Modern wäre es ja eigentlich das Projekt nach Rust oder Kotlin zu konvertieren

Wenn Du Microsoft fragst, ist C# "modern" :) :) :)
Und wer hat eigentlich nach überhaupt "modern" gefragt ? :?: :?: :?:
Übrigens ist eine fast wörtliche Übersetzung für "modern" -> "ungenügend verbreitet und vermutlich bald wieder aus der Mode". :evil: :evil: :evil:
-Michael

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von six1 »

mschnell hat geschrieben:Übrigens ist eine fast wörtliche Übersetzung für "modern" -> "ungenügend verbreitet und vermutlich bald wieder aus der Mode". :evil: :evil: :evil:
-Michael


:lol: :lol: :lol:
Gruß, Michael

KreuzBlick
Beiträge: 36
Registriert: Fr 3. Mai 2019, 17:45
OS, Lazarus, FPC: Win8.1 (L 2.2.4 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Saarland

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von KreuzBlick »

Erst mal danke für die Beiträge.

Zu Rust oder Kotlin wurde schon einiges gesagt. Ich kannte die tatsächlich noch nicht. Aber für mich ist das keine Alternative, denn, wie schon gesagt, mit Lazarus kenne ich mich gut aus. Und in Anbetracht meines Alters sage ich mal: Wäre ich 50 Jahre jünger, würde sich das Erlernen von einer neueren Sprache gegebenenfalls schon lohnen. Aber hier geht es wirklich nur darum, ein ziemlich vermurkstes Projekt in C/C++ mit vertretbarem Aufwand wieder wartbar zu machen. Und da muss ich mich schon mit Einzelheiten des mir nicht so vertrauten C, bzw. C++ herumschlagen.

@Warf: Das mit fgets läuft tatsächlich so auf eine Art TStrings.LoadFromFile hinaus. Ich habe mich da von der Zahl 9999 verwirren lassen. In den Beschreibungen von fgets steht nämlich nirgends explizit drin, wo der Zeiger fp nach der Leseaktion hinzeigt. Es ist mir aber inzwischen auch klar, dass wirklich nur bis zum Zeilenendezeichen gelesen wird (oder maximal 9999 Zeichen). Zur Verwirrung trug noch bei, dass bei meinem Beispiel ein String der Länge 5000 eingelesen wurde, der zu allem Überfluss auch noch vor dem #10#13 4986 Leerzeichen enthielt. :o

Inzwischen gehen meine Überlegungen noch in eine andere Richtung. Warum sollte ich funktionierenden Code neu schreiben? Ich könnte doch Funktionen in C++ in eine dll packen und diese von Lazarus aus an den entsprechenden Stellen aufrufen. Dazu muss ich mir nur zwei Dinge klar machen:
1. Wie erzeuge ich in Visual Studio eine dll?
2. Wie rufe ich eine solche dll in Lazarus auf.

Da gibts bestimmt schon Anleitungen dazu.
Viele Grüße
Gerold

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von pluto »

Was mich aber interessiert: was ist an der Konvertierung ins Lazarus 2.0.2 vom 16. April 2019 denn "unmodern"? Also, außer, dass dies dann vielleicht nicht so toll "Schick schick schickimicki" oder "Hipp Hipp Hippsterle" wäre?

Da gibt es einige Punkte, aber das wäre sicherlich ein neuer Thread, aber einige kann ich vielleicht schon nennen:
1. Erfahrungen von anderen Programmiersprachen.

2. Verbesserter Optimierer(In wie weit, kann ich selbst nicht beurteilen).

3. Bessere Fehler Handling
Du fängt nicht mit dem eigentlichen Programm an sondern: Was kann schief gehen?
Die Fehler Behandlung ist extrem Wichtig geworden. Pascal hat auch schon eine gute Fehler Behandlung, aber in Rust, ist sie deutlich ausgereifter,
du schreibst hier sehr deutlich was du möchtest, daher kann der Compiler sehr schnell Fehler erkennen, ohne sie Stunden lang suchen zu müssen.
Du schreibst im Prinzip alles Viermal was das angeht. Dadurch sparst du Extrem viel Zeit.

4. Verschiedene Programmier Konzepte wurden eingebaut. Sogar von Pascal, gibt es einiges(laut Wikipedia), erkannt man aber auch, an verschiedenen stellen.

5. Bei der OOP gibt es keine Vererbung mehr, sondern Methoden werden hinzugefügt. Dadurch werden komplexe Klassenstrukturen "verhindert". Wie ich gerade wieder bei einem "Problem mit Frames" feststellen musste, z.b. taucht da die Eigenschaft Position auf, die es aber scheinbar nirgendwo gibt, im OI taucht sie auf, aber die Code-Tools kennen sie bei TFrame nicht....
Die TabOrder Eigenschaft ist auch so eine Eigenschaft, die gibt es im OI, aber sie erzeugt ein Laufzeit Fehler bzw. ein Fehler beim Laden des TFroms:
"Unbekannte Eigenschaft"

6. Alle Variablen sind erst mal nicht veränderbar, erst mit einem Schlüsselwort können sie verändert werden.

7. Datentypen werden "selbstständig" ermittelt, aber viele Programmierer schreiben sie freiwillig hin.

8. Klassen werden, wenn sie innerhalb eine "Methode" erstellt werden, automatisch freigeben.

9. Datentypen werden, soweit ich weiß alle mit einem Default Wert belegt.

Es gibt aus meiner bisherigen Sicht auch einige Nachteile:
1. Die Sprache verändert sich noch, bald gibt es eine Stabile Version.
Daher gibt es kaum brauchbares Tutorials in Deutsch, ich konnte nur online Rust Buch von 2015 finden, dass ist aber "uralt".
Es gibt aber eine sehr, sehr umfangreiche Hilfe, allerdings ist es nicht leicht diese Hilfe zu "verstehen", gerade am Anfang.

2. Die Konzepte von Rust verwirren mich.
Die match(ich glaube so heißt sie), ist recht mächtig, aber auch am Anfang nicht so einfach zu verstehen.
Ist wohl auch alles eine Frage der Zeit.

3. Es gibt scheinbar noch keine so gute IDE wie Lazarus.
Alles wird mit einem reinen Text Editor geschrieben. Anschließend Kompiliert.
Habe auch was mit STM32 gemacht, das muss von "Hand" gemacht werden.
Rust Kompiliert es, die Hex Datei muss Umgewandelt werden und anschließend hochgeladen werden.
Das ist eigentlich der Hauptgrund, warum ich mich näher mit Rust befasse, wegen der "guten" STM32 Unterstützung.
Ich möchte auch mehr über Mikrocontroller erfahren. Klar würde es auch mit AVR gehen(Dafür hat Rust, wohl noch kein Target, soweit ich weiß), aber AVR,
ist nun mal echt Veraltet und überteuert im Vergleich zu STM32.

4. Alle Abhängigkeiten werden in einer Datei festgehalten. Das hat vor aber auch nachteile.
Z.B. sollte man eine große Festplatte haben. Der Vorteil: Alle Libs die verwendet werden sind Aktuelle,
jedoch gibt es auch die Möglichkeit alle libs in einem zentralen Verzeichnis zu sammeln.

Einiges kann man sicherlich auch in Object Pascal einbauen, aber wohl nicht alles.

Mir geht es jetzt nicht darum, eine Sprache schlecht zu reden und sagen: die andere ist viel besser, nein.
Ich befasse mich damit, wegen STM32 und um mehr Erfahrungen zu sammeln. Ich finde Object Pascal toll, gerade weil ich damit umgehen kann.
MFG
Michael Springwald

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von kupferstecher »

KreuzBlick hat geschrieben:Inzwischen gehen meine Überlegungen noch in eine andere Richtung. Warum sollte ich funktionierenden Code neu schreiben? Ich könnte doch Funktionen in C++ in eine dll packen und diese von Lazarus aus an den entsprechenden Stellen aufrufen. Dazu muss ich mir nur zwei Dinge klar machen:
1. Wie erzeuge ich in Visual Studio eine dll?
2. Wie rufe ich eine solche dll in Lazarus auf.

Du kannst auch C-Code statisch einbinden. Das scheint mir einfacher als über DLLs zu gehen. Mit C++ geht das nicht direkt, die Klassenstruktur ist wohl unterschiedlich. Da müssten die gerufenen Funktionen C-Kompatibel sein. Vielleicht ist das ja schon so.

Das Einbinden sollte dann nicht so schwierig sein.

http://wiki.freepascal.org/Creating_bin ... _libraries

Edit: Nicht vom langen Artikel abschrecken lassen. Der Abschnitt "Manual conversion of C headers to Pascal" enthält das Wesentliche.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Konvertierung von C/C++ nach Pascal/Lazarus?

Beitrag von pluto »

Leider sind auch die zugehörigen Dateiformate nicht richtig dokumentiert. Ich habe dazu nur den Quelltext. Pflichtenheft wäre sozusagen das vorhandene Programm.

Ich würde als Idee, genau mit dem Dateiformat anfangen, ich gehe davon aus, dass es bestimmt leichter ist, hier eine Schnittmenge zu finden.

Ich hatte mal ein "großes" Projekt vor, es ging um ein Programm, welches in C/C++ geschrieben war. Es bestand aus vielen, vielen C/C++ Dateien. Es ging darum, ein USB Mess Gerät anzusteuern in Lazarus.
Das habe ich auch sogar geschafft. In diesem Fall war es relativ einfach: Es gab sehr viele Beispiele und C Header Dateien. Zum Schluss musste ich nur wenige Nach Pascal(weil das Projekt für viele verschiedene Varianten ausgelegt war und es ging um eine C Header Datei, anhand den Beispielen konnte ich aber ein Pascal Code schreiben) konvertieren.
Vielleicht ist es bei dir auch so?
Ich bin hier schrittweise vorgegangen:
Welche Funktion wird zu erst aufgerufen? Welche danach? und soweiter.
Diese Seite hilft aber dabei: http://wiki.freepascal.org/Pascal_for_C_users
MFG
Michael Springwald

Antworten