2017-12-28 12 views
1

Die wichtigsten JavaScript Engines von Webbrowsern und nodeJS hatten just-in-time Compiler seit Jahren.Gibt es Möglichkeiten, den Assembler-Code für den Code zu sehen, der von einem der JavaScript-Jits erzeugt wird, insbesondere von V8?

Ich habe gerade ein Video auf Compiler Explorer beobachtet, das den von vielen Compilern für verschiedene CPUs ausgegebenen Assemblercode zeigt.

Das erinnerte mich daran, dass ich neugierig auf den Code bin, der von den Jits der JS-Engines erzeugt wurde.

Hat eine dieser Engines Möglichkeiten, diesen generierten Low-Level-Code zu sehen?

(Wenn dies fehl am Platz auf SO wenden Sie sich bitte an die richtige SE-Website zu migrieren.)

+1

Das Video, das Sie guckten, war vermutlich Matt Godbolts Vortrag auf der CppCon2017: ["Was hat mein Compiler in letzter Zeit für mich getan? Den Compiler-Deckel abschrauben "] (https://youtu.be/bSkpMdDe4g4). Es ist gut :) –

Antwort

2

Für V8 gibt es ein Flag --print-opt-code, die für jede Funktion Assembler-Code optimiert erzeugt Ausdrucke, bekommt optimiert. Beachten Sie, dass Funktionen nur optimiert werden, wenn sie "heiß" sind, und nicht sofort, so dass die Flagge für ein kurzes "Hallo, Welt" -Stil-Programm nichts drucken wird. Sie können Funktionen "heiß" machen, indem Sie sie häufig anrufen.

In älteren Versionen gab es ein --print-code-Flag für nicht optimierten Code, aber da der Grundlinien (nicht optimierende) Compiler durch einen Interpreter ersetzt wurde, gibt es keinen unoptimierten Code mehr. Sie können den generierten Bytecode mit --print-bytecode ausdrucken.

Wenn Sie Chrome verwenden, können Sie Flags angeben, die an V8 übergeben werden, indem Sie sie in --js-flags, z. --js-flags="--print-opt-code".

0

Eine Sache, die Sie immer tun können, ist interrupt your program while it's running, using a debugger.

Wenn es die meiste Zeit in JIT-kompiliertem Code verbringt, besteht die Möglichkeit, dass der aktuelle Anweisungszeigerwert (RIP) in einem JIT-kompilierten Maschinencode liegt, den Ihr Debugger für Sie zerlegt. (Oder zumindest der Teil nach dem aktuellen RIP: Der x86-Maschinencode verwendet Anweisungen variabler Länge. Es gibt also keinen zuverlässigen Weg rückwärts zu gehen. Sie können einen einzelnen Schritt ausführen, bis Sie einen Rückwärtszweig erreichen, um zum Anfang einer Schleife zu gelangen.)

Aber ohne irgendeinen Weg herauszufinden, für welchen Funktionsnamen JITed asm angezeigt wird, ist dies wahrscheinlich nicht sehr nützlich, es sei denn, Sie haben nur einen Hot Loop (zB in einem künstlichen Test/Microbenchmark).


Mit der JIT-Engine die asm drucken, wie sie es (@ jmrk Antwort) erzeugt ist viel mehr verwendbar; Ich erwähne diese Technik nur, weil sie ohne jegliche Unterstützung durch die JIT-Engine funktioniert, so dass alles funktioniert.

Verwandte Themen