ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

** โš  priv | ๊ฐ•์˜๋…ธํŠธ ์นดํ…Œ๊ณ ๋ฆฌ์— ์žˆ๋Š” ๋‚ด์šฉ์€ ๋ฐœํ–‰์ด ๋ชฉ์ ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ „ํ˜€ ์ •์ œ๋˜์–ด์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹น.**

 

11. Inside the V8 Engine

V8 ์—”์ง„์€ C++๋กœ ์ž‘์„ฑ๋จ

๊ตฌ๊ธ€ ํฌ๋กฌ, Node JS ์—์„œ ์‚ฌ์šฉ

V8์—”์ง„ ์ž‘๋™์›๋ฆฌ?

JS ์†Œ์Šค์ฝ”๋“œ โ†’ Parser ๊ฐ€ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ด์„œ

AST _(Abstract Syntax Tree - ์ถ”์ƒ๊ตฌ๋ฌธํŠธ๋ฆฌ : ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ)_๋กœ ๋ณ€ํ™˜ -
์ด๋•Œ scope๋„ ํ˜•์„ฑ๋œ๋‹ค๊ณ ํ•จ

AST๋ฅผ ๊ฐ€์ ธ๊ฐ€๋‹ค๊ฐ€ ignition ( V8 interpreter ) ํ•œํ…Œ ๋„˜๊ธฐ๊ณ 

์–˜๊ฐ€ JS์ฝ”๋“œ๋ฅผ ๋ฐ”์ดํŠธ์ฝ”๋“œ ( Bytecode ) ๋กœ ๋ณ€ํ™˜

Profiler ๋Š” ์ด ์ค‘ ์—์„œ ์ž์ฃผ ์“ฐ์ด๋Š” ์ฝ”๋“œ๋ฅผ ์ฐพ์Œ(ํ•จ์ˆ˜,๋ณ€์ˆ˜์˜ ํ˜ธ์ถœ๋นˆ๋„๋ฅผ ๋ชจ์•„์„œ)

๊ทธ๊ฑธ ๋“ค๊ณ  TurboFan (์ตœ์ ํ™” ๋‹ด๋‹น ์ปดํŒŒ์ผ๋Ÿฌ) ์— ๊ฐ€์ ธ๊ฐ€๋ฉด ์ตœ์ ํ™”(optimize)ํ•จ

๋‹ค์–‘ํ•œ ์ตœ์ ํ™”๊ธฐ๋ฒ• > ๊ถ๊ธˆํ•˜๋‹น!!

์ด๋Ÿฐ ์›๋ฆฌ๋ฅผ ๋ชฐ๋ผ๋„ JS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

๊ทธ์น˜๋งŒ

how the engine works underneath the hood ๋ฅผ ์•„๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ more optimized code ์ข€ ๋” ์ตœ์ ํ™” ๋œ ์ฝ”๋“œ๋ฅผ ์งค ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค!

V8 ์—”์ง„ ๊ตฌ๋™์›๋ฆฌ๋ฅผ ๊ณต๋ถ€ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋งŽ์ด ๋œ ํฌ์ŠคํŒ…
https://evan-moon.github.io/2019/06/28/v8-analysis/
ใ„ด๋„˜๋ชจ ์ข‹์€ ํฌ์ŠคํŒ…์ธ๋ฐ ๊ฐ์‚ฌํ•˜๋‹ค๊ณ  ๋Œ“๊ธ€์„ ๋‹ฌ ๊ณณ์ด ์—†๋‹คใ… 

12. Comparing Other Languages

C++ ๋กœ ์ฝ”๋“œ๋ฅผ ์งœ์„œ.exeํŒŒ์ผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค
C++ code -> an executable machine code ๋กœ ์ปดํŒŒ์ผ๋œ
๊ณ ๊ฒƒ์„ ๋”๋ธ”ํด๋ฆญํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰์ด ๋œ๋‹ค
์–˜๋Š” ์ด๋ฏธ have been compiled ๋˜์–ด์žˆ์–ด์„œ ๋ฐ”๋กœ ์‹คํ–‰๋  ๊ฒƒ์ด๋‹ค.

