/Compiler

๐Ÿ’ก iOS ์ปดํŒŒ์ผ๋Ÿฌ Tutorial

Primary LanguageSwift

Compiler

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค
์ด ๋•Œ ๊ตฌ๋ฌธ๋ถ„์„ -> ์ตœ์ ํ™” -> ์ฝ”๋“œ์ƒ์„ฑ -> ๋งํ‚น ์˜ ๊ณผ์ •์ด ์ง„ํ–‰๋˜๋ฉฐ
์†Œ์Šค์ฝ”๋“œ๋Š” Tokenizer, Lexer, Parser๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์ง€๋‚˜๊ฐ€๋ฉฐ
๊ตฌ๋ฌธ๋ถ„์„์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ํ•ด๋‹น ๊ณผ์ •์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค

2020, NaverBoostCamp์˜ ์ž๋ฃŒ๋“ค์„ ๋งŽ์ด ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค

1. Tokenizer


Tokenizer ๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์–ด๋–ค ๊ตฌ๋ฌธ์„ ํ† ํฐํ™” ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค
์—ฌ๊ธฐ์„œ ํ† ํฐ์ด๋ž€ ์–ดํœ˜ ๋ถ„์„์˜ ์ž‘์€ ๋‹จ์œ„๋ฅผ ๋œปํ•˜๋ฉฐ ๋‹จ์–ด, ๋‹จ์–ด๊ตฌ, ๋ฌธ์ž์—ด ๋“ฑ ์˜๋ฏธ์žˆ๋Š” ๋‹จ์œ„๋กœ ์ •ํ•ด์ง„๋‹ค
ํ† ํฐ์€ ์–ด๋–ค ์š”์†Œ๋“ค์„ ๊ตฌ์กฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค
๋”ฐ๋ผ์„œ, ์–ด๋–ค ๋ช…๋ น์–ด๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ํ•ด๋‹น ๋ช…๋ น์–ด๋ฅผ ์ž˜๋ผ์„œ ํ† ํฐ๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค

2. Lexer


Lexer๋Š” Tokenizer ๋กœ ์ธํ•ด ์ชผ๊ฐœ์ง„ ํ† ํฐ๋“ค์˜ ์˜๋ฏธ๋ฅผ ๋ถ„์„ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค
Tokenizer๋ฅผ ๊ฑฐ์น˜๋ฉฐ ์˜๋ฏธ์žˆ๋Š” ๋‹จ์œ„๋กœ ์ชผ๊ฐœ์ง€๊ณ ,
Lexer๋ฅผ ๊ฑฐ์น˜๋ฉฐ ํ† ํฐ์˜ ์œ ํ˜•์„ ๋ถ„์„ํ•˜๋Š” ๊ณผ์ •์„ ํ†ตํ‹€์–ด Lexical Analyze๋ผ๊ณ  ํ•œ๋‹ค

return ์ด๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ๋ถ„์„ํ•˜๋Š” ๊ณผ์ •์„ ์˜ˆ๋กœ ๋“ค์–ด๋ณด์ž

ex) return A ๋ช…๋ น์–ด ๋ถ„์„

  • return A๋ผ๋Š” ๋‹จ์–ด์—์„œ ์ž์ฒด๋Š” ์•„๋ฌด ์˜๋ฏธ๋„ ๊ฐ€์ง€์ง€ ์•Š์Œ
  • Tokenizer๋ฅผ ๊ฑฐ์น˜๋ฉฐ return๊ณผ A๋ผ๋Š” ์˜๋ฏธ์žˆ๋Š” ๋‹จ์–ด๊ฐ€ ๋จ -> ํ† ํฐํ™”
  • Lexer๋ฅผ ๊ฑฐ์น˜๋ฉฐ return ํ† ํฐ์€ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ผ๋Š” ๋ช…๋ น์–ด๊ตฌ๋‚˜! ๋ผ๊ณ  ์˜๋ฏธ๋ฅผ ๋ถ„์„
  • Lexer๋ฅผ ๊ฑฐ์น˜๋ฉฐ A ํ† ํฐ์€ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค! ๋ผ๊ณ  ์˜๋ฏธ๋ฅผ ๋ถ„์„
  • ํ•ด๋‹น ํ† ํฐ์€ {type: ๋ช…๋ น์–ด, value: "return", child: []} ์™€ ๊ฐ™์€ ์‹์œผ๋กœ ์˜๋ฏธ๊ฐ€ ๋ถ„์„๋˜์–ด Parser์—๊ฒŒ ์ „๋‹ฌ๋œ๋‹ค

3. Parser


Parser๋Š” Lexical Analyze๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค
๋ฐ์ดํ„ฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ๊ฒ€์ฆํ•˜๋Š” ์—ญํ• ๋„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ, ์ด๋ฅผ ํ†ตํ‹€์–ด Syntax Analyze๋ผ๊ณ  ํ•œ๋‹ค

