Bytecode


Bytecode

Der Bytecode ist in der Informatik eine Sammlung von Befehlen für eine virtuelle Maschine. Bei Kompilierung eines Quelltextes mancher Programmiersprachen oder Umgebungen – wie beispielsweise Java – wird nicht direkt Maschinencode, sondern ein Zwischencode, der Bytecode, erstellt. Dieser Code ist in der Regel unabhängig von realer Hardware und im Vergleich zum Quelltext oft relativ kompakt.

Inhaltsverzeichnis

Technische Details

Die virtuelle Maschine – im Fall von Java die Java Virtual Machine (JVM) – führt dann dieses Zwischenergebnis aus, indem sie den Bytecode in Maschinensprache, für den jeweiligen Prozessor, zur Laufzeit übersetzt. Dabei ist zu beachten, dass die Virtual Machine für jede Rechnerplattform, auf der das Kompilat laufen soll, bereits vorliegen muss.

Java ist heute nur eines der prominentesten Beispiele für eine Bytecode-basierte Programmiersprache. Andere Sprachen, die Bytecodes verwenden, sind zum Beispiel .NET-Sprachen wie C# oder Visual Basic, aber auch Python, Ruby, Perl, Prolog, Limbo, Tcl. Während bei Java, Python, und .NET der Bytecode als Kompilat gespeichert und dann unabhängig vom Quellcode ausgeführt wird, wird bei den Skriptsprachen Perl (bis Version 5) und Tcl beim Programmstart der Quellcode in Bytecode übersetzt und nur im Arbeitsspeicher vorgehalten.

Die Ausführung von Bytecode durch das Programm, das die virtuelle Maschine repräsentiert, kostet Zeit. Spezielle Just-in-time-Compiler (JIT-Compiler) übersetzen Bytecode-Stücke einmal während der Programmausführung in entsprechende Maschinencodestücke und führen diese dann aus. Dadurch lassen sich die Ausführungszeiten, jedoch nicht die Startzeiten, oft in den Bereich von vorübersetztem Maschinencode drücken.

Ein anderer Aspekt: Einen Interpreter kann man, abstrakt betrachtet, zu einem „bedingten indirekten Sprung“ vereinfachen, wobei moderne Interpretersprachen erst durch mehrfach indirekte Verknüpfungen implementierbar sind. Es sind also, analog zum Mehrpass-Compiler, Mehrpass-Interpreter.

Wenn man nun einen Teil der indirekten Verknüpfungen nicht erst zur Laufzeit auflöst, sondern schon vorher, findet definitionsgemäß eine Kompilation statt. Der so entstandene Code ist kein Quellcode mehr, aber auch noch kein Maschinencode. Er muss noch von einer, nun einfacheren und damit auch schnelleren virtuellen Maschine zur Laufzeit interpretiert werden.

Hintergründe

Viele interpretierte Sprachen verwenden auch intern Bytecode, das bedeutet, dass der Bytecode an sich unsichtbar für den Programmierer und Endbenutzer gehalten wird und automatisch als Zwischenschritt der Interpretation des Programmes erzeugt wird. Beispiele für aktuelle Sprachen, die zu diesem Trick greifen, sind: Perl, PHP, Prolog, Tcl und Python. In Python wird der Bytecode nach dem ersten Parsen in .pyc-Dateien (welche den Bytecode enthalten) abgelegt und ähnelt damit prinzipiell Java. Dieser Schritt ist jedoch optional.

Auch dieses Verfahren ist sehr alt: Bereits für LISP wurde in den 1960er Jahren Bytecompiling eingesetzt – 256 „atomare“ Funktionen wurden in einem Byte kodiert. Frühe BASIC-Versionen der 1970er- und 1980er Jahre verwendeten anstelle der Schlüsselwörter Bytes, sogenannte Tokens, um die Ausführung ihrer Programme zu beschleunigen und den Programmtext in einer kompakteren Form abzuspeichern. Der restliche Text – zum Beispiel Variablen, mathematische Ausdrücke und Zeichenketten – wurde jedoch unverändert gespeichert. Bei Ausgabe durch den LIST-Befehl wurden die Tokens wieder in lesbare Schlüsselwörter umgewandelt.

