Frage

Gibt es ein Tool, mit dem Quellcode in Perl in C -Code in C konvertiert wird? Jede Plattform ist in Ordnung.

War es hilfreich?

Lösung

Es gibt Perlcc was Perl nach C "übersetzt"

Es ist nicht wirklich ein Perl zu C -Compiler; Die Ausgabe ist einfach ein Bündel des Perl -Dolmetschers und des analysierten Bytecode Ihres Programms.

Andere Tipps

Die kanonische Antwort darauf ist MJDs "Warum nicht Perl auf C übersetzen?".

Die Antwort wird so ziemlich "Nein" sein. Perl ist eine äußerst dynamische Sprache. C ist eine Sprache für statisch große Datentypen. Jede Übersetzung von Perl zu C wird wahrscheinlich so ziemlich "diesen Unterroutine -Aufruf ausführen, um das zu simulieren, was Perl macht". Und es macht wenig Sinn, einen solchen Übersetzer aufzubauen, da es unwahrscheinlich ist, dass Perl viel schneller ausgeführt wird als Perl.

Ich habe ein ziemlich großes Programm in Perl geschrieben, das PDF basierend auf HTML- und Datenbankabfragen erstellt, das praktisch wie ein Browser verarbeitet. Das Gesamtquellcodevolumen beträgt über 1 MB. Die Programme bewerten HTML, erstellt SQL -Abfragen und ruft Daten ab, sucht nach Bildern auf der Festplatte oder lädt sie von HTTP -Servern herunter, erstellt eine Dokumentstruktur, erstellt alle Layoutberechnungen und erzeugt schließlich eine PDF.

Ich musste herausfinden, wie ich den Betrieb auf verschiedene Weise beschleunigen kann. Basierend darauf stelle ich fest, dass Perl ziemlich schnell ist und viele Aufgaben in Perl schnell und erfolgreich in C und sogar C ++ erledigt werden.

Es gibt zwei Möglichkeiten, um Perl oder Speicherverbrauch langsamer zu gestalten: eine große Anzahl komplexer Datenstrukturen - sie benötigen viel Speicher - und eine große Anzahl von Berechnungen. Ja, die Berechnung ist in Perl in der Tat sehr langsam. Ein einfacher Begriff wie

$a = $b * $c

