Wave (프로그래밍 언어)
Wave는 저수준 시스템 제어와 고수준 추상화를 하나의 일관된 언어 및 도구 체계에서 제공하는 것을 목표로 개발되는 시스템 프로그래밍 언어이다. 전영재가 설계했으며, Wave Foundation을 중심으로 컴파일러와 표준 라이브러리, 패키지 관리 도구, 직렬화 형식 및 저수준 도구 체계...
| 분류 | 시스템 프로그래밍 언어, 범용 프로그래밍 언어 |
|---|---|
| 설계자 | 전영재 |
| 개발 주체 | Wave Foundation |
| 최초 공개 | 2025년 1월 14일 |
| 개발 상태 | 개발 중 |
| 최신 공개 버전 | 0.1.9-pre-beta |
| 패러다임 | 명령형 프로그래밍, 절차형 프로그래밍, 구조적 프로그래밍, 제네릭 프로그래밍 |
| 타입 체계 | 정적 타입, 강한 타입, 명시적 타입 변환 |
| 실행 방식 | AOT 컴파일 |
| 컴파일러 | wavec |
| 컴파일러 구현 언어 | Rust |
| 컴파일러 백엔드 | LLVM, Whale |
| 파일 확장자 | .wave |
| 표준 라이브러리 | Wave Standard Library |
| 패키지 관리 도구 | Vex |
| 주요 대상 | Linux, macOS, WaveOS, 프리스탠딩 환경 |
| 라이선스 | MPL-2.0 |
| 공식 웹사이트 | wave-lang.dev |
| 소스 코드 | wavefnd/Wave |
Wave는 저수준 시스템 제어와 고수준 추상화를 하나의 일관된 언어 및 도구 체계에서 제공하는 것을 목표로 개발되는 시스템 프로그래밍 언어이다. 전영재가 설계했으며, Wave Foundation을 중심으로 컴파일러와 표준 라이브러리, 패키지 관리 도구, 직렬화 형식 및 저수준 도구 체계를 함께 개발하고 있다.[1][2]
Wave는 프로그램의 동작을 명시적으로 드러내고, 실행 과정에 숨겨진 기능을 최소화하며, 네이티브 실행 파일과 검사 가능한 컴파일러 단계를 제공하는 방향으로 설계된다. 컴파일러 자체에는 입출력이나 문자열 처리와 같은 내장 함수를 두지 않고, 언어가 제공하는 기능을 표준 라이브러리와 모듈을 통해 구성한다. 이에 따라 컴파일러는 문법 분석, 타입 검사, 중간 표현 생성과 기계어 생성에 집중하고, 일반적인 프로그래밍 기능은 독립적으로 발전할 수 있는 라이브러리 계층에 배치된다.[3]
언어의 주된 영역은 운영체제, 커널, 시스템 소프트웨어, 네트워크 프로그램, 컴파일러, 하드웨어 제어와 같은 저수준 개발이지만, 장기적으로는 응용 프로그램과 웹, 인공지능, 분산 시스템을 포함한 여러 분야를 하나의 언어 생태계에서 다루는 것을 지향한다. 고수준 인터페이스와 메모리·레지스터·하드웨어 자원에 대한 직접 제어를 함께 제공하여, 같은 프로젝트 안에서 추상화 수준을 필요에 따라 선택할 수 있도록 하는 것이 핵심 설계 목표이다.[4][5]
Wave 소스 코드는 wavec 컴파일러를 통해 네이티브 코드로 변환된다. 컴파일 과정에서는 토큰, 추상 구문 트리, 중간 표현, 기계어와 최종 출력 결과를 선택적으로 확인할 수 있으며, 이는 컴파일러가 수행하는 변환을 개발자가 직접 추적할 수 있게 한다. 현재 컴파일러는 Rust로 구현되고 LLVM을 코드 생성 백엔드로 사용한다.[6][7]
현재 Wave는 정식 안정판 이전의 pre-beta 단계에서 개발되고 있다. 함수와 변수, 포인터, 구조체, 열거형, 제네릭, 패턴 매칭, 인라인 어셈블리, 외부 함수 인터페이스 및 명시적 ABI 내보내기와 같은 기능이 구현되어 있으며, 언어 문법과 컴파일러 내부 구조는 개발 과정에서 계속 변경될 수 있다.[8][9]
역사
초기 개발
Wave의 기원은 2023년 상반기 전영재가 고등학교 3학년 재학 중 구상한 게임 엔진 프로젝트에서 시작되었다. 당시 전영재는 게임 엔진의 구현 언어와 엔진에 내장할 스크립트 언어를 함께 검토했으며, 엔진 자체는 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가 단순한 출력용 언어에서 저수준 프로그램을 작성할 수 있는 언어로 확장되기 시작하였다.[10]
2025년 7월의 v0.1.3-pre-beta에서는 함수 매개변수 구분 문법이 세미콜론에서 쉼표로 변경되고, 포인터 배열과 인덱스 접근의 LLVM IR 생성이 개선되었으며, 인라인 어셈블리와 가져오기 구조도 수정되었다.[11] 이어 공개된 v0.1.4-pre-beta에서는 메서드 체이닝과 개선된 명령줄 실행 방식이 도입되는 등 응용 프로그램 작성에 필요한 언어 기능이 확대되었다.[12]
컴파일러 구조 개편
pre-beta 초기의 Wave 컴파일러는 언어 기능이 추가될 때마다 파서, 의미 분석기와 LLVM 코드 생성기가 직접 확장되는 구조를 가졌다. 언어가 포인터, 구조체, 메서드와 운영체제 인터페이스를 지원하게 되면서 각 단계 사이의 책임을 분리하고 내부 표현을 정비할 필요성이 커졌다.
이에 따라 컴파일러는 소스 코드의 토큰화, 구문 분석, AST 생성, 의미 분석, 타입 검사와 LLVM IR 생성을 구분하는 파이프라인으로 개편되었다. 파서의 미리보기 처리와 AST 노드 관리가 개선되었고, 필드 접근과 메서드 호출처럼 유사한 문법을 문맥에 따라 구분하는 기능이 추가되었다. LLVM 백엔드에서도 구조체 리터럴, 메모리 주소, 포인터와 대상별 링크 처리를 안정적으로 다루기 위한 수정이 이어졌다.[13]
2026년 1월 공개된 v0.1.6-pre-beta에서는 이러한 변화가 대규모 구조 개편으로 정리되었다. 컴파일러 프런트엔드와 LLVM 백엔드가 함께 재구성되었으며, 표준 라이브러리도 기능별 모듈 구조로 개편되었다. 기존의 개별 기능 추가 중심 개발에서 컴파일러·표준 라이브러리·시험 체계를 하나의 시스템 프로그래밍 도구 체계로 구성하는 방향으로 전환한 시점에 해당한다.[14]
2026년 3월의 v0.1.8-pre-beta에서는 제네릭, match 패턴 매칭, 명시적 타입 변환과 정적 전역 변수가 추가되었다. LLVM 백엔드는 LLVM 21과 불투명 포인터, 새로운 최적화 파이프라인을 중심으로 갱신되었고, Linux x86-64와 macOS ARM64 사이의 크로스 ABI 처리 및 구조화된 오류 진단 기능도 도입되었다.[15]
표준 라이브러리와 생태계 확장
Wave의 초기 출력 기능은 컴파일러에 직접 구현된 내장 기능에 가까웠으나, 개발이 진행되면서 입출력과 문자열 처리, 운영체제 기능을 컴파일러에서 분리하여 표준 라이브러리에서 제공하는 방향으로 바뀌었다. 이에 따라 컴파일러는 언어의 구문과 타입, 코드 생성에 집중하고, 프로그램이 실제 환경과 상호작용하는 기능은 Wave Standard Library가 담당하게 되었다.
표준 라이브러리는 C 표준 라이브러리에 의존하는 래퍼만을 제공하는 방식이 아니라, 운영체제의 시스템 호출에서 시작하는 독립적인 계층을 포함하도록 구성되었다. Linux 환경에서는 파일과 콘솔 입출력, 메모리, 프로세스와 네트워크 기능에 접근하기 위한 시스템 모듈이 확장되었으며, 프리스탠딩 환경에서는 운영체제나 C 런타임이 존재하지 않는 상황에서도 필요한 기능을 선택적으로 구성할 수 있게 되었다.[16]
플랫폼별 코드를 분리하기 위한 조건부 구성 기능도 추가되었다. Wave에는 전통적인 텍스트 치환형 매크로 체계가 존재하지 않으며, 대신 #[target(os="linux")]와 같은 속성 문법을 이용하여 특정 운영체제나 대상에서만 선언과 구현이 포함되도록 할 수 있다. 이 구조는 일반적인 문법 변환보다 컴파일 대상의 선택과 프로그램 구성에 초점을 맞춘다.
언어 주변 도구도 독립적인 프로젝트로 확장되었다. 패키지와 의존성을 관리하는 Vex, 직렬화 및 데이터 표현을 위한 WSON, 저수준 컴파일러 도구 체계인 Whale, Wave로 운영체제를 구현하는 WaveOS가 개발되면서 Wave는 단일 컴파일러 프로젝트에서 언어·라이브러리·빌드 도구·운영체제를 포괄하는 생태계로 발전하였다.
최근 개발
2026년의 개발은 Wave를 운영체제와 프리스탠딩 환경에서 직접 사용할 수 있는 시스템 프로그래밍 언어로 확장하는 데 집중되었다. Linux 시스템 호출과 네트워크 모듈이 추가되었고, Linux x86-64와 macOS ARM64를 비롯한 대상 사이의 교차 컴파일 구조가 정비되었다. 이어 프리스탠딩 RISC-V 대상, 링크 단계의 시스템 루트 지정, 사용자 지정 링커 검증과 Windows 교차 컴파일 기능이 도입되었다.[17]
2026년 6월 공개된 v0.1.9-pre-beta에서는 독립 실행형 툴체인 패키징과 빌드 명령 체계가 대대적으로 개편되었다. Windows와 Linux용 패키지에 필요한 LLVM 및 런타임 구성 요소를 함께 제공하는 방향으로 배포 구조가 바뀌었으며, MinGW와 LLVM을 이용한 Windows 대상 생성, 프리스탠딩 RISC-V 지원, 사용자 지정 시스템 루트와 링커 검증 기능이 추가되었다.[18]
같은 버전 계열에서는 export(abi)를 통한 명시적인 ABI 심벌 내보내기와 인라인 어셈블리의 스택 계약이 도입되었다. 이는 Wave 코드가 외부 환경과 연결되는 방식을 명시하고, 운영체제 커널이나 부트 코드에서 컴파일러와 개발자 사이의 호출 및 스택 규칙을 구체적으로 표현하기 위한 기능이다. LLVM 불투명 포인터 체계로의 이전과 시험 실행기 개선도 함께 진행되었다.[19]
2026년 7월 기준 Wave의 최신 공개 버전은 v0.1.9-pre-beta이다. 초기에는 문자열 출력과 제한적인 문법만을 지원했으나, 현재는 UEFI 환경에서 동작하는 WaveOS 부트로더와 CPU의 Ring 0에서 실행되는 커널 코드를 작성할 수 있는 수준으로 확장되었다. 프리스탠딩 코드 생성, 직접적인 시스템 호출, 포인터와 인라인 어셈블리, 명시적 ABI와 교차 컴파일 기능을 이용하여 운영체제 구성 요소를 Wave 자체로 구현하고 있다.
응용 범위도 시스템 소프트웨어에 한정되지 않고 확장되고 있다. 제네릭과 자료구조, 수학 연산, 메모리 제어 및 컴파일 가능한 실행 모델을 바탕으로 인공지능 모델과 학습 코드를 구성하는 실험이 이루어지고 있다. 이에 따라 Wave는 게임 엔진을 위한 언어 구상에서 출발하여, 운영체제·컴파일러·응용 프로그램과 인공지능을 하나의 언어 및 도구 생태계에서 다루는 범용 시스템 프로그래밍 언어로 발전하고 있다.
설계 철학
명시적인 동작
저수준 제어와 고수준 추상화
표준 라이브러리 중심 구조
하나의 언어와 통합 생태계
컴파일러 내부의 가시성
플랫폼 독립성
언어 구조
소스 파일과 프로그램 구성
식별자와 예약어
문장과 표현식
변수와 상수
함수
제어 흐름
모듈과 가져오기
타입 체계
기본 자료형
정적 타입 검사
타입 추론
명시적 타입 변환
포인터와 참조
배열과 문자열
구조체
열거형과 타입 별칭
제네릭
메모리 모델
값과 메모리 표현
스택과 동적 메모리
포인터 연산
수명과 소유 관계
메모리 안전성
프리스탠딩 환경의 메모리 관리
함수와 호출 규약
함수 선언과 호출
매개변수와 반환값
가변 인자
메서드와 proto
외부 함수 인터페이스
ABI와 심벌 내보내기
제어 흐름
조건문
반복문
match 문
흐름 제어문
오류 처리
저수준 프로그래밍 기능
인라인 어셈블리
레지스터와 스택 계약
시스템 호출
하드웨어 접근
커널과 부트 환경
프리스탠딩 코드 생성
컴파일 과정
어휘 분석
구문 분석
추상 구문 트리
의미 분석과 타입 검사
Wave 중간 표현
LLVM 중간 표현
최적화
기계어와 실행 파일 생성
컴파일러
wavec
명령줄 인터페이스
컴파일러 진단
컴파일 단계 검사
최적화 수준
링크와 시스템 루트
교차 컴파일
표준 라이브러리
기본 구조
입출력과 서식화
문자열과 자료구조
운영체제 인터페이스
네트워크 기능
C 표준 라이브러리 연동
하드웨어 라이브러리
빌드와 패키지 관리
프로젝트 구성
빌드 명령
의존성 관리
Vex
독립 실행형 도구 체인
재현 가능한 빌드
생태계
Wave Standard Library
Vex
Whale
WSON
WaveOS
개발 도구와 편집기 지원
지원 플랫폼
Linux
macOS
WaveOS와 프리스탠딩 환경
FreeBSD와 기타 유닉스 계열
Windows
대상 지원 등급
활용 분야
운영체제와 커널
시스템 소프트웨어
임베디드 시스템
네트워크 프로그래밍
컴파일러와 개발 도구
응용 프로그램
웹과 서버 소프트웨어
인공지능과 고성능 연산
다른 프로그래밍 언어와의 관계
C
C++
Rust
Zig
Go
어셈블리어
개발과 거버넌스
LunaStev
Wave Foundation
공개 개발 방식
버전과 릴리스 정책
기여와 커뮤니티
라이선스
장점과 한계
관련 문서
- Wave 공식 웹사이트 ↩
- Wave 공식 GitHub 저장소 ↩
- Wave 저장소 README: About Wave ↩
- Wave 공식 문서: Introduction ↩
- Wave 공식 문서: Philosophy and Goals of Wave ↩
- Wave 공식 웹사이트: Compiler inspection ↩
- Wave 공식 GitHub 저장소 ↩
- Wave 공식 문서: Syntax ↩
- Wave v0.1.9-pre-beta 릴리스 ↩
- Wave 공식 개발 블로그 ↩
- Wave v0.1.3-pre-beta 릴리스 ↩
- Wave v0.1.4-pre-beta 릴리스 ↩
- Wave 공식 릴리스 목록 ↩
- Wave v0.1.6-pre-beta 릴리스 ↩
- Wave v0.1.8-pre-beta 릴리스 ↩
- Wave 공식 개발 블로그: 표준 라이브러리와 시스템 API ↩
- Wave 공식 개발 블로그 ↩
- Wave v0.1.9-pre-beta 릴리스 ↩
- Wave v0.1.9-pre-beta 릴리스 ↩