Ein bekannter früher Homecomputer der Bytecode verwendet, ist der TI 99/4a von Texas Instruments.

Rückgewinnung von Quelltext aus Kompilaten

Für Programmierer, die an Programmen arbeiten, deren Quellcode nicht offengelegt werden soll, gibt es ein Detail, das beachtet werden sollte: Bei Programmiersprachen, die direkt zu Maschinencode kompiliert werden, ist es in der Regel nicht möglich, aus dem Maschinencode den ursprünglichen Quellcode zurückzugewinnen. Bei Kompilierung zu Bytecode ist dies oftmals kein allzu großes Problem. Hierbei kann zwar nicht der exakte Quellcode rekonstruiert werden, allerdings ist es oftmals möglich, zumindest äquivalenten Code in der Quellsprache zurückzugewinnen, oftmals mit verblüffenden Ähnlichkeiten. Sehr gut scheint dies beispielsweise bei Java und .NET möglich zu sein; in Prolog mit WAM-Bytecode funktioniert es immer.

Für eigene .NET-Projekte kann der .NET Reflector verwendet werden. Dieser unterstützt drei .NET-Sprachen: C#, VB.NET und Delphi.NET.

Eine derartige Dekompilierung kann nicht verhindert werden, jedoch besteht die Möglichkeit, mithilfe eines sogenannten Obfuscator die Nutzbarkeit des hierdurch erhaltenden Quelltextes sehr stark einzuschränken.

Weblinks


Wikimedia Foundation.

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Bytecode — is a term which has been used to denote various forms of instruction sets designed for efficient execution by a software interpreter as well as being suitable for further compilation into machine code. Since instructions are processed by software …   Wikipedia

  • Bytecode — Saltar a navegación, búsqueda El bytecode es un código intermedio más abstracto que el código máquina. Habitualmente es tratado como un fichero binario que contiene un programa ejecutable similar a un módulo objeto, que es un fichero binario… …   Wikipedia Español

  • Bytecode — Le bytecode est un code intermédiaire plus concret (plus proche des instructions machines) que le code source, il n est pas directement exécutable. Il est contenu dans un fichier binaire qui représente un programme, tout comme un fichier objet… …   Wikipédia en Français

  • Bytecode — El bytecode es un código intermedio más abstracto que el código máquina. Habitualmente se lo trata como a un fichero binario que contiene un programa ejecutable similar a un módulo objeto, que es un fichero binario que contiene código máquina… …   Enciclopedia Universal

  • bytecode — ● ►en n. m. ►PROG Sorte de code objet, intermédiaire entre le source et le binaire exécutable, utilisé en Java pour permettre un usage multi plateforme de ce langage. Le code n est donc pas directement compréhensible par le processeur, ce qui… …   Dictionnaire d'informatique francophone

  • bytecode —    An intermediate form of computer code produced by Java and other programming languages. Most language compilers create code that is ready to run on a specific kind of processor. Java creates the bytecode in an abstract, processor independent… …   Dictionary of networking

  • bytecode — baitinė programa statusas T sritis informatika apibrėžtis Programa, išreikšta ↑tarpine kalba, kurios leksikos elementai yra ↑baitai. Gaunama sukompiliavus programą, parašytą aukšto lygio ↑programavimo kalba. Yra artima ↑kompiuterinei kalbai.… …   Enciklopedinis kompiuterijos žodynas

  • bytecode — noun P code …   Wiktionary

  • bytecode — n. (Computers) machine language of Java (compatible with all platform) …   English contemporary dictionary

  • bytecode — /ˈbaɪtkoʊd/ (say buytkohd) noun an output code, more abstract than machine code, used as an intermediate code for a compiler. {from the fact that each operation code is one byte in length} …   Australian English dictionary