Udemy - JavaScript: The Advanced Concepts
0) JS파일 입력
1) Parser : token으로 분리(Parse Tree 생성?)
2) AST(Abstract Syntax Tree)
3) Interpreter : 한줄씩 해석 -> ByteCode 생성 (기계어보다는 느림)
4) Profiler : 최적화 할 게 있을지 모니터링
5) Compiler : 최적화
6) Optimized code : 최적화된 기계어(101011...) 전달하여 Bytecode 부분 대체
---> interpreter로 일단 바로 실행하고, compiler로 점진적으로 효율화
---> 이걸 배워야하는 이유 : compiler는 완벽한게 아니기 때문에 내가 작성하는 코드가 컴파일러를 헷갈리지 않게, 유리하게 잘 사용할 수 있도록 하면 좋으니까
. 실행파일(.exe) : 주로 c++ 작성 후 (실행환경에 맞는) 기계어로 컴파일 -> 기계에서 실행
. java파일 : java 작성 > Bytecode 컴파일(JVM : JV기계...기계어로의 컴파일!) > JVM이 사용자 기계에 맞게 interpreting
//eval(), with는 엔진에게 scope 혼란을 줄수 있어 최적화가 어려움
JS는 객체 생성 후 속성을 추가 할 수있는 동적타이핑 언어로, 속성을 사전형으로 저장한다. 따라서 컴파일 시 속성의 메모리 오프셋을 결정하는 고정적타이핑 언어들(예 - JAVA)에 비해 검색비용이 든다. 이에 v8에서는 hidden class 방식을 사용하는데, 객체에 새로운 속성이 추가될때마다 새로운 히든클래스로 전환된다.
동일한 메소드를 동일한 유형의 객체에서 반복적으로 호출하는 점에 착안해 만들어진 기법. v8엔진은 최근에 호출된 메서드에 매개변수로 전달된 객체에 대한 타입을 캐시로 유지하는데, 동일한 히든클래스를 가진 객체가 두번이상 동일 메서드를 호출하면, 사용될 속성의 오프셋을 확인하기 위해 객체를 탐색하는 과정을 생략할 수 있다. 최적화 코드를 이용하던중 다른 타입의 객체가 메서드를 호출하면, 다시 de-optimized된 코드로 바꿔서 진행하므로 이를 고려한 코딩 필요!
처음부터 JS를 컴파일 해서 기계어로 만들었음 실행이 빠르잖아?
1) 브라우저에서 컴파일하려면 브라우저가 엄청 빨라야한다 - 1995년엔 느렸다
2) 바이너리 코드를 실행시키기 위한 (브라우저가 모두 동의하는) 표준이 있어야 한다 - 1995년은 브라우저 경쟁의 시대였으니 통합 불가였고, 지금까지도 브라우저별로 작동하는거 다다르다
그러나 이제 달라질것!
2017년 Web Assembly(표준 Binary 실행 포맷)가 탄생했다.
같은 강의 기록
엔진 설명
v8 최적화