waffle
μ™€ν”Œκ³΅μž₯
waffle
전체 방문자
였늘
μ–΄μ œ
  • λΆ„λ₯˜ 전체보기 (72)
    • πŸ“’ Daily Log (2)
    • πŸ”¨ Dev_BE (5)
      • κ°œλ…μ •λ¦¬ (4)
      • 기둝 (1)
    • πŸ”¨ Dev_FE (4)
    • πŸ”¨ Dev_DB (1)
    • βš™ Dev_Ops (0)
    • πŸ”‘ Lang (2)
      • Python (2)
    • πŸ’‘ ν”„λ‘œμ νŠΈ (9)
      • Base (1)
      • μ•„λŒ€λ°€λ§΅ (8)
    • πŸƒπŸ» μ™ΈλΆ€ν™œλ™ (2)
      • [ν”„λ¦¬μ½”μŠ€] μš°μ•„ν•œν…Œν¬μ½”μŠ€ 7κΈ° - BE (2)
    • πŸ“• [STUDY] 개발 (13)
      • [STUDY] μ•Œκ³ λ¦¬μ¦˜ (9)
      • 동계 μŠ€ν„°λ”” [Do-iT: μ›ΉνŒ©] (2021) (4)
    • πŸ“™ [STUDY] AI (2)
      • Tensorflow (2)
    • πŸ” λ³΄μ•ˆ,μ •λ³΄λ³΄ν˜Έ (32)
      • CTF (2)
      • πŸ“˜ [STUDY] ν¬λ Œμ‹ (15)
      • πŸ“˜ [STUDY] 취약점 (4)
      • πŸ“˜ [STYDY] 리버싱 (11)
    • πŸ“” IT 법λ₯  (0)

λΈ”λ‘œκ·Έ 메뉴

  • ν™ˆ
  • νƒœκ·Έ

곡지사항

인기 κΈ€

νƒœκ·Έ

  • scrum
  • gdb
  • Java
  • μˆ˜ν•™_1
  • Weekly
  • 개발
  • λ°±μ€€
  • μ½”λ”©ν…ŒμŠ€νŠΈ_고득점
  • js
  • μš°μ•„ν•œν…Œν¬μ½”μŠ€
  • javascript
  • λ°μΌλ¦¬μ•Œκ³ 
  • sql
  • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€
  • ν”„λ¦¬μ½”μŠ€
  • dopwn
  • μš°ν…Œμ½”_7κΈ°
  • JAVA_API
  • 자료ꡬ쑰
  • μš°ν…Œμ½”
  • κ°œλ°œλ°±μ„œ
  • μ•„μ£ΌλŒ€_μ•Œκ³ λ¦¬μ¦˜_ꡐ윑
  • write-up
  • API
  • μ•Œκ³ λ¦¬μ¦˜
  • λ¬Έμžμ—΄
  • μˆ˜ν•™_1(μ—°μŠ΅)
  • til
  • reversing
  • μ—°μŠ΅_자료ꡬ쑰

졜근 λŒ“κΈ€

졜근 κΈ€

ν‹°μŠ€ν† λ¦¬

hELLO Β· Designed By μ •μƒμš°.
waffle

μ™€ν”Œκ³΅μž₯

[ JS ] 1. 컴파일
πŸ”¨ Dev_FE

[ JS ] 1. 컴파일

2021. 8. 28. 18:52
728x90

jsλ₯Ό κ³΅λΆ€ν•˜λ©° λŠλ‚€ μ—”μ§„μ˜ 컴파일 과정을 μ•Œμ•„μ•Ό ν•˜λŠ” 이유 (μž‘μ„±μž ν”Όμ…œ):

 

1. μž‘μ„±μ‹œμ μƒ Chrome V8이 μ„Έκ³„μ μœΌλ‘œ κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” js엔진이며, V8 뿐 μ•„λ‹ˆλΌ λ‹€λ₯Έ 엔진듀도 ν•΄λ‹Ή 방식을 μ‚¬μš©ν•©λ‹ˆλ‹€.

