1024바이트 C로 만든 Python풍 인터프리터, 소스를 다시 파싱해 루프와 함수를 실행
- Austin Z. Henley가 매크로나 특수 라이브러리 없이 C 1024바이트로 Python 문법처럼 보이는 제한된 인터프리터를 작성함
- 인터프리터는 AST나 바이트코드를 만들지 않고 재귀 하강 파싱 중 식과 문을 즉시 실행하며, 프로그램 원문은 길이 999의 고정 배열에 저장함
- while·for 루프는 본문 실행 뒤 조건이 있는 소스 위치로 되돌아가 원문을 다시 파싱하고, 함수는 정의 위치를 기억했다가 호출 시 그 본문으로 이동한 뒤 호출 위치를 복원함
- 변수와 함수 이름을 소문자 한 글자로 제한해
vars[256]배열을 심볼 테이블로 바로 쓰며, 대부분의 공백은 제거하되 들여쓰기와 문자열 내부 공백은 유지함 - 오류 처리는 없고 키워드와 토큰 경계가 정확하다고 가정함. 예를 들어
f로 시작하면 정해진 형태의for K in range(N):로 처리함
Hacker News opinions
파이썬의 들여쓰기가 렉서 작성 난도를 실제로 얼마나 올렸는지 궁금함. 공백이 어휘 범위 토큰이 되는 게 구현자 입장에서도 꽤 복잡했나?
공백 문자 순서도 문제임. 스페이스 2개와 탭, 스페이스 조합은 스페이스와 탭, 스페이스 2개 조합과 다르니, 단순히 칸 수만 세면 안 되고 각 들여쓰기 단계의 실제 공백열을 추적해야 함.
그래도 들여쓰기를 싫어하는 건 파이썬을 억지로 쓰는 사람만의 불만은 아님. 초보자는 파이썬을 더 잘한다는 연구도 있고, Scala가 공백 문법을 선택 사항으로 만들었을 때는 논쟁이 컸지만 지금은 잘 받아들여졌음.
의미 있는 들여쓰기는 렉서가 이전 들여쓰기 수준의 스택을 유지해야 해서 정규 언어 문법이 아니게 됨. 다만 요즘 언어는 f-string 같은 문자열 보간만 있어도 렉서 상태나 스택이 필요한 경우가 많음.
실사용으로 작은 임베디드 언어가 필요하면 Snek가 있음. 플래시와 RAM이 수 kB뿐인 프로세서를 대상으로 한 작은 임베디드 언어임.
Snek는 소스에서 컴파일하거나 고치기가 너무 까다로움. 여러 플랫폼용 파일과 Python으로 쓴 Lola 파서 대신, POSIX 예제로 쓸 단일 C 파일이면 좋겠음.
제목이 'Python-like'였어야 한다고 봄. 실제 파이썬도 아니고, 이 인터프리터에서 돌아가는 파이썬 코드는 FizzBuzz 예제보다 크게 넓지 않아 보임.
함수 호출과 루프가 소스 텍스트 위치로 직접 점프한다는 발상은 재미있음. 단일 문자 변수 제한은 다른 미니 언어에서도 봤지만 이 방식은 처음 봄.
그 방식은 8비트 마이크로컴퓨터 인터프리터에서는 흔했음. 전체 주소 공간이 64KB면 AST를 먼저 만드는 건 낭비라 소스를 직접 해석했고, DOS COMMAND.COM도 그랬음.
이건 C4처럼 부분 언어라도 오류 검사를 하는 구현이 아니라, 입력이 전부 맞다고 가정하는 난잡한 코드임. f는 정확히 for x in range(y)라고, w는 while이라고 가정하니 Tiny Python이라 부르기엔 너무 단순함.
1024바이트는 C 소스 크기일 뿐 컴파일한 바이너리는 훨씬 커짐. 루프마다 뒤로 점프해 소스를 다시 파싱하는 방식은 DOS 배치 처리와도 비슷하고, 더 조밀한 예로 J Incunabulum도 볼 만함.