컴파일러를 만들어 볼까..

나빌레라의 이미지

운영체제를 만든지 일년이 넘었다.
일년동안 그걸 가지고 책도 썼고 조만간 출판될 예정이다.

어디선가 본 이야기이다.
시스템 프로그래밍에는 세 마리 용(드레곤)이 있다고 한다.

운영체제
컴파일러
데이터베이스

이 세 마리 용을 다 잡으면 드레곤 슬레이어가 된다고 한다.

운영체제는 하나 잡았으니, 이제 컴파일러 차례다.

사실 컴파일러를 만들어볼 계획은 지난 겨울 운영체제를 완성하는 순간부터 하고 있었다.
다만 어떻게 해야 할지 감을 잡지 못하고 있었을 뿐.

지금 잡아놓은 계획은 A, B, C 세 안이 있다.

A 안 : 바닥부터 만든다.
x86기반이나 ARM기반 컴파일러를 만드는건 빡시다..(아키텍처 공부가 더 오래 걸린다. 나는 컴파일러가 만들고 싶을 뿐이다.)
그래서 가상머신을 하나 만들어 버린다. (간단한건 쉽게 만들 수 있다. 뭐 인터프리터 비스므리하게 하면 될듯 하다.. 아님 말구..so cool)
1. 언어는 내가 정의하든지 있는걸 쓰든지 한다. 나는 개인적으로 파이썬 문법이 마음에 든다.
2. 가상머신 명령어 정의. 학교에서 시스템프로그래밍 과목에 썼던 sic/xe 머신을 수정한다. 아니면 걍 내가 다 만든다.
3. 가상머신 에뮬레이터 제작. 오브젝트 코드가 들어오면 word단위로 해석
4. 가상머신 어셈블러 제작. 가상머신 어셈블리어를 컴파일해서 가상머신 오브젝트 코드를 생성한다.
5. 가상머신 링커 제작. 각각의 오브젝트 파일들의 심볼테이블을 맞춰준다. 링킹한다.
6. 가상머신 로더 제작. 아마도 재배치 외에는 할 일이 별로 없을 것 같다.
7. lex와 yacc으로 파서를 만든다.
8. 파서로 부터 넘어오는 토큰정보를 바탕으로 어셈블리 코드를 만든다.
9. 합쳐서 돌린다.

B 안 : llvm 이용. 가장 유력하다. 왜냐.. 문서가 많고 API가 잘 되어 있다.
1. A안의 2~6번까지는 llvm API가 해준다. 고맙다.
2. 언어를 설계한다. 아니면 있느걸 쓰든지...
3. A안의 7~9 번까지와 동일

C 안 : jvm 이용. 시도조차 안해봤다. 근데 jvm 호환 컴파일러와 가상머신을 만든사람이 있는걸로 봐서 불가능하진 않은것 같다.
전체적으로 B안과 동일.

그렇다...
계획만 짜놓고 아무것도 안하고 있다.
사실 llvm 문서는 힐끗 힐끗 보고 있긴하지만, 아직 코드는 안 두드려봤다.
백문이 불여 일타라 했다. 백번 문서 읽는것 보다 한번 두드려 보는게 낫다.
귀차니즘이 극복되면 한번 두드려 봐야지.

궁극적으로는 내가 만든 컴파일러의 바이너리가 내가 만든 운영체제에서 동작하게 만드는 것이 목표인데
이건 십년을 바라보고 계획중이다.
안됨 말고.... so coooooool...

댓글

jachin의 이미지

전 마법사가 되는게 더 빠를 것 같아요.

파티 초대 콜?
====
( - -)a 이제는 학생으로 가장한 백수가 아닌 진짜 백수가 되어야겠다.

나빌레라의 이미지

야친옹은 이미 더이상 설명이 불필요한 초고수...
=3=33
======
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

snowall의 이미지

책 나오면 블로그에 알려주세요. 한권 사보고 싶습니다. 실습을 언제 할진 모르겠지만...-_-;

--------------------------
snowall의 블로그입니다.
http://snowall.tistory.com

피할 수 있을때 즐겨라! http://melotopia.net/b

gurugio의 이미지


어셈러브에서 사이트의 메인 프로젝트를 계획하고 있는데요 x86 기반으로

디스어셈블러->디버거->(아직 뭘 해야할지 모름)...->컴파일러

이렇게 기획하고 있습니다.

언어는 LISP 계열로 생각하고 있구요
현재 컴파일러 전공하신 분과 기획을 시작했는데 올 한해는 기본 연습을 하고
내년부터 조금씩 만들어 나가려구요.
3마리의 공룡은 어렵지만 도마뱀으로 2마리 정도는 어떻게 좀 해보려구요.
혹시 생각있으시면 어셈러브에 가끔 들러주세요. 오프라인 모임에는 언제든지 환영입니다.

그리고 책 출판 축하드리고요 예약도서 쓰면 예약하려고 총알도 준비했습니다.

----
섬기며 사랑하면 더 행복해집니다.
개인 홈페이지가 생겼습니다 http://caoskernel.org
어셈러브를 개편중입니다 http://www.asmlove.co.kr

오호라의 이미지

드래곤 슬레이어하니까. 리나 인버스가 생각나네요.

^^;

LALR parser 검 득템하세요!!

Hello World.

snowall의 이미지

그녀는 드래곤 슬레이어를 넘어선 "드래너머"입니다. -_-;

--------------------------
snowall의 블로그입니다.
http://snowall.tistory.com

피할 수 있을때 즐겨라! http://melotopia.net/b

aero의 이미지

Parrot( http://www.parrot.org/ )은 Perl6 의 기반이 되는 VM으로
각종언어 컴파일러 제작을 위한 편리한 환경을 제공합니다.
이미 많은 언어들이 Parrot위에서 구현( https://svn.parrot.org/parrot/trunk/languages/ )되고 있고요..
자세한 정보는
http://www.pmichaud.com/2008/pres/oscon-pct/slides/start.html

유명 Perl 해커 Simon Cozen이 Parrot위에 LOLOCODE를 구현해보고
감상을 적은 글 ( http://blog.simon-cozens.org/post/view/1323 )도
같이 보시면 도움이 되실 듯.

나빌레라의 이미지

오....
정말 감사합니다...^^

혹시나 aero님의 답글 같은게 달리지 않을까 하는 기대로 글을 올렸었거든요...^^

다시한번 정말 감사드립니다....
--------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

sangheon의 이미지

역시 aero 님이시군요. 추천~

--

B/o/o/k/w/o/r/m/

--

Minimalist Programmer

vacancy의 이미지

추천하고 갑니다. >_<

atie의 이미지

pure 컴파일러 만들어줘요.
----
I paint objects as I think them, not as I see them.
atie's minipage

----
I paint objects as I think them, not as I see them.
atie's minipage

jsj3579의 이미지

......

나빌레라의 이미지

흠...
왜 lex와 yacc을 안써야 유효한거죠?
------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

죠커의 이미지

가끔은 손으로 파서를 만드는 것이 도움이 된다고 생각합니다. :)

- 죠커's blog / HanIRC:#CN

jsj3579의 이미지

lex와 yacc안에 감춰진 이론들 때문이죠
저같은 경우는 학부때 LR파서 만들면서 참 많이 배웠거든요

오호라의 이미지

.....

Hello World.

prio의 이미지

파이선이라면 ply로.. (응?)

7339989b62a014c4ce6e31b3540bc7b5f06455024f22753f6235c935e8e5의 이미지

LangDev에도 놀러오세요~

http://langdev.net/

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.