JavaScript Visualized: πβοΈ the JavaScript Engine
Posted on September 03, 2020Β - Β 4 min readreference: https://dev.to/lydiahallie/javascript-visualized-the-javascript-engine-4cdf
JavaScriptλ λλ΄μ€λλ€ (μ νν μλμ§λ§μ), νμ§λ§ λ¨Έμ μ΄ μ€μ λ‘ μ¬λ¬λΆμ΄ μμ±ν μ½λλ₯Ό μ΄λ»κ² μ΄ν΄ν μ μμκΉμ? JavaScript κ°λ°μλ‘ μ°λ¦¬λ λ³΄ν΅ μ»΄νμΌλ¬λ₯Ό μ°λ¦¬κ° μ§μ λ€λ£¨μ§ μμ΅λλ€. κ·Έλ¬λ, JavaScript μμ§μ κΈ°λ³Έ λμμ μλ κ²κ³Ό, μΈκ° μΉνμ μΈ JavaScript μ½λλ₯Ό μ΄λ»κ² μ²λ¦¬νκ³ κΈ°κ³κ° κ·Έκ±Έ μ΄ν΄νλμ§ μλ κ²μ λΆλͺ ν λμμ΄ λ κ²μ λλ€!π₯³
Note: μ΄ ν¬μ€νΈλ Node.jsμ ν¬λ‘λ―Έμ λΈλΌμ°μ μ¬μ©λλ V8 μμ§μ κΈ°λ°μΌλ‘ μμ±λ©λλ€.
HTML νμκ° μμ€λ₯Ό ν¬ν¨νλ script
νκ·Έλ₯Ό λ°κ²¬ν©λλ€. μ΄ μμ€μ μ½λλ λ€νΈμν¬, μΊμ λλ μ€μΉλ μλΉμ€ μ컀λ‘λΆν° λ‘λλ©λλ€. μμ²λ μ€ν¬λ¦½νΈμ μλ΅μ λ°μ΄νΈ μ€νΈλ¦Ό λμ½λκ° μ²λ¦¬λ₯Ό νλ λ°μ΄νΈ μ€νΈλ¦Όμ
λλ€. λ°μ΄νΈ μ€νΈλ¦Ό λμ½λλ λ€μ΄λ‘λλ λ°μ΄νΈ μ€νΈλ¦Όμ λμ½λ ν©λλ€.
1 || λ€νΈμν¬, μΊμ λλ μμ»€λ‘ λμ΄μ¨ μ€ν¬λ¦½νΈλ UTF-16 λ°μ΄νΈ μ€νΈλ¦ΌμΌλ‘ λ‘λλκ³ , λ°μ΄νΈ μ€νΈλ¦Ό λμ½λλ‘ μ λ¬λ©λλ€.
λ°μ΄νΈ μ€νΈλ¦Ό λμ½λλ λμ½λλ λ°μ΄νΈ μ€νΈλ¦ΌμΌλ‘ ν ν°μ μμ±ν©λλ€. μλ₯Ό λ€μ΄ 0066
μ f
λ‘ λμ½λλκ³ , 0075
λ u
λ‘, 006e
λ n
μΌλ‘, 0063
μ c
λ‘, 0074
λ t
λ‘, 0069
λ i
λ‘, 006f
λ o
λ‘, 006e
λ n
μΌλ‘ λμ½λλλ©° κ³΅λ°±μ΄ λ°λΌμ΅λλ€. function
μ΄ λ§λ€μ΄μ‘μ£ ! μ΄λ JavaScriptμμ μμ½λ ν€μλκ³ μ΄λ κ² μμ±λ ν ν°μ νμμκ² μ λ¬λ©λλ€ (κ·Έλ¦¬κ³ pre-parserλ₯Ό gifsμμ λ€λ£¨μ§ μμμ§λ§ λμ€μ μ€λͺ
ν κ±°μμ). λλ¨Έμ§ λ°μ΄νΈ μ€νΈλ¦Όλ λμΌν λ°©μμΌλ‘ λμν©λλ€.
2 || λ°μ΄νΈ μ€νΈλ¦Ό λμ½λλ λ°μ΄νΈλ₯Ό ν ν°μΌλ‘ λμ½λ ν©λλ€. ν΄λΉ ν ν°μ νμμ μ λ¬λ©λλ€.
μμ§μ 2κ°μ νμλ₯Ό μ΄μ©ν©λλ€: pre-parserμ parserμ£ . μΉ μ¬μ΄νΈλ₯Ό λ‘λνλ μκ°μ μ€μ΄κΈ° μν΄ μμ§μ μ¦μ νμνμ§ μμ μ½λμ λν νμ±μ λ―Έλ£Ήλλ€. parserκ° μ¦μ νμν μ½λλ₯Ό μ²λ¦¬νλ λμ pre-parserλ λμ€μ μ¬μ©λ μ½λλ€μ μ²λ¦¬ν©λλ€! νΉμ ν¨μκ° μ¬μ©μμ λ²νΌ ν΄λ¦μ μν΄μλ§ νΈμΆλλ€λ©΄, κ·Έ μ½λλ μΉ μ¬μ΄νΈκ° λ‘λ λμλ§μ μ¦μ μ»΄νμΌν νμλ μλκ±°μ£ . μ΄ν μ¬μ©μκ° λ²νΌμ ν΄λ¦νκ³ ν΄λΉ μ½λλ₯Ό μμ²νλ©΄ νμλ‘ μ λ¬λ©λλ€.
νμλ λ°μ΄νΈ μ€νΈλ¦Ό λμ½λλ‘λΆν° λ°μ ν ν°μ κΈ°λ°μΌλ‘ λ Έλλ₯Ό μμ±ν©λλ€. μ΄λ° λ Έλλ€λ‘ μΆμ ꡬ문 νΈλ¦¬κ° λ§λ€μ΄μ§λλ€. λλ AST(Abstract Syntax Tree)λΌκ³ λ ν©λλ€. π³
3 || νμλ ν ν°μ κΈ°λ°μΌλ‘ λ Έλλ₯Ό μμ±νκ³ μΆμ ꡬ문 νΈλ¦¬λ₯Ό λ§λλλ€.
λ€μμ μΈν°νλ¦¬ν° μ°¨λ‘μ λλ€! μΈν°ν리ν°λ ASTλ₯Ό λ°λΌκ°λ©° ASTμ ν¬ν¨λ μ 보λ₯Ό κΈ°λ°μΌλ‘ λ°μ΄νΈ μ½λλ₯Ό μμ±ν©λλ€. λ°μ΄νΈ μ½λ μμ± μμ μ΄ μμ ν λλλ©΄, ASTλ μ§μμ§κ³ , λ©λͺ¨λ¦¬ κ³΅κ° λν λΉμμ§λλ€. λ§μ§λ§μΌλ‘ κΈ°κ³κ° μ²λ¦¬ν μ μλ λΆλΆμ΄ μμ΅λλ€! π
4 || μΈν°ν리ν°λ ASTλ₯Ό λ°λΌκ°λ©° λ°μ΄νΈ μ½λλ₯Ό μμ±ν©λλ€.
λ°μ΄νΈ μ½λλ μ΄λ―Έ λΉ λ₯΄μ§λ§, λ λΉ¨λΌμ§ μ μμ΅λλ€. μ΄λ° λ°μ΄νΈ μ½λκ° μ€νλ λ μ λ³΄κ° κ°μ΄ μμ±λ©λλ€. μ΄κ±Έλ‘ νΉμ λμμ΄ μμ£Ό λ°μνλμ§μ λν μ¬λΆμ μ¬μ©λ λ°μ΄ν°μ νμ μ κ°μ§ν μ μμ΅λλ€. μ¬λ¬ λΆμ ν¨μλ₯Ό κ΅μ₯ν λ§μ΄ νΈμΆ ν΄μμ κ²λλ€: λ λΉ λ₯΄κ² μ€νλ μ μλλ‘ μ΅μ νλ₯Ό ν μκΈ°μ λλ€! ππ½ββοΈ
λ°μ΄νΈ μ½λλ μμ±λ νμ νΌλλ°±(type feedback)κ³Ό ν¨κ» μ΅μ ν μ»΄νμΌλ¬(optimizing compiler)μκ² μ λ¬λ©λλ€. μ΅μ ν μ»΄νμΌλ¬λ λ°μ΄νΈ μ½λμ νμ νΌλλ°±μ κ°κ³ κ°μ₯ μ΅μ νλ κΈ°κ³ μ½λλ₯Ό λ§λ€μ΄λ λλ€. π
5 || μ΅μ ν μ»΄νμΌλ¬λ‘ λ°μ΄νΈ μ½λμ νμ νΌλλ°±μ μ λ¬λ°μ κ°μ₯ μ΅μ νλ κΈ°κ³ μ½λλ₯Ό μμ±ν©λλ€.
JavaScriptλ λμ νμ μΈμ΄λ‘ λ°μ΄ν°μ μ νμ΄ λμμμ΄ λ³νν μ μμ΅λλ€. μ΄λ λ§μ½ λ§€λ² νΉμ κ°μ΄ κ°μ§ λ°μ΄ν° νμ μ νμΈν΄μΌ νλ€λ©΄ JavaScript μμ§μ΄ κ·Ήλλ‘ λλ €μ§ μ μλ€λ κ±Έ λ§νμ£ .
μ½λλ₯Ό ν΄μν λ μμλλ μκ°μ μ€μ΄κΈ° μν΄ λ§λ€μ΄μ§ μ΅μ νλ κΈ°κ³ μ½λλ λ°μ΄νΈ μ½λλ₯Ό μ€ννλ λμ μμ§μ΄ μ΄μ μ λ΄€λ κ²½μ°μ λν΄μλ§ μ²λ¦¬λ₯Ό ν©λλ€. λ§μ½ κ°μ λ°μ΄ν° νμ μ λ°ννλ νΉμ μ½λ λΆλΆμ΄ κ³μν΄μ λ°λ³΅λλ€λ©΄, μ²λ¦¬ μλλ₯Ό λμ΄κΈ° μν΄ κ°λ¨ν μ΅μ νλ κΈ°κ³ μ½λλ₯Ό μ¬μ¬μ© ν©λλ€. νμ§λ§ JavaScriptλ λμ νμ μ΄κΈ° λλ¬Έμ, κ°μ μ½λ λΆλΆμμ κ°μκΈ° λ€λ₯Έ νμ μ λ°μ΄ν°κ° λ°νλλ μΌμ΄ λ°μν μλ μμ£ . κ·Έλ° μΌμ΄ λ°μνλ€λ©΄, λ¨Έμ μ½λλ μ΅μ νλ₯Ό μ·¨μνκ³ , μμ§μ λ°μ΄νΈ μ½λλ₯Ό μμ±νλ λ¨κ³λ‘ λλμ κ°λλ€.
νΉμ ν ν¨μκ° 100λ² νΈμΆμ΄ λμκ³ μ§κΈκΉμ§ νμ λμΌν κ°μ λ°ννλ€κ³ ν΄λ³΄μ£ . μ΄λ 101λ²μ§Έ νΈμΆμμλ ν΄λΉ κ°μ λ°νν κ²μ΄λΌκ³ κ°μ ν μ μμκ±°μμ.
μλμ κ°μ sum ν¨μκ° μλ€κ³ ν©λλ€. μ§κΈκΉμ§λ νμ μ«μκ°μΈ μΈμλ‘ νΈμΆ λμ΄μμ΅λλ€:
μ΄κ±΄ μ«μ 3
μ λ°νν©λλ€! λ€μ λ² νΈμΆ μμλ, λ κ°μ μ«μ κ°μΌλ‘ νΈμΆν κ±°λΌκ³ κ°μ ν μ μκ² μ£ .
λ§μ½ κ·Έκ² μ¬μ€ μ΄λΌλ©΄, λμ νμ μ λν μ‘°νκ° νμ μμ΄ μ΅μ νλ κΈ°κ³ μ½λλ₯Ό μ¬μ¬μ©νκΈ°λ§ νλ©΄ λ©λλ€. κ·Έκ² μλλΌ κ°μ μ΄ νλ Έλ€λ©΄, μ΅μ νλ κΈ°κ³ μ½λ λμ μλμ λ°μ΄νΈ μ½λλ‘ λλ릴 κ²λλ€.
μλ₯Ό λ€μ΄, λ€μ νΈμΆμμ, μ«μ λμ λ¬Έμμ΄μ μ λ¬νλ€κ³ ν΄λ³΄μ£ . JavaScriptλ λμ νμ μ΄κΈ° λλ¬Έμ μ΄λ€ μλ¬ μμ΄λ μ²λ¦¬κ° κ°λ₯ν©λλ€!
μ¦, μ«μ 2
κ° λ¬Έμμ΄λ‘ λ³νλκ³ ν¨μλ λ¬Έμμ΄ "12"
λ₯Ό λ°νν κ±°λΌλ λ§μ΄μ£ . μ΄λ κ² λλ©΄ ν΄μλ λ°μ΄νΈ μ½λλ₯Ό μ€ννλ λ¨κ³λ‘ λλμκ°κ³ νμ
νΌλλ°±μ κ°±μ νκ² λ©λλ€.
μ΄λ² ν¬μ€νΈκ° λμμ΄ λμ ¨κΈΈ λ°λλλ€! π λ¬Όλ‘ , μ΄λ² ν¬μ€νΈμ λ€λ£¨μ§ λͺ»ν μμ§μ λλ¨Έμ§ λΆλΆλ€(JavaScript Heap, Call Stack λ±)λ λ§μ΄ μμ΅λλ€λ§ λμ€μ λ€λ£¨λλ‘ νκ² μ΅λλ€! JavaScriptμ λ΄λΆμ κ΄μ¬μ΄ μμΌμλ€λ©΄ V8μ μ€ν μμ€μ΄κΈ° λλ¬Έμ λ΄λΆ λμμ λν μ’μ λ¬Έμκ° μμΌλ―λ‘ ν΄λΉ λ¬Έμλ₯Ό μ‘°μ¬ν΄ 보μλ κ±Έ κΆν΄λλ €μ! π€