JSCC: JavaScript로 개발하는 C Compiler

HandyPost는 한 도영(HDNua)이 작성하는 포스트 문서입니다.


문서: 

00. JSCC Javascript로 개발하는 C Compiler.pdf


 

1. 저자 서문

2013422일에 공군 병으로 입대하여 2015421일부로 전역을 하게 되었습니다. 마음이야 한 달은 전에 전역해서 부대 전역 전날까지만 해도 크게 느낌이 없었으나, 정문을 나와 바깥 공기를 쐬고 하룻밤 자고 일어나서 다음 복귀 일자를 생각하지 않아도 된다는 사실에 안도하고 나서야 정말로 제가 전역했음을 실감합니다.

저는 입대 이전에 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년이라는 나름 긴 시간을 연구해온 결과가 있기에 이를 자랑하고 자긍심을 얻고 싶었기 때문입니다. 칭찬은 고래도 춤추게 하는 만큼 저도 제 결과물에 비판보다 칭찬을 받고 싶은 마음이 크지만, 따끔한 비판도 저를 성장하게 하는 원동력이라 생각하고 겸허히 받아들일 수 있도록 마음가짐 하고 있습니다. 피드백은 언제나 환영합니다.

 

 

 

2015423

한 도영

HDNua(rbfwmqwntm@naver.com)

2. 개요

JSCC 프로젝트는 제목에서도 밝혔듯, JavaScript 프로그래밍 언어를 이용하여 C 프로그래밍 언어의 컴파일러를 개발하는 프로젝트다. 컴파일러를 개발한다고 적어놨으니 학부 1, 2학년은 기겁을 하고 달아날 일일지도 모르지만, 이 프로젝트를 진행한 사람 또한 그렇게 뛰어나지도 않은 일반적인 학부생이니 너무 부담 가지지 않았으면 한다. 실제로 이 글의 대상은 순수하게 프로그래밍 지식만을 이용하여 C 프로그래밍 언어의 컴파일러를 개발하고 싶어 하는 학생들이고, 난 그에 맞춰 내가 생각하는 가장 친절한 방법으로 내 프로젝트를 설명할 것이다. 모를 수도 있는 개념은 다시 설명할 것이고, 범위를 벗어나는 내용을 다루기 전에 최대한 사전에 이를 설명하기 위한 준비를 해놓을 것이다. 사실 아직 모든 부분을 완전히 작성하지 않은 프로젝트이지만, 컴파일러를 프로그래밍 지식만으로 개발하기 위해 무엇을 알고 있어야 하는가에 대한 단서는 될 수 있으리라 믿는다. 이렇게 장편의 글을 써보는 것이 그렇게 자주 있는 일이 아니라 설명을 어떻게 할까 하는 순서 등을 정하지 못했지만, 일단 내가 어떤 내용의 글을 쓸 것이라는 것만 간략히 이 곳에 적어두고 나머지는 진행하면서 완성해나가는 것도 괜찮을 것 같아서 그렇게 하기로 했다(팔 것도 아닌데 뭐).

이 문서는 CC++ 두 가지 언어에 능숙한 컴퓨터 과학을 전공하는 학생에게 적합하다. 이는 이 프로젝트가 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. 참고

Posted by 누아니

