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 aufrufen

    Nur 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 🙂


Anmelden zum Antworten