avatar
Published on

λΈŒλΌμš°μ €λŠ” μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”κ°€? - λͺ¨λ˜ μ›ΉλΈŒλΌμš°μ €κ°€ λ™μž‘ν•˜λŠ” 방법

Author
  • avatar
    Name
    yceffort

πŸš§μž‘μ„±μ€‘ 🚧

원문-How Browsers Work: Behind the scenes of modern web browsers

이 글을 μš”μ•½/λ²ˆμ—­ν•œ 더 쒋은 글이 넀이버 d2에 μžˆμŠ΅λ‹ˆλ‹€. 개인적인 곡뢀 μ°¨μ›μ—μ„œ 이 원문을 fully ν•œκΈ€λ‘œ λ²ˆμ—­ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

μ†Œκ°œ

μ›Ή λΈŒλΌμš°μ €λŠ” κ°€μž₯ 널리 μ“°μ΄λŠ” μ†Œν”„νŠΈμ›¨μ–΄λ‹€. 이 κΈ€μ—μ„œλŠ”, λΈŒλΌμš°μ €κ°€ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ μ†Œκ°œν•  것이닀. 이 글을 읽고 λ‚˜λ©΄, google.com을 타이핑 ν•œ μ‹œμ  λΆ€ν„° κ΅¬κΈ€νŽ˜μ΄μ§€κ°€ λΈŒλΌμš°μ €μ— 보이기 κΉŒμ§€, μ–΄λ–€ 일련의 과정이 μžˆλŠ”μ§€ μ•Œκ²Œ 될 것이닀.

λͺ©μ°¨

  1. μ†Œκ°œ
    1. 이 κΈ€μ—μ„œ μ†Œκ°œν•˜λŠ” λΈŒλΌμš°μ €
    2. λΈŒλΌμš°μ €μ˜ μ£Όμš” κΈ°λŠ₯
    3. λΈŒλΌμš°μ €μ˜ μƒμœ„ 레벨 ꡬ쑰
  2. λ Œλ”λ§ 엔진
    1. λ Œλ”λ§ 엔진듀
    2. μ£Όμš” 흐름
    3. μ£Όμš” 흐름 예제
  3. νŒŒμ‹±κ³Ό DOM 트리 ꡬ좕
    1. νŒŒμ‹±: 일반
      1. 문법듀
      2. Parser-Lexer μ‘°ν•©
      3. λ³€ν™˜
      4. νŒŒμ‹± 예제
      5. μ–΄νœ˜μ™€ ꡬ문에 λŒ€ν•œ 곡식적인 μ •μ˜
      6. νŒŒμ„œμ˜ μ’…λ₯˜
      7. μžλ™μœΌλ‘œ νŒŒμ„œ 생성
    2. HTML νŒŒμ„œ
      1. HTML 문법 μ •μ˜
      2. λ¬Έλ§₯으둜 λΆ€ν„° μžμœ λ‘­μ§€ λͺ»ν•¨
      3. HTML DTD
      4. DOM
      5. νŒŒμ‹± μ•Œκ³ λ¦¬μ¦˜
      6. 토큰화 μ•Œκ³ λ¦¬μ¦˜
      7. 트리ꡬ쑰 μ•Œκ³ λ¦¬μ¦˜
      8. νŒŒμ‹±μ΄ 끝났을 경우 μ•‘μ…˜
      9. λΈŒλΌμš°μ € μ—λŸ¬ 처리
    3. CSS νŒŒμ‹±
      1. μ›Ήν‚· css νŒŒμ„œ
    4. μŠ€ν¬λ¦½νŠΈμ™€ μŠ€νƒ€μΌμ‹œνŠΈλ₯Ό ν”„λ‘œμ„Έμ‹±ν•˜λŠ” μˆœμ„œ
      1. 슀크립트
      2. 예츑 νŒŒμ‹±
      3. μŠ€νƒ€μΌ μ‹œνŠΈ
  4. λ Œλ” 트리 ꡬ좕
    1. 돔 νŠΈλ¦¬μ™€ λ Œλ” νŠΈλ¦¬μ™€μ˜ 관계
    2. 트리λ₯Ό κ΅¬μΆ•ν•˜λŠ” μˆœμ„œ
    3. μŠ€νƒ€μΌ μ—°μ‚°
      1. μŠ€νƒ€μΌ 데이터 곡유
      2. νŒŒμ΄μ–΄ν­μŠ€ κ·œμΉ™ 트리
        1. ꡬ쑰체둜 뢄리
        2. κ·œμΉ™ 트리λ₯Ό ν™œμš©ν•˜μ—¬ μŠ€νƒ€μΌ μ»¨νƒμŠ€νŠΈ μ—°μ‚°
      3. μ‰¬μš΄ 맀칭을 μœ„ν•œ κ·œμΉ™ 닀루기
      4. 닀단계 μˆœμ„œμ— 따라 κ·œμΉ™ μ μš©ν•˜κΈ°
        1. μŠ€νƒ€μΌ μ‹œνŠΈ 닀단계 μˆœμ„œ
        2. νŠΉμ •μ„±
        3. κ·œμΉ™μ •λ ¬
      5. 점진적 ν”„λ‘œμ„ΈμŠ€
  5. λ ˆμ΄μ•„μ›ƒ
    1. Dirty bit system
    2. κΈ€λ‘œλ²Œ 및 incremental λ ˆμ΄μ•„μ›ƒ
    3. 동기 및 비동기 λ ˆμ΄μ•„μ›ƒ
    4. μ΅œμ ν™”
    5. λ ˆμ΄μ•„μ›ƒ ν”„λ‘œμ„ΈμŠ€
    6. λ„ˆλΉ„ 계산
    7. 라인 λΈŒλ ˆμ΄ν‚Ή
  6. νŽ˜μΈνŒ…
    1. κΈ€λ‘œλ²Œ 및 incremental
    2. νŽ˜μΈνŒ… μˆœμ„œ
    3. νŒŒμ΄μ–΄ν­μŠ€ λ””μŠ€ν”Œλ ˆμ΄ 리슀트
    4. μ›Ήν‚· μ‚¬κ°ν˜• μ €μž₯μ†Œ
  7. λ‹€μ΄λ‚˜λ―Ή λ³€ν™”
  8. λ Œλ”λ§ μ—”μ§„μ˜ μŠ€λ ˆλ“œ
    1. 이벀트 루프
  9. CSS2 λΉ„μ₯¬μ–Ό λͺ¨λΈ
    1. μΊ”λ²„μŠ€
    2. CSS box model
    3. 포지셔닝 μŠ€ν‚΄
    4. λ°•μŠ€ νƒ€μž…
    5. 포지셔닝
      1. relative
      2. floats
      3. absolute & fixed
    6. μΈ΅ν‘œν˜„
  10. λ¦¬μ†ŒμŠ€

