Byte-Code

Byte-Code

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

Die virtuelle Maschine, im Falle von Java die Java Virtual Machine (JVM), führt dann dieses Zwischenergebnis aus, indem sie den Bytecode in Maschinencode, 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 C#, Python, Perl, Prolog, Limbo, Tcl und Visual Basic. Während bei Java und C# der Bytecode als Kompilat gespeichert und dann unabhängig vom Quellcode ausgeführt wird, wird bei den Skriptsprachen Perl 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, vergleichsweise 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 erstem 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: Frühe BASIC-Versionen der 70er- und 80er 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.

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 C# 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:

  • Byte-Code — Byte Code,   die Kodierung eines Computerprogramms durch einen Compiler in einer abstrakten, prozessorunabhängigen Form, die sich besonders für die Compiler Optimierung oder für die Verarbeitung durch einen Interpreter (z. B. die Ausführung eines …   Universal-Lexikon

  • Byte Code Engineering Library — Infobox Software name = Jakarta BCEL caption = developer = Apache Software Foundation latest release version = 5.2 latest release date = release date|2006|06|06 latest preview version = latest preview date = operating system = Cross platform… …   Wikipedia

  • Byte Code Engineering Library — Jakarta BCEL Тип Библиотека модификации байт кодов Разработчик Apache Software Foundation Написана на Java Операционная система Кроссплатформенное программное обеспечение Последняя версия 5.2 (6 июня 2 …   Википедия

  • Byte-code — …   Википедия

  • byte-code — ● ►en n. m. ►PROG Variante pour bytecode …   Dictionnaire d'informatique francophone

  • Code page 930 — (abbreviated as CP930, also known as Japanese EBCDIC) is a code page created by IBM for representation of Japanese text. It is a superset of EBCDIC. It is commonly used on IBM OS390 and IBM AS400 operating system.It encodes halfwidth Katakana,… …   Wikipedia

  • Byte — [bai̮t], das; [s], [s]: zusammengehörige Folge von acht Bits: ein Megabyte umfasst 1 048 576 Bytes. Zus.: Gigabyte, Megabyte. * * * Byte 〈[baıt] n.; od. s, s od. (bei Zahlenangaben) ; EDV; 〉 kleinste im Speicher einer EDV Anlage adressierbare… …   Universal-Lexikon

  • Code page — is another term for character encoding. It consists of a table of values that describes the character set for a particular language. The term code page originated from IBM s EBCDIC based mainframe systems,[1] but many vendors use this term… …   Wikipedia

  • Byte pair encoding — or digram coding[1] is a simple form of data compression in which the most common pair of consecutive bytes of data is replaced with a byte that does not occur within that data. A table of the replacements is required to rebuild the original data …   Wikipedia

  • Code — redirects here. CODE may also refer to Cultural Olympiad Digital Edition. Decoded redirects here. For the television show, see Brad Meltzer s Decoded. For code (computer programming), see source code. For other uses, see Code (disambiguation).… …   Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”