JiSoo's Devlog

[μš°μ•„ν•œ νƒ€μž…μŠ€ν¬λ¦½νŠΈ] 6μž₯ λ³Έλ¬Έ

Frontend/Typescript

[μš°μ•„ν•œ νƒ€μž…μŠ€ν¬λ¦½νŠΈ] 6μž₯

μ§€μˆ­μˆ­μˆ­ 2025. 5. 29. 10:13

πŸ“ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λŸ°νƒ€μž„κ³Ό νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ 컴파일

λŸ°νƒ€μž„κ³Ό μ»΄νŒŒμΌνƒ€μž„

ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λŠ” κ³ μˆ˜μ€€, μ €μˆ˜μ€€ μ–Έμ–΄λ‘œ ꡬ뢄 κ°€λŠ₯ν•˜λ‹€.

κ³ μˆ˜μ€€ μ–Έμ–΄λŠ” μ‚¬λžŒμ΄ μ΄ν•΄ν•˜κΈ° 휘운 ν˜•μ‹μœΌλ‘œ μž‘μ„±, μ €μˆ˜μ€€ μ–Έμ–΄λŠ” 컴퓨터가 μ΄ν•΄ν•˜κΈ° μ‰¬μš΄ ν˜•μ‹μœΌλ‘œ μž‘μ„±λœλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λŒ€ν‘œμ μΈ κ³ μˆ˜μ€€ 언어에 μ†ν•˜λ©° μ»΄νŒŒμΌλŸ¬λ‚˜ 인터프리터에 μ˜ν•΄ μ €μˆ˜μ€€ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œ λ²ˆμ—­λ˜μ–΄ μ‹€ν–‰λœλ‹€.

 

μ†ŒμŠ€μ½”λ“œλŠ” μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ 기계어 μ½”λ“œλ‘œ λ³€ν™˜λ˜μ–΄ μ‹€ν–‰ κ°€λŠ₯ν•œ ν”„λ‘œκ·Έλž¨μ΄ λ˜λŠ”λ° 이 단계λ₯Ό μ»΄νŒŒμΌνƒ€μž„μ΄λΌκ³  ν•œλ‹€.

μ»΄νŒŒμΌνƒ€μž„μ€ μ†ŒμŠ€μ½”λ“œκ°€ 컴파일 과정을 거쳐 기계어 μ½”λ“œλ‘œ λ³€ν™˜λ˜μ–΄ μ‹€ν–‰ν•  수 μžˆλŠ” ν”„λ‘œκ·Έλž¨μ΄ λ˜λŠ” 과정을 μ˜λ―Έν•œλ‹€.

μ†ŒμŠ€μ½”λ“œμ˜ 컴파일이 μ™„λ£Œλ˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ λ©”λͺ¨λ¦¬μ— μ μž¬λ˜μ–΄ μ‹€ν–‰λ˜λŠ”λ° 이 μ‹œκ°„μ„ λŸ°νƒ€μž„μ΄λΌκ³  ν•œλ‹€.

즉, 컴파일 과정을 마친 μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μ‚¬μš©μžμ— μ˜ν•΄ μ‹€ν–‰λ˜λŠ” κ³Όμ •

 

μžλ°”μŠ€ν¬λ¦½νŠΈ λŸ°νƒ€μž„

μžλ°”μŠ€ν¬λ¦½νŠΈ λŸ°νƒ€μž„μ€ μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ μ‹€ν–‰λ˜λŠ” ν™˜κ²½

ex) 크둬, μ‚¬νŒŒλ¦¬ 같은 인터넷 λΈŒλΌμš°μ €μ™€ Node.js

μžλ°”μŠ€ν¬λ¦½νŠΈ λŸ°νƒ€μž„μ˜ μ£Όμš” ꡬ성 μš”μ†Œμ—λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„, μ›Ή API, 콜백 큐, 이벀트 루프, λ Œλ” 큐가 μžˆλ‹€.

 

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ λŸ°νƒ€μž„

μ»΄νŒŒμΌμ€ 좔상화 단계가 λ‹€λ₯Έ κ³ μˆ˜μ€€ μ–Έμ–΄μ—μ„œ μ €μˆ˜μ€€ μ–Έμ–΄λ‘œ λ³€ν™˜λ˜λŠ” 과정을 가리킨닀.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” tsc둜 λΆˆλ¦¬λŠ” 컴파일러λ₯Ό 톡해 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ‘œ λ³€ν™˜λœλ‹€.

