3P by GN⁺ | ★ favorite | 댓글 1개
  • Write Your Own Retro Compiler는 Z80 기반 CP/M에서 실행되고 같은 환경용 코드를 생성하는 셀프 호스팅 컴파일러를 전체 소스와 함께 다루는 339쪽 책임
  • 구현 대상인 T3X/0는 Pascal과 BCPL에 뿌리를 둔 단순한 언어이며, 책 안에 20쪽 분량의 전체 매뉴얼이 포함됨
  • C나 Pascal 같은 절차적 언어와 어셈블리 언어 지식이 필요하고, Z80 어셈블리와 CP/M 기본 지식이 있으면 따라가기 쉬움
  • 어휘 분석, 구문 분석, 코드 생성, 단순 최적화, BDOS 인터페이스와 런타임 라이브러리를 다이어그램·표·예제로 설명함
  • 모든 코드는 퍼블릭 도메인으로 제공되며, 종이책·PDF 구매 링크와 목차, 샘플 페이지, 소스 다운로드가 함께 공개됨

책의 범위와 대상

  • Write Your Own Retro Compiler는 2023년 Lulu Press에서 나온 339쪽, 91개 그림, 6" x 9" 형식의 책임
  • 중심 주제는 Z80 프로세서의 CP/M에서 실행되고 같은 환경을 대상으로 코드를 생성하는 셀프 호스팅 컴파일러임
  • 컴파일러 제작 경험이 없어도 따라갈 수 있도록 구성됨
  • 구현 언어인 T3X/0는 Pascal과 BCPL에 뿌리를 둔 단순한 언어임
  • 책에는 T3X/0에 대한 20쪽 분량의 전체 매뉴얼이 포함됨

필요한 지식

  • 최소한 하나의 절차적 프로그래밍 언어를 알아야 함
    • 예시로 CPascal이 제시됨
  • 어셈블리 언어도 하나 이상 알아야 하며, 이상적으로는 Z80 CPU용 어셈블리 지식이 필요함
  • CP/M 운영체제의 기본 지식도 요구됨
  • 독학하는 독자를 위해 Z80 어셈블리 언어에 대한 짧은 소개가 포함됨

컴파일러 구성 요소

  • 많은 다이어그램, 표, 예제로 컴파일러 내부 동작을 설명함
  • 다루는 주제는 다음과 같음
    • 어휘 분석
    • 구문 분석
    • 코드 생성
    • 단순 최적화
    • BDOS 인터페이스

      • 런타임 라이브러리

제공 링크와 코드

댓글과 토론

