초기 개발
Wave의 기원은 2023년 상반기 LunaStev가 고등학교 3학년 재학 중 구상한 게임 엔진 프로젝트에서 시작되었다. 당시 LunaStev는 게임 엔진의 구현 언어와 엔진에 내장할 스크립트 언어를 함께 검토했으며, 엔진 자체는 C++로 개발할 계획이었다. 그러나 당시의 C++ 개발 경험과 목표로 삼았던 게임 및 엔진의 규모 사이에 격차가 있었고, 기존 언어를 선택하는 대신 게임 엔진과 응용 프로그램에 사용할 새로운 프로그래밍 언어를 직접 설계하는 방향으로 계획을 전환하였다.
언어의 기본 구상은 2023년 중반부터 진행되었으며, 같은 해 후반에는 첫 구현이 시도되었다. 초기 구현은 완성된 컴파일러나 인터프리터로 이어지지 못했지만, 이 과정에서 Wave의 문법과 실행 모델에 대한 기초적인 설계가 형성되었다.
본격적인 구현은 2024년 5월에 시작되었다. 최초 구현체는 Java와 ANTLR을 이용하여 작성하려 했으나, 파서 생성기와 관련 도구를 운용하는 과정이 당시의 개발 방향과 맞지 않아 중단되었다. 2024년 6월 17일에는 구현 언어를 Rust로 전환하고 파서와 실행기를 직접 구성하기 시작하였다.
이 시기의 Wave는 아직 시스템 프로그래밍 언어로서의 구조가 확립되기 전이었다. 구현체는 컴파일러라는 이름으로 개발되었지만, 소스 코드를 기계어로 변환하기보다 구문을 해석하여 실행하는 인터프리터에 가까운 방식으로 동작하였다. 변수도 용도에 따라 나뉘어 있었으며, 문자열을 저장하는 var와 수를 저장하는 count가 서로 다른 선언으로 존재하였다. 이후 count는 독립적인 변수 종류에서 제거되고 var에 통합되었으며, 자료형을 변수 선언과 분리하는 현재의 구조로 발전하였다.
컴파일러 구현 언어의 변화
2024년 하반기에는 컴파일러 구조와 적합한 구현 언어를 찾기 위한 여러 차례의 전환이 이루어졌다. 6월 하반기부터 Rust로 작성된 기존 구현체에 C++, Haskell, Go로 작성된 코드와 실험적인 구성 요소가 함께 도입되었다. 서로 다른 언어로 구현된 구성 요소를 비교하고 컴파일러 개발에 적합한 구조를 탐색하기 위한 과정이었다.
2024년 8월 16일에는 기존의 다중 언어 구조를 정리하고 구현체 전체를 Zig로 교체하였다. 그러나 Zig 기반 구현 역시 장기간 유지되지 않았으며, 9월 12일에는 구현 언어가 C로 바뀌었다. 이어 10월 15일에는 C++로, 같은 달 26일에는 다시 Rust로 전환되었다.
2024년 10월 26일의 Rust 전환을 마지막으로 컴파일러 구현 언어는 더 이상 변경되지 않았다. 이후 Wave의 프런트엔드, 타입 검사기, 중간 표현 생성기와 LLVM 백엔드는 Rust를 중심으로 개발되었으며, 초기의 여러 구현 실험은 하나의 컴파일러 코드베이스로 통합되었다.
파서와 추상 구문 트리
초기 개발 과정에서는 파서와 추상 구문 트리의 역할이 각각 독립된 처리 단계로 인식되었다. 이로 인해 파서와 AST를 별개의 시스템으로 구현하려는 시도가 이어졌으나, 파싱의 결과를 구조화한 표현이 AST라는 점을 바탕으로 컴파일러 프런트엔드의 구조가 다시 설계되었다.
2024년 12월에는 소스 코드를 토큰화하고 구문을 분석하여 AST를 생성하는 데 성공하였다. 약 한 달 동안 파서와 AST 출력 기능을 집중적으로 구현한 결과, Wave 소스 코드의 구조를 트리 형태로 출력할 수 있는 최초의 작동 가능한 컴파일러가 완성되었다.
이 단계의 구현체는 실행 파일이나 기계어를 생성하지 않고 AST만 출력하였다. 따라서 초기 공개판은 완전한 컴파일 언어보다는 프런트엔드와 문법 구조를 시험하는 pre-alpha 계열로 분류되었다. Wave는 이 기간에 일곱 차례의 pre-alpha 버전을 거쳤으며, 마지막 AST 전용 공개판에는 v0.0.7-pre-alpha라는 버전이 부여되었다.
공개와 pre-beta 단계
Wave는 2025년 1월 14일 처음 공개되었다. 초기 공개판은 언어 문법과 파서, AST 생성기의 작동을 검증하는 데 초점이 맞추어져 있었으며, 독립적인 실행 파일을 생성하는 단계에는 도달하지 않은 상태였다.
이후 컴파일러에 LLVM 백엔드가 연결되면서 AST를 LLVM 중간 표현으로 내리고 네이티브 결과물을 생성하는 구조가 마련되었다. 2025년 2월 17일에는 LLVM을 통해 실제 프로그램을 생성할 수 있는 최초의 pre-beta 버전이 공개되었다. 이 버전에서 사용할 수 있는 고수준 기능은 print와 println을 이용한 출력이 중심이었으며, 언어 자체와 표준 라이브러리의 범위는 제한적이었다.
pre-beta 전환 이후에는 변수 선언과 연산, 함수 매개변수, 조건문, 반복문, 배열, 포인터와 인라인 어셈블리 등이 순차적으로 도입되었다. 2025년 4월과 5월에는 포인터, 명시적 가변성, 가져오기, UTF-8 처리와 인라인 어셈블리 등이 추가되면서 Wave가 단순한 출력용 언어에서 저수준 프로그램을 작성할 수 있는 언어로 확장되기 시작하였다.
2025년 7월의 v0.1.3-pre-beta에서는 함수 매개변수 구분 문법이 세미콜론에서 쉼표로 변경되고, 포인터 배열과 인덱스 접근의 LLVM IR 생성이 개선되었으며, 인라인 어셈블리와 가져오기 구조도 수정되었다. 이어 공개된 v0.1.4-pre-beta에서는 메서드 체이닝과 개선된 명령줄 실행 방식이 도입되는 등 응용 프로그램 작성에 필요한 언어 기능이 확대되었다.
컴파일러 구조 개편
pre-beta 초기의 Wave 컴파일러는 언어 기능이 추가될 때마다 파서, 의미 분석기와 LLVM 코드 생성기가 직접 확장되는 구조를 가졌다. 언어가 포인터, 구조체, 메서드와 운영체제 인터페이스를 지원하게 되면서 각 단계 사이의 책임을 분리하고 내부 표현을 정비할 필요성이 커졌다.
이에 따라 컴파일러는 소스 코드의 토큰화, 구문 분석, AST 생성, 의미 분석, 타입 검사와 LLVM IR 생성을 구분하는 파이프라인으로 개편되었다. 파서의 미리보기 처리와 AST 노드 관리가 개선되었고, 필드 접근과 메서드 호출처럼 유사한 문법을 문맥에 따라 구분하는 기능이 추가되었다. LLVM 백엔드에서도 구조체 리터럴, 메모리 주소, 포인터와 대상별 링크 처리를 안정적으로 다루기 위한 수정이 이어졌다.
2026년 1월 공개된 v0.1.6-pre-beta에서는 이러한 변화가 대규모 구조 개편으로 정리되었다. 컴파일러 프런트엔드와 LLVM 백엔드가 함께 재구성되었으며, 표준 라이브러리도 기능별 모듈 구조로 개편되었다. 기존의 개별 기능 추가 중심 개발에서 컴파일러·표준 라이브러리·시험 체계를 하나의 시스템 프로그래밍 도구 체계로 구성하는 방향으로 전환한 시점에 해당한다.
2026년 3월의 v0.1.8-pre-beta에서는 제네릭, match 패턴 매칭, 명시적 타입 변환과 정적 전역 변수가 추가되었다. LLVM 백엔드는 LLVM 21과 불투명 포인터, 새로운 최적화 파이프라인을 중심으로 갱신되었고, Linux x86-64와 macOS ARM64 사이의 크로스 ABI 처리 및 구조화된 오류 진단 기능도 도입되었다.
표준 라이브러리와 생태계 확장
Wave의 초기 출력 기능은 컴파일러에 직접 구현된 내장 기능에 가까웠으나, 개발이 진행되면서 입출력과 문자열 처리, 운영체제 기능을 컴파일러에서 분리하여 표준 라이브러리에서 제공하는 방향으로 바뀌었다. 이에 따라 컴파일러는 언어의 구문과 타입, 코드 생성에 집중하고, 프로그램이 실제 환경과 상호작용하는 기능은 Wave Standard Library가 담당하게 되었다.
표준 라이브러리는 C 표준 라이브러리에 의존하는 래퍼만을 제공하는 방식이 아니라, 운영체제의 시스템 호출에서 시작하는 독립적인 계층을 포함하도록 구성되었다. Linux 환경에서는 파일과 콘솔 입출력, 메모리, 프로세스와 네트워크 기능에 접근하기 위한 시스템 모듈이 확장되었으며, 프리스탠딩 환경에서는 운영체제나 C 런타임이 존재하지 않는 상황에서도 필요한 기능을 선택적으로 구성할 수 있게 되었다.
플랫폼별 코드를 분리하기 위한 조건부 구성 기능도 추가되었다. Wave에는 전통적인 텍스트 치환형 매크로 체계가 존재하지 않으며, 대신 #[target(os="linux")]와 같은 속성 문법을 이용하여 특정 운영체제나 대상에서만 선언과 구현이 포함되도록 할 수 있다. 이 구조는 일반적인 문법 변환보다 컴파일 대상의 선택과 프로그램 구성에 초점을 맞춘다.
언어 주변 도구도 독립적인 프로젝트로 확장되었다. 패키지와 의존성을 관리하는 Vex, 직렬화 및 데이터 표현을 위한 WSON, 저수준 컴파일러 도구 체계인 Whale, Wave로 운영체제를 구현하는 WaveOS가 개발되면서 Wave는 단일 컴파일러 프로젝트에서 언어·라이브러리·빌드 도구·운영체제를 포괄하는 생태계로 발전하였다.
최근 개발
2026년의 개발은 Wave를 운영체제와 프리스탠딩 환경에서 직접 사용할 수 있는 시스템 프로그래밍 언어로 확장하는 데 집중되었다. Linux 시스템 호출과 네트워크 모듈이 추가되었고, Linux x86-64와 macOS ARM64를 비롯한 대상 사이의 교차 컴파일 구조가 정비되었다. 이어 프리스탠딩 RISC-V 대상, 링크 단계의 시스템 루트 지정, 사용자 지정 링커 검증과 Windows 교차 컴파일 기능이 도입되었다.
2026년 6월 공개된 v0.1.9-pre-beta에서는 독립 실행형 툴체인 패키징과 빌드 명령 체계가 대대적으로 개편되었다. Windows와 Linux용 패키지에 필요한 LLVM 및 런타임 구성 요소를 함께 제공하는 방향으로 배포 구조가 바뀌었으며, MinGW와 LLVM을 이용한 Windows 대상 생성, 프리스탠딩 RISC-V 지원, 사용자 지정 시스템 루트와 링커 검증 기능이 추가되었다.
같은 버전 계열에서는 export(abi)를 통한 명시적인 ABI 심벌 내보내기와 인라인 어셈블리의 스택 계약이 도입되었다. 이는 Wave 코드가 외부 환경과 연결되는 방식을 명시하고, 운영체제 커널이나 부트 코드에서 컴파일러와 개발자 사이의 호출 및 스택 규칙을 구체적으로 표현하기 위한 기능이다. LLVM 불투명 포인터 체계로의 이전과 시험 실행기 개선도 함께 진행되었다.
2026년 7월 기준 Wave의 최신 공개 버전은 v0.1.9-pre-beta이다. 초기에는 문자열 출력과 제한적인 문법만을 지원했으나, 현재는 UEFI 환경에서 동작하는 WaveOS 부트로더와 CPU의 Ring 0에서 실행되는 커널 코드를 작성할 수 있는 수준으로 확장되었다. 프리스탠딩 코드 생성, 직접적인 시스템 호출, 포인터와 인라인 어셈블리, 명시적 ABI와 교차 컴파일 기능을 이용하여 운영체제 구성 요소를 Wave 자체로 구현하고 있다.
응용 범위도 시스템 소프트웨어에 한정되지 않고 확장되고 있다. 제네릭과 자료구조, 수학 연산, 메모리 제어 및 컴파일 가능한 실행 모델을 바탕으로 인공지능 모델과 학습 코드를 구성하는 실험이 이루어지고 있다. 이에 따라 Wave는 게임 엔진을 위한 언어 구상에서 출발하여, 운영체제·컴파일러·응용 프로그램과 인공지능을 하나의 언어 및 도구 생태계에서 다루는 범용 시스템 프로그래밍 언어로 발전하고 있다.