ν•˜μ§€λ§Œ νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” κ³ μˆ˜μ€€ μ–Έμ–΄(νƒ€μž…μŠ€ν¬λ¦½νŠΈ)κ°€ 또 λ‹€λ₯Έ κ³ μˆ˜μ€€ μ–Έμ–΄(μžλ°”μŠ€ν¬λ¦½νŠΈ)둜 λ³€ν™˜λ˜λŠ” 것이기 λ•Œλ¬Έμ— 컴파일이 μ•„λ‹Œ 트랜슀파일이라고 λΆ€λ₯΄κΈ°λ„ ν•œλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈ 컴파일러λ₯Ό μ†ŒμŠ€ λŒ€ 컴파일러라고 μ§€μΉ­ν•˜κΈ°λ„ ν•œλ‹€.

 

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” .ts ν™•μž₯μžκ°€ 뢙은 νŒŒμΌμ„ μ»΄νŒŒμΌν•˜κ³  .js ν™•μž₯μžκ°€ 뢙은 μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ„ λ§Œλ“ λ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ»΄νŒŒμΌλŸ¬λŠ” μ†ŒμŠ€μ½”λ“œλ₯Ό 해석해 AST(좔상 ꡬ문 트리)λ₯Ό λ§Œλ“  ν›„ νƒ€μž… 확인을 거친 λ‹€μŒ κ²°κ³Ό μ½”λ“œλ₯Ό μƒμ„±ν•œλ‹€.

 

AST(Abstract Syntax Tree)
μ»΄νŒŒμΌλŸ¬κ°€ μ†ŒμŠ€μ½”λ“œλ₯Ό ν•΄μ„ν•˜λŠ” κ³Όμ •μ—μ„œ μƒμ„±λœ 데이터 ꡬ쑰
μ»΄νŒŒμΌλŸ¬λŠ” μ–΄νœ˜μ  뢄석과 ꡬ문 뢄석을 톡해 μ†ŒμŠ€μ½”λ“œλ₯Ό λ…Έλ“œ λ‹¨μœ„μ˜ 트리 ꡬ쑰둜 κ΅¬μ„±ν•œλ‹€.

 

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” μ»΄νŒŒμΌνƒ€μž„μ— νƒ€μž…μ„ κ²€μ‚¬ν•˜κΈ° λ•Œλ¬Έμ— μ—λŸ¬κ°€ λ°œμƒν•˜λ©΄ ν”„λ‘œκ·Έλž¨ 싀행이 μ•ˆλœλ‹€.

이런 νŠΉμ§• λ•Œλ¬Έμ— νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό 정적 νƒ€μž… 검사기라고 ν•œλ‹€.

function add(a: number, b: number) {
  return a + b;
}

add(10, 20);
add(10, "20"); // μ—λŸ¬ λ°œμƒ

 

 

✨ νƒ€μž…μŠ€ν¬λ¦½νŠΈ 컴파일러의 λ™μž‘

μ½”λ“œ κ²€μ‚¬κΈ°λ‘œμ„œμ˜ νƒ€μž…μŠ€ν¬λ¦½νŠΈ 컴파일러

νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ»΄νŒŒμΌλŸ¬λŠ” μ½”λ“œμ— νƒ€μž… 였λ₯˜κ°€ μ—†λŠ”μ§€ ν™•μΈν•œλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” μ»΄νŒŒμΌνƒ€μž„μ— μ½”λ“œ νƒ€μž…μ„ ν™•μΈν•˜κΈ° λ•Œλ¬Έμ— μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜μ§€ μ•Šμ•„λ„ 였λ₯˜λ₯Ό 찾을 수 μžˆλ‹€.

μ»΄νŒŒμΌνƒ€μž„μ— 문법 μ—λŸ¬, νƒ€μž… κ΄€λ ¨ μ—λŸ¬λ₯Ό λͺ¨λ‘ κ²€μΆœν•œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” λŸ°νƒ€μž„μ— λ°œκ²¬ν•  수 μžˆλŠ” μ—λŸ¬λ₯Ό, νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” μ»΄νŒŒμΌνƒ€μž„μ— λ°œκ²¬ν•΄ μ‹€ν–‰ κ³Όμ •μ—μ„œ λ°œμƒν•  수 μžˆλŠ” 문제λ₯Ό λ°©μ§€ν•œλ‹€.

 

μ½”λ“œ λ³€ν™˜κΈ°λ‘œμ„œμ˜ νƒ€μž…μŠ€ν¬λ¦½νŠΈ 컴파일러

νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ»΄νŒŒμΌλŸ¬λŠ” νƒ€μž… 검사 ν›„ νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό 각자의 λŸ°νƒ€μž„ ν™˜κ²½μ—μ„œ λ™μž‘ν•  수 μžˆλŠ” κ΅¬λ²„μ „μ˜ μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ νŠΈλžœμŠ€νŒŒμΌν•œλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ†ŒμŠ€μ½”λ“œλŠ” νŒŒμ‹±ν•˜κ³  μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ‘œ λ³€ν™˜ν•΄μ•Ό μ‹€ν–‰ν•  수 μžˆλ‹€.

 

νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ»΄νŒŒμΌλŸ¬λŠ” νƒ€μž… 검사 μˆ˜ν–‰ ν›„ μ½”λ“œ λ³€ν™˜μ„ μ‹œμž‘ν•˜λŠ”λ° μ΄λ•Œ νƒ€μž… 였λ₯˜κ°€ μžˆμ–΄λ„ 일단 μ»΄νŒŒμΌμ„ μ§„ν–‰ν•œλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ½”λ“œκ°€ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ‘œ λ³€ν™˜λ˜λŠ” 과정은 νƒ€μž… 검사와 λ…λ¦½μ μœΌλ‘œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

 

πŸ‘‰πŸ» νƒ€μž…μŠ€ν¬λ¦½νŠΈ 컴파일러의 μ—­ν• 

1. μ΅œμ‹  λ²„μ „μ˜ νƒ€μž…μŠ€ν¬λ¦½νŠΈ, μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό κ΅¬λ²„μ „μ˜ μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ 트랜슀파일

2. μ½”λ“œμ˜ νƒ€μž… 였λ₯˜ 검사

 

 

‼️ νƒ€μž…μŠ€ν¬λ¦½νŠΈ 컴파일러의 ꡬ쑰

μ»΄νŒŒμΌλŸ¬λŠ” ν•œ ν”„λ‘œκ·Έλž¨μœΌλ‘œ 이λ₯Ό κ΅¬ν˜„ν•œ μ†ŒμŠ€ 파일이 μ‘΄μž¬ν•œλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ»΄νŒŒμΌλŸ¬λŠ” λ‹€μ„― 단계λ₯Ό 거쳐 νƒ€μž… 검사와 μžλ°”μŠ€ν¬λ¦½νŠΈ μ†ŒμŠ€ λ³€ν™˜μ„ μ§„ν–‰ν•œλ‹€.

μŠ€μΊλ„ˆ: .ts 토큰화

νŒŒμ„œ: 토큰 기반 AST 생성

바인더: AST λ…Έλ“œ 기반 심볼 생성

체컀: AST + 심볼 기반 νƒ€μž… 검사

이미터: AST + μ½”λ“œ 검사 기반 .js 생성

 

 

ν”„λ‘œκ·Έλž¨

νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ»΄νŒŒμΌλŸ¬λŠ” tsc λͺ…λ Ήμ–΄λ‘œ μ‹€ν–‰λ˜κ³  tsconfig.json에 λͺ…μ‹œλœ 컴파일 μ˜΅μ…˜μ„ 기반으둜 μ»΄νŒŒμΌμ„ μˆ˜ν–‰ν•œλ‹€.

λ¨Όμ € 전체적인 컴파일 과정을 κ΄€λ¦¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨ 객체(μΈμŠ€ν„΄μŠ€)κ°€ μƒμ„±λ˜κ³  이 κ°μ²΄λŠ” μ»΄νŒŒμΌν•  νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ†ŒμŠ€ 파일과 μž„ν¬νŠΈλœ νŒŒμΌμ„ λΆˆλŸ¬μ˜€λŠ”λ°, κ°€μž₯ 졜초둜 뢈러온 파일 κΈ°μ€€μœΌλ‘œ 컴파일 과정이 μ‹œμž‘λœλ‹€.

 

μŠ€μΊλ„ˆ

μŠ€μΊλ„ˆλŠ” νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ†ŒμŠ€ νŒŒμΌμ„ μ–΄νœ˜μ μœΌλ‘œ 뢄석해 토큰을 μƒμ„±ν•œλ‹€.

즉, μ†ŒμŠ€μ½”λ“œλ₯Ό μž‘μ€ λ‹¨μœ„λ‘œ λ‚˜λˆ  의미 μžˆλŠ” ν† ν°μœΌλ‘œ λ³€ν™˜ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.

 

νŒŒμ„œ

νŒŒμ„œλŠ” μŠ€μΊλ„ˆκ°€ μ€€ μ†ŒμŠ€ 파일의 토큰 정보λ₯Ό μ΄μš©ν•΄ ASTλ₯Ό μƒμ„±ν•œλ‹€.

ASTλŠ” μ»΄νŒŒμΌλŸ¬κ°€ λ™μž‘ν•˜λŠ” 데 핡심 기반이 λ˜λŠ” 자료 ꡬ쑰둜, μ†ŒμŠ€μ½”λ“œμ˜ ꡬ쑰λ₯Ό 트리 ν˜•νƒœλ‘œ ν‘œν˜„ν•œλ‹€.