2. μ—”μ§„μ˜ λ‚΄λΆ€ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ•Œμ•„λ³΄λ©° thisλ‚˜ js의 언어적 νŠΉμ„±μ„ μ΄ν•΄ν•˜λŠ” 것에 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

 


0. ???: jsλŠ” 컴파일 ν•„μš”μ—†λŠ” μ–Έμ–΄μΈλ°μš”?

 

 

글을 μ‹œμž‘ν•˜κΈ°μ „, 원둠적 κ°œλ…μ— κ·Όκ°„ν•˜μ—¬ 말을 ν•˜μžλ©΄ jsλŠ” 인터프리터 언어라 μ»΄νŒŒμΌμ΄ ν•„μš” μ—†μŠ΅λ‹ˆλ‹€..만

속도 ν–₯상 λ“±μ˜ λͺ©μ μ„ μœ„ν•΄ jsμ—”μ§„ λ‚΄μ—μ„œ 일뢀 컴파일 과정이 μžˆλŠ” κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€. 특히 졜근 λ‹€μˆ˜ μ‚¬μš©λ˜λŠ” Chrome v8엔진이 κ·Έ μ˜ˆμ‹œμž…λ‹ˆλ‹€.

 

λ”°λΌμ„œ jsλŠ” μ„ νƒμ μœΌλ‘œ μ»΄νŒŒμΌν•˜λŠ” 인터프리터 μ–Έμ–΄μž…λ‹ˆλ‹€.

 

Chrome V8엔진이 인터프리터 μ–Έμ–΄λ₯Ό μ‹€ν–‰ν•˜λŠ”λ° μ»΄νŒŒμΌμ„ μΆ”κ°€ν•˜κ³ μž ν–ˆλ˜ μ΄μœ μ™€, 그둜 인해 컴파일이 μΆ”κ°€λœ 과정에 λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ μ•„λž˜ 포슀트λ₯Ό μ°Έκ³ ν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€. (λ³Έ ν¬μŠ€νŠΈμ™€ 일뢀 λ‚΄μš©μ΄ κ²ΉμΉ©λ‹ˆλ‹€)

https://oowgnoj.dev/review/advanced-js-1

 

JavaScript, 인터프리터 μ–Έμ–΄μΌκΉŒ?

κΈ°μ–΅ν•˜κΈ° μœ„ν•΄ κΈ°λ‘ν•©λ‹ˆλ‹€.

oowgnoj.dev

 

 

κ°„λž΅ν•˜κ²Œ μ •λ¦¬ν•˜μžλ©΄..

1) Google이 μ§€λ„μ„œλΉ„μŠ€λ₯Ό κ°œλ°œν•˜λ˜ 쀑 js μ—”μ§„μ˜ 인터프리터 언어적 νŠΉμ„±μœΌλ‘œ μΈν•œ ν•œκ³„λ₯Ό λŠλ‚Œ

2) 컴파일 κΈ°λŠ₯이 μΆ”κ°€λœ V8엔진을 μΆœμ‹œν•˜μ—¬ μ„±λŠ₯을 λ†’μž„

정도가 λ˜κ² μŠ΅λ‹ˆλ‹€.

 

κ·Έλž˜μ„œ 글을 μ‹œμž‘ν•˜κΈ°μ „ μ‹€μ œ jsκ°œλ°œμ—μ„œλŠ” 쑰금 거리가 μžˆλŠ” 컴파일 과정을 μ•„λž˜μ— μ§„μ§œ 쑰금 μ„€λͺ…ν•  κ²ƒμž…λ‹ˆλ‹€.

μ‹«λ‹€λ©΄.. 밑에 λ‹¨λ½λ§Œ λ„˜κΈ°μ‹œλ©΄ λ©λ‹ˆλ‹€ (μ ‘μ–΄λ†“μ„κ²Œμš” πŸ˜‰)

