JavaScript is Grammer

김동현·2024년 1월 22일
0

NodeJS

목록 보기
3/6
post-thumbnail

JavaScript는 문법이다.

자바스크립트 소스 코드는 단일 스레드 또는 다중 쓰레드의 언어가 아니다.
자바 스크립트는 문법으로 나열된 문자열에 불과하다.

문법 文 글월 문 法 법 법
국어의 단어가 서로 관계를 맺어서 문장을 이루는 법칙.
말의 구성 및 운용상의 규칙. 또는 그것을 연구하는 학문

그럼, 무엇을 위한 문법일까?
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를 실행하는 지 공부하게 되면서 더 자바스크립트의 생태계를 이해할 수 있는 좋은 기회가 되었던 것 같다!

어떻게 언어가 실행되고, 어떤 환경에서 돌아가는 지 아는 것이 더 넓은 시야를 갖게 된 기회가 되었다!

참고 자료

profile
달려보자

0개의 댓글