1. μ†Œκ°œ

1-1. 이 κΈ€μ—μ„œ μ†Œκ°œν•˜λŠ” λΈŒλΌμš°μ €

μ˜€λŠ˜λ‚ μ—λŠ” 5개의 메인 λΈŒλΌμš°μ €κ°€ μ‘΄μž¬ν•œλ‹€: 크둬, μ΅μŠ€ν”Œλ‘œλŸ¬, νŒŒμ΄μ–΄ν­μŠ€, μ‚¬νŒŒλ¦¬ 그리고 였페라. λͺ¨λ°”μΌμ—μ„œ, μ•ˆλ“œλ‘œμ΄λ“œ λΈŒλΌμš°μ €, 아이폰, 였페라 λ―Έλ‹ˆ, 였페라 λͺ¨λ°”일, UC λΈŒλΌμš°μ € 등등이 μ‘΄μž¬ν•˜λŠ”λ°, 웹킷을 베이슀둜 ν•˜λŠ” 였페라λ₯Ό μ œμ™Έν•˜κ³ λŠ” λŒ€λΆ€λΆ„μ΄ 크둬을 기반으둜 ν•˜κ³  μžˆλ‹€. μ—¬κΈ°μ—μ„œλŠ” μ˜€ν”ˆμ†ŒμŠ€ λΈŒλΌμš°μ €μΈ νŒŒμ΄μ–΄ν­μŠ€, 크둬, μ‚¬νŒŒλ¦¬ (λΆ€λΆ„μ μœΌλ‘œ μ˜€ν”ˆμ†ŒμŠ€)λ₯Ό 예둜 λ“€ 것이닀. stat counter에 λ”°λ₯΄λ©΄ 2013λ…„ 6μ›” κΈ°μ€€ 이 μ„Έ λΈŒλΌμš°μ €κ°€ μ°¨μ§€ν•˜λŠ” κΈ€λ‘œλ²Œ λ°μŠ€ν¬ν†± λΈŒλΌμš°μ € 비쀑이 71%에 μœ‘λ°•ν•œλ‹€. λͺ¨λ°”μΌμ—μ„œλŠ”, μ•ˆλ“œλ‘œμ΄λ“œ λΈŒλΌμš°μ €, 아이폰과 크둬 베이슀 ν”„λΌμš°μ €κ°€ 54%정도λ₯Ό μ°¨μ§€ν•œλ‹€.

2019λ…„ 7μ›” ν˜„μž¬ μ„Έ λΈŒλΌμš°μ €μ˜ μ‹œμž₯ μ μœ μœ¨μ€ 83% 정도λ₯Ό μ°¨μ§€ν•œλ‹€.

1-2. λΈŒλΌμš°μ €μ˜ μ£Όμš” κΈ°λŠ₯

λΈŒλΌμš°μ €μ˜ μ£Όμš” κΈ°λŠ₯은 μ‚¬μš©μžκ°€ μ„ νƒν•œ μ›Ήλ¦¬μ†ŒμŠ€λ₯Ό μ„œλ²„μ— μš”μ²­ν•˜κ³ , λΈŒλΌμš°μ € μœˆλ„μš°μ— λ””μŠ€ν”Œλ ˆμ΄ν•˜μ—¬ ν‘œν˜„ν•˜λŠ” 것이닀.일반적으둜 λ¦¬μ†ŒμŠ€λŠ” HTML λ¬Έμ„œμ§€λ§Œ, μ—¬κΈ°μ—λŠ” PDF, 이미지, ν˜Ήμ€ 기타 λ‹€λ₯Έ μœ ν˜•μ΄ μžˆμ„ μˆ˜λ„ μžˆλ‹€. 이런 λ¦¬μ†ŒμŠ€μ˜ μœ„μΉ˜λŠ” μ‚¬μš©μžκ°€ μ‚¬μš©ν•˜λŠ” URI(Uniform Resource Identifier)에 μ˜ν•΄μ„œ 정해진닀.

λΈŒλΌμš°μ €κ°€ HTML νŒŒμΌμ„ ν•΄μ„ν•˜κ³  ν‘œμ‹œν•˜λŠ” 방법은 HTMLκ³Ό CSS λͺ…세에 λ”°λΌμ„œ 정해진닀. μ΄λŸ¬ν•œ λͺ…μ„ΈλŠ” μ›Ή ν‘œμ€€ν™” 기ꡬ인 W3C(World Wide Web Consortium) μ—μ„œ 정해진닀. μˆ˜λ…„ κ°„ 일뢀 λΈŒλΌμš°μ €λŠ” μ‚¬μ–‘μ˜ μΌλΆ€λ§Œμ„ μ€€μˆ˜ν•˜κ³  자체 μ΅μŠ€ν…μ…˜μ„ κ°œλ°œν–ˆλ‹€. μ΄λ‘œμΈν•΄ μ›Ή κ°œλ°œμžλ“€ μ‚¬μ΄μ—μ„œ μ‹¬κ°ν•œ ν˜Έν™˜μ„± λ¬Έμ œκ°€ λ°œμƒν–ˆλ‹€. μ˜€λŠ˜λ‚  λŒ€λΆ€λΆ„μ˜ λΈŒλΌμš°μ €λŠ” μ΄λŸ¬ν•œ λͺ…μ„Έλ₯Ό 거의 지킨닀.

