이것은 진행 중인 책 "Crafting Interpreters"에 사용되는 저장소입니다. 여기에는 책의 마크다운 텍스트, 두 인터프리터의 전체 구현, 두 인터프리터를 최종 사이트에 함께 엮는 빌드 시스템이 포함되어 있습니다.
오류를 발견하거나 제안 사항이 있으면 여기에 문제를 제출해 주세요. 감사합니다!
온라인으로 책을 쓰고 완성되기 전에 출판할 때 가장 좋은 점 중 하나는 당신과 같은 사람들이 나에게 친절하게 피드백을 주고, 오타를 지적하고, 다른 오류나 불분명한 텍스트를 찾아준다는 것입니다.
그렇게 하고 싶다면 좋습니다! 여기 저장소에 버그를 신고하거나 원할 경우 끌어오기 요청을 보낼 수 있습니다. 끌어오기 요청을 보내고 싶지만 HTML을 다시 생성하도록 빌드 시스템을 설정하고 싶지 않은 경우에도 걱정하지 마세요. 뽑으면 그렇게 할게요.
참여하는 또 다른 방법은 자신의 Lox 구현을 공유하는 것입니다. 모든 독자가 Java와 C를 좋아하는 것은 아니기 때문에 다른 언어로의 포트는 특히 유용합니다. Lox 포트나 구현을 Wiki에 자유롭게 추가하세요.
나는 매우 건망증이 심하고 오류가 발생하기 쉬운 포유동물이므로 최대한 자동화했습니다.
저는 OS X 시스템에서 개발하지만 모든 POSIX 시스템도 작동할 것입니다. 약간의 추가 노력을 기울이면 Windows에서도 이 작업을 수행할 수 있지만 많은 도움을 드릴 수는 없습니다.
대부분의 작업은 make에 의해 조정됩니다. 빌드 스크립트, 테스트 실행기 및 기타 유틸리티는 모두 Dart로 작성되었습니다. Dart 설치 지침은 여기에 있습니다. Dart가 설치되어 있고 경로에 있으면 다음을 실행하세요.
$ make get
그러면 빌드 및 테스트 스크립트에서 사용되는 모든 패키지가 다운로드됩니다.
두 개의 인터프리터를 컴파일하려면 javac
뿐만 아니라 경로에 C 컴파일러도 필요합니다.
설정이 완료되면 다음을 시도해 보세요.
$ make
모든 것이 제대로 작동하면 책에 대한 사이트가 생성될 뿐만 아니라 두 명의 인터프리터인 clox 및 jlox가 컴파일됩니다. 저장소 루트에서 바로 인터프리터를 실행할 수 있습니다.
$ ./clox
$ ./jlox
마크다운과 소스 코드 조각은 손으로 작성한 정적 사이트 생성기를 사용하여 최종 HTML로 함께 짜여져 있습니다. 이 생성기는 내 첫 번째 책의 작은 Python 스크립트로 시작하여 어떻게든 실제 프로그램에 가까운 것으로 성장했습니다.
생성된 HTML은 site/
아래의 저장소에 커밋됩니다. book/
에 있는 산문용 Markdown과 java/
및 c/
의 Java 및 C 구현에서 짜여진 코드 조각의 조합으로 구축되었습니다. (소스 코드에 있는 재미있어 보이는 주석은 모두 어떤 조각이 어디로 가는지 아는 방법입니다.)
모든 마법을 수행하는 스크립트는 tool/bin/build.dart
입니다. 직접 실행하거나 다음을 실행할 수 있습니다.
$ make book
그러면 전체 사이트가 한 번에 생성됩니다. 점진적으로 작업하는 경우 개발 서버를 실행하는 것이 좋습니다.
$ make serve
이것은 site/
디렉토리에 루트가 있는 로컬 호스트에서 작은 HTTP 서버를 실행합니다. 페이지를 요청할 때마다 Markdown 파일, 인터프리터 소스 파일, 템플릿 및 자산을 포함하여 소스가 변경된 모든 파일을 다시 생성합니다. 계속 실행하고, 로컬에서 파일을 편집하고, 브라우저를 새로 고쳐 변경 사항을 확인하세요.
다음과 같이 각 통역사를 구축할 수 있습니다.
$ make clox
$ make jlox
이렇게 하면 책의 해당 부분 끝에 나타나는 각 통역사의 최종 버전이 구축됩니다.
각 장의 끝에서 통역사가 어떻게 생겼는지 확인할 수도 있습니다. (나는 책 중간에도 작동하는지 확인하기 위해 이것을 사용합니다.) 이것은 코드 조각에 대해 동일한 주석 표시를 사용하여 어떤 코드 덩어리가 있는지 결정하는 tool/bin/split_chapters.dart
스크립트에 의해 구동됩니다. 각 장에 나와 있습니다. 각 장의 끝 부분에서 본 스니펫만 사용하고 각 장의 코드에 대해 하나의 디렉터리인 gen/
에 소스의 새 복사본을 생성합니다. (또한 방해가 되는 마커 주석이 모두 제거되었기 때문에 소스 코드를 보는 더 쉬운 방법이기도 합니다.)
그런 다음 각 항목을 별도로 만들 수 있습니다. 달리다:
$ make c_chapters
그리고 build/
디렉터리에는 chap14_chunks
등과 같은 각 장에 대한 실행 파일이 제공됩니다. 마찬가지로:
$ make java_chapters
이는 Java 코드를 각 장의 하위 디렉터리에 있는 build/gen/
의 클래스 파일로 컴파일합니다.
나는 책에 나오는 통역사가 해야 할 일을 수행하는지 확인하기 위해 사용하는 전체 Lox 테스트 모음을 가지고 있습니다. 테스트 케이스는 test/
에 있습니다. Dart 프로그램 tool/bin/test.dart
는 Lox 인터프리터에서 각 테스트 파일을 실행하고 결과를 구문 분석하며 테스트가 예상한 대로 수행되는지 확인하는 테스트 실행기입니다.
테스트를 실행할 수 있는 다양한 통역사가 있습니다.
$ make test # The final versions of clox and jlox.
$ make test_clox # The final version of clox.
$ make test_jlox # The final version of jlox.
$ make test_c # Every chapter's version of clox.
$ make test_java # Every chapter's version of jlox.
$ make test_all # All of the above.
테스트 스위트와 테스트 실행기를 사용하여 자신의 Lox 구현을 테스트할 수 있습니다. 테스트 실행기는 tool/bin/test.dart
에 있으며 --interpreter
사용하여 실행할 수 있는 사용자 정의 인터프리터 실행 파일을 제공받을 수 있습니다. 예를 들어, my_code/boblox
에 실행 가능한 인터프리터가 있는 경우 다음과 같이 테스트할 수 있습니다.
$ dart tool/bin/test.dart clox --interpreter my_code/boblox
실행할 테스트 모음에 따라 테스트 기대치가 결정되므로 이를 알려주어야 합니다. 인터프리터가 jlox처럼 작동해야 한다면 "jlox"를 제품군 이름으로 사용하세요. clox처럼 동작하는 경우 "clox"를 사용하세요. 통역사가 책의 한 장 끝까지만 완성된 경우 "chap10_functions"와 같이 해당 장을 모음으로 사용할 수 있습니다. 모든 장의 이름을 보려면 Makefile을 참조하세요.
통역사가 사용하기 위해 다른 명령줄 인수를 전달해야 하는 경우 --arguments
사용하여 이를 테스트 실행기에 전달하면 통역사가 이를 전달합니다.
asset/
– 사이트를 생성하는 데 사용되는 Sass 파일 및 jinja2 템플릿입니다.book/
- 각 장의 텍스트에 대한 마크다운 파일입니다.build/
- 중간 파일 및 기타 빌드 출력(사이트 자체 제외)이 여기에 있습니다. Git에 커밋되지 않았습니다.c/
– C로 작성된 인터프리터인 clox의 소스 코드. 원하는 경우 XCode 프로젝트도 포함되어 있습니다.gen/
– GeneAst.java에 의해 생성된 Java 소스 파일이 여기에 있습니다. 커밋되지 않았습니다.java/
– Java로 작성된 인터프리터인 jlox의 소스 코드입니다.note/
– 다양한 연구, 메모, TODO 및 기타 기타 사항.note/answers
– 과제에 대한 샘플 답변입니다. 부정 행위는 없습니다!site/
– 최종 생성된 사이트입니다. 이 디렉토리의 내용은 craftinginterpreters.com을 직접 반영합니다. 여기에 있는 대부분의 콘텐츠는 build.py에 의해 생성되지만 글꼴, 이미지 및 JS는 여기에만 존재합니다. 생성된 콘텐츠를 포함하여 모든 것이 커밋됩니다.test/
– Lox 구현을 위한 테스트 사례입니다.tool/
– 빌드, 테스트 및 기타 스크립트가 포함된 Dart 패키지입니다.