Bytecode - Bytecode
Bytecode , auch als P-Code bezeichnet , ist eine Form von Befehlssatz, der für eine effiziente Ausführung durch einen Software- Interpreter entwickelt wurde . Im Gegensatz zu menschenlesbarem Quellcode sind Bytecodes kompakte numerische Codes, Konstanten und Referenzen (normalerweise numerische Adressen), die das Ergebnis des Compiler- Parsings und der semantischen Analyse von Dingen wie Typ, Geltungsbereich und Verschachtelungstiefe von Programmobjekten codieren .
Programmausführung |
---|
Allgemeine Konzepte |
Codearten |
Kompilierungsstrategien |
Bemerkenswerte Laufzeiten |
|
Bemerkenswerte Compiler und Toolchains |
|
Der Name Bytecode stammt von Befehlssätzen mit Ein- Byte- Opcodes gefolgt von optionalen Parametern. Zwischendarstellungen wie Bytecode können von Programmiersprachenimplementierungen ausgegeben werden , um die Interpretation zu erleichtern , oder sie können verwendet werden, um die Hardware- und Betriebssystemabhängigkeit zu reduzieren , indem derselbe Code plattformübergreifend auf verschiedenen Geräten ausgeführt werden kann. Bytecode kann oft entweder direkt auf einer virtuellen Maschine (einer P-Code-Maschine, dh einem Interpreter) ausgeführt werden oder kann für eine bessere Leistung weiter in Maschinencode kompiliert werden .
Da Bytecode-Befehle durch Software verarbeitet werden, können sie beliebig komplex sein, ähneln aber dennoch oft traditionellen Hardware-Befehlen: virtuelle Stapelmaschinen sind am gebräuchlichsten, aber virtuelle Registermaschinen wurden auch gebaut. Verschiedene Teile können oft in separaten Dateien gespeichert werden, ähnlich wie bei Objektmodulen , aber während der Ausführung dynamisch geladen.
Ausführung
Ein Bytecode-Programm kann ausgeführt werden, indem die Anweisungen einzeln analysiert und direkt ausgeführt werden. Diese Art von Bytecode-Interpreter ist sehr portabel. Einige Systeme, die als dynamische Übersetzer oder Just-in-Time- Compiler (JIT) bezeichnet werden, übersetzen Bytecode nach Bedarf zur Laufzeit in Maschinencode . Dies macht die virtuelle Maschine hardwarespezifisch, verliert jedoch nicht die Portabilität des Bytecodes. Beispielsweise wird Java- und Smalltalk- Code typischerweise im Bytecode-Format gespeichert, das dann typischerweise JIT-kompiliert wird, um den Bytecode vor der Ausführung in Maschinencode zu übersetzen. Dies führt zu einer Verzögerung, bevor ein Programm ausgeführt wird, wenn der Bytecode in nativen Maschinencode kompiliert wird, verbessert jedoch die Ausführungsgeschwindigkeit im Vergleich zur direkten Interpretation des Quellcodes erheblich, normalerweise um eine Größenordnung (10x).
Aufgrund des Leistungsvorteils führen viele Sprachimplementierungen heute ein Programm in zwei Phasen aus, wobei zuerst der Quellcode in Bytecode kompiliert und dann der Bytecode an die virtuelle Maschine übergeben wird. Es gibt Bytecode-basierte virtuelle Maschinen dieser Art für Java , Raku , Python , PHP , Tcl , mawk und Forth (Forth wird jedoch selten auf diese Weise über Bytecodes kompiliert, und seine virtuelle Maschine ist stattdessen allgemeiner). Die Implementierung von Perl und Ruby 1.8 funktioniert stattdessen durch eine abstrakte Syntaxbaumdarstellung, die aus dem Quellcode abgeleitet wird.
In jüngerer Zeit haben die Autoren von V8 und Dart die Vorstellung in Frage gestellt, dass für eine schnelle und effiziente VM-Implementierung Zwischenbytecode benötigt wird. Beide dieser Sprachimplementierungen führen derzeit eine direkte JIT-Kompilierung vom Quellcode zum Maschinencode ohne Bytecode-Vermittler durch.
Beispiele
- ActionScript wird in der ActionScript Virtual Machine (AVM) ausgeführt, die Teil von Flash Player und AIR ist . ActionScript-Code wird normalerweise von einem Compiler in das Bytecode-Format umgewandelt . Beispiele für Compiler sind ein in Adobe Flash Professional integrierter und ein in Adobe Flash Builder integrierter und im Adobe Flex SDK verfügbarer Compiler .
- Adobe Flash- Objekte
- BANCStar , ursprünglich Bytecode für ein Tool zum Erstellen von Schnittstellen, wird aber auch als Sprache verwendet
- Berkeley Paketfilter
- Byte-Code-Engineering-Bibliothek
- C zu Java Virtual Machine Compiler
- Die CLISP- Implementierung von Common Lisp wurde viele Jahre lang nur in Bytecode kompiliert; jetzt unterstützt es jedoch auch das Kompilieren in nativen Code mit Hilfe von GNU Lightning
- CMUCL und Scieneer Common Lisp - Implementierungen von Common Lisp kann entweder an nativen Code oder zu Bytecode kompiliert, die kompakt weit mehr ist
- Common Intermediate Language, ausgeführt von Common Language Runtime , verwendet von .NET Framework- Sprachen wie C#
- Dalvik- Bytecode, der für die Android- Plattform entwickelt wurde, wird von der virtuellen Dalvik-Maschine ausgeführt
- Dis-Bytecode, der für das Inferno (Betriebssystem) entwickelt wurde , wird von der virtuellen Dis-Maschine ausgeführt
- EiffelStudio für die Programmiersprache Eiffel
- EM, die virtuelle Maschine des Amsterdam Compiler Kit , die als Zwischenkompilierungssprache und als moderne Bytecode-Sprache verwendet wird
- Emacs ist ein Texteditor , dessen meisten Funktionen von Emacs Lisp implementiert sind , dem integrierten Dialekt von Lisp . Diese Funktionen werden in Bytecode kompiliert. Diese Architektur ermöglicht es Benutzern, den Editor mit einer Hochsprache anzupassen, die nach der Kompilierung in Bytecode eine angemessene Leistung liefert.
- Einbettbare Common Lisp- Implementierung von Common Lisp kann in Bytecode oder C-Code kompiliert werden
- Ericsson-Implementierung von Erlang verwendet BEAM-Bytecodes
- Die Virtual Machine (EVM) von Ethereum ist die Laufzeitumgebung mit eigenem Bytecode für die Transaktionsausführung in Ethereum (Smart Contracts).
- Icon- und Unicon- Programmiersprachen
- Infocom hat die Z-Maschine verwendet , um seine Softwareanwendungen portabler zu machen
- Java-Bytecode , der von der Java Virtual Machine ausgeführt wird
- KEYB , der MS-DOS / PC-DOS- Tastaturtreiber mit seiner Ressourcendatei KEYBOARD.SYS, die Layout-Informationen und kurze p-Code- Sequenzen enthält, die von einem Interpreter innerhalb des residenten Treibers ausgeführt werden.
- LSL, eine Skriptsprache, die in virtuellen Welten verwendet wird, kompiliert in Bytecode, der auf einer virtuellen Maschine ausgeführt wird. Second Life hat die ursprüngliche Mono-Version, Inworldz hat die Phlox-Version entwickelt.
- Die Sprache Lua verwendet eine registerbasierte virtuelle Bytecode-Maschine
- m-Code der MATLAB- Sprache
- Malbolge ist eine esoterische Maschinensprache für eine ternäre virtuelle Maschine.
- Multiplan
- O-Code der Programmiersprache BCPL
- OCaml- Sprache kompiliert optional in eine kompakte Bytecode-Form
- p-Code der UCSD Pascal- Implementierung der Pascal- Sprache
- Parrot virtuelle Maschine
- Wählen Sie BASIC, auch als Data BASIC oder MultiValue BASIC bezeichnet
- Die R-Umgebung für statistische Berechnungen bietet einen Bytecode-Compiler über das Compiler-Paket, das jetzt mit R-Version 2.13.0 Standard ist. Es ist möglich, diese Version von R so zu kompilieren, dass die Basis- und empfohlenen Pakete dies ausnutzen.
- Pyramid 2000 Abenteuerspiel
- Python- Skripte werden bei der Ausführung in Pythons Bytecode-Sprache kompiliert, und die kompilierten Dateien (.pyc) werden im Ordner des Skripts zwischengespeichert
Kompilierter Code kann mit einem integrierten Tool zum Debuggen des Low-Level-Bytecodes analysiert und untersucht werden. Das Tool kann von der Shell aus initialisiert werden, zum Beispiel:
>>> import dis # "dis" - Disassembler of Python byte code into mnemonics.
>>> dis.dis('print("Hello, World!")')
1 0 LOAD_NAME 0 (print)
2 LOAD_CONST 0 ('Hello, World!')
4 CALL_FUNCTION 1
6 RETURN_VALUE
- Schema 48- Implementierung von Schema mit Bytecode-Interpreter
- Bytecodes vieler Implementierungen der Smalltalk- Sprache
- Der in den Parallax Propeller- Mikrocontroller integrierte Spin-Interpreter
- Die SQLite- Datenbank-Engine übersetzt SQL-Anweisungen in ein maßgeschneidertes Bytecode-Format.
- SÜSSE 16
- Tcl
- Winzige BASIC
- Visual FoxPro kompiliert in Bytecode
- WebAssembly
- YARV und Rubinius für Ruby