JS엔진이 ν‘œν˜„μ‹κ³Ό 문을 κ΅¬λΆ„ν•˜λŠ” 법

2025. 8. 12. 01:29ㆍFront-end/JavaScript

λ°˜μ‘ν˜•

 

https://youtu.be/Zc9ifjZy0gs?si=PknWCo0KNwPJO3De

 

 

ν‘œν˜„μ‹κ³Ό 문을 μ •λ¦¬ν•˜λ‹€λ³΄λ‹ˆκΉŒ ν—·κ°ˆλ¦¬κΈ° μ‹œμž‘ν–ˆλ‹€.

μ •ν™•νžˆ 뭐가 ν‘œν˜„μ‹μ΄κ³  뭐가 문인가

a = 1	// ν‘œν˜„μ‹
a = 1;	// 문으둜 쓰인 ν‘œν˜„μ‹
var a;	// μ„ μ–Έλ¬Έ (ν‘œν˜„μ‹x)
var a = 1;	// λ³€μˆ˜ μ„ μ–Έλ¬Έ (ν‘œν˜„μ‹x)

띠용~~ κ·Έλž˜μ„œ 더 정리해봀닀.

 

ν‘œν˜„μ‹ λ¬Έ
 κ°’이 λœλ‹€.
 ν‰κ°€ν•˜λ©΄ 결과값이 λ‚˜μ˜¨λ‹€
 λ‹€λ₯Έ ν‘œν˜„μ‹ μ•ˆμ— λ“€μ–΄κ°ˆ 수 μžˆλ‹€
 λ™μž‘을 'μ§€μ‹œ'ν•œλ‹€
 ν”„λ‘œκ·Έλž¨μ˜ 흐름 μ œμ–΄, λ³€μˆ˜ μ„ μ–Έ 등이 κ°€λŠ₯ν•˜λ‹€
 ν‘œν˜„식을 포함할 수 μžˆλ‹€
μ½”λ“œ μ„€λͺ… 평가 κ²°κ³Ό μ½”λ“œ μ„€λͺ… κ°’ λ°˜ν™˜ μ—¬λΆ€
1 + 2 숫자 λ§μ…ˆ ν‘œν˜„μ‹ 3 var a; λ³€μˆ˜ μ„ μ–Έλ¬Έ β­•
'hello' λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹ 'hello' if (a>0) { ... } 쑰건문 β­•
a = 1 ν• λ‹Ή ν‘œν˜„μ‹ 1 for (...) { ... } 반볡문 β­•
true && false 논리 AND ν‘œν˜„μ‹ false a = 1; ν‘œν˜„μ‹ λ¬Έ ❌
  var a = 1; λ³€μˆ˜ μ„ μ–Έλ¬Έ ❌

 

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ECMAScript λͺ…세에 따라 μ½”λ“œλ₯Ό λ¬Έκ³Ό ν‘œν˜„μ‹μœΌλ‘œ νŒŒμ‹±ν•œλ‹€.

  • var : μ„ μ–Έλ¬Έμ„ λ§Œλ“œλŠ” ν‚€μ›Œλ“œλ‘œ, varλ₯Ό λ§Œλ‚˜λŠ” μˆœκ°„ ν•΄λ‹Ή μ½”λ“œλŠ” λ¬ΈμœΌλ‘œ ν•΄μ„λœλ‹€.→ λ‹€λ₯Έ ν‘œν˜„μ‹μ— λ“€μ–΄κ°ˆ 수 μ—†μŒ
  • μ„Έλ―Έμ½œλ‘ (;) : λ¬Έμ„ λλ‚΄λŠ” ν† ν°μœΌλ‘œ, νŒŒμ„œκ°€ μ„Έλ―Έμ½œλ‘ μ„ λ§Œλ‚˜λ©΄ 'μ—¬κΈ°κΉŒμ§€κ°€ ν•œ λ¬Έμ΄κ΅¬λ‚˜'ν•˜κ³  λŠλŠ”λ‹€.

μ—”μ§„μ˜ νŒŒμ‹± 과정은 μ•„λž˜μ™€ 같이 μ§„ν–‰λœλ‹€.

  1. 토큰화 (Tokenize)
    • a = 1;  →  Identifier(a), =, NumericLiteral(1), ;
  2. νŒŒμ‹± (Parse)
    • 토큰을 *AST(Abstract Syntax Tree)둜 λ³€ν™˜
    • a = 1은 AssignmentExpression λ…Έλ“œλ‘œ,
      뒀에 μ„Έλ―Έμ½œλ‘ μ΄ λΆ™μœΌλ©΄ ExpressionStatement λ…Έλ“œλ‘œ 감쌈
  3. μ‹€ν–‰ (Execute)
    • ExpressionStatementλŠ” μ‹€ν–‰ν•˜λ˜, λ°˜ν™˜κ°’μ„ 버림