샀앙을 μ–΄κΈ΄ λΈŒλΌμš°μ €λŠ”... ^^

λΈŒλΌμš°μ €μ˜ UIλŠ” μ„œλ‘œ λŒ€λΆ€λΆ„μ˜ 곡톡점을 가지고 μžˆλ‹€. μ΄λŸ¬ν•œ 곡톡점듀을 예둜 λ“€μžλ©΄

  • URIλ₯Ό 넣을 수 μžˆλŠ” μ£Όμ†Œμ°½
  • λ’€λ‘œκ°€κΈ°/μ•žμœΌλ‘œκ°€κΈ° λ²„νŠΌ
  • 뢁마크 μ˜΅μ…˜
  • ν˜„μž¬ λ¬Έμ„œλ₯Ό μƒˆλ‘œ κ³ μΉ˜κ±°λ‚˜ 멈좜 수 μžˆλŠ” μƒˆλ‘œκ³ μΉ¨/멈좀 λ²„νŠΌ
  • μ‚¬μš©μžμ˜ ν™ˆνŽ˜μ΄μ§€λ‘œ κ°€λŠ” ν™ˆλ²„νŠΌ

μ΄μƒν•˜κ²Œλ„ μ΄λŸ¬ν•œ 곡톡점듀은, 곡식적인 λͺ…μ„Έλ‘œ μ§€μ •λœ 것이 μ•„λ‹˜μ—λ„ λΆˆκ΅¬ν•˜κ³  μˆ˜λ…„ λ™μ•ˆ ν˜•μ„±λœ 쒋은 κ΄€ν–‰κ³Ό μ„œλ‘œλ₯Ό λͺ¨λ°©ν•˜λŠ” λΈŒλΌμš°μ €μ˜ νŠΉμ§•μ—μ„œ λΉ„λ‘―λœ 것이닀. HTML5 λͺ…μ„ΈλŠ” λΈŒλΌμš°μ €κ°€ κ°€μ Έμ•Όν•˜λŠ” UI μš”μ†Œλ₯Ό μ •μ˜ν•˜κ³  μžˆμ§€λŠ” μ•Šμ§€λ§Œ, 일뢀 κ³΅ν†΅λœ μš”μ†Œλ“€μ„ λ‚˜μ—΄ν•œλ‹€. κ·Έ μ€‘μ—λŠ” μ£Όμ†Œ ν‘œμ‹œμ€„, μƒνƒœ ν‘œμ‹œμ€„, 도ꡬ ν‘œμ‹œμ€„ 등이 μžˆλ‹€. λ¬Όλ‘  νŒŒμ΄μ–΄ν­μŠ€λ‚˜ 크둬의 λ‹€μš΄λ‘œλ“œ κ΄€λ¦¬μžμ™€ 같은 νŠΉμ • λΈŒλΌμš°μ €μ—λ§Œ μžˆλŠ” κΈ°λŠ₯도 μžˆλ‹€.

1-3 λΈŒλΌμš°μ €μ˜ μƒμœ„λ ˆλ²¨ ꡬ쑰

  1. μœ μ € μΈν„°νŽ˜μ΄μŠ€: μ£Όμ†Œμ°½, μ•ž/λ’€ λ²„νŠΌ, 뢁마크 메뉴 λ“±, μš”μ²­ν•œ νŽ˜μ΄μ§€λ₯Ό λ³΄μ—¬μ£ΌλŠ” 창을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€ λͺ¨λ“  뢀뢄을 μΉ­ν•œλ‹€.
  2. λΈŒλΌμš°μ € 엔진: μœ μ € μΈν„°νŽ˜μ΄μŠ€μ™€ λ Œλ”λ§ 엔진 μ‚¬μ΄μ˜ λ™μž‘μ„ μ œμ–΄
  3. λ Œλ”λ§ 엔진: μš”μ²­ν•œ μ½˜ν…μΈ λ₯Ό ν‘œμ‹œν•œλ‹€. 예λ₯Ό λ“€μ–΄ HTML을 μš”μ²­ν•˜λ©΄ HTMLκ³Ό CSSλ₯Ό νŒŒμ‹±ν•˜μ—¬ 화면에 ν‘œμ‹œν•œλ‹€.
  4. λ„€νŠΈμ›Œν‚Ή: HTTP μš”μ²­κ³Ό 같은 λ„€νŠΈμ›Œν¬ 톡신에 μ‚¬μš©λœλ‹€. μ—¬κΈ°λŠ” ν”Œλž«νΌ 독립적인 μΈν„°νŽ˜μ΄μŠ€μ΄κ³  각 ν”Œλž«νΌ ν•˜λΆ€μ—μ„œ μ‹€ν–‰λœλ‹€.
  5. UI λ°±μ—”λ“œ: 콀보 λ°•μΈ , μ°½κ³Ό 같은 기본적인 μž₯치λ₯Ό κ·Έλ¦°λ‹€. ν”Œλž«νΌμ—μ„œ λͺ…μ‹œν•˜μ§€ μ•Šμ€ 일반적인 μΈν„°νŽ˜μ΄μŠ€λ‘œ, OS μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€ 체계λ₯Ό μ‚¬μš©ν•œλ‹€.
  6. μžλ°”μŠ€ν¬λ¦½νŠΈ 인터프리터: μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό νŒŒμ‹±ν•˜κ³  싀행을 μœ„ν•΄ μ‚¬μš©ν•œλ‹€.
  7. 데이터 μŠ€ν† λ¦¬μ§€: 자료λ₯Ό μ €μž₯ν•˜λŠ” 계측이닀. μΏ ν‚€λ₯Ό μ €μž₯ν•˜λŠ” 것과 같이, λͺ¨λ“  μ’…λ₯˜μ˜ μžμ›μ„ ν•˜λ“œλ””μŠ€ν¬μ— μ €μž₯ν•  λ•Œ μ‚¬μš©ν•œλ‹€. HTML5 λͺ…μ„Έμ—λŠ” λΈŒλΌμš°μ €κ°€ μ§€μ›ν•΄μ•Όν•˜λŠ” μ›Ή 데이터 λ² μ΄μŠ€κ°€ μ •μ˜ λ˜μ–΄ μžˆλ‹€.