JAVA ๋Š” JVM (Java Virtual Machine)๋ฅผ ์ด์šฉํ•จ
JVM์€ ์ฝ”๋“œ๋ฅผ compile ํ•˜๊ฑฐ๋‚˜ interpret ํ•ด์„œ bytecode๋กœ ๋งŒ๋“ ๋‹ค(?)
bytecode is not a native machine code. ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•จ.

๊ทธ๋ ‡๊ฒŒ ๋•Œ๋ฌธ์— virtual machine ์ด๋‚˜ JavaScript engine ๊ณผ ๊ฐ™์€ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์žˆ์–ด์•ผ ์‹คํ–‰ ๊ฐ€๋Šฅํ•จ

13. Writing Optimized Code

JS ์—”์ง„์„ ๋•๊ธฐ์œ„ํ•ด์„œ (๋” ๋น ๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ?)
์š”๊ฒƒ๋“ค์€ ์ •๋ง ์ฃผ์˜ํ•˜์…ˆ

eval(), arguments, for.. in, with, delete

arguments

: ์š”๊ฑฐ ๋งŽ์ด ์“ฐ๊ฒŒ ๋˜๊ธดํ•˜๋Š”๋ฐ, we can use parameter destructuring to avoid using arguments for and loop.
ใ„ด MDN ์— ์š”๋Ÿฌ์ผ€ ์จ์žˆ๋Š”๋ฐ ์ด์–˜๊ธด๊ฐ€?
Note: ES6 ํ˜ธํ™˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ ์ค‘์ด๋ผ๋ฉด ๋˜๋„๋ก ๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ใ„ด ๊ด€๋ จ ์ฝ์„ ๊ฑฐ๋ฆฌ : Avoid modifying or passing arguments into other functions โ€” it kills optimization - https://www.jstips.co/en/javascript/avoid-modifying-or-passing-arguments-into-other-functions-it-kills-optimization/
ใ„ด Passing arguments to any other function is known as leaking arguments. https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#3-managing-arguments

ใ„ด ๋Œ€์ถฉ arguments ์–˜๋ฅผ ์–ด๋–ค ํ•จ์ˆ˜(array.slice ๋“ฑ๋“ฑ)์— ํ†ต๊ณผ์‹œํ‚ค๋ฉด V8 ์—”์ง„์˜ optimization ๊ณผ์ •์„ skipํ•œ๋‹ค๋Š” ์–˜๊ธฐ์ธ๋“ฏ!
ใ„ด
What is safe arguments usage?

