본 게시글은 How Does JavaScript Really Work? (Part 1) 내용을 번역한 내용입니다.
오역 및 의역이 있을 수 있습니다 🥲 (있으면 알려주세요!)
모듈 JavaScript 애플리케이션을 빌드할 수 있게 도와주고, 컴포넌트를 프로젝트나 팀과 쉽게 공유할 수 있는 툴
일단 JS를 시작하기 전에, 프로그래밍 언어들은 어떻게 동작하는지부터 이해해봅시다.
컴퓨터는 마이크로프로세서로 이루어져있고, 우리는 (아주 작지만 강력한) 코드로 이것을 조작할 수 있죠. 하지만 언어를.. 어떻게 마이크로프로세서가 이해할 수 있을까요?
기계의 enterprise 레벨 코드나, 어셈블리어를 작성하는 것은 사실상 불가능 하기때문에, 우리는 고수준언어(Java나, Python 같은)가 필요합니다. 그리고 이 언어로 작성된 것을 기계어로 바꿔주는 컴파일러나 인터프리터도 (당연히) 필요할 것 입니다.
컴파일러/인터프리터는 프로세스나 다른 언어가 작성한 것들을 기계어로 변경해줍니다.
Interpreter: 즉석에서 파일을 한 줄씩 읽고 번역. 초기에는 이것이 JS가 작동하는 방식이였습니다.
Compiler: 내가 넣은 파일을 기계어가 해석할 수 있는 새로운 파일을 미리 만듦.
다시말해, 우리가 작성한 JS 코드를 기계어로 바꿀 수 있는 두가지 방법이 있습니다.
ECMAScript를 만들어낸 똑똑한 사람들은 두 프로세스의 장점을 섞어 JIT(Just-in-time) 컴파일러를 만들어냅니다. Javascript는 인터프리터처럼 실행되지만 실제 구현과 실행은 엔진에 의존하죠. 이제 V8에서 사용하는 전략에 대해 살펴볼까요?
Javascript는 기계어로 바꾸어주는 머신(엔진)이 존재합니다. 다른 언어들과 유사하게, (이 엔진은 모든 언어를 사용해 구축할 수 있으므로) 엔진이 하나만 있는 것은 아닙니다.
V8
은 크롬 브라우저를 위해 구글에서 구현한 엔진SpiderMonkey
는 Netscape Navigator에서 처음으로 사용된 엔진이며, 현재는 FireFox에서 사용JavaScriptCore
는 애플이 사파리를 위해 만든 엔진이 엔진들은 상당히 중요하기 때문에 Internet Explorer 뒤의 엔진이 궁금하다면 이 Wikipedia page를 참고하세요.
나만의 엔진은 어떻게 만들 수 있을까요?
생각보다 간단합니다! javascript의 ECMAScript 규격을 따라하면 돼요.
만약 우리가 번역기를 만든다면, 양 쪽 언어에서 통용되는 단어들을 먼저 알아야겠죠? 이미 우리는 확실한 기계어를 알고 있지만, JavaScript는 표준화가 필요합니다. (기계어와 통용될 단어말이예요!)
이 JavaScript의 표준화는 바로 ECMAScript(Ecma International in a specification) 또는 ES라 불리는 조직에서 처리해줍니다. 그러니까, 이제 블로그/유투브등에서 “ES7에서 업데이트 된 것”에 대한 내용을 보면, ‘아! ECMAScript 표준에 JS에 기능이 추가되었군!’ 라고 생각하면 됩니다.
쉽게말해, ECMAScript는 ECMA-262 기술 규격에 의해 정의된 범용 스크립트 언어로, Javascript는 이 ECMAScript 사양을 준수하는 범용 스크립팅 언어입니다.
좀 더 세부적인 내용은 이 블로그를 참고해보세요.
V8의 과거
구글이 많은 프로세스를 처리해야하는 구글 맵 브라우저를 만들었던 때로 돌아가봅시다. 그 당시 JavaScript 구현은 그 거대한 구글맵을 빠르게 처리할만큼 좋지 않았습니다. 구글은 빨리 사람들이 구글맵을 보고 광고를 팔아 💰돈을 벌어야하는데💰, 이런 문제가 있다보니 결국 서비스를 더 빠르고 강력하게 만들자는 생각을 하게됩니다.
그리고 2008년, 구글은 C++로 (그 빠르다고 하는) V8 엔진을 만들게 됩니다.
Parsing과 트리 만들기
Javascript 파일이 엔진으로 들어오면, parser가 내가 쓴 코드의 의미를 알아내기 위해 코드를 토큰으로 분해하여 분석합니다. 그 토큰들은 AST(Abstract Syntax Tree)를 만들어 냅니다.
AST들은 컴파일러가 언어 요소와 키워드의 사용을 검증하는 각각의 의미분석 시에 매우 중요한 역할을 합니다. 나중에는 AST가 실제 바이트코드나 기계어를 생성하는데 사용됩니다.
엔진의 심장
그 이후의 이야기
5.9버전이 릴리즈되기 전에는 두개의 최적화 컴파일러와, 기준 컴파일러를 사용했었습니다.
Baseline coompiler(기준 컴파일러)
는 full-codegen이라고도 불리며, 최적화 되지않은 기계어를 빠르게 생성두 개의 최적화 컴파일러(Crankshaft와 TurboFan)
은 코드 최적화에 사용JavaScript에 몇 가지 기능 추가와 함께, 구조 복잡성 증가로 인해 V8 팀에서는 동일한 파이프라인을 유지하는 것이 힘들어졌고, 이에따라 새로운 파이프라인으로 변경하게 됩니다.
(이전 접근방식과, 새로운 파이프라인으로 변경 이유에 대해 더 궁금하다면 이곳을 확인해보면 좋아요!)
미래에는
V8엔진은 더 좋은 성능을 위해 여전히 개선중입니다. 웹 어셈블리가 형태를 갖추기 시작하면, 파이프라인에 단계가 더 추가될 수도..
수많은 ECMAScript 엔진이 있고, V8은 그 중 구글이 만들어낸 인기있는 엔진 중 하나입니다. 이 블로그 글이 도움이 되었기를 바라며, ..(생략).. 만약 V8 팀와 더 자세한 내용이 궁금하다면 이곳을 참고하세요.