|
| 1 | +이 시리즈는 C 컴파일러를 완전 처음에서부터 만드는 튜토리얼이에요. |
| 2 | + |
| 3 | +윗문장에서 제가 한 가지 거짓말을 한 게 있어요: 사실 *컴파일러* 대신에 |
| 4 | +*인터프리터*예요. "C 인터프리터"가 대체 뭐길래 거짓말을 한거죠? 하지만 아마 |
| 5 | +인터프리터를 만듦으로서 컴파일러를 더 잘 이해할 수 있게 될겁니다. |
| 6 | + |
| 7 | +맞아요, 전 여러분이 어떻게 컴파일러가 구성되어있는지에 대해 기본적인 이해를 하고 |
| 8 | +인터프리터를 만드는게 그렇게까지 어렵지 않다는걸 깨닫길 바래요. 행운을 빕니다! |
| 9 | + |
| 10 | +마지막으로, 이 시리즈는 제작자가 처음에 중국어로 적고, 직접 영어로 번역했어요. |
| 11 | +그리고 그걸 제가 또 한국어로 번역했고요. 만약에 어색한 표현이나 이상한 부분이 |
| 12 | +있다면 정정해주세요. |
| 13 | + |
| 14 | +이번 챕터에서 코드를 적지는 않을거라서 코드를 보고 싶으신 분들은 건너 뛰셔도 |
| 15 | +상관 없어요... |
| 16 | + |
| 17 | +## 왜 컴파일러 이론에 관심을 가져야 하죠? |
| 18 | + |
| 19 | +왜냐면 **멋지기** 때문이죠! |
| 20 | + |
| 21 | +그리고 매우 유용해요. 프로그램들은 우리에게 무언가를 해주기 위해 만들어져요. |
| 22 | +만약에 그것들이 어떤 형태의 데이터를 다른 형태로 변환하는데 쓰인다면 우리는 그걸 |
| 23 | +컴파일러라고 부르죠. 따라서 몇가지 컴파일러 이론을 배우는 것을 통해 우리는 |
| 24 | +매우 강력한 문제 해결 기술을 마스터 해볼 수 있어요. 충분히 멋지지 않나요? |
| 25 | + |
| 26 | +사람들은 컴파일러가 어떻게 동작하는지 이해하는 것은 더 좋은 코드를 짜는데 도움을 |
| 27 | +줄 수 있다고 말하곤 하죠. 일부는 최신 컴파일러들은 최적화를 너무 잘 해줘서 |
| 28 | +더이상 신경쓰지 않아도 된다고 말할 거예요. 음... 맞는 말이에요. 대부분의 |
| 29 | +사람들은 단지 코드의 효율성만을 높이기 위해 컴파일러 이론을 배울 필요는 없죠. |
| 30 | +그리고 대부분의 사람들은 당신을 의미해요! |
| 31 | + |
| 32 | +전 컴파일러 이론이 프로그래밍을 쉽게 만들어주는 것이기 때문에 항상 경외해왔어요. |
| 33 | +어쨌든 어셈블리어만으로 웹브라우저를 만드는 걸 상상할 수 있나요? 그래서 제가 |
| 34 | +대학에서 컴파일러 이론을 배울 기회가 생겼을 때, 전 너무 기뻤어요! |
| 35 | +그리고나서... 그게 뭔지 이해를 못 해서 그만 뒀죠. |
| 36 | + |
| 37 | +보통 컴파일러 코스는 다음을 다뤄요: |
| 38 | + |
| 39 | +1. 구문 표현 방법(BNF 등) |
| 40 | +2. NFA(Nondeterministic Finite Automata; 비결정적 유한 오토마타), |
| 41 | + DFA(Deterministic Finite Automata; 결정적 유한 오토마타)와 렉서 |
| 42 | +3. 파서(재귀하향, LL(k), LALR 등) |
| 43 | +4. 중간언어 |
| 44 | +5. 코드 생성 |
| 45 | +6. 코드 최적화 |
| 46 | + |
| 47 | +아마도 90% 이상의 학생들은 파서 이상은 관심이 없을거예요. 게다가 우린 아직도 |
| 48 | +어떻게 컴러를 만드는지 몰라요! 심지어 그 이론들을 열심히 배운 뒤에도 말이죠. |
| 49 | +음, 주된 원인은 "컴파일러 이론"이 가르치려고 하는게 |
| 50 | +"파서 생성기 만드는 방법", 즉 구문 문법을 이용해서 컴파일러를 만들어주는 |
| 51 | +도구이기 때문이죠. lex/yacc나 flex/bison 같은 것들 말이에요. |
| 52 | + |
| 53 | +이런 이론들은 컴파일러를 자동으로 생성하는 일반적인 문제의 해결법을 |
| 54 | +가르쳐줍니다. 한 번 마스터하고 나면 모든 종류의 문법을 다룰 수 있다는 걸 |
| 55 | +의미해요. 산업에서 정말 유용해요. 그렇지만 학생들과 프로그래머에게 너무 강력하고 |
| 56 | +너무 복잡해요. lex/yacc의 소스코드를 한 번 읽어보면 이해가 될거예요. |
| 57 | + |
| 58 | +좋은 소식은 컴파일러를 만드는 건 상상하는 것보다 훨씬 쉽다는 거예요. 거짓말은 |
| 59 | +안 할게요. 쉽진 않지만 그렇다고 그렇게 어렵지는 않아요. |
| 60 | + |
| 61 | +## 프로젝트의 탄생 |
| 62 | + |
| 63 | +어느날 깃헙에서 [c4](https://github.com/rswier/c4)를 발견했어요. 단지 네 가지의 |
| 64 | +함수만으로 구현되었다고 하는 작은 C 인터프리터예요. 가장 놀라운 부분은 그게 |
| 65 | +부트스트랩(스스로를 인터프리트 해요)이라는 거예요. 게다가 500줄 정도의 코드로 |
| 66 | +완성되었어요! |
| 67 | + |
| 68 | +한편 전 컴파일러에 대한 많은 튜토리얼을 읽었어요, 너무 간단하거나(간단한 계산기 |
| 69 | +구현 등) 자동화 도구(flex/bison 등)을 이용했어요. 하지만 c4는 완전히 처음부터 |
| 70 | +구현되었어요. 하지만 슬픈 점은 c4가 최소한이 되려고 하는데, 이 점이 코드를 꽤 |
| 71 | +어지럽고 이해하기 어렵게 만들어요. 그래서 아래와 같은 목적을 위해서 새로운 |
| 72 | +프로젝트를 시작했어요: |
| 73 | + |
| 74 | +1. 작동하는 C 컴파일러(사실은 인터프리터) 구현하기 |
| 75 | +2. 어떻게 만들어졌는지에 대한 튜토리얼 작성하기 |
| 76 | + |
| 77 | +다시 작성하는데 일주일이 걸렸고 결과적으로 주석을 포함해서 1400줄이 되었어요. |
| 78 | +프로젝트는 깃헙에서 호스팅되고 있어요: |
| 79 | +[Write a C Interpreter](https://github.com/lotabout/write-a-C-interpreter). |
| 80 | + |
| 81 | +멋진 프로젝트를 제공해주신 rswier에게 감사드립니다! |
| 82 | + |
| 83 | +## 가기 전에 |
| 84 | + |
| 85 | +컴파일러를 구현하는 건 지루할 수 있고 디버깅하기가 어려워요. 그래서 저는 |
| 86 | +코드를 타이핑하는 것 뿐만 아니라 공부하는 데 충분한 시간을 할애해줬으면 해요. |
| 87 | +제가 느꼈던 것처럼 큰 성취감을 느낄 수 있을 거라고 장담해요. |
| 88 | + |
| 89 | +## 좋은 리소스 |
| 90 | +1. [Let’s Build a Compiler](http://compilers.iecc.com/crenshaw/): 새내기들에게 |
| 91 | + 아주 좋은 컴파일러 제작에 관한 튜토리얼 |
| 92 | +2. [Lemon Parser Generator](http://www.hwaci.com/sw/lemon/): SQLite에서 사용되는 |
| 93 | + 파서 생성기예요. 코드로 컴파일러 이론을 이해하고싶다면 읽어보는 것도 좋아요. |
| 94 | + |
| 95 | +결론적으로 저는 일반적인 수준의 사람이라 필연적으로 내용과 코드에 문제가 |
| 96 | +있을거예요. (제 번역도요...). 얼마든지 정정해주세요! |
| 97 | + |
| 98 | +그럼, 즐기길 바래요 |
0 commit comments