Hacker News 의견들
  • 최신 컴파일러 책을 냈음. “Write Your Own Compiler”의 확장판에 가깝고, 이번에는 현대 시스템의 ELF 대신 Z80용 CP/M 코드 생성을 다뤄서 여러 부분이 훨씬 단순해짐
    4MHz Z80 시스템에서 10분 안에 자기 자신을 컴파일하는 컴파일러를 만들려면 어느 정도 복잡도가 필요한지 볼 수 있음. 코드는 무료지만 책은 유료임

    • Nils가 뭘 만드는지 늘 기대됨. 이런 일을 사업으로도 수익성 있게 하고 있으면 좋겠고, 언젠가는 전부 사서 따라 해보고 싶음
      덧붙여 Forth에 대한 군더더기 없는 책과 Nils식 해석도 보고 싶음
  • 최근에 이런 구형 x86 CPU용 C 다중 패스 컴파일러와 어셈블러를 TypeScript로 만들었음
    https://github.com/Mati365/ts-c-compiler

    • 책의 컴파일러는 조금 더 오래된 Z80용이고, 곱셈이나 나눗셈 명령조차 없음. 그래도 이 컴파일러는 8086과 386용 코드도 출력할 수 있음
  • Practical Compiler Construction 2판 실물 책을 갖고 있는데 꽤 마음에 듦. 관심 있는 사람에게는 Nils의 책들을 추천함

  • 이 책은 재미있어 보임. 다만 여전히 The Dragon Book의 제대로 된 후속작을 기다리고 있음
    현대 CPU와 가능하면 GPU 최적화까지 다루고, 빠른 동시성 가비지 컬렉터가 있는 현대적인 가상 머신을 설계하고 작성하는 법도 다루는 책이면 좋겠음. 어떤 면에서는 컴파일러 작성보다 더 어려울 수도 있음

    • Bob Morgan의 Building an Optimizing Compiler는 현대 컴파일러 최적화에 완전히 집중한 책이고 1997년에 출간됐음
      제어 흐름 그래프 구축, 그 위에서 가능한 여러 최적화, 별칭 분석, 정적 단일 대입 형식, CFG 지배자 기반 최적화, 명령어 스케줄링, 레지스터 할당, 목적 코드 생성까지 다룸. 대부분의 컴파일러 책처럼 어휘 분석, 구문 분석, NFA/DFA 같은 내용은 다루지 않음
      고급 분석이 필요한 최적화 컴파일러를 만들려는 사람에게는 Static Program Analysis도 도움이 될 듯함: https://cs.au.dk/~amoeller/spa/
      가비지 컬렉션은 Garbage Collection handbook이 있음: https://gchandbook.org/
    • 학생 때 The Dragon Book을 별로 좋아하지 않았던 기억이 있음. 이유는 이제 잘 안 나지만, 아마 구조가 좋지 않고 어떤 주제는 지나치게 자세한 반면 다른 주제는 설명이 부족하다고 느꼈던 듯함
      기본 지식이 어느 정도 있다면 이 강의가 마음에 들 수 있음: https://www.cs.cmu.edu/~janh/courses/411/18/schedule.html
      특히 SSA 형식을 소개하는 방식이 좋았음
      더 고급 주제는 여기 있음: https://www.cs.cmu.edu/~15745/handouts.html
    • 나도 그런 책을 기대해 왔음. 요즘은 현대 마이크로코드/펌웨어 같은 요소 때문에 너무 복잡해졌고, 마법처럼 느껴지는 것이 많음
      무언가가 “마법”처럼 느껴질 때는 누군가가 한계라고 생각했던 것을 영리하게 우회했다는 신호처럼 받아들임. 최근에는 작은 스피커가 실제로 낼 수 있는 것보다 더 큰 저음을 내는 것처럼 보이는 가짜 베이스를 읽고 있는데, 고조파를 이용해 뇌가 실제보다 더 낮은 음을 듣는 것처럼 속이는 방식이 흥미로움
  • 흥미로워 보이지만, 독자가 먼저 새 프로그래밍 언어인 T3X를 알거나 배워야 한다는 단점이 있음
    외부와의 연결이 키보드와 화면뿐인 레트로 CP/M 시스템에서 처음부터 컴파일러를 작성하고 개발할 수 있을지도 궁금함

    • 이 부분은 책을 쓰기 전 많이 고민했음. 결국 T3X를 선택한 이유는 해당 컴파일러가 가장 작은 C 부분집합 컴파일러보다 훨씬 작고, 개인적으로는 T3X가 더 배우고 이해하기 쉽다고 봤기 때문임
      SubC는 3815줄이고 T3X/0은 2330줄임
      물론 외부 도구 없이 CP/M에서 시작할 수도 있지만, 그러면 부트스트랩용 컴파일러를 어셈블리어로 작성해야 함. 시간이 많이 들지만 충분히 가능한 일임. 다만 읽을거리로 흥미로울지는 의문임
    • 단점으로 보이지 않음. 컴파일러를 쓰려는 사람이라면 새 프로그래밍 언어가 큰 장애물은 아닐 가능성이 높고, 단순하고 깔끔한 장난감 언어가 교육용으로는 더 나을 수 있음
      C풍 문법이 아니라 ALGOL풍 문법을 쓰는 건 약간 의외지만, 이건 내 편향일 수 있음. 머릿속에서 DOEND{}로 대응시키는 정도는 큰 부담이 아님
  • 어휘 분석과 구문 분석 단계를 넘어가는 컴파일러 튜토리얼이라니, 거의 최초 아닌가 싶음
    농담이지만 실제로 많은 자료가 거기서 멈춤. 이건 사볼 생각임

  • 자기만의 CP/M 비슷한 운영체제를 작성하는 책도 있으면 재미있겠음

    • 그건 Andrew Tanenbaum의 Operating Systems Design and Implementation임
      물론 Unix풍 마이크로커널 운영체제를 만드는 법을 보여주지만, 파일 시스템 장을 제외하고 전부 건너뛰면 됨. 그리고 트리 자료구조 조언은 따르지 말고 평평한 테이블만 쓰며 정확한 파일 크기 구현도 신경 쓰지 않으면 됨. 그러면 CP/M이 됨
      개인적으로는 2판을 선호함. 3판은 데모 Minix 코드가 1980년대 PC가 아니라 1990년대 후반 PC에서 돌아가게 하느라 불필요하게 복잡해졌다고 봄
  • 부정적으로 쓰는 건 아니고, 도움이 될 수 있는 관찰임
    무료 챕터를 읽어봤는데, 주제 지식이 많지 않은 사람에게는 일부가 어려울 수 있어 보였음. 각 제목 아래에서는 “언어의 문법이란...”처럼 개념을 처음부터 설명하지만, 몇 문장 지나지 않아 어셈블리 명령어 같은 고급 주제가 설명 없이 등장함
    독자가 문법의 의미를 배워야 하는 수준이라면 바로 다음 문장들을 이해하기 어려울 수 있음. 그래서 일관성을 조금 더 높이면 책의 완성도가 좋아질 듯함

    • 책 소개에도 적었듯이 컴파일러 구성에 대한 사전 지식은 필요 없지만, 독자는 최소 하나의 절차형 언어와 하나의 어셈블리어에는 익숙해야 한다고 봤음
      그래서 어셈블리 명령어 같은 것은 독자가 알고 있다고 가정해도 괜찮다고 생각했음
      책 부록에는 Z80 어셈블리에 대한 짧은 입문도 있지만, 그것도 어셈블리어의 기본은 안다고 가정함
      모든 책은 어딘가에서 시작해야 함. 컴퓨터 프로그래밍 지식이 전혀 없다고 가정하고 컴파일러 구성 책을 쓰기는 어렵다. 그래도 지식의 저주가 없다는 뜻은 아니니, 이 점은 확실히 염두에 두겠음
  • 실제 책 내용과 별개로, 딱 맞게 레트로하고 미니멀한 웹 디자인도 마음에 듦
    향수를 크게 자극함. 책상 위에 “HTML 3.2 UNLEASHED!!!!” 같은 제목의 6인치 두께 책을 두고 직접 사이트를 만들던 좋은 기억이 떠오름

    • 좋은 시절이었음
      다만 정적 페이지 1500개쯤에 전역 변경을 적용하려 하면 재미가 끝남. 아직은 고통이 CMS를 직접 만들 만큼 크지는 않지만, 설령 만들더라도 디자인은 그대로 둘 것임
  • https://web.archive.org/web/20231210141834/http://t3x.org/t3...