μŠ€μΊλ„ˆλŠ” μ–΄νœ˜μ  λΆ„μ„œκΈ€ 톡해 토큰 λ‹¨μœ„λ‘œ μ†ŒμŠ€μ½”λ“œλ‘œ λ‚˜λˆ„μ§€λ§Œ νŒŒμ„œλŠ” μƒμ„±λœ 토큰 λͺ©λ‘μ„ ν™œμš©ν•΄ ꡬ문적 뢄석을 μˆ˜ν–‰ν•œλ‹€.

이λ₯Ό 톡해 μ½”λ“œμ˜ μ‹€μ§ˆμ μΈ ꡬ쑰λ₯Ό λ…Έλ“œ λ‹¨μœ„μ˜ 트리 ν˜•νƒœλ‘œ ν‘œν˜„ν•œλ‹€.

 

바인더

λ°”μΈλ”μ˜ μ£Όμš” 역할은 체컀 λ‹¨κ³„μ—μ„œ νƒ€μž… 검사λ₯Ό ν•  수 있게 κΈ°λ°˜μ„ λ§ˆλ ¨ν•˜λŠ” 것이닀.

νƒ€μž… 검사λ₯Ό μœ„ν•΄ μ‹¬λ³Όμ΄λΌλŠ” 데이터 ꡬ쑰λ₯Ό μƒμ„±ν•˜κ³  그에 λŒ€μ‘ν•˜λŠ” AST λ…Έλ“œλ₯Ό μ—°κ²°ν•˜λŠ” 역할을 μˆ˜ν–‰ν•œλ‹€.

심볼은 이전 λ‹¨κ³„μ˜ ASTμ—μ„œ μ„ μ–Έλœ νƒ€μž…μ˜ λ…Έλ“œ 정보λ₯Ό μ €μž₯ν•œλ‹€.

export interface Symbol {
  flags: SymbolFlags;
  escapedNamd: string;
  declarations?: Declaration[];
  //...
}

 

체컀와 이미터

μ²΄μ»€λŠ” νŒŒμ„œκ°€ μƒμ„±ν•œ AST와 심볼을 ν™œμš©ν•΄ νƒ€μž… 검사λ₯Ό μˆ˜ν–‰ν•œλ‹€.

μ²΄μ»€λŠ” AST의 λ…Έλ“œλ₯Ό νƒμƒ‰ν•˜λ©΄μ„œ 심볼 정보λ₯Ό λΆˆλŸ¬μ™€ μ†ŒμŠ€ νŒŒμΌμ— λŒ€ν•œ νƒ€μž… 검사λ₯Ό μ§„ν–‰ν•œλ‹€.

체컀의 νƒ€μž… κ²€μ‚¬λŠ” λ‹€μŒ 컴파일 단계인 μ΄λ―Έν„°μ—μ„œ μ‹€ν–‰λœλ‹€.

checker.ts의 getDiagnostics() ν•¨μˆ˜λ‘œ νƒ€μž…μ„ κ²€μ¦ν•˜κ³  νƒ€μž… μ—λŸ¬μ— λŒ€ν•œ μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό μ €μž₯ν•œλ‹€.

 

μ΄λ―Έν„°λŠ” νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ†ŒμŠ€ νŒŒμΌμ„ λ³€ν™˜ν•˜λŠ” 역할을 ν•œλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ†ŒμŠ€ νŒŒμΌμ„ μžλ°”μŠ€ν¬λ¦½νŠΈ 파일과 νƒ€μž… μ„ μ–Έ 파일(d.ts)둜 μƒμ„±ν•œλ‹€.

 

 

🌟 νƒ€μž…μŠ€ν¬λ¦½νŠΈ 컴파일 κ³Όμ • 정리

1. tsc λͺ…λ Ήμ–΄ μ‹€ν–‰ν•΄ ν”„λ‘œκ·Έλž¨ 객체가 컴파일 κ³Όμ • μ‹œμž‘

2. μŠ€μΊλ„ˆλŠ” μ†ŒμŠ€ νŒŒμΌμ„ 토큰 λ‹¨μœ„λ‘œ 뢄리

3. νŒŒμ„œλŠ” ν† ν°μœΌλ‘œ AST 생성

4. λ°”μΈλ”λŠ” AST의 각 λ…Έλ“œμ— λŒ€μ‘ν•˜λŠ” 심볼 생성, 심볼은 μ„ μ–Έλœ νƒ€μž…μ˜ λ…Έλ“œ 정보 λ‹΄κ³  μžˆλ‹€.

5. μ²΄μ»€λŠ” ASTλ₯Ό νƒμƒ‰ν•˜λ©΄μ„œ 심볼 정보 ν™œμš©ν•΄ νƒ€μž… 검사

6. νƒ€μž… 검사 κ²°κ³Ό μ—λŸ¬κ°€ μ—†μœΌλ©΄ μ΄λ―Έν„°λ‘œ μžλ°”μŠ€ν¬λ¦½νŠΈ μ†ŒμŠ€ 파일 λ³€ν™˜

 

728x90