63 프로그래밍 언어 (Programming Language)
처음부터 끝까지 나만의 프로그래밍 언어를 코딩해 봅시다. 이 프로젝트는 언어가 왜 그렇게 설계되었는지, 어떤 언어가 어떤 작업에 더 적합한지에 대한 깊은 통찰력을 제공할 것입니다. 세상에는 이미 수많은 프로그래밍 언어가 존재하므로, 여러분의 언어가 돋보일 수 있도록 정말 기발하거나 유용한 기능(예: Brainfuck 참고)을 포함해 보세요.
이 프로젝트는 컴파일러와 인터프리터의 작동 원리, 그리고 추상 구문 트리(AST)를 다루는 방법을 익히기에 아주 좋은 고난도 과제입니다. 특히 독특한 문법 규칙과 풍부한 라이브러리를 직접 설계해 보세요.
63.1 주요 개발 포인트
- 어휘 분석 (Lexing / Tokenization): 소스 코드를 토큰(Token)이라는 의미 있는 단위로 분리합니다.
- 구문 분석 (Parsing): 토큰들을 계층적인 구조인 추상 구문 트리(AST)로 변환합니다.
- 인터프리터 및 컴파일러: AST를 순회하며 실제로 명령을 실행하거나 기계어로 변환합니다.
- 변수 및 함수 관리: 변수의 유효 범위(Scope)와 함수 호출, 데이터 타입을 처리하는 로직을 구축합니다.
- 독창적인 문법 설계: 기존 언어와는 다른 재미있거나 효율적인 나만의 코딩 규칙을 정의합니다.
63.2 Python 구현 예시 (간단한 계산 언어 인터프리터 시뮬레이션)
class TinyInterpreter:
"""
사용자의 산술 연산 명령어를 해석하고 실행합니다.
"""
def __init__(self):
self.variables = {}
print("나만의 Tiny 언어 인터프리터 시작.")
def execute(self, code):
"""
한 줄의 소스 코드를 해석합니다. (예: SET x = 10)
"""
parts = code.split()
if not parts: return
cmd = parts[0].upper()
if cmd == "SET":
# 변수 설정 로직 (SET x = 10)
var_name = parts[1]
value = int(parts[3])
self.variables[var_name] = value
print(f"변수 설정: {var_name} = {value}")
elif cmd == "PRINT":
# 변수 출력 로직 (PRINT x)
var_name = parts[1]
val = self.variables.get(var_name, "Undefined")
print(f"출력 결과: {val}")
elif cmd == "ADD":
# 덧셈 로직 (ADD x y)
v1, v2 = parts[1], parts[2]
res = self.variables.get(v1, 0) + self.variables.get(v2, 0)
print(f"덧셈 결과: {res}")
if __name__ == "__main__":
interp = TinyInterpreter()
# Tiny 언어 코드 실행 테스트
interp.execute("SET a = 10")
interp.execute("SET b = 20")
interp.execute("ADD a b")
interp.execute("PRINT a")