λ‚΄μš© μ΄ν•΄μ—λŠ” μ§€μž₯이 μ—†μŠ΅λ‹ˆλ‹€


더보기

js μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚€κΈ° μœ„ν•΄ v8엔진은 μš°λ¦¬κ°€ μ•ˆλ³΄μ΄λŠ” κ³³μ—μ„œ μ—¬λŸ¬ 단계λ₯Ό 거치며 효율적으둜 μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚€κΈ°μœ„ν•΄ λ…Έλ ₯ν•©λ‹ˆλ‹€.

이 단계듀은 μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° 전에 미리 μ²˜λ¦¬ν•΄λ‘λŠ” 것이 μ•„λ‹Œ μ‹€ν–‰ν•˜λŠ” κ·Έ μ¦‰μ‹œ μ²˜λ¦¬λ©λ‹ˆλ‹€. κ·Έλž˜μ„œ jsκ°€ 컴파일 λ˜λŠ” 방식을 JIT ( = Just In Time) μ»΄νŒŒμΌλ°©μ‹μ΄λΌ ν•©λ‹ˆλ‹€.

크게 3단계, ν˜Ήμ€ 4λ‹¨κ³„λ‘œ ν‘œν˜„μ΄ κ°€λŠ₯ν•œλ°, μ΄λŠ” λ³΄λŠ” 관점에 따라 λ‹€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

Franziska Hinkelmann's Presentation - JSConf EU 2017

 

3λ‹¨κ³„λ‘œ ν‘œν˜„ν•˜μžλ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

 

1. λ ‰μ‹± (Lexing): μž‘μ„±λœ μ½”λ“œλ₯Ό 의미λ₯Ό κ°€μ§€κ³  μžˆλŠ” μ΅œμ†Œ λ‹¨μœ„ (=토큰)으둜 λΆ€μˆ˜λŠ”(?) κ³Όμ •μž…λ‹ˆλ‹€.

2. νŒŒμ‹± (Parsing): 토큰듀을 문법 ꡬ쑰듀을 λ°˜μ˜ν•œ 트리(=AST)둜 λ§Œλ“œλŠ” κ³Όμ •μž…λ‹ˆλ‹€. 

3. μ½”λ“œ 생성: νŒŒμ‹±κ³Όμ •μ—μ„œ λ‚˜μ˜¨ ASTλ₯Ό 기반으둜 인터프리터가 jsλ₯Ό 읽으며 μ²˜λ¦¬ν•©λ‹ˆλ‹€.

 

쑰금 더 μžμ„Ένžˆ ν‘œν˜„ν•œ 4λ‹¨κ³„λŠ” 3번 단계가 ν™•μž₯λ©λ‹ˆλ‹€:

 

1,2: 상동

3. 인터프리터 μ‹€ν–‰: V8엔진이 κ°€μ§€κ³  μžˆλŠ” Interpreter Ignitionμ—κ²Œ ASTλ₯Ό μ „λ‹¬ν•˜μ—¬ λ°”μ΄νŠΈμ½”λ“œλ‘œ λ³€ν™˜ν•˜μ—¬ μ½”λ“œλ₯Ό μ‹€μ œλ‘œ μ‹€ν–‰ν•©λ‹ˆλ‹€.

4. TurboFan μ‹€ν–‰ (선택적): Ignition이 λ³€ν™˜ν•œ λ°”μ΄νŠΈμ½”λ“œλ“€ 쀑 자주 μ‹€ν–‰λ˜λŠ” μ½”λ“œλ₯Ό TurboFan이 μ΅œμ ν™”λœ μ½”λ“œλ‘œ λ‹€μ‹œ μ»΄νŒŒμΌν•©λ‹ˆλ‹€. λ°˜λŒ€λ‘œ 자주 싀행이 λ˜μ§€ μ•ŠλŠ”λ‹€κ³  νŒλ‹¨λ˜λ©΄ λ°˜μ΅œμ ν™” (Deoptimizing)ν•©λ‹ˆλ‹€.

 