*ASTλž€ 좔상 문법 트리의 μ•½μžλ‘œ, μ†ŒμŠ€ μ½”λ“œλ₯Ό ꡬ쑰적으둜 ν‘œν˜„ν•œ 트리 ν˜•νƒœμ˜ μžλ£Œκ΅¬μ‘°μ΄λ‹€.

μ½”λ“œμ˜ 문법 ꡬ쑰λ₯Ό λ…Έλ“œ(node)와 κ°€μ§€(branch)둜 λ‚˜λˆ„μ–΄ μΆ”μƒν™”ν•΄μ„œ ν‘œν˜„ν•œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„, 도ꡬ듀(Babel, ESLint, TypeScript 컴파일러 λ“±)이 AST둜 μ½”λ“œλ₯Ό κ²€μ‚¬ν•˜κ³  μˆ˜μ •ν•œλ‹€.

let a = 1 + 2;

VariableDeclaration	// λ³€μˆ˜ μ„ μ–Έ
 β”œβ”€ Identifier: a	// λ³€μˆ˜ 이름
 └─ BinaryExpression (+)	//λ”ν•˜κΈ° μ—°μ‚°
     β”œβ”€ NumericLiteral: 1	// ν”Όμ—°μ‚°μž
     └─ NumericLiteral: 2	// ν”Όμ—°μ‚°μž

AST Explorer같은 AST μ‹œκ°ν™” 도ꡬλ₯Ό μ‚¬μš©ν•΄μ„œ λ‹€μ–‘ν•œ μ–Έμ–΄μ˜ ASTλ₯Ό λ³Ό 수 μžˆλ‹€.

 

 

 

 

 

 

μ°Έκ³ 

더보기

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_operators#expressions_and_statements

 

Expressions and operators - JavaScript | MDN

This chapter describes JavaScript's expressions and operators, including assignment, comparison, arithmetic, bitwise, logical, string, ternary and more.

developer.mozilla.org

https://velog.io/@rhaudgks12/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-5%EC%9E%A5-%ED%91%9C%ED%98%84%EC%8B%9D-%EA%B3%BC-%EB%AC%B8

 

μžλ°”μŠ€ν¬λ¦½νŠΈ 5μž₯ ν‘œν˜„μ‹ κ³Ό λ¬Έ

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ λ¨Όμ € λ¬Έ(statement) λ‹¨μœ„λ‘œ κ΅¬λΆ„ν•˜κ³ , 각 문을 ν‘œν˜„μ‹(expression) 으둜 λ‚˜λˆ„μ–΄ ν•΄μ„ν•©λ‹ˆλ‹€. ν‘œν˜„μ‹μ€ κ°’μœΌλ‘œ 평가될 수 μžˆλŠ” 문의 일뢀뢄이며, 문은 ν”„λ‘œκ·Έ

velog.io

https://valur.tistory.com/entry/%EB%AA%A8%EB%8D%98-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-Deep-Dive-5%EC%9E%A5-%ED%91%9C%ED%98%84%EC%8B%9D%EA%B3%BC-%EB%AC%B8

 

[λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive] 5μž₯ ν‘œν˜„μ‹κ³Ό λ¬Έ

κ°’κ°’(value)은 식(ν‘œν˜„μ‹, expression)이 평가(evaluate)λ˜μ–΄ μƒμ„±λœ κ²°κ³Όλ₯Ό λ§ν•œλ‹€. ν‰κ°€λž€ 식을 ν•΄μ„ν•΄μ„œ 값을 μƒμ„±ν•˜κ±°λ‚˜ μ°Έμ‘°ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€. 예λ₯Ό λ“€μ–΄ '10 + 20'μ΄λΌλŠ” 식은 ν‰κ°€λ˜μ–΄ 숫자 κ°’ 30

valur.tistory.com

 

 

 

 

λ°˜μ‘ν˜•

'Front-end > JavaScript' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[WIP] defer πŸ†š async πŸ†š DOMContentLoaded  (1) 2025.08.14
Undefined vs null vs NaN  (3) 2025.08.12
B7 : 쑰건문  (3) 2025.08.12
B6 : ꡬ문과 μ—°μ‚°μž  (9) 2025.08.11
μžλ°”μŠ€ν¬λ¦½νŠΈ λͺ¨λ“ˆ μ‹œμŠ€ν…œ  (4) 2025.08.08