https://www.html5rocks.com/en/tutorials/internals/howbrowserswork/layers.png

크둬과 같은 κ²½μš°μ—λŠ” 각 νƒ­λ§ˆλ‹€ λ³„λ„μ˜ λ Œλ”λ§ 엔진을 μ‚¬μš©ν•œλ‹€. 각 탭은 λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ‹€ν–‰λœλ‹€.

2. λžœλ”λ§ 엔진

λ Œλ”λ§ μ—”μ§„μ˜ 역할은... λ§κ·ΈλŒ€λ‘œ λ Œλ”λ§μ΄λ‹€. λ Œλ”λ§μ€ μ—¬κΈ°μ„œ μš”μ²­λ°›μ€ μ½˜ν…μΈ λ₯Ό λΈŒλΌμš°μ € 화면에 λ³΄μ—¬μ£ΌλŠ” 역할이닀.

기본적으둜 λ Œλ”λ§μ—”μ§„μ€ HTML, XML, 그리고 이미지λ₯Ό ν‘œμ‹œν•  수 μžˆλ‹€. ν”ŒλŸ¬κ·ΈμΈμ΄λ‚˜ μ΅μŠ€ν…μ…˜μ„ ν™œμš©ν•œλ‹€λ©΄, λ‹€μ–‘ν•œ 데이터 νƒ€μž…, 예λ₯Ό λ“€μ–΄ PDF λ“± 도 ν‘œμ‹œν•  수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜, 이번 μ±•ν„°μ—μ„œλŠ” 일반적인 ν™œμš© 예제인 CSS둜 포맷된 HTMLκ³Ό 이미지λ₯Ό ν‘œμ‹œν•˜λŠ” 법에 λŒ€ν•΄μ„œ λ‹€λ£° 것이닀.

2-1. λ Œλ”λ§ 엔진듀

λΈŒλΌμš°μ € λ§ˆλ‹€ μ„œλ‘œλ‹€λ₯Έ λ Œλ”λ§ 엔진을 μ‚¬μš©ν•˜κ³  μžˆλ‹€. μ΅μŠ€ν”„λ‘€λŸ¬λŠ” Tridentλ₯Ό, νŒŒμ΄μ–΄ν­μŠ€λŠ” Geckoλ₯Ό μ‚¬μš©ν•˜λ©° μ‚¬νŒŒλ¦¬λŠ” Webkit을 μ‚¬μš©ν•œλ‹€. 그리고 크둬과 15버전 λΆ€ν„° μ˜€νŽ˜λΌλŠ” Webkitμ—μ„œ 포크된 Blinkλ₯Ό μ‚¬μš©ν•œλ‹€.

Webkit은 μ˜€ν”ˆμ†ŒμŠ€ λ Œλ”λ§ μ—”μ§„μœΌλ‘œ, λ¦¬λˆ…μŠ€ ν”Œλž«νΌμ—μ„œ μ‚¬μš©λ  μ—”μ§„μœΌλ‘œ λ§Œλ“€μ–΄μ‘Œλ‹€κ°€ μ• ν”Œμ— μ˜ν•΄μ„œ λ§₯κ³Ό μœˆλ„μš°λ„ μ§€μ›ν•˜κ²Œ λ˜μ—ˆλ‹€. μžμ„Έν•œ 것은 webkit.orgλ₯Ό μ°Έμ‘°ν•˜λ©΄ λœλ‹€.

2-2. μ£Όμš” 흐름

λ Œλ”λ§ 엔진은 톡신을 톡해 μš”μ²­ν•œ λ¬Έμ„œμ˜ λ‚΄μš©μ„ μ–»λŠ” 것뢀터 μ‹œμž‘ν•œλ‹€. 보톡 λ¬Έμ„œλ‚΄μš©μ€ 8kb λ‹¨μœ„λ‘œ μ „μ†‘λœλ‹€. λ Œλ”λ§ μ—”μ§„μ˜ 기본적인 λ™μž‘κ³Όμ •μ€ μ•„λž˜μ™€ κ°™λ‹€.

  1. DOM 트리 ꡬ좕을 μœ„ν•œ HTML νŒŒμ‹±
  2. λ Œλ” 트리 ꡬ좕
  3. λ Œλ” 트리 배치
  4. λ Œλ” 트리 그리기

λ Œλ”λ§ 엔진은 HTML λ¬Έμ„œλ₯Ό νŒŒμ‹±ν•˜κΈ° μ‹œμž‘ν•˜λ©°, μ½˜ν…μΈ  트리 λ‚΄λΆ€μ—μ„œ νƒœκ·Έλ₯Ό DOM λ…Έλ“œλ‘œ λ³€ν™˜ν•œλ‹€.그리고 엔진은 CSS파일과 μŠ€νƒ€μΌ μš”μ†Œλ₯Ό νŒŒμ‹±ν•˜κΈ° μ‹œμž‘ν•œλ‹€. μŠ€νƒ€μΌ 정보와 HTML ν‘œμ‹œ κ·œμΉ™μ€ 'λ Œλ”νŠΈλ¦¬' 라고 λΆ€λ₯΄λŠ” λ˜λ‹€λ₯Έ 트리λ₯Ό μƒμ„±ν•œλ‹€.

