나만의 언어, 과연 만들 수 있을까?
자체 프로그래밍 언어 제작 경험을 공유하며, 모딩(Modding)을 위한 언어 설계의 필요성을 강조함
C++와 유사한 문법을 지향하며, C 언어와의 상호 운용성(Interop)을 목표로 함
샌드박싱(Sandboxing), 작은 컴파일러 크기(Small Compiler Footprint), 빠른 컴파일 속도를 중요하게 고려함
Bison 파서(Parser), JIT 컴파일러(JIT Compiler) 등 컴파일러 아키텍처에 대한 기술적 세부 사항을 설명함
모딩(Modding)을 위한 언어 설계의 어려움
작성자는 게임 모딩(Modding)을 위한 언어 설계를 위해 Lua와 C++를 검토했지만, 샌드박싱(Sandboxing)의 어려움과 C++의 복잡성으로 인해 자체 언어 개발을 결정했다고 밝힌다. 특히, Lua는 샌드박싱이 어렵고 C++는 모더(Modder)들에게 높은 진입 장벽을 제시한다는 점을 지적하며, 데이터 격리 아키텍처(Data Isolation Architecture)를 위한 자체 언어의 필요성을 강조한다. 또한, C++ 컴파일러의 큰 용량 또한 문제점으로 언급된다.
PSLang: C++와 Rust, Python의 혼합
작성자는 C++, Rust, Python, Zig 등 여러 언어의 영향을 받아 pslang이라는 자체 언어를 개발했다. pslang은 정적 타입 시스템(Static Type System), 엄격한 타입 검사(Strict Type Checking), 그리고 C와의 원활한 상호 운용성을 목표로 한다. 특히, C와의 상호 운용성을 위해 C ABI를 준수하며, 13개의 기본 타입을 지원한다. 또한, 메모리 레이아웃(Memory Layout)을 명확하게 정의하여 C와의 호환성을 높였다.
컴파일러 아키텍처 및 기술적 구현
작성자는 컴파일러를 파서(Parser), AST(Abstract Syntax Tree), IR(Intermediate Representation), 인터프리터(Interpreter), JIT 컴파일러(JIT Compiler)로 구성했다. 파서 구현을 위해 Bison을 사용했으며, AST를 생성한다. 또한, IR을 통해 컴파일러와 인터프리터 간의 코드 재사용성을 높이고, 최적화를 용이하게 한다. 현재는 Aarch64 아키텍처를 지원하는 JIT 컴파일러를 개발 중이며, 레지스터 할당(Register Allocation), IR 최적화(IR Optimization), 실행 파일 생성 등의 기능을 추가할 계획이다.
언어 기능 및 향후 계획
작성자는 struct 생성자, 전역 변수, 메서드 호출 구문, 다형성(Polymorphism), 연산자 오버로딩, for 루프, 자동 리소스 관리, polymorphic literals, 컴파일 타임 평가, 타입 계산, 코루틴, 라이브러리 모듈 등 다양한 언어 기능을 추가할 계획이다. 특히, 다형성을 위해 C++ 스타일의 함수 오버로딩과 템플릿, 또는 Haskell/Rust 스타일의 트레이트(Traits)를 고려하고 있다. 또한, 자동 리소스 관리(Automatic Resource Management)를 위해 RAII, defer, linear types를 연구하고 있다.