Ich spiele mit einem Spielzeug-Interpreter in Java herum und erwäge, einen einfachen Compiler zu schreiben, der das kann Erzeuge Bytecode für die Java Virtual Machine. Was hat mich zum Nachdenken gebracht, wie viel Optimierung von Compilern, die auf virtuelle Maschinen wie JVM und CLI abzielen, gemacht werden muss?
Tun Just-In-Time (JIT) -Compiler konstante Faltung, Peephole-Optimierungen etc.?
Ich werde nur zwei Links hinzufügen, die Javas Bytecode ziemlich gut erklären und einige der verschiedenen Optimierung der JVM zur Laufzeit.
Die Optimierung des Bytecodes ist in den meisten Fällen wahrscheinlich ein Oxymoron
Ich glaube nicht, dass das stimmt. Optimierungen wie das Aufrufen von Schleifen-Invarianten und propagierenden Konstanten können niemals schaden, selbst wenn die JVM schlau genug ist, um sie allein zu machen, weil der Code weniger Arbeit macht.
Optimierung macht JVMs zu Umgebungen für lang laufende Anwendungen. Sie können darauf wetten, dass SUN, IBM und Freunde ihr Bestes geben, um sicherzustellen, dass sie Ihren Bytecode und JIT-kompilierten Code so effizient wie möglich optimieren können.
Wenn Sie sagen, dass Sie Ihren Bytecode voroptimieren können, wird das wahrscheinlich nicht viel schaden.
Es ist jedoch wert, dass JVMs dazu tendieren, besser zu funktionieren (und nicht zu crashen), wenn sie nur mit der Art von Bytecode dargestellt werden, den der Java-Compiler zu konstruieren versucht. Es ist nicht unbekannt, dass Optimierungen verpasst werden oder sogar, dass die JVM abstürzt, wenn Permutationen von Bytecodes auftreten, die korrekt sind, aber im Gegensatz zu dem, was von javac produziert wird. Hoffentlich ist diese Art von Dingen jetzt in der Vergangenheit, aber vielleicht ist etwas, dessen man sich bewusst sein muss.
Verschleierungen wie ProGuard werden viele statische Optimierungen an Ihrem Bytecode für Sie durchführen.
Der HotSpot-Compiler optimiert Ihren Code zur Laufzeit besser als es zur Kompilierzeit möglich ist - er hat schließlich mehr Informationen zum Arbeiten. Der einzige Zeitpunkt, an dem Sie den Bytecode anstelle nur Ihres Algorithmus optimieren sollten, ist, wenn Sie mobile Geräte wie Blackberry verwenden, wo die JVM für diese Plattform nicht leistungsfähig genug ist, um den Code zur Laufzeit zu optimieren und nur den Bytecode auszuführen. p>
Die Optimierung des Bytecodes ist in den meisten Fällen wahrscheinlich ein Oxymoron. Wenn Sie die VM nicht steuern, haben Sie keine Ahnung, was die Codeausführung beschleunigt, wenn überhaupt. Der Compiler müsste die Details der VM kennen, um optimierten Code zu generieren.
Hinweis zu Aseraphim:
In einigen wenigen Fällen kann es auch nützlich sein, Bytecode für nicht eingebettete Anwendungen zu optimieren:
Bei der Bereitstellung von Code über die Leitung, z. B. für WebStart-Apps, um die lieferbare / Cachegröße zu minimieren und weil Sie nicht unbedingt die Fähigkeit / Geschwindigkeit des Clients kennen.
Für Code, von dem Sie wissen, dass er leistungskritisch ist und beim Start verwendet wird, bevor HotSpot Zeit hatte, irgendwelche Statistiken zu sammeln.
Auch hier können die Transformationen, die ein guter Optimierer / Obfuscator durchführt, sehr hilfreich sein.