Only use

  • arguments.length
  • arguments[i] where i is always a valid integer index into the arguments, and can not be out of bound
  • Never use arguments directly without .length or [i]
  • STRICTLY fn.apply(y, arguments) is ok, nothing else is, e.g. .slice. Function#apply is special.
  • Be aware that adding properties to functions (e.g. fn.$inject =...) and bound functions (i.e. the result of Function#bind) generate hidden classes and, therefore, are not safe when using #apply.

ใ„ด ์‹ ๊ธฐํ•˜๊ตฌ๋งŒ๐Ÿค”๐Ÿค”

for ... in

object๋ฅผ loopํ•  ์ผ์ด ์žˆ์œผ๋ฉด
Object.keys() ๋ฅผ ์ด์šฉ

V8 ์—”์ง„์˜ ์ค‘์š”ํ•œ optimizing ์ปดํŒŒ์ผ ๊ธฐ๋ฒ•

Inline Caching, Hidden Classes

์ธ๋ผ์ธ ์บ์‹ฑ์€
์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ๋˜‘๊ฐ™์€ ์ธ์ž๋กœ ๊ณ„์†๊ณ„์† ํ˜ธ์ถœ๋˜๋ฉด
๊ณ  ํ˜ธ์ถœ๋œ ๋ผ์ธ ์ž์ฒด๋ฅผ return๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•ด์„œ ํ•ด์„ > ์–ธ๋”๋Œ€์‹œ ๊ณผ์ œํ–ˆ๋˜๊ฑฐ ์ค‘์—์„œ memoize ์ด๋ž‘ ๋ญ”๊ฐ€ ๋น„์Šทํ•œ ๋А๋‚Œ์ธ๋ฐ..๐Ÿค”

์š”๊ฑธ ์ดํ•ดํ•˜๋ ค๋ฉด ํžˆ๋“ ํด๋ž˜์Šค๋ฅผ ์•Œ์•„์•ผ๋จ

ใ„ด ์ฝ์„ ๊ฑฐ๋ฆฌ : Javascript Hidden Classes and Inline Caching in V8
https://richardartoul.github.io/jekyll/update/2015/04/26/hidden-classes.html

โ€‹ Optimization takeaways

  1. ์ˆจ๊ฒจ์ง„ ํด๋ž˜์Šค์™€ ๊ทธ ์ดํ›„์— ์ตœ์ ํ™”๋œ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ญ์ƒ ๊ฐ์ฒด ์†์„ฑ์„ ๋™์ผํ•œ ์ˆœ์„œ๋กœ ์ธ์Šคํ„ด์Šคํ™”ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ธ์Šคํ„ด์Šคํ™” ํ›„ ๊ฐœ์ฒด์— ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ˆจ๊ฒจ์ง„ ํด๋ž˜์Šค ๋ณ€๊ฒฝ์ด ๊ฐ•์ œ๋กœ ์ ์šฉ๋˜๊ณ  ์ด์ „ ์ˆจ๊ฒจ์ง„ ํด๋ž˜์Šค์— ์ตœ์ ํ™”๋œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ๋А๋ ค์ง‘๋‹ˆ๋‹ค. ๋Œ€์‹  ํ•ด๋‹น ์ƒ์„ฑ์ž์— ์žˆ๋Š” ๊ฐœ์ฒด์˜ ์†์„ฑ์„ ๋ชจ๋‘ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  3. ์ธ๋ผ์ธ ์บ์‹ฑ์œผ๋กœ ์ธํ•ด ๋™์ผํ•œ ๋ฐฉ๋ฒ•์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
function Animal(x, y){
    this.x = x;
    this.y = y;
}

const obj1 = new Animal(1, 2);
const obj2 = new Animal(3, 4);

obj1.a = 30;
obj1.b = 100;

obj2.b = 30;
obj2.a = 100;

// ์ด๋ ‡๊ฒŒ ๊ฐ์ฒด์˜ ์†์„ฑ์„ ๋‹ค๋ฅธ ์ˆœ์„œ๋กœ ํ• ๋‹น hidden class๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š๊ฒŒ ๋˜์–ด ์†๋„๊ฐ€ ์ €ํ•˜๋จ
// delete ์—ฐ์‚ฐ์ž issue๋„ ๋งˆ์ฐฌ๊ฐ€์ง€ ์ด์œ 

์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€
์˜ˆ์ธก๊ฐ€๋Šฅํ•œ predictable ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ.
์˜ˆ์ธก๊ฐ€๋Šฅํ• ์ˆ˜๋ก ์ปดํ“จํ„ฐ ์ž…์žฅ์—์„œ๋„ ์ตœ์ ํ™” ํ•˜๊ธฐ ์ข‹๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•˜์ง€ ์•Š๋Š” ์˜ˆ์ธก๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๊ฐ€ fast efficient code

ใ„ด ์ฝ์„ ๊ฑฐ๋ฆฌ :
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”๊ฐ€: V8 ์—”์ง„์˜ ๋‚ด๋ถ€ + ์ตœ์ ํ™”๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ์„ ์œ„ํ•œ ๋‹ค์„ฏ ๊ฐ€์ง€ ํŒ

https://engineering.huiseoul.com/์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š”-์–ด๋–ป๊ฒŒ-์ž‘๋™ํ•˜๋Š”๊ฐ€-v8-์—”์ง„์˜-๋‚ด๋ถ€-์ตœ์ ํ™”๋œ-์ฝ”๋“œ๋ฅผ-์ž‘์„ฑ์„-์œ„ํ•œ-๋‹ค์„ฏ-๊ฐ€์ง€-ํŒ-6c6f9832c1d9

14. WebAssembly

Why not just use machine code from the beginnig?

๋ธŒ๋ผ์šฐ์ €๋“ค์ด the standard binary executable format ์„ ๋™์˜ํ–ˆ์Œ

์š”๊ฒƒ์€ ๊ณง Game Changer ๊ฐ€ ๋ ๊ฑฐ์ž„. ์˜ˆ์˜ ์ฃผ์‹œํ•˜์…ˆ

WebAssembly๋Š” ์ตœ์‹  ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ์œ ํ˜•์˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ์— ๊ฐ€๊นŒ์šด ์„ฑ๋Šฅ์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ ์ปดํŒฉํŠธํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๋งท์„ ์ œ๊ณตํ•˜๋Š” ์ €์ˆ˜์ค€ ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด๋กœ, C/C++, Rust ๋“ฑ๊ณผ ๊ฐ™์€ ์–ธ์–ด์˜ ์ปดํŒŒ์ผ ํƒ€๊ฒŸ์œผ๋กœ์จ ๊ทธ๋Ÿฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ์›น์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๋˜ํ•œ JavaScript์™€ ํ•จ๊ป˜ ์‹คํ–‰๋˜๋ฉฐ ์„œ๋กœ๋ฅผ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

++

์›น ์–ด์…ˆ๋ธ”๋ฆฌ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฌด๋ค์ผ๊นŒ?
https://youtu.be/KjgDxBLv0bM

WebAssembly = WASM

Compilation Target

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Œ

์›น ์–ด์…ˆ๋ธ”๋ฆฌํŒŒ์ผ์€ ๊ทธ๋ƒฅ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์ž„
C, C++, Rust, Go ๊ฐ€ ์›น์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ์ปดํŒŒ์ผ๋จ

JS๊ฐ€ ๋ชปํ•˜๋Š”๊ฑธ ํ•˜๊ฒŒํ•ด์คŒ

์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š์•„๋„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ C, C++ ๊ฐ™์€ ์–ธ์–ด๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ cooool

์ด์ œ ์œ ๋‹ˆํ‹ฐ๊ฒŒ์ž„์„ ์ปดํŒŒ์ผํ•˜๋ฉด ์›น์‚ฌ์ดํŠธ๊ฐ€ ํ•ด๋‹น ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Œ.

์›น ์–ด์…ˆ๋ธ”๋ฆฌ์™€ JS ๋Š” ์„œ๋กœ ๋Œ€์ฒด์ œ๊ฐ€ ์•„๋‹ˆ๋ผ
์„œ๋กœ ๋ชปํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ณด์™„ํ•ด์ฃผ๋Š”๊ฒƒ

์Šˆํผ ์ฟจ!

comprehension 1.์ดํ•ด๋ ฅ

feasible 1.์‹คํ˜„ ๊ฐ€๋Šฅํ•œ

15. Call Stack and Memory Heap

๋ฌด์ง€๋ง‰์ง€ํ•˜๊ฒŒ ์ค‘์š”ํ•œ ์ฝœ์Šคํƒ๊ณผ ๋ฉ”๋ชจ๋ฆฌํž™

heap : ๋ฉ”๋ชจ๋ฆฌ๋ฅผ allocate, use, release memory

call stack : we need place to keep trak of where we are in the code, so with that we can run the code in order

stack frame allow us to know where we are in the code

16. Stack Overflow

์ฝœ์Šคํƒ์— ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜๊ฐ€ ๊ณ„์†๊ณ„์† ์Œ“์ธ๋‹ค๋ฉด

function inception(){
    inception();
}

Recursion is one of the most common ways to create a stack overflow

Uncaught RangeError: Maximum call stack size exceeded ๋ฐœ์ƒ!

17. Garbege Collection

๋ฉ”๋ชจ๋ฆฌ๋„ ์Šคํƒ์ฒ˜๋Ÿผ limit๊ฐ€ ์žˆ๊ธฐ๋•Œ๋ฌธ์—
๋”์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋Š” GC์— ์˜ํ•ด free up ๋จ

C์™€ ๊ฐ™์€ low level ์–ธ์–ด์—์„œ๋Š” ์ง์ ‘ ์ปจํŠธ๋กคํ•œ๋‹ค

Mark and Sweep Algorithms ์— ์˜ํ•ด ์ž‘๋™

Reference-counting์—์„œ๋Š” ์„œ๋กœ๊ฐ€ ์„œ๋กœ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด๋Š” GC์˜ ์ˆ˜์ง‘๋Œ€์ƒ์ด ์•„๋‹ˆ๋‹ค (์ฐธ์กฐ์„ธ๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜)

๋”ฐ๋ผ์„œ 2012๋…„ ๊ธฐ์ค€์œผ๋กœ ๋ชจ๋“  ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €๋“ค์€ ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰์…˜์—์„œ Mark and Sweep ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

JS์—์„œ๋Š” ์ „์—ญ๋ณ€์ˆ˜๋ฅผ roots ๋กœ ๋‘๊ณ , ๊ฑฐ๊ธฐ์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๋‹ฟ์„ ์ˆ˜ ์—†๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ฐ€๋น„์ง€๋กœ ์ˆ˜์ง‘ํ•œ๋‹ค.

์ฐธ์กฐ : https://developer.mozilla.org/ko/docs/Web/JavaScript/Memory_Management

18. Memory Leaks

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ๊ฐ€์žฅ ํฐ ์š”์ธ ์„ธ๊ฐ€์ง€

  1. Global Variables

  2. Event listener

  3. setInterval()

hypothetically ๊ฐ€์ •ํ•˜์—ฌ

19. Single Threaded

it has only one call stack

์šฐ๋ฆฌ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๊ณ 
์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰(call stack์— push)ํ•  ๋•Œ๋งˆ๋‹ค
call stack์ด ์ ์  ์ปค์งˆ๊ฒƒ

mimic ๋ชจ๋ฐฉํ•˜๋‹ค, ํ‰๋‚ด๋‚ด๋‹ค

hence 1.์ด๋Ÿฐ ์ด์œ ๋กœ

meanwhile (๋‹ค๋ฅธ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”) ๊ทธ ๋™์•ˆ์—, ํ•œํŽธ

21. Javascript Runtime

Issue With Single Thread ์„ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด?

web API๋Š” ๋ธŒ๋ผ์šฐ์ €๋กœ๋ถ€ํ„ฐ ์ œ๊ณต๋จ
window ๊ฐ์ฒด์•ˆ์— ์ด๋œธ ex) setTimeout, setInterval, fetchโ€ฆ

