PAS2JS-Transpiler von Pascal nach JavaScript: Inkompatibel mit Delphi und Problemumgehungen

Heutzutage steckt in der Tasche eines gewöhnlichen Menschen ein leistungsfähiger Personal Computer, von dem man vor etwa 10 bis 20 Jahren nur träumen konnte. Und wenn Sie kilometerlangen debuggten Windows-Code und perfekt funktionierende Anwendungen und Dienstprogramme in Delphi haben, möchten Sie diesen Reichtum sicherlich für die mobile Entwicklung nutzen. Und auch die Erfahrungen beim Programmieren unter Windows. Mit PAS2JS können Sie zwei Welten kombinieren: die Entwicklung für Windows und die Erstellung von Webanwendungen und Node.js-Modulen.


Einige der aus persönlicher Erfahrung entdeckten Schwierigkeiten werden in diesem Artikel erörtert.


Warum nicht einfach JavaScript lernen und Webanwendungen darauf schreiben?


Ich habe JavaScript gut genug gelernt. Aber zuerst ist das Programmieren für das Web mehr als nur die Kenntnis der Sprache. Zweitens ist die Möglichkeit, einen Code für verschiedene Plattformen zu schreiben, von unschätzbarem Wert. Sie können Anwendungsmodule in der Delphi-IDE mit ihrem leistungsstarken Debugger und Editor debuggen und dann durch Hinzufügen der erforderlichen Bindungen eine vorgefertigte Arbeitsanwendung für die Site erhalten. Wenn Sie den Fehler beheben oder der Anwendung für Windows neue Funktionen hinzufügen, reicht es aus, nur die JavaScript-Module in PAS2JS neu zu kompilieren.


Es ist zu beachten, dass PAS2JS zwar nicht alle Funktionen der Delphi-Sprache unterstützt, diese jedoch auf der Website aufgeführt sind . Außerdem können einige Fragmente von scheinbar einfachem PAS2JS-Code nicht in JavaScript übertragen werden.


Übersetzungsschwierigkeiten


Also wurde das neue PAS2JS-Paket von FTP heruntergeladen. Wir versuchen, die einfache „Hallo Welt“ neu zu kompilieren und hören sofort bei:


uses System.SysUtils; 

Fehler: Einheit "System.SysUtils" kann nicht gefunden werden

Vorgefertigte PAS2JS-Pakete, die sich im Paketordner befinden, duplizieren teilweise Delphi-Systemeinheiten. Sie haben jedoch kein Präfix im Namen. Die Lösung ist einfach: Entfernen Sie das Präfix "System". aus dem Namen der Einheit. Das Programm wird in Delphi kompiliert (falls nicht, überprüfen Sie, ob das Präfix „System“ in Unit Scope Names im Menü Delphi Project | Options | Delphi Compiler vorhanden ist).


Typguss in Konstanten


PAS2JS unterstützt keine Typumwandlung in konstanten Ausdrücken:


 const CODE_A = Word('a'); 

Fehler: Konstanter Ausdruck erwartet

Bei aufgezählten Typen können Sie versuchen, dies folgendermaßen zu ändern:


 const CODE_A = Ord('a'); 

Außerdem versteht PAS2JS die integrierten Funktionen der Sprachen Lo und Hi nicht. Bei der Definition von Konstanten können sie wie folgt ersetzt werden:


 const LO_BYTE = $1234 and $FF; // Lo($1234); HI_BYTE = $1234 shr 8;// Hi($1234); 

ANSI-Zeichen und Zeichenfolgen


Ich hoffe, Sie haben in Ihren Delphi-Projekten bereits auf Unicode-Strings umgestellt? Wenn Sie einige Zeilen im ANSI-Format belassen, um Speicherplatz zu sparen, werden sie nicht in JavaScript konvertiert: PAS2JS kennt die Typen AnsiChar, AnsiString, Utf8String und RawByteString nicht. Ersetzen Sie sie durch Unicode-Typen oder Byte und Array of Byte.


Hier ist ein Beispiel für das Ersetzen von AnsiChar durch Byte:


 //  procedure TestAnsiCharAndByte1; const SMALL_ENG_LETTERS = ['a'..'z']; CAPITAL_ENG_LETTERS = ['A'..'Z']; var ch: AnsiChar; engs: set of AnsiChar; begin engs := SMALL_ENG_LETTERS + CAPITAL_ENG_LETTERS; ch := 'Z'; if ch in engs then Writeln('It''s an English letter'); end; //  procedure TestAnsiCharAndByte2; const SMALL_ENG_LETTERS = [Ord('a')..Ord('z')]; CAPITAL_ENG_LETTERS = [Ord('A')..Ord('Z')]; var ch: Byte; engs: set of Byte; begin engs := SMALL_ENG_LETTERS + CAPITAL_ENG_LETTERS; ch := Ord('Z'); if ch in engs then Writeln('It''s an English letter'); end; 

Lebloser Brief ó


Aus Neugier: Auf Polnisch gibt es einen Buchstaben ó - O kreskowane, Unicode # $ 00F3. Aus irgendeinem Grund hat es PAS2JS nicht gefallen, und in einigen Fällen kann es keine Zeile erkennen, wenn dieser Buchstabe darin enthalten ist:


 var s: string; begin s := #$00F3'abdef'; //  s := 'abdef'#$017C; //  s := #$00F3'abdef'#$017C; // Error: Illegal character s := #$00F3; s := s + 'abdef'#$017C; //    end; 

Fallbeschreibung


Eine plötzliche Überraschung lag in der Fallerklärung, in der PAS2JS sich weigerte, russische Briefe als Optionen zu akzeptieren:


  ch := ''; case ch of '': Writeln(' ""'); // Error: Incompatible types: got "Char" expected "Char" (???) ''..'': Writeln('   '); // Error: char expected, but string found end; 

Die Definition von Konstanten für die notwendigen russischen Buchstaben half:


 const ckbA = #$410; //  ckbB = #$411; //  ckbYa = #$42F; //  var ch: Char; begin ch := ''; case ch of ckbA: Writeln(' ""'); ckbB..ckbYa: Writeln('   '); end; 

Schlussfolgerungen


Ich habe es geschafft, ein kleines Delphi-Projekt für das Web zu kompilieren und relativ kleine Änderungen am Quellcode des Programms vorzunehmen. Für die eingesparte Zeit habe ich diesen Artikel geschrieben. Tests haben gezeigt, dass beide Versionen des Programms: für Windows und für das Web genau gleich funktionieren. Dies ist zweifellos ein Erfolg: Jetzt kann ich dieses Projekt entwickeln, indem ich ein Programm in Delphi fertigstelle und es mit PAS2JS in JavaScript übersetze.


Ich bin sicher, dass die festgestellten geringfügigen Mängel schnell behoben werden. Da das PAS2JS-Projekt offen und kostenlos ist, wird es von der Free Pascal-Community aktiv entwickelt.

Source: https://habr.com/ru/post/de436920/


All Articles