λ Œλ” νŠΈλ¦¬λŠ” 색상 λ˜λŠ” 면적과 같은 μ‹œκ°μ  속성이 μžˆλŠ” μ‚¬κ°ν˜•μ„ ν¬ν•¨ν•˜κ³  μž‡λŠ”λ°, 정해진 μˆœμ„œλŒ€λ‘œ 화면에 ν‘œμ‹œλœλ‹€.

λ Œλ” 트리 ꡬ좕 μ΄ν›„μ—λŠ”, λ ˆμ΄μ•„μ›ƒ ν”„λ‘œμ„ΈμŠ€λ‘œ λ„˜μ–΄κ°„λ‹€. 이 말은, 각 λ…Έλ“œκ°€ ν™”λ©΄μ˜ μ •ν™•ν•œ μœ„μΉ˜μ— ν‘œμ‹œλ˜λŠ” 것을 μ˜λ―Έν•œλ‹€. λ‹€μŒμ€ UI λ°±μ—”λ“œμ—μ„œ λ Œλ” 트리의 각 λ…Έλ“œλ₯Ό κ°€λ‘œμ§€λ₯΄λ©° λͺ¨μ–‘을 λ§Œλ“€μ–΄ λ‚΄λŠ” 그리기 과정이닀.

2-3. μ£Όμš” 흐름 예제

μ›Ήν‚·μ˜ μ£Όμš” 흐름

https://www.html5rocks.com/en/tutorials/internals/howbrowserswork/webkitflow.png

λͺ¨μ§ˆλΌ κ²Œμ½”μ˜ λ Œλ”λ§ 엔진 μ£Όμš” 흐름

https://www.html5rocks.com/en/tutorials/internals/howbrowserswork/image008.jpg

κ·Έλ¦Όμ—μ„œ λ³΄λ‹€μ‹œν”Ό, μ›Ήν‚·κ³Ό κ²Œμ½”κ°€ μ•½κ°„ λ‹€λ₯Έ μš©μ–΄λ₯Ό μ“°κ³  μžˆμ§€λ§Œ 기본적인 흐름은 λ™μΌν•˜λ‹€.

κ²Œμ½”λŠ” μ‹œκ°μ μœΌλ‘œ μ²˜λ¦¬λ˜λŠ” λ Œλ” 트리λ₯Ό ν”„λ ˆμž„νŠΈλ¦¬ 라고 λΆ€λ₯΄κ³ , 각 μš”μ†Œλ₯Ό ν”„λ ˆμž„μ΄λΌκ³  λΆ€λ₯΄λŠ” 반면, 웹킷은 λ Œλ” 객체둜 κ΅¬μ„±λ˜μ–΄ μžˆλŠ” λ Œλ” νŠΈλ¦¬λΌλŠ” μš©μ–΄λ₯Ό μ‚¬μš©ν•œλ‹€. 웹킷은 μš”μ†Œλ₯Ό λ°°μΉ˜ν•˜λŠ”λ° λ ˆμ΄μ•„μ›ƒμ΄λΌλŠ” μš©μ–΄λ₯Ό μ‚¬μš©ν•˜μ§€λ§Œ, κ°œμ½”λŠ” λ¦¬ν”Œλ‘œμš°λΌλŠ” μš©μ–΄λ₯Ό μ‚¬μš©ν•œλ‹€. attachmentλŠ” 웹킷이 λ Œλ“œ 트리λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ DOMλ…Έλ“œμ™€ μ‹œκ°μ •λ³΄λ₯Ό μ—°κ²°ν•˜λŠ” 과정을 μ˜λ―Έν•œλ‹€. λ°˜λ©΄μ— κ²Œμ½”λŠ” HTMLκ³Ό DOM트리 사이에 μ½˜ν…μΈ  싱크라고 λΆ€λ₯΄λŠ” 과정을 λ‘λŠ”λ°, μ΄λŠ” DOM μš”μ†Œλ₯Ό μƒμ„±ν•˜λŠ” κ³Όμ •μœΌλ‘œ μ›Ήν‚·κ³Ό λΉ„μŠ·ν•˜μ—¬ 큰 의미 μžˆλŠ” 차이점으둜 λ³΄μ§€λŠ” μ•ŠλŠ”λ‹€.

3. νŒŒμ‹±κ³Ό DOM 트리 ꡬ좕

3-1. νŒŒμ‹± 일반

νŒŒμ‹±μ€ λ Œλ”λ§ μ—”μ§„μ—μ„œ μ•„μ£Ό μ€‘μš”ν•œ μž‘μ—…μ΄λΌμ„œ, νŒŒμ‹±μ— λŒ€ν•΄μ„œ μ•„μ£Ό 깊게 λ‹€λ£° μ˜ˆμ©‘μ΄λ‹€. νŒŒμ‹±μ— λŒ€ν•œ 짧은 μ†Œκ°œμ™€ ν•¨κ»˜ μ‹œμž‘ν•œλ‹€.

λ¬Έμ„œλ₯Ό νŒŒμ‹±ν•œλ‹€λŠ” 것은 λ¬Έμ„œ ꡬ쑰λ₯Ό 읽을 수 μžˆλŠ” μ½”λ“œλ‘œ λ³€ν™˜ν•œλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€. νŒŒμ‹±μ˜ κ²°κ³ΌλŠ” 보톡 λ…Έλ“œμ˜ 트리둜 λ‚˜νƒ€λ‚˜λŠ”λ°, 이 λ…Έλ“œμ˜ νŠΈλ¦¬λŠ” λ¬Έμ„œμ˜ ꡬ쑰λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 이것을 파슀트리 λ˜λŠ” μ‹ νƒμŠ€ 트리 라고 ν•œλ‹€.

