Bytecode's
-
Hallo, ich lese ab und zu etwas über Bytecodes. Mich würd mal interessieren was das ist. Wie diese aussehen. Wie man diese erstellt und so. Danke für die Antworten.
cu
-
-
und wie macht man selber sowas?
-
Normalerweise gar nicht, dafuer gibts doch Compiler.
-
? Und wie haben es die Java Entwickler gemacht?
-
Die haben Java-Compiler geschrieben, die Javecode in Bytecode übersetzten.
-
Leute, sagt doch wenn ihr auch nicht wisst wie es geht.
Ich wollte nur verstehen wie das Funktioniert. Natürlich habe ich jetzt etwas darüber erfahren. Aber wie implementiert man sowas. Und wie wird so ein Bytecode später von der Exe verarbeitet. Das habe ich noch nicht verstanden.
Bitte nur die antorten die auch wissen was ich meine. Der Rest kann mitlesen und etwas dazu lernen.
-
p9 schrieb:
Ich wollte nur verstehen wie das Funktioniert. Natürlich habe ich jetzt etwas darüber erfahren. Aber wie implementiert man sowas. Und wie wird so ein Bytecode später von der Exe verarbeitet. Das habe ich noch nicht verstanden.
Bytecode ist nichts anderes als eine eigene Sprache wenn du so willst. Nur statt
print "Hallo"
schreibt man
00 32 A7 C0 AA CA AD D7 79 67 D6 ...Es kommt nur auf das parsen an.
Eine fuer menschen lesbare Syntax ist schwer ist parsen, bzw. kann nicht so einfach optimaler Code daraus generiert werden.Deswegen gehen Interpretersprachen gerne ueber einen Bytecode, der quasi wie eine kompilierte EXE ist, nur dass den Code nicht der Prozessor, sondern der Interpreter zu lesen bekommt. Dieser wandelt ihn dann zB in fuer den Prozessor verstaendliche Symbole um, oder Interpretiert den Bytecode selber.
Was genau interessiert dich?
-
Wenn du dir einmal eine kompilierte class-datei von Java ansiehst, wirst du
feststellen, dass dort nur Schlüsselwörter in Bytecode übersetzt wurde Strings
und Zahlenkonstanten sind nach wie vor lesbar.
Es ist für einen Computer einfach leichter mit Binärdateien zu hantieren und dort
immer X-Bytes einzulesen und zu analysieren was für ein Symbol/Schlüsselwort das
ist, als Zeichen für Zeichen einzulesen und diesen einen Sinn zu geben, bzw.
möglich ohne Probleme aber viel aufwändiger und langsamer.Perl verwendet auch ein internes Format, da Perl OpenSource ist kannst du dir
ja mal anschauen wie die das machen und wie das anschließend aussieht.
-
Danke für diese Antworten.
Ich habe mal eine einfache Skriptsprache geschrieben. Die Exe-Datei hat diese Script Befehle interpretiert.
player 0,0,100 <- Script Befehl
Pseudocode (exe):
if "player" player.x=x; player.y=y; ...
In Bytecode müsste es so was sein:
01 00 00 64
if 01 //01 wird als player interpretiert player.x=00; player.y=00; player.z=64; ...
Ich hoffe mal das ich das richtig verstanden habe.
-
Wenn du ein Schlüsselwort "Player" in der Sprache hast und dieses in Bytecode
als 0x01 darstellst, dann müsstest du eben 1Byte der Datei einlesen und eben
schauen ob es 0x01 oder 0x02,... ist.
-
Hmmm, habe ich da Jahrelang was falsch gemacht?
Bei mir ist Bytecode so eine Art Minimal-Assembler der von meiner Virtuellen Maschine ausgeführt wird.
Wenn ich ein "Script" habe, das so aussieht:
a = "Hallo"
b = " Welt"
c = a || b // || sei mein String-Concatenate, ist von SQL abgeschaut
print(c)sähe der Bytecode dafür z.B. so aus:
push "Hallo"
setvar a // Popt Element vom Stack und weist der der Variablen a zu
push " Welt"
setvar b
pushvar a // Inhalt der Variablen a auf den Stack pushen
pushvar b
concatenate // Zwei Elemente von Stack popen, zusammehängen und das Ergebnis pushen
funcall "print" // Funktion print aufrufenNur halt dass setvar z.B. 0x01 ist, push 0x02, pop 0x03 usw...
Ähm... Was ich damit sagen will, Bytecode ist für mich direkt ausführbarer Code. Da wird nichts mehr geparsed oder Interpertiert, der wird direkt so wie er ist von der VM ausgeführt.
-
frenki schrieb:
Ähm... Was ich damit sagen will, Bytecode ist für mich direkt ausführbarer Code. Da wird nichts mehr geparsed oder Interpertiert, der wird direkt so wie er ist von der VM ausgeführt.
Aha, woher weiss denn dein Interpreter was er bei
0x01 0x07 0x10
machen soll?Weil er es interpretiert. Genauso macht es der Prozessor ja auch. Er sieht eine Zahlenkombinationen und erkennt: aha, na dann pushe ich das da mal auf den stack
-
Ähhh, ja so gesehen hast du recht.
Allerdings ist meine VM einfach nur ein Array aus Funktionen und die Bytecodes sind die Indizies in dieses Array