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")