예λ₯Ό λ“€μ–΄, 2+3-1은 μ•„λž˜μ™€ 같은 트리ꡬ쑰둜 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.

https://www.html5rocks.com/en/tutorials/internals/howbrowserswork/image009.png

3-1-1. 문법듀

νŒŒμ‹±μ€ λ¬Έμ„œμ— μž‘μ„±λœ μ–Έμ–΄ λ˜λŠ” ν˜•μ‹μ˜ κ·œμΉ™μ„ λ”°λ₯Έλ‹€. νŒŒμ‹±ν•  수 μžˆλŠ” λͺ¨λ“  ν˜•μ‹μ€ 정해진 μš©μ–΄μ™€ ꡬ문 κ·œμΉ™μ— 따라야 ν•œλ‹€. 이것을 λ¬Έλ§₯ 자유 문법이라고 ν•œλ‹€. μΈκ°„μ˜ μ–Έμ–΄λŠ” 이런 λͺ¨μŠ΅κ³ΌλŠ” λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— κΈ°κ³„μ μœΌλ‘œ νŒŒμ‹±μ΄ λΆˆκ°€λŠ₯ν•˜λ‹€.

3-1-2. Parser-Lexer μ‘°ν•©

νŒŒμ‹±μ€ 두가지 μ„œλΈŒ ν”„λ‘œμ„ΈμŠ€λ‘œ λ‚˜λˆŒμˆ˜ μžˆλ‹€. λ ‰μ‹œμ»¬ 뢄석과 μ‹ νƒμŠ€ 뢄석.

λ ‰μ‹œμ»¬ 뢄석은 μž…λ ₯값을 ν† ν°μœΌλ‘œ λ‚˜λˆ„λŠ” 과정이닀. 토큰은 μœ νš¨ν•˜κ²Œ κ΅¬μ„±λœ λ‹¨μœ„μ˜ 집합이라고 λ³Ό 수 μžˆλ‹€. μΈκ°„μ˜ μ–Έμ–΄μ—μ„œλŠ” μ‚¬μ „μ μœΌλ‘œ 뜻이 μžˆλŠ” 단어듀을 μ˜λ―Έν•œλ‹€.

μ‹ νƒμŠ€ 뢄석은 μ–Έμ–΄λ₯Ό μ‹ νƒμŠ€ κ·œμΉ™μ— μ μš©ν•˜λŠ” 것이닀.

νŒŒμ„œλŠ” 보톡 두가지 일을 ν•˜λŠ”λ° λ ‰μ„œ (ν† ν¬λ‚˜μ΄μ €λΌκ³ λ„ ν•œλ‹€)λŠ” μž…λ ₯값을 μœ νš¨ν•œ 토큰 κ°’μœΌλ‘œ λ‚˜λˆ„λŠ” 일을 ν•˜κ³ , νŒŒμ„œλŠ” μ–Έμ–΄ κ·œμΉ™μ— 따라 λ¬Έμ„œκ΅¬μ‘°λ₯Ό λΆ„μ„ν•˜μ—¬ νŒŒμ‹±νŠΈλ¦¬λ₯Ό μƒμ„±ν•œλ‹€. λ ‰μ„œλŠ” 곡백, μ€„λ°”κΏˆ 같은 의미 μ—†λŠ” 문자λ₯Ό μ œκ±°ν•œλ‹€.

D2μ—μ„œλŠ” λ ‰μ„œλ₯Ό μ–΄νœ˜λΆ„μ„μœΌλ‘œ, νŒŒμ„œλŠ” κ΅¬λ¬ΈλΆ„μ„μœΌλ‘œ μ •μ˜ν–ˆλ‹€.

https://www.html5rocks.com/en/tutorials/internals/howbrowserswork/image011.png

νŒŒμ‹±κ³Όμ •μ€ λ°˜λ³΅λœλ‹€. νŒŒμ„œλŠ” λ ‰μ–΄μ„Έ μƒˆλ‘œμš΄ 토큰이 μžˆλŠ”μ§€ μ§ˆμ˜ν•˜κ³ , 토큰을 μ‹ νƒμŠ€ κ·œμΉ™μ— λ§žμΆ”λ €κ³  ν•œλ‹€. λ§Œμ•½ λ§žλŠ” κ·œμΉ™μ΄ μžˆλ‹€λ©΄, 토큰에 ν•΄λ‹Ήν•˜λŠ” λ…Έλ“œκ°€ νŒŒμ‹±νŠΈλ¦¬μ— μΆ”κ°€λ˜κ³ , νŒŒμ„œλŠ” λ˜λ‹€λ₯Έ 토큰을 μš”μ²­ν•˜κ²Œ λœλ‹€.

λ§Œμ•½ μΌμΉ˜ν•˜λŠ” κ·œμΉ™μ΄ μ—†λ‹€λ©΄, νŒŒμ„œλŠ” 토큰을 내뢀에 μ €μž₯ν•˜κ³  토큰과 μΌμΉ˜ν•˜λŠ” κ·œμΉ™μ΄ λ°œκ²¬λ λ•Œ κΉŒμ§€ μš”μ²­ν•œλ‹€. λ§žλŠ” κ·œμΉ™μ΄ κ³„μ†ν•΄μ„œ μ—†λ‹€λ©΄ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•˜λŠ”λ°, μ΄λŠ” λ¬Έμ„œκ°€ μœ νš¨ν•˜μ§€ μ•Šκ³  μ‹ νƒμŠ€ 였λ₯˜κ°€ μžˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

3-1-3. λ³€ν™˜

