Für Python kann es eine vorkompilierte Version file.pyc erstellen, so dass das Programm ohne erneutes Interpretieren ausgeführt werden kann. Können Ruby, PHP und Perl in der Befehlszeile dasselbe tun?Kann Ruby, PHP oder Perl eine vorkompilierte Datei für den Code wie Python erstellen?
Antwort
Es gibt keine portable Bytecode-Spezifikation für Ruby und somit auch keine Möglichkeit, vorkompilierte Bytecode-Archive zu laden. Fast alle Ruby-Implementierungen verwenden jedoch eine Art Bytecode- oder Intcode-Format, und einige von ihnen können Bytecode-Archive ausgeben und neu laden.
YARV kompiliert immer zu Bytecode vor dem Ausführen des Codes, aber das wird normalerweise nur im Speicher ausgeführt.Es gibt Möglichkeiten, den Bytecode auf die Festplatte auszulagern. At the moment, there is no way to read it back in, jedoch. Dies wird sich in Zukunft ändern: Es wird an einem Bytecode-Verifizierer für YARV gearbeitet, und sobald dies geschehen ist, kann Bytecode sicher in die VM geladen werden, ohne dass Korruption befürchtet wird. Außerdem haben die JRuby-Entwickler angegeben, dass sie bereit sind, eine YARV VM emulator inside JRuby zu implementieren, sobald das YARV-Bytecode-Format und der Verifier stabilisiert sind, so dass Sie YARV-Bytecode in JRuby laden können. (Beachten Sie, dass diese Version ist obsolete.)
Rubinius auch immer kompiliert Bytecode, und es hat eine format for compiled files (.rbc
Dateien, analog zu JVM .class
Dateien), und es ist die Rede von einem Bytecode-Archivformat (.rba
Dateien, analog zu JVM .jar
Dateien). Es besteht die Möglichkeit, dass Rubinius einen YARV-Emulator implementiert, wenn Apps bereitgestellt werden, da der YARV-Bytecode immer beliebter wird. Außerdem haben die JRuby-Entwickler angegeben, dass sie bereit sind, eine Rubinius bytecode emulator inside JRuby zu implementieren, wenn Rubinius-Bytecode eine beliebte Art der Bereitstellung von Ruby-Anwendungen wird. (Beachten Sie, dass diese Version obsolete ist.)
XRuby ist ein reiner Compiler, kompiliert Ruby Quellcode direkt zu JVM Bytecode (.class
Dateien). Sie können diese .class
-Dateien wie jede andere Java-Anwendung bereitstellen.
JRuby begann als Dolmetscher, aber es hat sowohl einen JIT-Compiler und eine AOT compiler (jrubyc
), die Ruby Sourcecode zu JVM-Bytecode (.class
Dateien) zusammenstellen können. Es wird auch daran gearbeitet, eine new compiler that can compile (type-annotated) Ruby code to JVM bytecode zu erstellen, die tatsächlich wie eine Java-Klasse aussieht und aus Java-Code ohne Barrieren verwendet werden kann.
Ruby.NET ist ein reiner Compiler, der Ruby-Quellcode zu CIL-Bytecode kompiliert (PE .dll
oder .exe
Dateien). Sie können diese wie jede andere CLI-Anwendung bereitstellen.
IronRuby kompiliert auch zu CIL bytecode, aber tut dies normalerweise in-memory. Sie können jedoch commandline switches to it übergeben, sodass die Dateien .dll
und .exe
auf die Festplatte ausgegeben werden. Sobald Sie diese haben, können sie normal eingesetzt werden.
BlueRuby automatisch Ruby-Quellcode in BRIL (BlueRuby Intermediate Language) vorparseriert, was im Grunde ein serialisierter Partree ist. (Siehe Blue Ruby - A Ruby VM in SAP ABAP (PDF) für weitere Details.)
ich denke (aber ich bin definitiv nicht sicher), dass es einen Weg gibt Cardinal zu bekommen Parrot Bytecode Archive auskippen. (Eigentlich Kardinal kompiliert nur Vergangenheit, und dann Parrot übernimmt, so wäre es Parrot Job-Dump und Last-Bytecode-Archive.)
Nicht für PHP, obwohl die meisten PHP-Setups eine Bytecode Cache enthalten, die den kompilierten Bytecode zwischenspeichern wird, so dass beim nächsten Ausführen des Skripts die kompilierte Version ausgeführt wird. Dies beschleunigt die Ausführung erheblich.
Es gibt keine Möglichkeit, dass ich tatsächlich über die Befehlszeile auf den Bytecode zugreifen.
Perl 5 kann die Bytecodes auf die Festplatte kopieren, aber es ist fehlerhaft und unangenehm. Perl 6 hat eine sehr saubere Methode zum Erstellen von ausführbaren Bytescode, die Parrot ausführen kann.
Perls Just-in-Time-Kompilierung ist schnell genug, dass dies in den meisten Fällen keine Rolle spielt. Ein Ort, wo es wichtig ist, ist in einer CGI-Umgebung, die mod_perl ist.
Das Bytecode-Ding scheint in 5.10 gebrochen/entfernt zu sein. Warten auf 6 –
und s/mod_perl/fastcgi/imho. –
Ich kann es kaum erwarten, bis Parrot zur Primetime bereit ist! – Copas
Für Perl können Sie versuchen, B::Bytecode und perlcc zu verwenden. Beide sind jedoch sehr experimentell. Und Perl 6 kommt bald heraus (theoretisch) und wird auf Parrot sein und einen anderen Bytecode verwenden, und das alles wird dann etwas fragwürdig sein.
Perl 6 kommt vor Weihnachten heraus, aber Larry hat nicht gesagt, welches Jahr. Das heißt, Sie können jetzt mit Rakudo (dem aktuellen Marktführer in Perl 6-Implementierungen) spielen: http://rakudo.org/ –
Silly Larry. Ich möchte wirklich, dass Perl 6 bald rauskommt.Ich reiße mir gerade die Haare aus, während ich versuche, die Manpages für Git zu installieren, aber sobald ich das aus dem Weg räume, werde ich bald in eine Perl 6-Implementierung schauen. Ich könnte mit Pugs gehen, weil es ein cooler Ort ist, um Haskell zu lernen. –
Gemäß der dritten Ausgabe von Programming Perl ist es möglich, dies auf einige experimentelle Arten zu approximieren.
Ruby 1.8 verwendet gar keinen Bytecode (auch intern), daher gibt es keinen Vorkompilierungsschritt.
Aber die aktuelle Version tut es. – Chuck
Das ist einfach nicht wahr. Fast alle Implementierungen von Ruby 1.8 (mit nur einer einzigen Ausnahme) können zu Bytecode kompiliert werden. Tatsächlich können mehrere Implementierungen * nur * kompilieren, sie haben * keinen * Interpreter. –
@ Jörg: Es gibt nur eine Implementierung, die selbst korrekt als "Ruby 1.8" bezeichnet wird, und das ist die Version 1.8 des von Matz geschriebenen Ruby-Interpreters. Die anderen sind Jruby, Rubinius, etc. – Chuck
Wenn Sie in Ihren PHP-Skripten Zend Guard verwenden, werden die Skripts im Wesentlichen vorab in Byte-Code kompiliert, der dann von der PHP-Engine ausgeführt werden kann, wenn die Zend Optimizer-Erweiterung geladen ist.
Also ja, Zend Guard/Optimizer erlaubt vorkompilierte PHP-Skripte zu verwenden.
Für PHP kompiliert die Phalanger Project zu .Net-Baugruppen. Ich bin mir nicht sicher, ob das das ist, wonach Sie gesucht haben.
Bei hysterischen Rosinen sucht Perl 5 bei der Suche nach Modulen nach .pmc
Dateien vor .pm
Dateien. Diese Dateien können Bytecode enthalten, obwohl Perl standardmäßig keinen Bytecode ausgibt (im Gegensatz zu Python).
Module::Compile (or: what's this PMC thingy?) geht etwas mehr Tiefe über diese obskure Funktion. Sie werden nicht häufig benutzt, aber ...
Die klugen Leute, die Module::Compile schrieben, nutzen diesen Vorteil, um Perl-Code in ... vorzuforsten, ist es noch Perl, aber es wird vorverarbeitet.
Dies beschleunigt unter anderem die Ladezeit und erleichtert die Fehlersuche bei der Verwendung von Quellfiltern (Perl-Code ändert Perl-Quellcode vor dem Laden durch den Interpreter).
"hysterische Rosinen"? –
@Lars: "hysterische Rosinen" eq "historische Gründe". Perl 5 hatte sehr früh Unterstützung für .pmc-Dateien, aber es blieb viele Jahre unbenutzt, bis es von Perl-6-Implementierern wiederentdeckt wurde. – ephemient
"Historische Gründe". Es ist ein beliebtes Wortspiel. –
hier sind einige Beispiele Zauberworte für die Befehlszeilen
perl -MO=Bytecode,-H,-o"Module.pm"c "Module.pm"
Hat jemand daran gedacht, den Bytecode von LLVM anstelle eines noch anderen benutzerdefinierten Bytecodes zu verwenden?
- 1. PHP Sockets oder Python, Perl, Bash Sockets?
- 2. Ruby vorkompilierte Bibliotheken
- 3. Python-Code zu Perl
- 4. Wie kann ich einen Perl-Hash im C-Code erstellen?
- 5. Parsen eine große HTML-Datei (local) - mit Perl oder PHP
- 6. Wie kann ich Inline-Perl-Code in HTML, wie PHP?
- 7. Multithreading für Perl-Code
- 8. Wäre es möglich, Python oder Perl mit Ruby zu integrieren?
- 9. Web-Service: PHP oder Ruby on Rails oder Python?
- 10. PHP, Ruby, Python ... Yuma?
- 11. PHP. Wie kann ich eine Bibliothek für Funktionen erstellen?
- 12. Wie kann ich eine Datei in php erstellen und herunterladen
- 13. Python oder Ruby für Web-Entwicklung?
- 14. Benötigen Sie ein Framework, um Ruby- oder Python-Code für das Web zu schreiben?
- 15. Ruby oder PHP oder PHP Framework?
- 16. So erstellen Sie eine CSS-Datei im PHP-Code
- 17. Perl __SUB__ analog für Ruby
- 18. Wie erstellen Sie eine oder eine Anweisung für den folgenden Code
- 19. Git-Bibliothek für Ruby oder Python?
- 20. Perl-Interpreter für PHP
- 21. Wie sperre ich eine Datei in Perl?
- 22. Gibt es eine Web-Crawler-Bibliothek für PHP oder Ruby?
- 23. Verbinden mit .NET Sslstream x.509-Socket mit Python oder Ruby oder Perl
- 24. Wie kann ich von Perl erzeugten Perl-Code verschönern?
- 25. Wie kann ich Perl-Code verstecken?
- 26. Wie rufe ich Python-Code von Ruby?
- 27. Erstellen Sie eine CSS-Datei mit PHP
- 28. Wie starte ich eine eigenständige Ruby- oder Python-Datei von nginx?
- 29. Wie kann ich eine Datei in Perl asynchron überwachen?
- 30. Ist Python oder Ruby gut für Penetrationstests?
Mit PAST meinst du PASM, die Assemblersprache von Parrot? –
Nein, AFAICS Parrot kompiliert nach PAST, nicht nach PASM. Was sinnvoll ist, denn so soll Parrot eigentlich funktionieren: PASM und PIR sollen von Menschen geschrieben werden, PAST von Compilern. –
Es scheint, als ob die kompilierten Versionen von Ruby eine wesentliche Leistungsverbesserung haben sollten, aber von Benchmarks scheint es nicht wahr zu sein (oder nicht so wesentlich, wie ich es gedacht hätte). Ist das wahr und wenn ja, warum? Vielen Dank! –