댓글을 달아 주세요

  1. 우와.. 2015.06.22 11:13  댓글주소  수정/삭제  댓글쓰기

    와.. 세상에.. 저는 해군이였는데 군대에서 C하려다 포기했었는데..
    HTML은 대학교 졸업반 다되어가서 손댔었구..

    대단하십니다...

  2. BlogIcon semtax 2015.09.26 02:21  댓글주소  수정/삭제  댓글쓰기

    ㅋㅋ 저 군대있을때 생각나네요
    사실 군대에서 사용할수 있는 언어가 은근히 됩니다.
    Python도 쓸 수있고요(GIMP 에 내장) VB도 할 수있습니다. 그리고 Powershell 도 가능하지요 ㅋㅋ
    인트라넷 잘 뒤져보면 eclipse 까지 찾을 수 있더군요 ㅎㄷㄷ

    • BlogIcon 누아니 2015.09.27 11:34 신고  댓글주소  수정/삭제

      Java랑 sublime text까지는 사용하는 걸 봤는데, 생각보다 많네요.
      전 부서장 승인이라는 게 필요하대서 번거로울 것 같아 그냥 말았지만요.

  3. BlogIcon 누파모래 2015.10.29 10:17 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요! js로 그래픽프로그램을 주로 만들던 이상백이라고 합니다 ㅎㅎ 기억하실지 모르겠지만..
    저도 이번에 인터프리터를 하나 만드려고 하는데 많은 도움이 될 것 같네요.

    • BlogIcon 누아니 2015.10.29 15:11 신고  댓글주소  수정/삭제

      그 마우스 따라서 가운데로 공이 모이는 프로그램 만드셨던 것 같은데 맞나 모르겠네요. 전우님 글은 자주 봤었습니다.
      들러주셔서 감사드려요. ㅎㅎ

  4. BlogIcon 윤삼월 2016.02.03 15:45  댓글주소  수정/삭제  댓글쓰기

    저는 포인터부터 배우려는 복수전공생인데 우연히 보다가요. 군 선임이 매크로뭔가로 엑셀프로그램 하나 만들던게 기억나서요

  5. ytg0602 2018.12.27 00:16  댓글주소  수정/삭제  댓글쓰기

    잘 읽고 있습니다. 감사합니다. ^^

  6. 오릳릳 2019.07.23 18:49  댓글주소  수정/삭제  댓글쓰기

    컴파일러 만드는 것에 관심이 생겼는데 꼭 정독 해보겠습니다.
    좋은 글 올려주셔서서 감사합니다.

    • BlogIcon 누아니 2019.07.24 22:58 신고  댓글주소  수정/삭제

      가끔 들러서 덧글 달아주시는 분들을 보면 힘이 많이 납니다.
      이 문서는 컴파일러를 yacc나 bison, flex와 같은 전문적인 컴파일러 제작 도구 없이, 순수하게 학부생의 프로그래밍 지식만으로 컴파일러를 개발해보는 프로젝트입니다.
      실제로 응용 가능한 컴파일러를 만드는 경우에는 드래곤북이 낫고, 컴파일러의 원리를 들여다보려면 이 문서가 많이 도움이 될 겁니다.

      들러주셔서 감사합니다.

  7. 임성익 2019.12.18 14:58  댓글주소  수정/삭제  댓글쓰기

    저두 공부하려고 최근에 Kernighan & Ritchie 의 The C Programming Language 원본,번역본 다 샀습니다.
    첨엔 번역본만 샀는데, 이게 뭔가 종종 해석이 이상하고 앞뒤가 안맞고, 그래서 한글은 한글인데 뭔 의미인지... 그래서, 원본을 샀죠 ㅎㅎ ( 그래도 이해가 안되는건 제가 지능이 딸린다는뜻... ㅋㅋ )

    근데, 이 책, 제가 태어나기도전에 쓰여졌더군요... 1판은 78년, 2판은 88년 -_-..
    뭔가 좀 교육용 책이라는 느낌보다는?? 교육자에 의해서 쓰여진 책이라기보다는??
    C언어 창시자, 컴퓨터 과학자가 쓴 책이라 뭔가 좀 어려운... 연습문제들도 만만치 않더군요...
    포인터 마지막장 ,"복잡한 선언문" 에서 dcl , direct-dcl 이거 몇번 읽어봐도 당췌 뭐하자는건지 모르겠어요.. ㅋㅋ 뒤에 Appendix 8.5 가보니깐 뭐라고 써잇긴 한데..
    이게 당췌 프로그래밍하고 뭔 상관이야!!! 하고 책상 엎어버리고, 구글에 direct-dcl 로 검색하니 도영님 블로그가 제일 앞에... ㅋ
    저도 잘 할수 있겠죠?? ㅋ

    • BlogIcon 누아니 2019.12.19 00:44 신고  댓글주소  수정/삭제

      TCPL은 원서의 경우 가격이 굉장히 비싼 것으로 알고 있는데, 열정이 대단하십니다. 말씀하신 대로, TCPL은 입문자용 책이라기보단 이미 프로그래밍을 알고 있는 사람에게 가이드를 하는 책에 가까워요. 예전 KLDP에서 놀 때 코멘트 한 적이 있어, 그 글을 찾느라 답변이 늦었습니다.

      이미 어셈블리 등의 저급 언어나 다른 고급 언어를 배운 사람들에게 "C는 이렇게 생긴 언어다 나머지 다 알고 있지?"하는 식이에요.
      (퀵 정렬이 예제로 나오는 시점에서 입문용 서적으로는 너무 장벽이 높습니다. 아주 뛰어나시다면 모르지만..)
      https://kldp.org/node/151695

      아직도 저는 "복잡한 선언문" 파트를 가장 좋아합니다. declarator와 direct-declarator를 읽어나가면서 코드를 분석하는 게 참 재미있어요. 컴파일러를 후에 직접 개발하게 되면 뒤에 나온 C 언어의 정의는 반드시 필요합니다. 이미 좋은 C 컴파일러가 여럿 나온 상황에서는 보통 취미로 펴보는 정도긴 하지만요.

      저도 글 쓸 당시에 평범한 대학생이었고, 지금도 그냥 평범한 사람입니다. 복잡한 선언문은 노력하면 충분히 이해할 수 있는 정도의 글이니, JSCC 1장과 2장 문서 정도 읽으시면 충분히 이해하시리라 봅니다.

      건투를 빌어요. 덧글 남겨주셔서 고맙습니다.

  8. 대단합니다 2020.04.08 20:06  댓글주소  수정/삭제  댓글쓰기

    당신을 보고. 저도 용기를 얻습니다.
    지금까지 프로젝트 하나도 제대로 끝낸적이 없는데.
    하나라도 끈질기게 붙잡고 끝내야겠네요.
    저는 CPU를 만들고 그 CPU에 컴파일러까지가 만들어보는게 목표입니다.