HooneyLog

JavaScript 컴파일러에 대한 이해

프로필 이미지

Seunghoon Shin

2024년 11월 25일 06:04

JavaScript 컴파일러에 대한 이해


소개

Custom JavaScript 컴파일러에 대한 인사이트는 무엇이 있을까??

  • 코드 최적화에 대한 깊은 통찰 제공.
  • JavaScript 내부 동작 원리 이해.
  • 특정 목적에 맞는 도메인 전용 언어(DSL) 설계.

  • 왜 JavaScript 컴파일러를 만들어야할까?

  • 최적화 및 효율성
  • 커스텀 문법 지원이 가능
  • 내부 동작 원리 이해
  • 언어 설계

  • JavaScript 컴파일러를 만드는 과정

    1. JavaScript 실행 파이프라인 이해

    JavaScript 코드는 브라우저 엔진(예: V8)에서 다음과 같은 단계를 거쳐 실행됩니다:

  • 파싱: JavaScript 코드를 분석해 추상 구문 트리로 변환합니다.
  • 컴파일: AST를 바이트코드나 기계어로 변환합니다.
  • 실행: 컴파일된 코드를 실행합니다.
  • 예시:

    let x = 5 + 3;이라는 코드가 실행되기까지 구문 분석 → 컴파일 → 실행 과정을 거친다.


    2. 어휘 분석(Lexical Analysis)

    어휘 분석은 코드에서 키워드, 식별자, 연산자 등 의미 있는 최소 단위인 토큰으로 분리합니다.

    예시 코드:

    let x = 5 + 3;

    생성된 토큰:

  • let (키워드)
  • x (식별자)
  • = (연산자)
  • 5 (리터럴)
  • + (연산자)
  • 3 (리터럴)

  • 3. 추상 구문 트리 생성

    AST는 프로그램의 구문적 구조를 계층적인 트리 형태로 나타낸 것입니다. 이는 코드의 논리와 구성 요소를 검사할 수 있게 합니다.

    예시 코드:

    
    let x = 5 + 3;

    생성된 AST:

    {
      "type": "Program",
      "body": [
        {
          "type": "VariableDeclaration",
          "declarations": [
            {
              "type": "VariableDeclarator",
              "id": { "type": "Identifier", "name": "x" },
              "init": {
                "type": "BinaryExpression",
                "operator": "+",
                "left": { "type": "Literal", "value": 5 },
                "right": { "type": "Literal", "value": 3 }
              }
            }
          ]
        }
      ]
    }

    4. 의미 분석

    AST의 의미를 분석해 코드가 언어 규칙을 준수하는지 확인합니다.

  • 스코프 해석: 변수의 접근 가능 범위를 결정합니다.
  • 타입 검사: 타입 규칙을 준수하는지 확인합니다.
  • 에러 처리: 선언되지 않은 변수나 잘못된 연산을 감지합니다.
  • 예시:

    
    let x = "hello" + 5;  // 올바른 코드, 결과는 "hello5"
    let y = "hello" - 5;  // 에러 발생: 문자열에서 숫자를 뺄 수 없음

    5. 코드 생성

    AST가 의미적으로 유효하다면 이를 실행 가능한 코드로 변환합니다.

  • 트랜스파일된 JavaScript: AST를 다시 JavaScript 코드로 변환합니다.
  • 바이트코드/기계어 생성: 낮은 수준의 코드로 변환하여 CPU에서 직접 실행 가능하게 만듭니다.
  • 예시:

    위 AST는 다음과 같은 JavaScript 코드로 변환됩니다:

    let x = 5 + 3;

    6. 에러 처리

  • 문법 에러(Syntax Errors): 잘못된 구문 구조. 예: SyntaxError: Unexpected token }
  • 의미 에러(Semantic Errors): 언어 규칙 위반. 예: 선언되지 않은 변수 사용.
  • 런타임 에러(Runtime Errors): 실행 중 발생하는 문제. 예: 0으로 나누기, 메모리 초과 등.

  • JIT(Just-In-Time) 컴파일
  • WebAssembly와의 사용
  • 도메인 전용 언어(DSL) 설계

  • 결론

  • JavaScript의 동작 원리를 깊이 이해할 수 있음.
  • 코드 최적화 및 실행 성능을 직접 개선할 수 있ㅇ음.
  • 특정 도메인에 맞는 새로운 언어를 설계하고 구현할 수 있음.