D
Deprecated
Gast
Hallo,
mag eine ziemlich bekloppte Frage sein, aber irgendwie konnte mir bisher niemand eine konkrete Antwort geben:
Worin besteht eigentlich der genaue Unterschied zwischen der Arbeitsweise eine JIT-Compilers und eines Interpreters?
Ich meine, beide haben doch die Aufgabe, zur Laufzeit eine Bytecodeanweisung "irgendwie" auf Maschinencode abzubilden und diese Maschinencodeanweisung(en) dann zur Ausführung zu bringen. Soweit korrekt?
Einen Interpreter stelle ich mir wie folgt vor: Beim Starten eines Programms, lese die erste Bytecode-Anweisung, bilde diese "irgendwie" auf Maschinensprache ab, lasse den Rechner die entsprechende(n) Maschineninstruktionen ausführen, gehe dann zur nächsten Bytecodeanweisung und mache alles von vorne.
Und irgendwie checke ich jetzt nicht, was der JIT konkret anders macht. Auch der muss ja während der Laufzeit irgendwie den Bytecode auf Maschinencode abbilden.
Besteht der Unterschied etwa darin, wie die Abbildung "Bytecode -> Maschinencode" genau gemacht wird (aufwändiges Umrechnen vs. Nachschlagen in einer Art Hashmap, o.ä.) ?
Oder ist der Unterschied, dass der JIT zum Teil den einmal abgebildeten Maschinencode speichert, und den Bytecode dann nicht mehr neu abzubilden braucht, sondern einfach die gespeicherten Maschineninstruktionen ausführt falls die Stelle erneut durchlaufen wird? Das würde ja Sinn machen, wenn das Abbilden (d.h. das Berechnen und Schreiben des passenden Maschinencodes) aufwändig ist und viel Rechenzeit benötigt...
Teilweise wird ja auch behauptet, dass ein JIT beim Programmstart immer den gesamten Bytecode nach Maschinencode kompiliert und erst dann das Ausführen dieses Maschinencodes veranlasst, so dass das Laden sehr lange dauert, das Ausführen aber schnell geht weil die ganze Zeit Maschinencode läuft. Das glaube ich aber nicht so richtig, denn das wäre für mich kein JIT-Verhalten mehr.
Ein weiterer Unterschied, der angegeben wird, ist dass ein Interpreter immer bloß eine einzige Bytecodeanweisung abbildet und diese dann ausführt, während der JIT zum Teil auch mehrere Anweisungen hintereinander abbildet und erst dann ausführt. Das mag zwar stimmen, ist doch aber kein Argument warum ein JIT schneller ist, denn beide Verfahren würden doch insgesamt die gleiche Zeit beanspruchen...
Die Frage wäre jetzt: was stimmt davon, was nicht? Oder habe ich den konkreten Unterschied etwa gar nicht erfasst?
Über ein paar Expertenmeinungen wäre ich sehr dankbar...
mag eine ziemlich bekloppte Frage sein, aber irgendwie konnte mir bisher niemand eine konkrete Antwort geben:
Worin besteht eigentlich der genaue Unterschied zwischen der Arbeitsweise eine JIT-Compilers und eines Interpreters?
Ich meine, beide haben doch die Aufgabe, zur Laufzeit eine Bytecodeanweisung "irgendwie" auf Maschinencode abzubilden und diese Maschinencodeanweisung(en) dann zur Ausführung zu bringen. Soweit korrekt?
Einen Interpreter stelle ich mir wie folgt vor: Beim Starten eines Programms, lese die erste Bytecode-Anweisung, bilde diese "irgendwie" auf Maschinensprache ab, lasse den Rechner die entsprechende(n) Maschineninstruktionen ausführen, gehe dann zur nächsten Bytecodeanweisung und mache alles von vorne.
Und irgendwie checke ich jetzt nicht, was der JIT konkret anders macht. Auch der muss ja während der Laufzeit irgendwie den Bytecode auf Maschinencode abbilden.
Besteht der Unterschied etwa darin, wie die Abbildung "Bytecode -> Maschinencode" genau gemacht wird (aufwändiges Umrechnen vs. Nachschlagen in einer Art Hashmap, o.ä.) ?
Oder ist der Unterschied, dass der JIT zum Teil den einmal abgebildeten Maschinencode speichert, und den Bytecode dann nicht mehr neu abzubilden braucht, sondern einfach die gespeicherten Maschineninstruktionen ausführt falls die Stelle erneut durchlaufen wird? Das würde ja Sinn machen, wenn das Abbilden (d.h. das Berechnen und Schreiben des passenden Maschinencodes) aufwändig ist und viel Rechenzeit benötigt...
Teilweise wird ja auch behauptet, dass ein JIT beim Programmstart immer den gesamten Bytecode nach Maschinencode kompiliert und erst dann das Ausführen dieses Maschinencodes veranlasst, so dass das Laden sehr lange dauert, das Ausführen aber schnell geht weil die ganze Zeit Maschinencode läuft. Das glaube ich aber nicht so richtig, denn das wäre für mich kein JIT-Verhalten mehr.
Ein weiterer Unterschied, der angegeben wird, ist dass ein Interpreter immer bloß eine einzige Bytecodeanweisung abbildet und diese dann ausführt, während der JIT zum Teil auch mehrere Anweisungen hintereinander abbildet und erst dann ausführt. Das mag zwar stimmen, ist doch aber kein Argument warum ein JIT schneller ist, denn beide Verfahren würden doch insgesamt die gleiche Zeit beanspruchen...
Die Frage wäre jetzt: was stimmt davon, was nicht? Oder habe ich den konkreten Unterschied etwa gar nicht erfasst?
Über ein paar Expertenmeinungen wäre ich sehr dankbar...