2009-05-19 6 views

Antwort

29

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.)

+0

Mit PAST meinst du PASM, die Assemblersprache von Parrot? –

+0

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. –

+0

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! –

6

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.

12

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.

+0

Das Bytecode-Ding scheint in 5.10 gebrochen/entfernt zu sein. Warten auf 6 –

+0

und s/mod_perl/fastcgi/imho. –

+0

Ich kann es kaum erwarten, bis Parrot zur Primetime bereit ist! – Copas

4

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.

+0

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/ –

+0

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. –

1

Gemäß der dritten Ausgabe von Programming Perl ist es möglich, dies auf einige experimentelle Arten zu approximieren.

-1

Ruby 1.8 verwendet gar keinen Bytecode (auch intern), daher gibt es keinen Vorkompilierungsschritt.

+0

Aber die aktuelle Version tut es. – Chuck

+1

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. –

+1

@ 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

1

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.

1

Für PHP kompiliert die Phalanger Project zu .Net-Baugruppen. Ich bin mir nicht sicher, ob das das ist, wonach Sie gesucht haben.

9

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).

+1

"hysterische Rosinen"? –

+3

@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

+0

"Historische Gründe". Es ist ein beliebtes Wortspiel. –

3

hier sind einige Beispiele Zauberworte für die Befehlszeilen

perl -MO=Bytecode,-H,-o"Module.pm"c "Module.pm" 
1

Hat jemand daran gedacht, den Bytecode von LLVM anstelle eines noch anderen benutzerdefinierten Bytecodes zu verwenden?

Verwandte Themen