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

(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 

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 

Siehe auch

Anmerkungen

  1. ^ 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

  1. ^ a b "Dynamic Machine Code Generation". Google Inc.
  2. ^ "Die Implementierung von LuA 5.0". (NB. Dies beinhaltet eine registrierungsbasierte virtuelle Maschine.)
  3. ^ "Dalvik VM". Archiviert von das Original 2013-05-18. Abgerufen 2012-10-29. (NB. Diese VM ist registriert.)
  4. ^ "Byte -Code gegen Maschinencode". www.allaboutcomputing.net. Abgerufen 2017-10-23.
  5. ^ O’Phinney, Matthew Weier. "Erkundung des neuen PHP JIT -Compilers". Zend von Perforce. Abgerufen 2021-02-19.
  6. ^ "Php 8: The JIT - Stitcher.io". stitcher.io. Abgerufen 2021-02-19.
  7. ^ Loitsch, Florian. "Warum nicht eine Bytecode -VM?". Google. Archiviert von das Original Am 2013-05-12.
  8. ^ "JavaScript Myth: JavaScript benötigt einen Standard -Bytecode". 2ity.com.
  9. ^ "CLHS: Funktion Disassemble". www.lispworks.com.
  10. ^ "Leistungsstimmen und Tipps". LispCookbook.github.io.
  11. ^ "Die Implementierung der Icon -Programmiersprache" (PDF). Archiviert von das Original (PDF) am 2016-03-05. Abgerufen 2011-09-09.
  12. ^ "Die Implementierung von Icon und Unicon A Compendium" (PDF).
  13. ^ 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. […]
  14. ^ 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.
  15. ^ "US -Patent 6.973.644".
  16. ^ 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.
  17. ^ "R -Installation und -verwaltung". cran.r-project.org.
  18. ^ "Die SQLite -Bytecode -Engine". Archiviert von das Original Am 2017-04-14. Abgerufen 2016-08-29.