자바스크립트 소스 코드는 단일 스레드
또는 다중 쓰레드의 언어
가 아니다.
자바 스크립트는 문법
으로 나열된 문자열
에 불과하다.
문법 文 글월 문 法 법 법
국어의 단어가 서로 관계를 맺어서 문장을 이루는 법칙.
말의 구성 및 운용상의 규칙. 또는 그것을 연구하는 학문
그럼, 무엇을 위한 문법일까?
JavaScript는 V8 엔진이 특정한 규칙으로 이루어진 문자열
을 C++ 객체 인스턴스로 변환
하는 데 사용되는 문법이다.
JavaScript 프로그램을 실행하기 위해 V8 엔진이 이해할 수 있도록 AST(Abstract Syntax Tree)로 변환해야 한다.
이 AST는 V8 엔진의 Ignition 인터프리터로 전달 되어 바이트 코드
로 컴파일 된다.
Understanding the V8 Javascript Engine Youtube 세미나를 보면 네트워크에서 Byte Stream Decoder로 이진수로 된 문자열 스트림
이 흐르고 있는 것을 영상으로 볼 수 있다.
function
토큰을 예를 들면 아래와 같은 데, 해당 토큰을 사용할 때 맥락에 필요한 다른 토큰들을 AST 트리 구문으로 변환 하는 것이다.
😎 여기서 스캐너가 등장한다
스캐너는 Parser
가 AST 트리 구조를 만들기 위해 필요한 토큰
을 제공해 주는 역할을 한다.
스캐너
스캐너는 UTF-16로 이루어진 문자열을 Token화 한다.
토큰이란 단일론적인 의미를 갖는 하나 이상의 문자로 구성된 블록이다.
Ex) let, const, function...
V8 Engine Token Namespace 링크를 들어가 보면 토큰이 어떤 종류가 있는 지 확인 할 수 있다.
....
#define LONG_SYMBOL_NAME_LIST(V) \
V("<=", LE) \
V(">=", GE) \
V("==", EQ) \
V("!=", NE) \
V("<<", SHL) \
V(">>", SAR) \
V(">>>", SHR) \
V("'use asm'", UseAsm)
// clang-format off
#define SIMPLE_SINGLE_TOKEN_LIST(V) \
V('+') V('-') V('*') V('%') V('~') V('^') V('&') V('|') V('(') V(')') \
V('[') V(']') V('{') V('}') V(':') V(';') V(',') V('?')
// clang-format on.
...
아래는 V8 엔진의 아키텍처
로 스캐너는 UTF-16으로 이루어진 문자열 스트림을 토큰화 하여 Parser가 AST를 생성할 수 있는 재료(토큰)
을 만들어 주는 역할을 한다!
스캐너가 궁금하다면 V8 Engine의 scanner.c 코드를 참고해보면 좋을 것 같다 😁
블로그를 올리고 생각해보니 모든 언어는 문법인가 생각이 들었다.
C, C++도 결국 컴파일러가 바꾸어주는 것 아닌가?
흠.. 근데 JS는 V8 Engine이 C++를 활용하기 위해 필요한 약속이니 뉘앙스가 좀 다른가 싶기도 하다. C++을 사용하기 위한 문법?!😯
잘 모르겠다!
하지만, 중요한 것은 해당 아이디어와 V8엔진이 어떻게 JS를 실행하는 지 공부하게 되면서 더 자바스크립트의 생태계를 이해할 수 있는 좋은 기회가 되었던 것 같다!
어떻게 언어가 실행되고, 어떤 환경에서 돌아가는 지 아는 것이 더 넓은 시야를 갖게 된 기회가 되었다!