λμΌν λ΄μ©μ΄ μλ°μ€ν¬λ¦½νΈ μ€ν°λ μ리μ¦μ μκΈ°λ νμ§λ§, μλ°μ€ν¬λ¦½νΈ μ리μ¦μλ μ΄ λ΄μ©μ λ£κ³ μΆμ΄μ κ°μ κΈμ λ λ² ν¬μ€ν νκ² λμλ€.
μ€μ½νλ νν, λ³μμ μμ‘΄ λ²μ λΌκ³ μκ³ μλ€. λ λν κ·Έλ κ²λ§ μκ°νκ³ μμλ€. λ¬Όλ‘ μ΄ λ§μ΄ λ§λ₯ νλ¦°κ²μ μλμ§λ§, μ€μ½νλ λ³΄λ€ λμ κ°λ μ ν¬ν¨νλ λ¨μ΄μ΄λ€.
κ·Έλμ μ€μ½νλ₯Ό μκΈ° μ μ, μλ°μ€ν¬λ¦½νΈ νλ‘κ·Έλ¨μ΄ μ΄λ»κ² μλνλμ§λ₯Ό λ¨Όμ λ³Όκ²μ΄λ€.
- μλ°μ€ν¬λ¦½νΈ νλ‘κ·Έλ¨μ Engine, Compiler, Scopeμ μν΄ μ€νλλ€. (λ³΄λ€ μ ννκ²λ μμ§μ μν΄ μ€νλμ§λ§, μ»΄νμΌλ¬μ μ€μ½νλ μμ§μ λͺ λ Ήμ λ°λΌ κ°κΈ° 맑μ μΌμ νκΈ° λλ¬Έμ, κ°κ°μ μν΄ μ€νλλ€λ κ²λ λ§λ₯ ν리μ§λ§μ μλ€κ³ μκ°νλ€)
- Compilationμ μ κ³Όμ κ³Ό μλ°μ€ν¬λ¦½νΈ νλ‘κ·Έλ¨ μ€νμ μ κ³Όμ μ λ΄λΉνλ€. (μ°λ¦¬κ° νν μλ V8μ μλ°μ€ν¬λ¦½νΈμ λ€μν μμ§ μ€ νλμ΄λ€)
- μ»΄νμΌλ μ΄μ μ νλ€. μ»΄νμΌλ μ΄μ μ΄λ μμ§μ΄ μ€νν μ μλ μ½λλ₯Ό μμ±νλ κ³Όμ μ λ§νλ€.
- μ»΄νμΌλ μ΄μ
μ
ν ν¬λμ΄μ§/λ μ±
,νμ±
,μ½λ μμ±
μ μ΄ 3λ¨κ³λ‘ μ΄λ£¨μ΄μ Έμλ€.
- μλμ κ°μ μλ°μ€ν¬λ¦½νΈ νλ‘κ·Έλ¨μ΄ μλ€.
- μ΄ν΄λ₯Ό λκΈ° μν΄ μμ±ν κ±°λΌμ μ€μ μ μ‘°κΈ λ€λ₯΄λ€. λ³΄λ€ μ ννκ³ μμΈνκ² μκ³ μΆλ€λ©΄ μ΄ μ¬μ΄νΈλ₯Ό λ°©λ¬Έν΄λ³΄μ.
- λ¬Έμμ΄μ λλμ΄, tokenμ΄λΌ νλ μλ―Έ μλ μ‘°κ°μΌλ‘ λλλ κ²μ λ§νλ€.
- μ΄ κ³Όμ μ κ±°μΉλ©΄, κ·Έλ¦Όμ²λΌ
const
,a
,=
,5
,=
μΌλ‘ λλμ΄μ§λ€.
- ν ν° λ°°μ΄μ νλ‘κ·Έλ¨μ λ¬Έλ² κ΅¬μ‘°λ₯Ό λ°μνμ¬ νΈλ¦¬ κ΅¬μ‘°λ‘ λ§λλ κ²μ λ§νλ€. μ΄ κ³Όμ μ κ±°μ³ λ§λ€μ΄μ§ κ²μ AST(Abstract Syntax Tree) λΌ νλ€.
- μ΄ κ³Όμ μ κ±°μΉλ©΄, κ·Έλ¦Όκ³Ό κ°μ (λκ°μ§λ μλ€) ASTκ° μμ±λλ€.
- μμ§μ΄ μ€νν μ μλ μ½λλ₯Ό μμ±νλ€.
- μ€μ½νλ λ³μμ μμ‘΄λ²μ λ₯Ό λ§νλ€, λΌκ³ νλ©΄ νλ¦° λ§μ μλλ€. νμ§λ§ λκ° μμ¬μμ΄ μλ€. μλνλ©΄ μ€μ½νλ μ΄λ³΄λ€ ν° κ°λ μ ν¬ν¨νλ λ¨μ΄μ΄κΈ° λλ¬Έμ΄λ€.
- μ½λλ₯Ό μμ±νλλμ λ€μνκ³ λ§μ λ³μλ€μ΄ μ μΈλκ³ ν λΉλκ³ μ¬μ©λλ€. κ·Έλ λ€λ©΄ νλ‘κ·Έλ¨μ μ΄λ€ λ³μκ° μ΄λμ μ μ₯λμ΄μλμ§ μ΄λ»κ² μ°Ύλκ±ΈκΉ? μ΄λ€ κ·μΉμ΄ νμνμ§ μμκΉ?
- μ΄λ¬ν μΌμ νλ κ²μ΄ μ€μ½νμ΄λ€. μ¦ μ€μ½νλ μμ‘΄ λ²μ λ§μ λ§νλ κ²μ΄ μλλΌ, κ·μΉμ λ°λΌ λ³μμ κ΄ν λͺ©λ‘μ μμ±νκ³ κ΄λ¦¬νλ κ²μ λ§νλ€. λ°λΌμ
μ€μ½νλ λ³μμ μμ‘΄λ²μλ₯Ό λ§νλ€
λΌλ μ μλ μ‘°κΈ μμ¬μμ΄ λ¨λ κ²μ΄λ€.
μ»΄νμΌλ¬μ μμ§κ³Ό μ€μ½νκ° μ΄λ»κ² μλ°μ€ν¬λ¦½νΈ νλ‘κ·Έλ¨μ μ€ννλμ§λ₯Ό μμ보μ
- 1λ² μ½λμ 2λ² μ½λλ κ°μ μν μ μννλ€.
- 1λ² μ½λλ μ¬μ©μκ° μμ±ν μ½λμ΄κ³ , 2λ² μ½λλ 1λ² μ½λκ° μ»΄νμΌλ μ΄μ μ κ±°μΉλ©° λ§λ€μ΄μ§ μμ§μ΄ μ€νμν¬ μ½λμ΄λ€. (μμ λκ°μ§λ μμ§λ§, μλ―Έμ μΌλ‘ λΉμ·νλ€)
// 1
var a = 5;
console.log(a); // 5
// 2
var a;
a = 5;
console.log(a);
var a;
μ΄κ±΄ μ»΄νμΌλ¬κ° μ€ννλ μ½λλ‘, μ»΄νμΌλ¬κ° μ€μ½νμκ² λ³μ aκ° νΉμ ν μ€μ½ν 컬λ μ (a.k.a λ²μ) μμ μλμ§λ₯Ό λ¬Όμ΄λ³΄λ κ²μ΄λ€. μ΄λ―Έ 컬λ μ μμ μλ€λ©΄ 무μνκ³ μ§λκ°κ³ , μλ€λ©΄ μ»΄νμΌλ¬κ° μ€μ½νμκ² μ€μ½ν 컬λ μ μ μΆκ°νλΌκ³ μμ²νλ€.a = 5;
μ΄κ±΄ μμ§μ΄ μ€ννλ μ½λλ‘, μμ§μ μ΄ μ½λλ₯Ό μ²λ¦¬νλ λμ λ κ°μ§μ μΌμ νλ€.a
λ νμ¬ μ€μ½ν 컬λ μ λ΄μμ μ κ·Όν μ μλκ°?- κ·Έλ λ€λ©΄
a
μκ²5
λ₯Ό ν λΉνλ€. (κ·Έλ μ§ μλ€λ©΄ λ€λ₯Έ μ€μ²© μ€μ½νλ₯Ό λ³Έλ€)
- μ΄λ κ² aμκ² 5κ° ν λΉμ΄ λμλ€. 그리κ³
console.log(a);
λ₯Ό μ€ννμ¬ 5λ₯Ό μΆλ ₯νκ² λμλ€.
- κ°μ ν λΉνκ³ (
a = 5;
), κ°μ λΆλ¬μ€λ νΉμ μ κ·Όνλ (console.log(a);
) λ κ°μ§μ μΌμ ν κ²μ΄λ€. μ΄κ²μ μ’ λ μμΈν 보μ.
μμ μμ€λ‘ ν μΌμ ν¬κ² λλμ΄μ μκ°ν΄λ³΄λ©΄, μμ§μ ν λΉνλ κ² a = 5;
κ³Ό κ°μ λΆλ¬μμ μΆλ ₯νλ κ² console.log(a);
λ κ°μ μΌμ νλ€.
- LHS
- LHS(Left-Hand Side) κ²μμ΄λΌ νλ©° κ°μ ν λΉν λ μμ§μ΄ νλ κ²μμ΄λ€. λ³μκ° μΌμͺ½μ μμ λμ μννλ κ²μ΄λ€. μ¦ λ³μλ₯Ό ν λΉν λ μΌμ΄λλ κ²μμ΄ LHS κ²μμ΄λ€.
- κ°μ μ°Ύλλ€. RHS
- RHS(Right-Hand Side) κ²μμ΄λΌ νλ©° κ°μ κ°μ Έμ¬ λ μμ§μ΄ νλ κ²μμ΄λ€. λ³μκ° μ€λ₯Έμͺ½μ μμ λμ μννλ κ²μ΄λ€. μ¦ λ³μμ κ°μ κ°μ Έμ¬ λ μΌμ΄λλ κ²μμ΄ RHS κ²μμ΄λ€.
- νμ΄μ μ΄ μ½λκ° μμλ€.
// 1
var a = 5;
console.log(a); // 5
- κ·Έλ¦¬κ³ μ»΄νμΌλ μ΄μ κ³Όμ μ κ±°μΉλ©°, μ΄ μ½λ(μμ§μ΄ μ€νν μ½λ)κ° λμλ€.
// 2
var a; // μ»΄νμΌλ¬κ° Scopeμκ² μ μΈμ μμ²ν¨
a = 5; // μμ§μ΄ LHS κ²μμ ν¨
console.log(a); // μμ§μ΄ RHS κ²μμ ν¨
μ΄ κ·Έλ¬κ³ 보λ.. μ»΄νμΌλ μ΄μ κ³Όμ μμ λͺ¨λ μ μΈμ λ¨Όμ νμμ? κ·ΈλΌ hoxy... μ΄κ² νΈμ΄μ€ν ..?
- κ·Έλ λ€! μ΄κ² νΈμ΄μ€ν μ΄λ€ νΈμ΄μ€ν !!
- μ κΉ νΈμ΄μ€ν μ λν΄ μ΄μΌκΈ°ν΄λ³΄μ. νΈμ΄μ€ν μ μμ 첫 μ£Ό μ κ°λ¨νκ² μΈκΈνλ κ² μ²λΌ μ μΈλ¬Έμ 맨 μλ‘ λμ΄μ¬λ¦¬λ κ² μ΄λ€.
μλ°μ€ν¬λ¦½νΈ νλ‘κ·Έλ¨μ μ»΄νμΌκ³Όμ μ κ±°μΉλ€. μ΄ κ³Όμ μμ μμ§μ΄ μ€νν μ½λκ° λ§λ€μ΄μ§κ³ , κ·Έ νμμΌ μμ§μ κ·Έ μ½λλ₯Ό μ€ννλ€.
- μ΄ λ§μ λ΅μ΄ μλ€. λ°λ‘ μ»΄νμΌ κ³Όμ μ κ±°μΉκΈ° λλ¬Έμ΄λ€. μ‘°κΈ λ μμΈν λ§νμλ©΄, μ»΄νμΌ κ³Όμ μ€μ μ»΄νμΌλ¬κ° λͺ¨λ μ μΈλ¬Έ(
var a
μ κ°μ) λ₯Ό λ³΄κ³ μ€μ½ν 컬λ μ μ μΆκ°ν΄λ¬λΌκ³ μμ²μ λ¨Όμ ν΄λ²λ¦¬κΈ° λλ¬Έμ΄λ€. - μμλ₯Ό 보μ. 1λ² μ½λκ° μ°λ¦¬κ° μμ±ν μ½λμ΄κ³ , 2λ² μ½λκ° μμ§μ΄ μ€ννκ² λλ μ½λμ΄λ€.
// 1
console.log(a); // undefined
var a;
// 2
var a; // νΈμ΄μ€ν
λμλ€
console.log(a); // undefined
- 2λ² μ½λμμ 보λ€μνΌ, μμ§μ΄ μ€νν λμλ
a
μ λν μ μΈμ΄ λμ΄μκΈ° λλ¬ΈμReferenceErorr
κ° λ°μνμ§ μκ³undefined
κ° λ°μνλ κ²μ΄λ€.
- μ μΈλ¬Έλ§ 맨 μλ‘ μ¬λ¦¬κ³ , λμ λ¬Έμ΄λ μ€νλ¬Έμ κ·Έλλ‘ λλ€.
console.log(a); // ReferenceError
a = 5;
-
μμμ λ³Έ μ½λμ λ³λ‘ λ€λ₯Έκ²λμλλ°, μ΄κ±΄
ReferenceError
κ° λλ€. λλ체 λκ° λ€λ₯Έκ±ΈκΉ?λλν μ§λλ²μ 1μ£Όμ°¨ μλ£λ₯Ό μ€λΉνλ©΄μ λ μ½λμ μ°¨μ΄μ μ λͺ°λμκ³ , κ·Έλμ μλ‘ λ€λ₯Έ κ²°κ³Όμ νΌλμ€λ¬μ λ€.
- λ°λ‘ λκ° λ€λ₯Έ κ±ΈκΉ? μ μΈλ¬Έμ΄ μλ€!
- μ μ½λμμ
var a;
λΌλ λ¬Έμ₯μ μμλ€. μ¦ μ»΄νμΌ κ³Όμ μμ, μ»΄νμΌλ¬λ μ€μ½νμκ²a
λ₯Ό μ€μ½ν 컬λ μ μ μΆκ°ν΄λ¬λΌκ³ νμ§ λͺ»νμλ€. κ·Έλ κΈ° λλ¬Έμ, μ€μ½ν 컬λ μ μa
λ μΆκ°λμ§ λͺ»νμλ€! - 곧μ΄μ΄,
console.log(a);
λ₯Ό μμ§μ΄ μ€ννλ©΄μ μ€μ½νμ μλ λ³μa
λ₯Ό μ»μ΄μ€λ €κ³ (RHS κ²μ) νμμΌλ, μ€ν¨ νμλ€.
- μ μ½λμμ
- μ¦ μμ λ΄μ©μ νμ€λ‘ μμ½νμλ©΄, 'RHS κ²μμ΄ μ€ν¨νλ©΄
ReferenceError
κ° λ°μνλ€' μ΄λ€.
νΈμ΄μ€ν μ΄ μΌμ΄λμ§ μμ(κ² μ²λΌ 보μ΄λ) μμ μ½λ μΆμ²
console.log(a); // ReferenceError
let a = 20;
console.log(a);
- μ΄ μμλ§ λ΄λ, νΈμ΄μ€ν
μ΄ μΌμ΄λμ§ μλ κ² κ°λ€. κ·Έλ°λ° νΈμ΄μ€ν
μ΄ μΌμ΄λλ€λ? κ·Έλ λ€λ©΄ λκ° νΈμ΄μ€ν
μ΄ μμΌμ΄λλ κ² μ²λΌ 보μ΄λλ‘ ν΄μ£Όλ건κ°?
- κ·Έλ λ€. TDZ λλ¬Έμ, μμ μν©μ΄ λ°μνμ¬ νΈμ΄μ€ν μ΄ μΌμ΄λμ§ μλ κ² μ²λΌ 보μ΄λ κ²μ΄λ€.
- Temporal Dead Zone, μΌμμ μ¬κ°μ§λλ₯Ό λ»νλ λ§μ΄λ€.
- μ΄ κ³΅κ°μ const, letμΌλ‘ μ μΈλ λ³μκ° ν λΉμ΄ λκΈ° μ κΉμ§ 머무λ₯΄κ³ μλ κ³³μ λ§νλ€. μ¦ ν λΉμ΄ λλ©΄, μ΄ κ³³μμ λ²μ΄λ μ°Έμ‘°(RHS) ν μ μλ μνκ° λλ κ²μ΄λ€.
TDZμ flow μ΄λ―Έμ§ μΆμ²
- μ΄μ κ°μ μ½λκ° μλ€.
// 1
console.log(a); // ReferenceError
let a = 20;
console.log(a);
// 2
let a;
console.log(a); // ReferenceError
a = 20;
console.log(a);
- μκΉμ μ£Όμλ€κ³Ό κ°μ΄, 1λ² μ½λκ° μλ³Έ μ½λμ΄κ³ 2λ² μ½λκ° μμ§μ΄ μ€νν μ½λμ΄λ€.
- μ¬μ€ μμμ
a
λ μ μΈμ΄ λμ΄μμλ€. κ·Έλ¦Όμμ 보면 μ€μ½ν μμ λ€μ΄μλ κ²μ λ³Ό μ μλ€. κ·Έλ¬λ 보λ€μνΌ TDZ μμ λ€μ΄μλ€. μλνλ©΄ μμ§ ν λΉλμ§ μμκΈ° λλ¬Έ μ΄λ€. λλ¬Έμ RHS κ²μμΌλ‘a
λ₯Ό μ°Ύμ μ μμκ³ , μ΄μReferenceError
κ° λ°μνμλ€.
- μ΄μ
a = 20;
μ λ§λλ©°,a
μκ²20
μ΄ ν λΉλμλ€. λ°λΌμa
λ TDZ μμ λΉ μ Έλμ€κ² λμλ€.
- μ΄μ
console.log(a);
λ₯Ό νκΈ° μν΄,a
λ₯Ό RHS κ²μνμμ λ μ€μ½νμμa
λ₯Ό μ°Ύμ μ μκ² λμλ€. - κ·Έλ¬λ μ μ½λλ, μ€μ μλμν¨λ€λ©΄ λ λ²μ§Έμ μΈ λ²μ§Έ μ κ²°κ³Όλ λ³Ό μ μλ€. μλνλ©΄, 첫 λ²μ§Έμμ
ReferenceError
κ° λ°μνμκΈ° λλ¬Έμ΄λ€. κ·Έλμ μ΄ μ½λμtry ~ catch
λ₯Ό μΆκ°νμ¬, μλ¬κ° λ°μνμ¬λ μ€νλλλ‘ λ§λ€μ΄λ³΄μλ€.
try {
console.log(a);
}
catch (e) {
console.log(e); // μλ¬ μΆλ ₯
}
let a = 20;
console.log(a);
ReferenceError: a is not defined
at Object.<anonymous> (/Users/isang-a/Desktop/run.js:2:14)
at Module._compile (module.js:653:30)
at Object.Module._extensions..js (module.js:664:10)
at Module.load (module.js:566:32)
at tryModuleLoad (module.js:506:12)
at Function.Module._load (module.js:498:3)
at Function.Module.runMain (module.js:694:10)
at startup (bootstrap_node.js:204:16)
at bootstrap_node.js:625:3
20
- 20μ΄ μ μΆλ ₯λλ κ²μ λ³Ό μ μμλ€.
- κ·ΈλΌμλ κ°μ΄ μ μ¬ μ μμΌλ, μ½λλ₯Ό 보μ.
let a = 5;
{
console.log(a);
}
{
console.log(a); // undefined
let a = 10;
}
- λλκ²λ 5κ° μλλΌ undefinedκ° μΆλ ₯λλ€. κ·Έ μ΄μ λ λ°λ‘ μ½λκ° μ»΄νμΌλ μ΄μ κ³Όμ μ κ±°μΉλ©° μλμ²λΌ λ°λκΈ° λλ¬Έμ΄λ€.
let a = 5;
{
console.log(a);
}
{
let a; // νΈμ΄μ€ν
μ΄ λμλ€
console.log(a);
a = 10;
}
- μ¦ νΈμ΄μ€ν μ μ»΄νμΌλ μ΄μ κ³Όμ μ€μ, μ»΄νμΌλ¬κ° λͺ¨λ μ μΈλ¬Έμ λ³΄κ³ μ€μ½νμκ² ν΄λΉ 컬λ μ μ μ μΈμ μμ§μ΄ μ½λλ₯Ό μ€ννκΈ° μ μμμ²νκΈ° λλ¬Έμ μΌμ΄λλ κ²μ΄λ€.
const
,let
λͺ¨λ νΈμ΄μ€ν μ΄ μΌμ΄λλ, TDZ λλ¬Έμ μ°λ¦¬ λμλ μΌμ΄λμ§ μλ κ² μ²λΌ 보μΈλ€.
- μ»΄νμΌλ μ΄μ κ³Όμ μ€ κ±°μΉλ λ¨κ³μΈ λ μ± νμμ κ²°μ λλ μ€μ½νλ₯Ό λ§νλ€. μ¦ μ½λμ λ°λΌ λ§λ€μ΄μ§λ μ€μ½νλ₯Ό λ§νλ€.
- μΌλ¨ λ¨Όμ λ§νμλ©΄, μ΄λ μ»΄νμΌ λ¨κ³μμ 미리 λ§λ€μ΄ λμ μμ§μ΄ μ€ν ν μ΅μ νλ μ½λλ₯Ό μλ―Έμκ² λ§λ€κΈ° λλ¬Έμ μ λ μ’μ λ°©λ²μ΄ μλλ€. νμ§λ§ λ μ컬 μ€μ½νλ₯Ό κ³ μΉλ€λ κ²μ΄ 무μμΈμ§, μ΄λ€ κ²°κ³Όλ₯Ό μ΄λνλμ§λ₯Ό 보기 μν΄ μ§κ³ λμ΄κ°μ.
function foo(str, a) {
eval(str);
console.log(a, b);
}
var b = 2;
foo("var b=3;", 1); // 1, 3
- μ΄ μ½λλ‘ λ°λ‘ μ΄λ»κ² μ€μ½νκ° κΌ¬μλμ§ μμ보기μλ μ‘°κΈ μ΄λ ΅λ€.
eval()
μ΄ μ‘΄μ¬νμ§ μλ μ½λλ₯Ό λ¨Όμ 보μ. κ·Έ μλλ μμ§μ΄ μ€νν μ½λμ΄λ€.
// eval()μ΄ μ‘΄μ¬νμ§ μλ μ½λ
function foo(a) {
console.log(a, b);
}
var b = 2;
foo(1); // 1, 2
// μμ§μ΄ μ€νν μ½λ
var b;
function foo(a) {
console.log(a, b);
}
b = 2;
foo(1); // 1, 2
b=2
λ₯Ό λ§λκ³ ,b
μ 2κ° ν λΉλμλ€.
-
foo(1);
μ νΈμΆ νμ¬ LHS κ²μ(a=1
)μ νμλ€. μ¦a
μκ² 1μ ν λΉν΄ μ£Όμλ€. -
λ€μμΌλ‘
console.log(a, b);
κ° μ€νλλ€. μ΄ κ³Όμ μμa
λfoo()
μ μ€μ½ν μμ μμΌλ 1μ΄ μΆλ ₯μ΄ λ κ²μ΄λ€.b
λfoo()
μ μ€μ½νμ μλ€. μ΄μ μμ§μ΄ λ μμ μ€μ½νλ₯Ό μ¬λΌκ°λλ€. λ°λ‘ μ μ μ€μ½νμ΄λ€. κ·Έλ¦¬κ³ μ΄ κ³³μμb
λ₯Ό μ°Ύμλ€.b
λ 2λ₯Ό κ°λλ€. μ¦console.log(a, b);
μ κ²°κ³Όλ1, 2
μ΄λ€. -
λ€μ evalμ΄ μλ μ½λλ₯Ό 보μ.
// eval()μ΄ μλ μ½λ
function foo(str, a) {
eval(str);
console.log(a, b);
}
var b = 2;
foo("var b=3;", 1);
// μμ§μ΄ μ€νν μ½λ
var b;
function foo(str, a) {
eval(str);
console.log(a, b);
}
b = 2;
foo("var b=3;", 1);
b=2;
λ₯Ό μ€ννλ€.
foo("var b=3;", 1);
λ₯Ό μ€ννλ€. μ΄ κ³Όμ μμb
μλ 3μ΄ ν λΉλκ³ ,a
μλ 1μ΄ ν λΉλλ€. μ¦ μ²μμ λ§λ€μ΄ λμ μ€μ½νλ₯Ό κ³ μΉκ² λλ€.
- JavaScriptλ μ»΄νμΌ μΈμ΄μΌκΉμ, μΈν°νλ¦¬ν° μΈμ΄μΌκΉμ? JIT μ»΄νμΌλ¬λ?
- λ¨Όμ μ΄ λΆλΆμ λν΄ μκ³ μΆμ΄ ꡬκΈλ§μ ν΄λ³΄μμ΅λλ€. κ·Έλ¬λ λͺ νν ν΄λ΅μ μ»μ μκ° μμμ΅λλ€. λκ΅°κ°λ μ»΄νμΌ μΈμ΄λ€, λ€λ₯Έ λκ΅°κ°λ μΈν°νλ¦¬ν° μΈμ΄μ΄λ€, λ λ€λ₯Έ λκ΅°κ°λ μ΄ λμ κ²½κ³κ° λͺ¨νΈν μΈμ΄μ΄λ€ λΌκ³ νμμ΅λλ€. μ΄λ κ΅μ₯ν νΉμ΄νκ³ , λΉν©μ€λ½κ³ , λλλ§ν μΌμ΄μμ΅λλ€. μλνλ©΄ C, Java, Pythonλ± μ κ° κ²½νν΄λ³Έ μ¬λ¬ μΈμ΄λ€μ μ»΄νμΌμΈμ΄ νΉμ μΈν°νλ¦¬ν° μΈμ΄λ‘ λͺ ννκ² κ΅¬λΆλμκΈ° λλ¬Έμ΄μμ΅λλ€.
- λλ¬Έμ μ¬λ¬ μλ£λ₯Ό μ°Ύμ보μκ³ , μ λλ¦λλ‘ λ΄λ¦° μ μ μ μΈ κ²°λ‘ μ μλ°μ€ν¬λ¦½νΈλ μΈν°ν리ν
μ νλ μ»΄νμΌ μΈμ΄λΌλ κ²μ
λλ€.
- λ¨Όμ μ»΄νμΌ μΈμ΄κ° κ°λ νΉμ±μ μλ°μ€ν¬λ¦½νΈμ μ΄λ λΆλΆμμ λ³Ό μ μλμ§λ₯Ό λ³΄κ² μ΅λλ€. μ΄λ μ΄ μλ£μ μλ νΈμ΄μ€ν μ΄ κ°μ₯ μ μ νλ€κ³ μκ°ν©λλ€. (νΈμ΄μ€ν μ λν μ€λͺ μ μΆκ°μ μΌλ‘ νμ§ μκ² μ΅λλ€)
- λ€μμΌλ‘ μΈν°νλ¦¬ν° μΈμ΄κ° κ°λ νΉμ±μ μλ°μ€ν¬λ¦½νΈμ μ΄λ λΆλΆμμ λ³Ό μ μλμ§λ₯Ό λ³΄κ² μ΅λλ€. μ΄λ μ΄ μλ£μ μλ
with
μeval()
, κ·Έλ¦¬κ³ μΆνμ λ€λ£°thisμ λ°μΈλ©
μ΄λΌκ³ μκ°ν©λλ€. λ¨Όμ with
μeval()
μ λλ€. μ΄λ€μ λ¬Έμ μ μ μμμ λ€λ£¬ κ² μ²λΌ μ»΄νμΌλ μ΄μ μ€μ λ§λ€μ΄ λμ μ΅μ νλ μ€μ½νλ₯Ό λ°νμμμ κ³ μΉλ€ λ κ² μ΄μμ΅λλ€. λνthisμ λ°μΈλ©
μ λλ€. thisμ λ°μΈλ©μ λ°νμμμ μΌμ΄λ©λλ€. λ°λΌμ λ°νμμμ μ€μ½νλ₯Ό κ³ μΉλ€ λ λ§κ³Ό, λ°νμμμ (λ°μΈλ©μ΄)μΌμ΄λλ€λ λ§μ΄, μΈν°νλ¦¬ν° μΈμ΄λ‘μ¨μ νΉμ§μ μ 보μ¬μ€λ€κ³ μκ°ν©λλ€.
- κ·Έλ¦¬κ³ μ΄λ€μ κ°λ₯νκ²λ νλ λ°μλ JIT μ»΄νμΌλ¬κ° μκΈ° λλ¬Έμ
λλ€.
- JIT μ»΄νμΌλ¬λ₯Ό μ€λͺ νκΈ°μ μμ, μ»΄νμΌ μΈμ΄μ μΈν°νλ¦¬ν° μΈμ΄μ μ₯λ¨μ μ κ°λ¨νκ² λ³΄κ² μ΅λλ€.
- μ»΄νμΌ μΈμ΄λ μ½λλ₯Ό μ€ννκΈ° μ , μ»΄νμΌ νμμ μ½λμ μ΅μ νλ₯Ό μ§νν©λλ€. μ΄ κ³Όμ μμ λ°λ³΅λ¬Έκ³Ό κ°μ μ½λμ μ΅μ νκ° μΌμ΄λ©λλ€. λ°λΌμ μ»΄νμΌ νμμ μ μ§ μμ μκ°μ μ°μ§λ§, μ΅μ ν λ μ½λλ₯Ό μ€ννκΈ° λλ¬Έμ μ€ν μκ°μ 짧μ΅λλ€.
- μΈν°νλ¦¬ν° μΈμ΄λ μ΅μ νλ₯Ό νμ§ μμ΅λλ€. λ°νμμ ν μ€, ν μ€ ν΄μνλ©° μ€νν©λλ€. λλ¬Έμ μ»΄νμΌ νμμ΄ μ‘΄μ¬νμ§ μμ μλκ° λΉ λ¦ λλ€. νμ§λ§ λ°λ³΅λ¬Έκ³Ό κ°μ΄ κ°μ μΌμ μ¬λ¬λ² λ°λ³΅νλ μ½λμ κ²½μ°, 맀 λ² ν΄μν΄μΌ νλ©° λΉμ°ν μ΄μ λν μ΅μ νλ μ½λλ μμ΅λλ€. λλ¬Έμ μ΄λ° κ²½μ° μ€ν μκ°μ΄ μ€λ κ±Έλ¦¬κ² λ©λλ€.
- μ¦ μ»΄νμΌ μΈμ΄λ μ€λΉ μκ°μ΄ λ§μ΄ νμν λμ , μ€νν λμλ μλκ° λΉ λ₯΄λ©° μΈν°νλ¦¬ν° μΈμ΄λ μ€λΉ μκ°μ΄ νμ μμ§λ§ κ²½μ°μ λ°λΌ μλκ° λ§μ΄ λλ €μ§ μ μλ€λ κ²μ λλ€.
- μ΄λ κ² μμΌ μ μμ κ² κ°μ λμ μ₯, λ¨μ μ JITλ μ‘°νλ‘κ² μ μμμ΅λλ€. λ°λ‘ λͺ¨λν° λ₯Ό μ΄μ©ν΄μμ. μ΄ λͺ¨λν°λ μΈν°ν리ν°λ₯Ό μ¬μ©νμ¬ μ½λλ₯Ό μ λ΄ λλ€. κ·Έλ¦¬κ³ μμ£Ό λ°λ³΅μ΄ μΌμ΄λλ μ½λ, μ¦ λ¨κ±°μ΄(hot) μ½λ λ₯Ό μ°Ύμλ λλ€. κ·Έλ¦¬κ³ μ΄ μ½λμ λν΄μλ§ μ»΄νμΌλ¬μκ² μ΅μ νλ₯Ό μμ²ν©λλ€. μ΅μ νκ° νμμλ μ½λμ λν΄μλ μ΅μ νλ₯Ό νμ§ μμ΅λλ€. μ¦ νμν λΆλΆμ λν΄μλ μ»΄νμΌμ νκ³ , κ·Έλ μ§ μμ λΆλΆμ κ΅³μ΄ μ΅μ νλ₯Ό νμ§ μκ³ μΈν°ν리ν λ§ ν©λλ€.
- μ 리νμλ©΄, μ λ μλ°μ€ν¬λ¦½νΈλ μΈν°ν리ν μ νλ μ»΄νμΌ μΈμ΄λΌκ³ μκ°νλ©°, κ·Έ κΈ°μ μλ JIT μ»΄νμΌλ¬κ° μκΈ° λλ¬Έμ κ°λ₯νλ€κ³ μκ°ν©λλ€.
- μλ°μ€ν¬λ¦½νΈκ° μ»΄νμΌ μΈμ΄, μΈν°νλ¦¬ν° μΈμ΄μ μ±κ²©μ λνλ΄λ λΆλΆμ μ κ° λ€λ£¬ κ² μΈμλ λ μμΌλ¦¬λΌ μκ°ν©λλ€. λ€λ§ μ κ° κ°μ§ μ§μμ νκ³λ‘ μ¬κΈ°κΉμ§λ§ μ μ΄λΈ κ²μ΄ μμ½μ΅λλ€. μ΄μ νΉμ λ€λ₯Έ μμλ μκ²¬μ΄ μμΌμλ€λ©΄, μ΄μλ₯Ό λ¨κ²¨μ£Όμ λ€λ©΄ μ λ§ κ°μ¬νκ² μ΅λλ€.