λŒ€λΆ€λΆ„μ˜ 경우 파슀 νŠΈλ¦¬κ°€ λ§ˆμ§€λ§‰ 결과물이 μ•„λ‹ˆλ‹€. νŒŒμ‹±μ€ 보톡 λ³€ν™˜κ³Όμ •μ—μ„œ μ‚¬μš©λ˜λŠ”λ°, 이 과정은 μž…λ ₯된 λ¬Έμ„œλ₯Ό λ‹€λ₯Έ ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 과정을 μ˜λ―Έν•œλ‹€. 이와 같은 예둜 컴파일이 μžˆλ‹€. μ†ŒμŠ€ μ½”λ“œλ₯Ό 기계 μ½”λ“œλ‘œ λ§Œλ“œλŠ” μ»΄νŒŒμΌλŸ¬λŠ”, νŒŒμ‹±νŠΈλ¦¬ 생성후 기계 μ½”λ“œ λ¬Έμ„œλ‘œ λ³€ν™˜ν•œλ‹€.

https://www.html5rocks.com/en/tutorials/internals/howbrowserswork/image013.png

3-1-4. νŒŒμ‹± 예제

이전 κ·Έλ¦Όμ—μ„œ μˆ˜ν•™μ‹μ„ 파슀 트리둜 λ§Œλ“€μ–΄ λ³΄μ•˜λ‹€. κ°„λ‹¨ν•œ μˆ˜ν•™ μ–Έμ–΄λ₯Ό μ •μ˜ν•˜κ³ , νŒŒμ‹±κ³Όμ •μ„ μ‚΄νŽ΄λ³΄μž.

μ–Έμ–΄: 이 μˆ˜ν•™μ–Έμ–΄μ—λŠ” μ •μˆ˜, λ”ν•˜κΈ°, λΉΌκΈ°κ°€ μžˆλ‹€.

μ‹ νƒμŠ€:

  1. 기본적인 μš”μ†Œλ‘œλŠ” ν‘œν˜„μ‹, ν•­, μ—°μ‚°μžκ°€ μžˆλ‹€
  2. 언어에 ν¬ν•¨λ˜λŠ” ν‘œν˜„μ‹ κ°―μˆ˜μ— μ œν•œμ΄ μ—†λ‹€
  3. ν•­ 뒀에 μ—°μ‚°μž, 그뒀에 λ˜λ‹€λ₯Έ 항이 λ‚˜μ˜€λŠ” ν˜•νƒœλ‘œ μ •μ˜ν•œλ‹€
  4. μ—°μ‚°μžλŠ” λ”ν•˜κΈ° 토큰 λ˜λŠ” λΉΌκΈ° 토큰이닀
  5. μ •μˆ˜ 토큰 λ˜λŠ” ν•˜λ‚˜μ˜ ν‘œν˜„μ‹μ€ 항이닀.

이제 μ•„κΉŒ 예제인 2+3-1을 λΆ„μ„ν•΄λ³΄μž.

κ·œμΉ™μ— λ§žλŠ” 첫 번째 λ¬Έμžμ—΄μ€ 2λ‹€. κ·œμΉ™ 5에 λ”°λ₯΄λ©΄ 이것은 ν•˜λ‚˜μ˜ ν•­μœΌλ‘œ λ³Ό 수 μžˆλ‹€. 두 번째둜 λ§žλŠ” 것은 2+3 인데 이것은 ν•­ 뒀에 μ—°μ‚°μžμ™€ 또 λ‹€λ₯Έ 항이 λ“±μž₯ν•œλ‹€λŠ” μ„Έ 번째 κ·œμΉ™κ³Ό μΌμΉ˜ν•œλ‹€. μž…λ ₯ κ°’μ˜ λ§ˆμ§€λ§‰ λΆ€λΆ„κΉŒμ§€ μ§„ν–‰ν•˜λ©΄ 또 λ‹€λ₯Έ 일치λ₯Ό λ°œκ²¬ν•  수 μžˆλ‹€. 2+3은 ν•­κ³Ό μ—°μ‚°μžμ™€ ν•­μœΌλ‘œ κ΅¬μ„±λœ ν•˜λ‚˜μ˜ μƒˆλ‘œμš΄ ν•­μ΄λΌλŠ” 것을 μ•Œκ³  있기 λ•Œλ¬Έμ— 2+3-1은 ν•˜λ‚˜μ˜ ν‘œν˜„μ‹μ΄ λœλ‹€. 2++은 μ–΄λ–€ κ·œμΉ™κ³Όλ„ λ§žμ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μœ νš¨ν•˜μ§€ μ•Šμ€ μž…λ ₯이 λœλ‹€.

3-1-5. μ–΄νœ˜μ™€ ꡬ문에 λŒ€ν•œ 곡식적인 μ •μ˜

μ–΄νœ˜λŠ” 보톡 μ •κ·œν‘œν˜„μ‹μ„ ν™œμš©ν•œλ‹€.

예λ₯Ό λ“€μ–΄ 이 μˆ˜ν•™μ–Έμ–΄λŠ” μ•„λž˜μ²˜λŸΌ ν‘œν˜„ν•  수 μžˆμ„ 것이닀.

INTEGER: 0|[1-9][0-9]*
PLUS: +
MINUS: -

λ³΄μ‹œλ‹€μ‹œν”Ό, μ •μˆ˜λ„ μ •κ·œν‘œν˜„μ‹μœΌλ‘œ μ •μ˜ν–ˆλ‹€.

μ‹ νƒμŠ€λŠ” 보톡 BNF라고 λΆ€λ₯΄λŠ” ν˜•μ‹μ„ λ”°λΌμ„œ μ •μ˜ν•œλ‹€.

expression := term operation term
operation := PLUS | MINUS
term := INTEGER | expression