์–˜๋„ค๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰๋จ

underneath the hood, ๋ธŒ๋ผ์šฐ์ €๋“ค์€ C++ ๊ณผ ๊ฐ™์€ ๋กœ์šฐ๋ ˆ๋ฒจ์–ธ์–ด๋ฅผ ์ด์šฉํ•ด์„œ ์ด๋Ÿฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค

์–˜๋„ค๋“ค์€ JS์˜ ์˜์—ญ์ด ์•„๋‹Œ Web API์˜ ์˜์—ญ์—์„œ ์žˆ๋Š”๊ฑฐ์ž„

callback queue / event loop

์š”๊ฑด ์ž˜์•Œ์ฅ

event loop: hey! callstak! are you empty????? are you empty????? are you empty?????

22. Node.js

JS file === Music Notes

JS Engine === Musician or Composer : ์•…๋ณด๋ฅผ ์ฝ๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Œ

JS Runtime === the whole package where we have the musician but we also give that musician besides the musical notes.
์Œ์•…์„ ์—ฐ์ฃผํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“  ๋„๊ตฌ๋“ค

๊ธ๊นŒ Node.js ๋Š” JS Runtime ์ž…๋‹ˆ๋‹ค!!!!!!!

Node.js ์˜ ์ •์˜!

