2017-12-28 15 views
1

웹 브라우저의 주요 JavaScript 엔진과 nodeJS에는 수년간 just-in-time 컴파일러가 있습니다.JavaScript jits, 특히 V8에서 생성 된 코드의 어셈블리 코드를 볼 수있는 방법이 있습니까?

다양한 CPU 용 많은 컴파일러가 출력 한 어셈블리 코드를 보여주는 Compiler Explorer의 비디오를 방금 보았습니다.

JS 엔진의 jits에서 생성 된 코드에 대해 궁금해했습니다.

이러한 엔진 중 하나라도 저수준으로 생성 된 코드를 볼 수있는 방법이 있습니까? (이 올바른 SE 사이트로 마이그레이션 주시기 바랍니다 SO에 장소를 벗어나면.)

V8 들어

+1

시청중인 비디오는 CppCon2017에서 아마 Matt Godbolt의 연설이었습니다 : [ "내 컴파일러가 나에게 최근에 한 일은 무엇인가? 컴파일러의 뚜껑을 풀기 "] (https://youtu.be/bSkpMdDe4g4). –

답변

2

는 가져옵니다 각 기능에 대한 어셈블리 코드를 최적화 생성 인쇄하는 플래그 --print-opt-code,이 최적화. "hello, world"스타일 프로그램의 경우 플래그가 아무 것도 인쇄하지 않으므로 기능이 "핫"상태 일 때만 최적화됩니다. 함수를 "많이 호출"하여 기능을 "멋지게"만들 수 있습니다.

이전 버전에서는 최적화되지 않은 코드에 대해 --print-code 플래그가 있었지만 기본 (최적화되지 않은) 컴파일러가 인터프리터로 교체되었으므로 더 이상 최적화되지 않은 코드가 없습니다. 생성 된 바이트 코드는 --print-bytecode으로 인쇄 할 수 있습니다.

Chrome을 사용하는 경우 플래그를 -js-flags로 래핑하여 V8에 전달하도록 지정할 수 있습니다. --js-flags="--print-opt-code".

0

항상 할 수있는 한 가지는 interrupt your program while it's running, using a debugger입니다.

대부분의 시간을 JIT 컴파일 코드에서 사용하는 경우 현재 명령어 포인터 값 (RIP)이 디버거가 사용자를 위해 디스 어셈블하는 일부 JIT 컴파일 컴퓨터 코드 내에있을 가능성이 있습니다. (또는 적어도 현재 RIP 이후의 부분 : x86 머신 코드는 가변 길이 명령어를 사용하므로 신뢰할 수있는 방법으로 되돌릴 수 없습니다. 뒤로 가기 분기에 도달 할 때까지 한 단계 씩 수행하여 루프의 맨 위로 이동하십시오.)

그러나 JITed asm을보고있는 함수 이름을 파악할 방법이 없어도 하나의 핫 루프 만 있으면 (예 : 인공 테스트/마이크로 벤치 마크) 매우 유용하지는 않습니다.


그것 (@ jmrk의 답변을) 생성으로 JIT 엔진은 ASM을 인쇄 갖는 훨씬 더 사용할 수있다; JIT 엔진의 지원 없이도 작동하기 때문에이 기술 만 언급하므로 어떤 작업에도 사용할 수 있습니다.

관련 문제