문법이 λ¬Έλ§₯ 자유 문법이라면 μ–Έμ–΄λŠ” μ •κ·œ νŒŒμ„œλ‘œ νŒŒμ‹±ν•  수 μžˆλ‹€. λ¬Έλ§₯ 자유 문법은 μ™„μ „νžˆ BNF둜 ν‘œν˜„ κ°€λŠ₯ν•œ λ¬Έλ²•μœΌλ‘œ 보면 λœλ‹€.

3-1-6. νŒŒμ„œμ˜ μ’…λ₯˜

νŒŒμ„œλŠ” top-down νŒŒμ„œμ™€ bottom up νŒŒμ„œ μ΄λ ‡κ²Œ λ‘κ°€μ§€λ‘œ λ‚˜λˆ„μ–΄μ§„λ‹€. μ§κ΄€μ μœΌλ‘œ μ„€λͺ…ν•˜μžλ©΄, top-down νŒŒμ„œλŠ” μœ„μ—μ„œ λΆ€ν„° μƒμœ„κ΅¬μ‘°μ—μ„œ λΆ€ν„° μΌμΉ˜ν•˜λŠ” 뢀뢄을 μ°ΎκΈ° μ‹œμž‘ν•˜μ§€λ§Œ, bottom-up의 κ²½μš°μ—λŠ” λ°‘μ—μ„œ λΆ€ν„° 점차 높은 μˆ˜μ€€μœΌλ‘œ μ°ΎλŠ”λ‹€.

두 μ’…λ₯˜ νŒŒμ„œκ°€ 예제λ₯Ό μ–΄λ–»κ²Œ νŒŒμ‹±ν•˜λŠ”μ§€ μ‚΄νŽ΄λ³΄μž.

top-down νŒŒμ„œλŠ” μƒμœ„ κ΅¬μ‘°μ—μ„œ λΆ€ν„° μ‹œμž‘ν•œλ‹€. 2+3에 ν•΄λ‹Ήν•˜λŠ” ν‘œν˜„μ‹μ„ μ°ΎλŠ”λ‹€. 그리고 2+3-1λ₯Ό 찾을 것이닀. ν‘œν˜„μ‹μ„ μ°ΎλŠ” 과정은, λ‹€λ₯Έ κ·œμΉ™μ„ μ μ§„μ μœΌλ‘œ κ³„μ†ν•΄μ„œ μ°ΎλŠ” 방식인데 κ°€μž₯ 높은 μˆ˜μ€€μ˜ κ·œμΉ™μ„ λ¨Όμ € μ°ΎλŠ” 것을 μ‹œμž‘ν•œλ‹€.

λ°˜λ©΄μ— bottom-up은 μž…λ ₯값이 κ·œμΉ™μ— λ§žμ„λ•Œ κΉŒμ§€ μ°Ύμ•„μ„œ λ§žλŠ” μž…λ ₯κ°’ κ·œμΉ™μœΌλ‘œ λ°”κΎΈλŠ”λ°, μ΄λŠ” μž…λ ₯κ°’μ˜ λκΉŒμ§€ μ§„ν–‰λœλ‹€. λΆ€λΆ„μ μœΌλ‘œ μΌμΉ˜ν•˜λŠ” ν‘œν˜„μ‹μ€ νŒŒμ„œμ˜ μŠ€νƒμ— μŒ“μΈλ‹€.

Stackinput
2 + 3 - 1
ν•­+ 3 - 1
ν•­ μ—°μ‚°μž3 -1
ν‘œν˜„μ‹-1
ν‘œν˜„μ‹ μ—°μ‚°μž1
ν‘œν˜„μ‹

bottom up νŒŒμ„œλŠ” shift-reduce νŒŒμ„œλΌκ³ λ„ λΆˆλ¦¬μš°λŠ”λ°, μ™œλƒν•˜λ©΄ μž…λ ₯값이 였λ₯Έμͺ½μœΌλ‘œ μ΄λ™ν•˜λ©΄μ„œ μ‹ νƒμŠ€ κ·œμΉ™μœΌλ‘œ λ‚¨λŠ” 것이 점차 κ°μ†Œν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

3-1-7. νŒŒμ„œ μžλ™ 생성

νŒŒμ„œλ₯Ό 생성해 쀄 수 μžˆλŠ” 도ꡬλ₯Ό νŒŒμ„œ 생성기라고 ν•œλ‹€. 이 생성기에 문법을 μ œκ³΅ν•˜κ³ , μ–΄νœ˜μ™€ μ‹ νƒμŠ€ κ·œμΉ™μ„ μ μš©ν•˜μ—¬ νŒŒμ„œλ₯Ό μƒμ„±ν•œλ‹€. νŒŒμ„œλ₯Ό μž‘μ„±ν•˜λ €λ©΄ νŒŒμ‹±μ— λŒ€ν•œ κΉŠμ€ 이해가 ν•„μš”ν•˜λ©°, μˆ˜μž‘μ—…μœΌλ‘œ μ΅œμ ν™”λœ νŒŒμ„œλ₯Ό μ œκ³΅ν•˜λŠ” 것은 쉽지 μ•ŠμœΌλ―€λ‘œ νŒŒμ„œ 생성기가 μœ μš©ν•  수 μžˆλ‹€.

Webkit의 κ²½μš°μ—λŠ” flex라고 λΆˆλ¦¬μš°λŠ” lexer와 bison이라고 λΆˆλ¦¬μš°λŠ” νŒŒμ„œ 생성기λ₯Ό μ‚¬μš©ν•œλ‹€. FlexλŠ” ν† ν°μ˜ μ •κ·œ ν‘œν˜„μ‹ μ •μ˜λ₯Ό ν¬ν•¨ν•˜λŠ” νŒŒμΌμ„ μž…λ ₯κ°’μœΌλ‘œ λ°›κ³ , bison은 BNFν˜•μ‹μ˜ μ–Έμ–΄ μ‹ νƒμŠ€ κ·œμΉ™μ„ μž…λ ₯ λ°›λŠ”λ‹€.