34 — 셀프호스트: NME가 NME를 실행
29은 BML이라는 아주 작은 언어를 컴파일했습니다. 이 가이드는
이미 NME 단어인 say, set, while, end로 된 부분집합을 컴파일합니다 —
NME가 NME를 실행하는 씨앗입니다.
단계
미니 언어 프로그램입니다 — 줄마다 명령 하나, NME 단어로:
set count 0 while count 3 say 안녕 add count 1 end say 끝while count 3은 "count < 3인 동안 반복"이고,end가 블록을 닫습니다.컴파일러 전체입니다.
selfhost.ko.nme로 저장합니다:
실행해 보기 →# selfhost.ko.nme — 아주 작은 NME형 언어를 컴파일하는 NME # 미니 언어는 NME 단어를 씁니다: say <글자>, set <이름> <정수>, # add <이름> <정수>, while <이름> <정수>, end # 실행: nme 실행 selfhost.ko program = [ "set count 0", "while count 3", " say 안녕", " add count 1", "end", "say 끝", ] lines = [] indent = 0 for raw in program: parts = raw.split() verb = parts[0] if verb == "say": lines.append(" " * indent + f'print("{parts[1]}")') elif verb == "set": lines.append(" " * indent + f"{parts[1]} = {parts[2]}") elif verb == "add": lines.append(" " * indent + f"{parts[1]} += {parts[2]}") elif verb == "while": lines.append(" " * indent + f"while {parts[1]} < {parts[2]}:") indent = indent + 4 elif verb == "end": indent = indent - 4 else: lines.append(" " * indent + "# 알 수 없는 명령: " + raw) source = "\n".join(lines) 말해 "만들어진 Python:" 말해 source 말해 "" 말해 "실행 결과:" exec(source)split()이 각 줄을 단어로 나누고,indent가 블록 깊이를 관리하며,exec(source)가 만들어진 Python을 실행합니다 — 29의 방법입니다.서버도 입력도 없이 실행합니다:
nme 실행 selfhost.ko만들어진 Python: count = 0 while count < 3: print("안녕") count += 1 print("끝") 실행 결과: 안녕 안녕 안녕 끝NME로 쓴 컴파일러가 NME 단어를 읽어 CPython에서 실행했습니다 — NME가 NME를 컴파일하는 씨앗입니다.
영어는 같은 컴파일러를
show로 씁니다; 전체 프로그램은 영어 가이드에 있습니다.
직접 해보기
say hi 3처럼 세 번 출력하는 형식을 더해 보세요. 힌트: for _ in range(3): print("hi")로 번역.
배운 것
- NME 단어로 된 미니 언어는 NME 자신에 더 가깝습니다.
say,set,add,while,end가 각각 Python 한 줄로 번역됩니다.- NME형 소스를 읽는 컴파일러는 NME가 NME를 실행하는 씨앗입니다.