Zwischen Assemblercode und Maschinencode liegt eben doch nochmal eine Verarbeitungsstufe. Globale Variablen werden sicher in keinem vernünftigen Maschinencode mitten im Code "deklariert".
Und wie gesagt, kein Maschinencode hat ein if...endif-Konstrukt, das ist nicht effizient umsetzbar. Anstatt einfach einen vom Assembler vorherberechneten Sprung zu machen, musst du jetzt alle Befehle anschauen und ignorieren bis du das endif findest. Das ist einfach die falsche Abstraktionsstufe für Maschinencode.
Ähm ja ^^ Langsam weiß man nicht mehr wer was meint bei den ganzen Begriffen, Maschienencode, Assembler, Bytecode usw. usw.
Ich möchte keinen Maschienencode heraus bekommen, der direkt auf der Hardware läuft... Das sollte später dann ein Interpreter oder der Just In Time(kurz JIT-) Compiler übernehmen.
Bytecode und Maschinencode ist größtenteils äquivalent. Maschinencode ist der Bytecode einer Maschine, die zufällig in Hardware existiert, und Bytecode ist der Maschinencode einer rein virtuellen Maschinen. Also ist das eigentlich mehr oder weniger dasselbe. Deswegen ist es auch sinnvoll Maschinencode z.B. von x86 mit dem Bytecode deiner VM zu vergleichen.
Sonst ist das nicht mehr Plattform unabhängig. Das die befehle ähnlich wie bei Assembler sind.. naja das ist halt so ^^ MS hat mit MSIL ja auch scheinbar bei Assembler abgeschaut.
Nein, das ist nicht einfach nur so, sondern das hat den Grund, dass man schon maschinennah (aber immer noch plattformunabhängig) sein will, damit die Übersetzung in die endgültige Form effizient geht. Letztendlich will man ja doch immer bei Maschinencode für eine Registermaschine rauskommen, da gibt es also genug Gemeinsamkeiten.
Hier ein Java Bytecode der durch einen "disassembler" geschickt wurde um leserlich darzustellen:
wie man da sehen kann gibt es auch dort if, goto usw. seltsame Dinge die nichts mit Assembler oder Nativen Maschinencode zu tun haben...
Im Gegenteil sieht das sehr viel mehr nach Maschinencode aus als dein Bytecode. Was bei der Java-VM vielleicht noch etwas "komisch" oder ungewohnt aussieht, ist dass die Java-VM keine Registermaschine, sondern eine Stackmaschine ist.
if und goto (zumindest wenn if ein bedingter Sprung ist, wie es hier aussieht) sind keine seltsamen Dinge für eine Maschinensprache. Auf x86 existieren sie genauso und sind unverzichtbar, nur dass sie Jcc und JMP heißen. Ein endif wiederum oder ein else wirst du im Java-Bytecode nicht finden. Variablen müssen auch irgendwo liegen, aber sicher nicht wie bei dir mitten im Code.
Aber es ist halt der Bytecode den die JavaEntwickler sich ausgedacht haben und dieser kann später mit einem Interpreter ausgeführt werden oder mit einem JIT-Compiler für die jeweilige Hardware in richtigen Maschinencode umgewandelt werden.
Naja, der Punkt ist halt, dass die Java-Entwickler nicht einfach irgendwas runtergeschrieben haben, sondern sich was dabei gedacht haben. Natürlich ist der Bytecode immer das, was sich sein Entwickler eben ausgedacht hat, aber es gibt trotzdem besser und schlechter geeigneten Bytecode.