ist in Perl ziemlich zeitaufwändig, aber in jeder kompilierten Sprache sehr schnell. Die Operanden hier können sogar Ganzzahlen sein, keine schwimmenden Punktvariablen - es ist langsam. Ich denke, dies ist der Grund, warum Perl im Sprachschießerwettbewerb ziemlich schlecht erzielt [http://shootout.alioth.debian.org/ weibliche Computer -Benchmarks -Spiel).

Ich fand mein ziemlich großes Programm - es verwendet viele Perl -Kern und zusätzliche CPAN -Module als schnell, obwohl es intepretiert wurde.

Es funktioniert sehr gut ... bis es um die Berechnung von Textgrößen und Layoutkoordinaten geht. Das ist sehr zeitaufwändig. Nachdem ich dies angegeben hatte, schrieb ich kleine Perl -Testprogramme, die nur Millionen von arithmetischen Berechnungen durchgeführt und festgestellt wurden, dass sie sehr langsam sind.

Außerdem verwende ich und objektorientierte Ansatz, um jedes einzelne Layoutelement zu modellieren. Jedes Objekt wird durch einen Hash dargestellt - das ist mindestens etwa 10 kByte pro Objekt. Wenn eine große Menge an Daten zum Drucken ist, ist ein Speicherverbrauch von mehreren 100mbyte für dieses Programm nicht ungewöhnlich.

Ich habe also immer noch einen guten Grund, das Teil des Layouts auf C zu verschieben, indem ich Strukturen verwendete, in denen ich jetzt Hashes mit festen Schlüsseln habe und C integer Arithmetik habe, wo Perl jetzt einen langsamen Job macht.

Aber alles andere wurde schnell gemacht und schnell getestet und läuft so schnell, dass ich keinen Grund sehe, mich zu ändern. Ich finde Perl Code auch viel bequemer zu schreiben und zu testen als C -Code. Und viele CPAN -Module bieten Lösungen, die Sie nicht selbst ausarbeiten müssen. Viele von ihnen sind gut getestet und dokumentiert.

Nach dieser recht lenghty dicussion schließe ich zu: Wenn es sich um ein Server- oder Befehlszeilenprogramm handelt, betrachten Sie Perl. Wenn dieses Programm jedoch riesige Datenstrukturen oder viele Arithmetiken aufbauen muss, sollten Sie etwas schnelleres in Betracht ziehen. Manchmal kann es sich um ein Perl -Programm mit einem in C geschriebenen Modul handeln.

C -Übersetzer haben Perl, aber keine sind perfekt. Idealerweise möchten Sie einen Übersetzer, der sowohl korrekt als auch elegant ist. Leider können Sie nicht beides haben, einfacher Perl -Code ist kein gleichwertiger einfacher C -Code, daher müssen Sie entweder eine Übersetzung haben, die nicht 100% korrekt ist oder so komplex ist wie Perl selbst. Dies hat einige dazu gebracht zu glauben, dass Sie nicht versuchen sollten, Perl zu übersetzen. Es wäre genauer zu sagen, dass Sie klar sein müssen, was Sie aus der Übersetzung erreichen möchten, und nicht von Wundern erwarten.

100% korrekt ist einfach: Wenn Ihr Perl -Skript myperl.pl ist, dann das C -Programm void main(){system("perl myperl.pl")} wird genau das tun, was myperl.pl tun wird; Dies ist jedoch eher sinnlos. Das perlcc Compiler ist etwas anspruchsvoller, scheint aber immer noch nicht viel Nutzen zu bringen. Ich habe es nicht bemerkt perlcc schneller als einfach als einfach. Auch wenn Perl Code notorisch schwierig zu lesen ist, bevorzuge ich, bevor ich es bevorzuge print "Hello World\n" auf die 700 Linie lange Monstrosität das perlcc übersetzt es in. Ich habe nicht gesehen, dass diese Programme etwas produzieren, das einen Code-Review sowie einen schriftlichen eleganten C-Code übergeben würde. OTOH, wenn Sie einen Compiler wünschen, weil Sie Ihren Quellcode nicht auf nicht oBfuszierte Weise verteilen möchten, dann perlcc könnte Wunder arbeiten.

Rperl kann Geschwindigkeits -Ups erreichen, ist aber sehr begrenzt in dem, was es übersetzen kann.

Für ein Beispiel eines trivialen "eleganten, aber nicht korrekten" Übersetzers siehe den Prototyp Perl2c ++. PL. Dies erfolgt durch das Ersetzen (einige) Standard-Perl-Ismen durch C ++-ISMS. C ++ wurde ausgewählt, weil es sich um eine hochrangige Sprache wie Perl handelt, hat aber immer noch das gleiche bloße Metallethos von C.

Im Falle eines einfachen LCG-Pseudo-Random-Zahlengenerators Lcg.pl, die Ausgabe von perl2c++.pl ist sauber und prägnant C ++ - Code, der Dutzende Male schneller ausführt als die ursprüngliche Perl und nicht von Perl -Bibliotheken abhängt. Es könnte erweitert werden, um alle Standardantworten auf "Wie man X auf Perl macht" und durch "Wie man X in C ++" ersetzt. Dann könnte es viele einfache, aber reale Perl-Skripte erfolgreich übersetzen und einem Menschen helfen, nicht triviale Perl-Software in einen eleganten C ++-Code zu übersetzen. Dies wäre am nützlichsten, wenn Sie sich in Perl numerische Software schreiben, die in erster Linie in C ++ geschrieben werden sollte.

Für Software, für die Perl gut geeignet ist, aber Sie möchten nur ein wenig schneller werden, ist der von JavaScript (und letztendlich Perl 6) verwendete JIT -Ansatz vielversprechender.

Der Konverter wird a genannt Programmierer, und der Konvertierungsprozess Programmierung. Im Ernst, die richtige Sprache von Perl ist so groß und mächtig, dass jeder, der versucht, einen Konverter zu schreiben, auf eine lebenslange Aufgabe herabblicken würde. Darüber hinaus ist der Effekt auf die Leistungsverbesserung möglicherweise keine Größenordnung. Warum also die Mühe?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top