더 μžμ„Έν•œ μ΄μ•ΌκΈ°λŠ” μ•„λž˜ 포슀트λ₯Ό λ³΄μ‹œλ©΄μ„œ μ΄ν•΄ν•˜μ‹œλ©΄ 더 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€.

이 ν¬μŠ€νŠΈμ—μ„œ V8엔진이 λŒμ•„κ°€λŠ” μ›λ¦¬λŠ” μ—¬κΈ°κΉŒμ§€λ§Œ μ„€λͺ…ν•  μ˜ˆμ •μž…λ‹ˆλ‹€ (λ¨Έλ¦¬μ•„νŒŒ..)

 

https://evan-moon.github.io/2019/06/28/v8-analysis/

 

V8 엔진은 μ–΄λ–»κ²Œ λ‚΄ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 걸까?

이번 ν¬μŠ€νŒ…μ—μ„œλŠ” κ΅¬κΈ€μ˜ V8 엔진이 μ–΄λ–€ λ°©μ‹μœΌλ‘œ μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό ν•΄μ„ν•˜κ³  μ‹€ν–‰ν•˜λŠ”μ§€ μ‚΄νŽ΄ λ³΄λŠ”μ§€μ— λŒ€ν•΄ ν¬μŠ€νŒ…ν•˜λ €κ³  ν•œλ‹€. 은 둜 μž‘μ„±λ˜μ—ˆμ§€λ§Œ ν•„μžμ˜ 메인 μ–Έμ–΄κ°€ 이 μ•„λ‹ˆκΈ°λ„ ν•˜κ³ , μ›Œ

evan-moon.github.io

 


λ„˜κΈ°μ‹  뢄듀을 μœ„ν•΄ κ°„λž΅νžˆ μ„€λͺ…ν•˜μžλ©΄..

 

js μ½”λ“œλŠ” λ ‰μ‹± -> νŒŒμ‹± -> μ½”λ“œ 생성 과정을 κ±°μΉ©λ‹ˆλ‹€

각 κ³Όμ •μ˜ μžμ„Έν•œ λ‚΄μš©μ΄ κΆκΈˆν•˜μ‹œλ‹€λ©΄ μœ— 단락을 λ΄μ£Όμ„Έμš”.

κ°„λ‹¨ν•œ μ„€λͺ…은 μ•„λž˜μ—μ„œ ν•˜λ‚˜ν•˜λ‚˜ μ„€λͺ…ν•˜λ©° μ•½κ°„μ”© μ„€λͺ…ν•  μ˜ˆμ •μž…λ‹ˆλ‹€.

 

 

1. λ ‰μ‹±

 

λ ‰μ‹± (=Lexing)μ΄λž€ μž‘μ„±λœ μ½”λ“œλ₯Ό 의미λ₯Ό κ°€μ§„ μ΅œμ†Œ λ‹¨μœ„λ‘œ μž˜λΌλ‚΄λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. ν•œκΈ€ λ¬Έμž₯을 ν˜•νƒœμ†Œλ‘œ 자λ₯Έλ‹€κ³  λ³΄μ‹œλ©΄ λ©λ‹ˆλ‹€. ν•œκΈ€μ—μ„œλŠ” 의미λ₯Ό κ°€μ§„ μ΅œμ†Œ λ‹¨μœ„λ₯Ό ν˜•νƒœμ†ŒλΌκ³  ν•˜λŠ”λ°, μ—¬κΈ°μ—μ„œλŠ” "토큰"이라고 ν•©λ‹ˆλ‹€.

 

var num = 10;

 

μ΄λΌλŠ” μ½”λ“œλŠ”

"var", "num", "=", "10", ";"둜 λ‚˜λ‰˜μ–΄μ§‘λ‹ˆλ‹€.

 

 

function b() {
	
}

 

ν•¨μˆ˜ 선언문은 μ–΄λ–¨κΉŒμš”?

