JSCC: JavaScript로 개발하는 C Compiler
HandyPost는 한 도영(HDNua)이 작성하는 포스트 문서입니다.
문서:
00. JSCC Javascript로 개발하는 C Compiler.pdf
1. 저자 서문
2013년 4월 22일에 공군 병으로 입대하여 2015년 4월 21일부로 전역을 하게 되었습니다. 마음이야 한 달은 전에 전역해서 부대 전역 전날까지만 해도 크게 느낌이 없었으나, 정문을 나와 바깥 공기를 쐬고 하룻밤 자고 일어나서 다음 복귀 일자를 생각하지 않아도 된다는 사실에 안도하고 나서야 정말로 제가 전역했음을 실감합니다.
저는 입대 이전에 The C Programming Language을 읽으면서, ‘C의 선언 방식’을 설명하는 예제를 보고 저도 컴파일러를 만들 수 있겠다는 생각을 막연히 하고 있었습니다. 후에 자료구조 서적을 볼 때 ‘복합 연산이 가능한 계산기’ 예제를 공부했는데, 이 예제를 보고 나서 그러한 마음이 더욱 커져서 이 두 가지 사실을 기초로 컴파일러 제작에 도전해봤습니다. 물론 저는 뛰어난 두뇌를 가진 수재가 아니라 열심히 공부하는 일반적인 학생이었고, 정수형 변수의 선언과 값의 대입, 사칙 연산과 나머지 연산까지는 열심히 연구하여 성공했지만, 함수의 정의와 호출에서 도무지 갈피를 못 잡고 방황하다 결국엔 부족한 내공을 탓하며 프로젝트를 중단했습니다. 그리고는 어린 친구들도 간단히 만들 법한 스도쿠 게임(Sudoku!), 미궁 게임(모래 미궁), 파일 이름 정리 프로그램(HandyComicNamer) 등을 만들면서 어영부영 시간을 보내다가 군대로 갔습니다.
“군대에서 프로그래밍을 공부할 수 있을까?”라는 건 제게 아주 중요한 문제였기 때문에, 자대에 배치되어 전입 신병을 위한 교육 생활을 하던 때에 저와 동기들을 인솔하던 간부에게 이를 물어봤습니다만, 대답은 부정적이었고 저는 남는 시간을 컴퓨터 없이 진행해야 한다는 사실에 크게 실망했습니다. 막 들어온 신병이라 책을 펴놓고 공부할라치면 높은 기수 선임의 눈치가 보이고, 아무래도 막내다보니 온갖 궂은 잡일을 도맡아하게 되어 도무지 공부를 할 환경으로는 생각할 수 없었습니다. 그뿐만이 아닙니다. 인트라넷은 개발 도구를 찾기 아주 힘든 환경이고, 개발 도구가 있다 하더라도 사용하려면 부서장 등의 간부가 인가를 해야 합니다. 그렇게 인가된 도구로 개발을 한다손 쳐도 혹 잘못된 코드를 작성하면 인트라넷에 깔린 백신 프로그램이 작성한 프로그램을 바이러스로 인식하고, 이 프로그램을 만든 사람은 보안과에 호출되어 진술서를 작성해야 하는 등 프로그래밍을 하기 아주 껄끄러운 환경이었습니다.
하지만 어디든 찾으면 방법은 있더군요. 부대 사람들에게 제 능력을 보이고 싶은 마음에 중학생 때 배웠던 HTML을 이용하여 미궁 게임을 만들어보려고 부대 내에서 사용되는 인트라넷 페이지의 소스 보기를 클릭했더니, 제가 알고 있는 프로그래밍 언어와 아주 비슷한 글들이 보이는 겁니다(그것이 JavaScript라는 걸 안 건 더 나중의 일이었습니다). 마치 운명처럼 ‘군대 내에서의 프로그래밍 공부 가능성’을 발견했고, 저는 이를 놓칠 수 없었습니다. 근무 시간에는 틈틈이 어떤 것이 가능할지 생각해보고, 비번 시간에는 휴게실의 컴퓨터를 이용해 눈에 띄지 않게 JavaScript를 공부했습니다. 위에도 밝혔듯 개발 도구가 없기 때문에 세 달에서 네 달은 메모장만으로 코드를 작성했습니다. 267번 줄에 오류가 있다고 하면 메모장으로 파일을 연 다음 1번 줄부터 차례로 267번 줄을 찾았습니다. 그러다 불편함을 도저히 참을 수가 없어서 textarea 요소를 이용해 줄 번호와 코드를, iframe을 이용해 오른쪽에 결과 화면을 보여주는 프로그램을 개발하여 사용했습니다(Handy HTML Maker, 5버전까지 나왔고 최종 버전은 그럭저럭 쓸 만했습니다).
군대에서 프로그래밍이 가능함을 깨닫자 아주 재미있는 생각이 들었습니다. JavaScript는 배우기 쉬운 기술이지만, 군대 안에서 프로그래밍을 배우고자 하는 사람은 아주 많고 그 중 대다수가 C를 배우고 싶어 했으나 환경이 여의치 않아 공부를 할 수 없었습니다. 그래서 저는 JavaScript를 이용하여 C 컴파일러를 개발하면 모든 사람들이 군대에서 프로그래밍을 공부할 수 있게 될 것이라는 사명감에 불타올랐고, 입대 전에 포기했던 이 프로젝트를 그 당시 생소했던 JavaScript라는 언어로 새롭게 작성하게 되었습니다.
이 문서는 제 개인 국내 블로그에 한국어로, 다른 제 외국 블로그에 영어로 올릴 계획입니다. 한국어로 작성하는 이유는 제가 한국어를 사랑하고, 또한 제가 쓸 수 있는 말 중에 가장 능숙한 언어여서 제 생각을 왜곡 없이 전달할 수 있기 때문입니다. 영어로도 작성하는 이유는 스스로 더 많은 사람들과 소통하기 위한 의사소통 능력을 키우기 위함입니다.
많은 부분이 정확한 교재나 문서가 아닌 추론으로 되어있기에 현대적 관점에서의 컴파일러보다 당연히 성능이 떨어지고 오류가 많을 것입니다. 그럼에도 불구하고 제가 이 글을 쓰는 이유는, 제가 1년이라는 나름 긴 시간을 연구해온 결과가 있기에 이를 자랑하고 자긍심을 얻고 싶었기 때문입니다. 칭찬은 고래도 춤추게 하는 만큼 저도 제 결과물에 비판보다 칭찬을 받고 싶은 마음이 크지만, 따끔한 비판도 저를 성장하게 하는 원동력이라 생각하고 겸허히 받아들일 수 있도록 마음가짐 하고 있습니다. 피드백은 언제나 환영합니다.
2015년 4월 23일
한 도영
HDNua(rbfwmqwntm@naver.com)
2. 개요
JSCC 프로젝트는 제목에서도 밝혔듯, JavaScript 프로그래밍 언어를 이용하여 C 프로그래밍 언어의 컴파일러를 개발하는 프로젝트다. 컴파일러를 개발한다고 적어놨으니 학부 1, 2학년은 기겁을 하고 달아날 일일지도 모르지만, 이 프로젝트를 진행한 사람 또한 그렇게 뛰어나지도 않은 일반적인 학부생이니 너무 부담 가지지 않았으면 한다. 실제로 이 글의 대상은 순수하게 프로그래밍 지식만을 이용하여 C 프로그래밍 언어의 컴파일러를 개발하고 싶어 하는 학생들이고, 난 그에 맞춰 내가 생각하는 가장 친절한 방법으로 내 프로젝트를 설명할 것이다. 모를 수도 있는 개념은 다시 설명할 것이고, 범위를 벗어나는 내용을 다루기 전에 최대한 사전에 이를 설명하기 위한 준비를 해놓을 것이다. 사실 아직 모든 부분을 완전히 작성하지 않은 프로젝트이지만, 컴파일러를 프로그래밍 지식만으로 개발하기 위해 무엇을 알고 있어야 하는가에 대한 단서는 될 수 있으리라 믿는다. 이렇게 장편의 글을 써보는 것이 그렇게 자주 있는 일이 아니라 설명을 어떻게 할까 하는 순서 등을 정하지 못했지만, 일단 내가 어떤 내용의 글을 쓸 것이라는 것만 간략히 이 곳에 적어두고 나머지는 진행하면서 완성해나가는 것도 괜찮을 것 같아서 그렇게 하기로 했다(팔 것도 아닌데 뭐).
이 문서는 C와 C++ 두 가지 언어에 능숙한 컴퓨터 과학을 전공하는 학생에게 적합하다. 이는 이 프로젝트가 JavaScript로 개발하는 컴파일러임에도 불구하고, 이 글을 읽기 전에 독자가 먼저 JavaScript를 배우지 않아도 된다는 뜻이다. 왜냐하면 문서 중간에 이 프로젝트와는 별개로 HTML, CSS, JavaScript를 연습하는 프로젝트를 추가하여 이 예제를 직접 만들어보는 식으로 JavaScript를 설명할 것이기 때문이다. 이에 독자가 의아함을 마음 한구석에 품을 수 있으나, 두 프로젝트를 서로 분리하기 어렵다고 판단하여 이렇게 정한 것이니 양해를 바란다.
3. 목차
반드시 이 순서로 진행한다고 장담할 수 없으나, 개략적인 순서는 다음과 같다.
1. 스택과 계산기
1.1) 프로젝트 준비
1.2) 스택 자료구조
1.3) 복합 연산이 가능한 계산기
1.4) 문자열 버퍼
1.5) 변수를 처리할 수 있도록 개선된 복합 연산이 가능한 계산기
2. C언어의 변수 선언과 정의
2.1) 스택 메모리
2.2) C의 복잡한 선언
2.3) 변수 선언과 정의
2.4) 계산기와의 결합
2.5) 한계
3. 컴파일러 & 인터프리터
3.1) 기계어와 어셈블리
3.2) 무엇을 개발하고 있는가?
3.3) 인터프리터를 개발한다면?
3.4) JSCC의 개발 방향
4. 어셈블리 튜토리얼
4.1) 프로젝트 준비
4.2) MASM 개요
4.3) MASM 문법
5. 번외: Handy HTML Maker
5.1) 개요
5.2) HTML, CSS, JavaScript
5.3) HTML, CSS 튜토리얼
5.4) JavaScript 튜토리얼
5.5) Handy 라이브러리 작성
5.6) Handy HTML Maker 개발
6. JSCC 설계 및 구현
6.1) 개요
6.2) Runner
6.3) Linker
6.4) Compiler
7. 심화 주제
7.1) 전처리기
7.2) 추가로 다루어볼 만한 것
7.3) 맺음말
8. 참고
'알려주기' 카테고리의 다른 글
[JSCC] 5. NASM 어셈블리 언어 (0) | 2015.05.29 |
---|---|
[JSCC] 4. CIL 어셈블리 언어 (0) | 2015.05.25 |
[JSCC] 3. 컴파일러와 인터프리터 (0) | 2015.05.25 |
[JSCC] 2. C의 선언 (0) | 2015.05.25 |
[JSCC] 1. 스택과 계산기 (0) | 2015.05.25 |