๋งŒ์•ฝ ์‹ค์ œ๋กœ Tokenizer, Lexer, Parser ๊ฐœ๋…์„ ์ด์šฉํ•˜์—ฌ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ตฌํ˜„ํ•ด๋ณผ ์ƒ๊ฐ์ด๋ผ๋ฉด,
Parser๊ฐ€ ํƒœ์Šคํฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ๋ฌด์–ธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐœ๊ฒฌ๋˜์—ˆ๋‹ค๋ฉด
Error๋ฅผ ๋˜์ง€๋Š” ์‹์œผ๋กœ ์—๋Ÿฌ ํ•ธ๋“ค๋ง์ด ํ•„์š”ํ•˜๋‹ค
Parser์— ์˜ํ•ด ๋„์ถœ๋œ ๊ฒฐ๊ณผ๋Š” AST(Abstract Syntax Tree) ํ˜•ํƒœ๋กœ ์ƒ์„ฑ๋œ๋‹ค

4. AST (Abstract Syntax Tree)

AST๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ Tokenizer, Lexer, Parser ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉฐ ๋ถ„์„๋œ ๊ตฌ๋ฌธ์„ ํŠธ๋ฆฌ์˜ ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค
๋ถ„์„๋œ ์†Œ์Šค๋ฅผ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝ์‹œํ‚จ ํŠธ๋ฆฌ๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค
AST๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค

5. ์˜ˆ์‹œ

์˜ˆ์‹œ 1)

// - Input
printf("Hello World");

// - Tokenizer : ์˜๋ฏธ์žˆ๋Š” ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ (ํ† ํฐํ™”)
["printf", "(", "Hello World", ")", ";"]

// - Lexer : ์ฃผ์–ด์ง„ ํ† ํฐ์˜ ์˜๋ฏธ ๋ถ„์„
<id, printf>
<punctuation, (>
<literal, "Hello World">
<punctuation, )>
<punctuation, ;>

// - Parser : ๋ถ„์„๋œ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ๋ฐ AST ๊ตฌ์กฐํ™”
{
    type: punctuation,
    value: printf,
    child: [
        {
            type: literal,
            value: "Hello World",
            child: []
        }
    ]
}

์œ„์˜ ์˜ˆ์‹œ๋Š” ์ •์ƒ์ ์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„์„ ์™„๋ฃŒํ–ˆ์„๋•Œ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค
AST ์—์„œ๋Š” ๊ด„ํ˜ธ๋‚˜ ์„ธ๋ฏธ์ฝœ๋ก ๊ณผ ๊ฐ™์€ ์ •๋ณด๋“ค์€ ์ƒ๋žตํ•˜๊ณ 
์†Œ์Šค์ฝ”๋“œ์—์„œ ํ•„์š”ํ•œ ์ •๋ณด๋“ค๋งŒ ์ถ”๋ ค๋‚ด์–ด ํŠธ๋ฆฌํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค

Abstract ๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ๋“ค์–ด๊ฐ„ ์ด์œ ๋Š”
์†Œ์Šค์ฝ”๋“œ์˜ ๋ถˆํ•„์š”ํ•œ ์ •๋ณด๋Š” ์ œ์™ธํ•˜๊ณ  ํ•ต์‹ฌ ๋ฐ์ดํ„ฐ๋“ค๋งŒ์„ ์ด์šฉํ•ด ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค


์˜ˆ์‹œ 2)

// - Input
printf("Wrong Syntax")

// - Tokenizer : ์˜๋ฏธ์žˆ๋Š” ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ (ํ† ํฐํ™”)
["printf", "(", "Wrong Syntax", ")"]

// - Lexer : ์ฃผ์–ด์ง„ ํ† ํฐ์˜ ์˜๋ฏธ ๋ถ„์„
<id, printf>
<punctuation, (>
<literal, "Hello World">
<punctuation, )>

// - Parser : ๋ถ„์„๋œ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ๋ฐ AST ๊ตฌ์กฐํ™”
Compile Error - missing semicolon

์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” ์ž˜๋ชป๋œ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๋Š” ๊ณผ์ •์„ ๋‚˜ํƒ€๋‚ธ๋‹ค
Tokenizer ์™€ Lexer ๋Š” ์˜๋ฏธ์žˆ๋Š” ๋‹จ์œ„๋กœ ์†Œ์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ 
์˜๋ฏธ๋ฅผ ๋ถ„์„ํ•˜๋Š” ์—ญํ• ๋งŒ ํ•  ๋ฟ, ํ•ด๋‹น ์†Œ์Šค๊ฐ€ ์œ ํšจํ•œ์ง€ ์•„๋‹Œ์ง€๋Š” ๊ฒ€์ฆํ•˜์ง€ ์•Š๋Š”๋‹ค

์‹ค์ œ ๊ณผ์ •์€ ๋ณด๋‹ค ๋ณต์žกํ•œ ๋ฐฉ์‹์œผ๋กœ ์ด๋ค„์ง€๊ฒ ์ง€๋งŒ
๊ฒ€์ฆ์€ Parser์—์„œ ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์—, Parser์—์„œ ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฅผ ๋˜์ ธ์ค„ ๊ฒƒ์ด๋‹ค
์ปดํŒŒ์ผ ์—๋Ÿฌ์˜ ๋Œ€๋ถ€๋ถ„์€ ์œ„์™€ ๊ฐ™์ด Parser์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ AST๋กœ ๊ตฌ์กฐํ™”ํ•˜์ง€ ๋ชปํ•˜์—ฌ ๋˜์ ธ์ฃผ๋Š” ์—๋Ÿฌ์ผ ํ™•๋ฅ ์ด ๋†’๋‹ค

6. ์ฐธ๊ณ