"function", "b", "()", "{}"둜 λ‚˜λ‰˜μ–΄ μ§„λ‹€κ³  ν•©λ‹ˆλ‹€.

 

2. νŒŒμ‹±

νŒŒμ‹± (=Parsing)μ΄λž€ 토큰을 AST둜 λ°”κΎΈλŠ” 과정을 λ§ν•©λ‹ˆλ‹€. μ—¬κΈ°μ—μ„œ ASTλŠ” Abstract Syntax Tree, 좔상 ꡬ문 트리의 μ•½μžμž…λ‹ˆλ‹€. 

Gyujin Cho's post - https://gyujincho.github.io/2018-06-19/AST-for-JS-devlopers

이런 μ‹μœΌλ‘œ νŠΈλ¦¬κ°€ μ™„μ„±λœλ‹€κ³  ν•˜λ„€μš”. 보닀 μžμ„Έν•œ λ‚΄μš©μ€ μ œκ°€ μ½μ–΄λ΄€λ˜ 포슀트λ₯Ό μ•„λž˜μ— μ²¨λΆ€ν•˜κ² μŠ΅λ‹ˆλ‹€. 이 포슀트의 λͺ©μ μ€ V8의 μƒμ„Έν•œ 이해가 μ•„λ‹Œ μŠ€μ½”ν”„μ˜ 원리에 λŒ€ν•œ 이해λ₯Ό μœ„ν•œ κΈ°λ°˜μ΄λ‹ˆκΉŒμš”(이 λ‚΄μš©μ€ λ‹€μŒ ν¬μŠ€νŠΈμ— μžˆμŠ΅λ‹ˆλ‹€!!)

 

https://gyujincho.github.io/2018-06-19/AST-for-JS-devlopers

 

μžλ°”μŠ€ν¬λ¦½νŠΈ 개발자λ₯Ό μœ„ν•œ AST(λ²ˆμ—­)

AST for JavaScript developers(by Bohdan Liashenko)의 λ²ˆμ—­κΈ€μž…λ‹ˆλ‹€.

gyujincho.github.io

 

3. μ½”λ“œ 생성

 

이 뢀뢄에 λŒ€ν•œ μ„€λͺ…은 μƒλž΅ν•˜κ² μŠ΅λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ μœ„μ— μ ‘ν˜€μžˆλŠ” κΈ€μ΄λ‚˜ 쀑간쀑간 μ²¨λΆ€ν•œ λ‹€λ₯Έ 포슀트, ν˜Ήμ€ 좔후에 μ—…λ‘œλ“œν•  κ²Œμ‹œλ¬Όμ„ ν™•μΈν•΄μ£Όμ„Έμš”!

 

728x90
λ°˜μ‘ν˜•

'πŸ”¨ Dev_FE' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[ CSS ] CSS λͺ¨λ°”일 Transition κ°œμ„   (0) 2022.02.13
[ JS ] λ¬Έμžμ—΄λ‚΄μ˜ νŠΉμ • λ¬Έμžμ—΄ λͺ¨λ‘ λŒ€μΉ˜ν•˜κΈ°  (0) 2022.01.25
[ vanilla js ] Web Worker API (κ°œλ…νŽΈ)  (0) 2021.07.20
    'πŸ”¨ Dev_FE' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [ CSS ] CSS λͺ¨λ°”일 Transition κ°œμ„ 
    • [ JS ] λ¬Έμžμ—΄λ‚΄μ˜ νŠΉμ • λ¬Έμžμ—΄ λͺ¨λ‘ λŒ€μΉ˜ν•˜κΈ°
    • [ vanilla js ] Web Worker API (κ°œλ…νŽΈ)
    waffle
    waffle
    개발기술 κ΄€λ ¨ 글듀은 velog에 μžˆμŠ΅λ‹ˆλ‹€ :) (https://velog.io/@cm_waffle) Developer waffle = new Waffle();

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”