Node.js is a JavaScript runtime built on Chrome V8 JavaScript engine.

web API, Callback Queue, Event Loop ๊ฐ™์€๊ฑด ์›๋ž˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋งŒ ์“ธ ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ
๋ธŒ๋ผ์šฐ์ € ๋ฐ–์—์„œ๋„ JS๋ฅผ ๋Œ๋ฆด์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“  C++ํ”„๋กœ๊ทธ๋žจ

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์šฐ๋ฆฌ ์ปดํ“จํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”๊ฑด ํ•œ์ •์ ์ด๋‹ค
file system ๊ฐ™์€๊ฑฐ ์ ‘๊ทผ ๋ชจํƒ

sandbox enviroment

๊ทธ์น˜๋งŒ node.js ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋” ๋งŽ์€๊ฑธ ํ• ์ˆ˜์žˆ์Œ!

node ํ™˜๊ฒฝ์—์„œ๋Š” window ๊ฐ€ ์•„๋‹ˆ๋ผ global ์—์„œ API๋ฅผ ์ฐพ์„ ์ˆ˜ ์ด๋œธ

capability (capabilities) 1.๋Šฅ๋ ฅ, ์—ญ๋Ÿ‰

 

์ถœ์ฒ˜ : Udemy - JavaScript: The Advanced Concept
https://www.udemy.com/course/advanced-javascript-concepts

๋Œ“๊ธ€