Skip to content

Commit 849bf54

Browse files
authored
Merge pull request #36 from sudo0272/tutorial-ko
Create 0-머리말
2 parents ab3d5e4 + 1543ff8 commit 849bf54

File tree

1 file changed

+98
-0
lines changed

1 file changed

+98
-0
lines changed

tutorial/ko/0-머리말.md

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
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

Comments
 (0)