Bytecode
Bytecode, auch bezeichnet P-Code, ist eine Form von Befehlssatz Entwickelt für eine effiziente Ausführung durch eine Software Dolmetscher. nicht wie für Menschen lesbar[1] QuellcodeBytecodes sind kompakte numerische Codes, Konstanten und Referenzen (normalerweise numerische Adressen), die das Ergebnis von codieren Compiler Parsen und Durchführung Semantische Analyse von Dingen wie Typ, Umfang und Nisttiefen von Programmobjekten.
Der Name Bytecode stammt aus Anweisungssätzen mit einem.Byte Opcodes gefolgt von optionalen Parametern. Zwischendarstellungen wie Bytecode können durch ausgegeben werden Programmiersprache Implementierungen zu erleichtern Deutung, oder es kann verwendet werden, um Hardware zu reduzieren und Betriebssystem Abhängigkeit, indem der gleiche Code ausgeführt wird plattformübergreifendauf verschiedenen Geräten. Bytecode kann häufig entweder direkt auf a ausgeführt werden virtuelle Maschine (a P-Code-Maschine, d.h. Dolmetscher), oder es kann weiter zusammengestellt werden in Maschinensprache für eine bessere Leistung.
Da Bytecode -Anweisungen von Software verarbeitet werden, sind sie möglicherweise willkürlich komplex, sind jedoch häufig mit herkömmlichen Hardwareanweisungen ähnlich: virtuell Stapelmaschinen sind die häufigsten, aber virtuell Maschinen registrieren wurden auch gebaut.[2][3] Verschiedene Teile können häufig in separaten Dateien gespeichert werden, ähnlich wie Objektmodule, aber dynamisch während der Ausführung geladen.
Ausführung
Ein Bytecode -Programm kann durch Parsing und ausgeführt werden direkt Ausführung der Anweisungen nacheinander. Diese Art von Bytecode Interpreter ist sehr tragbar. Einige Systeme, dynamische Übersetzer genannt, oder gerade rechtzeitig (JIT) Compiler, übersetzen Bytecode in Maschinensprache nach Bedarf bei Laufzeit. Dies macht die hardwarespezifische virtuelle Maschine, verliert jedoch nicht die Portabilität des Bytecode. Zum Beispiel, Java und Smalltalk Der Code wird typischerweise im Bytecode -Format gespeichert, das normalerweise zusammengestellt wird, um den Bytecode vor der Ausführung in den Maschinencode zu übersetzen. Dies führt zu einer Verzögerung, bevor ein Programm ausgeführt wird, wenn der Bytecode mit dem nativen Maschinencode kompiliert wird, die Ausführungsgeschwindigkeit jedoch erheblich im Vergleich zum Interpretieren von Quellcode direkt, normalerweise um eine Größenordnung (10x), verbessert.[4]
Aufgrund seines Leistungsvorteils führen heute viele Sprachimplementierungen ein Programm in zwei Phasen aus, um zuerst den Quellcode in Bytecode zu kompilieren und dann den Bytecode an die virtuelle Maschine weiterzugeben. Es gibt Bytecode -basierte virtuelle Maschinen dieser Art für Java, Raku, Python, Php,[a] Tcl, MAWK und Weiter (Forth wird jedoch selten über Bytecodes auf diese Weise kompiliert, und seine virtuelle Maschine ist stattdessen generischer). Die Implementierung von Perl und Rubin 1.8 Stattdessen arbeiten Sie, indem Sie ein Gehen Zusammenfassung Syntaxbaum Darstellung aus dem Quellcode abgeleitet.
In jüngerer Zeit die Autoren von V8[1] und Pfeil[7] haben die Vorstellung in Frage gestellt, dass für eine schnelle und effiziente VM -Implementierung Zwischenbytecode erforderlich ist. Beide Sprachimplementierungen führen derzeit die direkte JIT -Kompilierung von Quellcode zu Maschinencode ohne Bytecode -Intermediary durch.[8]
Beispiele
- Aktionen führt im ActionScript Virtual Machine (AVM) aus, das Teil von Flash Player ist und LUFT. ActionScript -Code wird typischerweise durch a in Bytecode -Format umgewandelt Compiler. Beispiele für Compiler sind eine in Adobe Flash Professional integrierte und in den Adobe Flash Builder eingebaute und erhältlich in der Adobe Flex SDK.
- Adobe Flash Objekte
- Bancstar, ursprünglich Bytecode für ein Schnittstellen-Bauwerkzeug, aber auch als Sprache verwendet
- Berkeley Paketfilter
- Berkeley Pascal [1]
- Byte Code Engineering Library
- C zu Java virtuelle Maschine Compiler
- Cliv Implementierung von Common Lisp Wird verwendet, um viele Jahre nur zum Bytecode zu kompilieren; Jetzt unterstützt es jedoch auch das Kompilieren von nativem Code mit Hilfe von GNU lightning
- Cmucl und Scieneer Common Lisp -Implementierungen von Common Lisp Kann entweder mit nativem Code oder Bytecode kompilieren, was weitaus kompakter ist
- Gemeinsame Zwischensprache Ausgeführt von Gemeinsame Sprachlaufzeit, benutzt von .NETZ Sprachen wie C#
- Dalvik Bytecode, ausgelegt für die Android Plattform, wird von der ausgeführt Virtuelle Maschine Dalvik
- Dis bytecode, ausgelegt für die Inferno (Betriebssystem), wird von der ausgeführt Dis virtuelle Maschine
- Eiffelstudio für die Eiffel Programmiersprache
- Em, die Amsterdam Compiler Kit Virtuelle Maschine, die als intermediäre Kompilierungssprache und als moderne Bytecode -Sprache verwendet wird
- EMACs ist ein Texteditor mit den meisten seiner Funktionen von implementiert von EMACS Lisp, sein eingebauter Dialekt von Lispeln. Diese Funktionen werden in Bytecode zusammengestellt. Mit dieser Architektur können Benutzer den Editor mit einer hohen Sprache anpassen, die nach dem Zusammenstellen in Bytecode eine angemessene Leistung liefert.
- Eingebettbares gemeinsames Lisp Implementierung von Common Lisp Kann zu Bytecode oder C -Code kompilieren
- Common Lisp bietet a
zerlegt
Funktion[9] Dies druckt den Standardausgabe des zugrunde liegenden Code einer angegebenen Funktion. Das Ergebnis ist implementierungsabhängig und kann in Bytecode gelöst werden oder nicht. Seine Inspektion kann zum Debuggen- und Optimierungszweck verwendet werden.[10] Stahlbank Common Lispzum Beispiel produziert:
(zerlegt '(Lambda (x) (drucken x))) ; Demontage für (Lambda (x)) ; 2436F6DF: 850500000F22 Test EAX, [#x220F0000]; No-Arg-Parsing-Einstiegspunkt ; E5: 8BD6 MOV EDX, ESI ; E7: 8B05A8F63624 MOVE EAX, [#x2436F6A8]; #<FDEFINITION -Objekt für Print> ; ED: B904000000 MOV ECX, 4 ; F2: FF7504 Push DWORD PTR [EBP+4] ; F5: FF6005 JMP DWORD PTR [EAX+5] ; F8: CC0A Break 10; Fehlerfalle ; FA: 02 Byte #x02 ; FB: 18 Byte #x18; Ungültiger ARG-Count-Fehler ; FC: 4F Byte #x4f; ECX
- Ericsson -Implementierung von Erlang Verwendet Beam -Bytecodes
- Äther's Virtual Machine (EVM) ist die Laufzeitumgebung, die eine eigene Bytecode für die Transaktionsausführung in Ethereum (Smart Contracts) verwendet.
- Symbol[11] und Unicon[12] Programmiersprachen
- Infocom benutzte die Z-Machine Um seine Softwareanwendungen tragbarer zu gestalten
- Java -Bytecode, was von der ausgeführt wird Java virtuelle Maschine
- Keiko Bytecode verwendet von der Oberon-2 Programmiersprache, um es und die zu machen Oberon -Betriebssystem tragbarer.
- Schlüssel, das MS-DOS/PC dos Tastaturfahrer mit seiner Ressourcendatei Tastatur.Sys Layoutinformationen und kurz P-Code Sequenzen, die von einem Dolmetscher im ansässigen Fahrer ausgeführt werden.[13][14]
- LLVM IR
- LSL, eine in virtuelle Welten verwendete Skriptsprache, kompiliert in Bytecode, die auf einer virtuellen Maschine ausgeführt werden. Second Life hat die ursprüngliche Mono -Version, Inworldz hat die Phlox -Version entwickelt.
- Lua Sprache verwendet eine registrierungsbasierte Bytecode-virtuelle Maschine
- M-Code des Matlab Sprache[15]
- Malbolge ist ein Esoterisch Maschinensprache für eine ternäre virtuelle Maschine.
- Microsoft P-Code benutzt in Visuell c ++ und Visual Basic
- Multiplan[16]
- O-Code des BCPL Programmiersprache
- Ocaml Die Sprache kompiliert optional in einem kompakten Bytecode -Formular
- P-Code von UCSD Pascal Implementierung der Pascal Sprache
- Virtuelle Papageienmaschine
- Basic auswählen Auch als Datenbasis bezeichnet oder Multivalue Basic
- Das R Umgebung für statistisches Computer Bietet einen Bytecode -Compiler über das Compiler -Paket, das jetzt standardmäßig mit R Version 2.13.0 ist. Es ist möglich, diese Version von R zu kompilieren, damit die Basis und die empfohlenen Pakete dies ausnutzen.[17]
- Pyramide 2000 Abenteuerspiel
- Python Skripte werden zur Ausführung in die Bytecode -Sprache von Python zusammengestellt, und die kompilierten Dateien (.pyc) werden in den Ordner des Skripts zwischengespeichert
Kompilierter Code kann mit einem integrierten Tool zum Debuggen des Bytecode auf niedriger Ebene analysiert und untersucht werden. Das Werkzeug kann beispielsweise aus der Shell initialisiert werden:
>>> importieren dis # "dis" - Disassembler von Python -Byte -Code in Mnemonics. >>> dis.dis('Print ("Hallo, Welt!")') 1 0 Load_Name 0 (Druck) 2 Load_Const 0 ('Hallo, Welt!') 4 call_function 1 6 return_value
- Schema 48 Implementierung des Schemas unter Verwendung von Bytecode -Interpreter
- Bytecodes vieler Implementierungen der Smalltalk Sprache
- Das Spin -Dolmetscher in das eingebaut Parallaxe Propeller Mikrocontroller
- Das Sqlite Die Datenbank-Engine übersetzt SQL-Anweisungen in ein maßgeschneidertes Byte-Code-Format.[18]
- Apfel SÜSSE 16
- Tcl
- Timi wird von Compilern auf dem verwendet Ibm i Plattform.
- Tiny Basic
- Visual Foxpro kompiliert zu bytecode
- WebAssembly
- Yarv und Rubinius zum Rubin
- Zcode
Siehe auch
Anmerkungen
- ^ PHP hat Just-in-Time-Zusammenstellung in Php 8,[5][6] und zuvor nicht in der Standardversion, hatte Optionen wie HHVM. Für ältere Versionen von PHP: obwohl Php Opcodes werden jedes Mal generiert, wenn das Programm gestartet wird, immer interpretiert und nicht Just-in-Time Compiled.
Verweise
- ^ a b "Dynamic Machine Code Generation". Google Inc.
- ^ "Die Implementierung von LuA 5.0". (NB. Dies beinhaltet eine registrierungsbasierte virtuelle Maschine.)
- ^ "Dalvik VM". Archiviert von das Original 2013-05-18. Abgerufen 2012-10-29. (NB. Diese VM ist registriert.)
- ^ "Byte -Code gegen Maschinencode". www.allaboutcomputing.net. Abgerufen 2017-10-23.
- ^ O’Phinney, Matthew Weier. "Erkundung des neuen PHP JIT -Compilers". Zend von Perforce. Abgerufen 2021-02-19.
- ^ "Php 8: The JIT - Stitcher.io". stitcher.io. Abgerufen 2021-02-19.
- ^ Loitsch, Florian. "Warum nicht eine Bytecode -VM?". Google. Archiviert von das Original Am 2013-05-12.
- ^ "JavaScript Myth: JavaScript benötigt einen Standard -Bytecode". 2ity.com.
- ^ "CLHS: Funktion Disassemble". www.lispworks.com.
- ^ "Leistungsstimmen und Tipps". LispCookbook.github.io.
- ^ "Die Implementierung der Icon -Programmiersprache" (PDF). Archiviert von das Original (PDF) am 2016-03-05. Abgerufen 2011-09-09.
- ^ "Die Implementierung von Icon und Unicon A Compendium" (PDF).
- ^ Paul, Matthias R. (2001-12-30). "Keyboard.Sys interne Struktur". Newsgroup:comp.os.msdos.programmer. Archiviert vom Original am 2017-09-09. Abgerufen 2016-09-17.
[…] Tatsächlich ist das Format im Grunde genommen das gleiche in MS-DOS 3.3- 8.0, PC dos 3.3- 2000, einschließlich russischer, litauischer, chinesischer und japanischer Probleme sowie in Windows NT, 2000 und XP […]. Es gibt geringfügige Unterschiede und Inkompatibilitäten, aber das allgemeine Format hat sich im Laufe der Jahre nicht geändert. […] Einige Dateneinträge enthalten normale Tabellen […] Die meisten Einträge enthalten jedoch ausführbarer Code von irgendeiner Art interpretiert P-Code-Interpreter bei *Laufzeit*, einschließlich bedingter Zweige und dergleichen. Deshalb das der Grund Schlüssel Der Treiber hat einen so großen Speicherausdruck im Vergleich zu tabelletriebenen Tastaturtreibern, die in 3 bis 4 kb durchgeführt werden können, die mit Ausnahme des Interpreters dieselbe Funktionsstufe erhalten. […]
- ^ Mendelson, Edward (2001-07-20). "So zeigen Sie den Euro in MS-DOS und Windows DOS an". Zeigen Sie das Euro-Symbol in MS-DOS mit Vollbildmess (einschließlich Windows 95 oder Windows 98 Full-Screen-DOS) an. Archiviert vom Original am 2016-09-17. Abgerufen 2016-09-17.
[…] Matthias [R.] Paul […] warnt, dass die IBM PC DOS Die Version des Tastatur -Treibers verwendet einige interne Prozeduren, die von der nicht erkannt werden Microsoft Fahrer, also sollten Sie die verwenden, wenn möglich, die IBM Versionen von beiden KeyB.com und Tastatur.Sys Anstatt Microsoft- und IBM -Versionen zu mischen […]
(NB. Was unter "Verfahren" gemeint ist. Hier sind einige zusätzliche Bytecodes in der IBM -Tastatur. - ^ "US -Patent 6.973.644".
- ^ Microsoft C PCode -Spezifikationen. p. 13.
Multiplan wurde nicht zusammengestellt Maschinensprache, aber zu einer Art Byte-Code, der von einem betrieben wurde Dolmetscher, um Multiplan über die weit verbreitete Hardware der Zeit tragbar zu machen. Dieser Byte-Code unterscheidet sich zwischen dem maschinellen spezifischen schwimmendes Punktformat zu berechnen und ein externes (Standard-) Format, das war Binär codierte Dezimalzahl (BCD). Die Pack- und Auspackanweisungen zwischen den beiden.
- ^ "R -Installation und -verwaltung". cran.r-project.org.
- ^ "Die SQLite -Bytecode -Engine". Archiviert von das Original Am 2017-04-14. Abgerufen 2016-08-29.