Whale (컴파일러 툴체인)
Whale은 IR, 어셈블러, 목적 파일 라이브러리와 링커 기반을 함께 개발하는 오픈 소스 컴파일러 툴체인이다. LunaStev가 개발을 시작했으며 Wave 생태계의 저수준 코드 생성·검증 기반을 구성한다. 개별 구성 요소를 언어 구현과 컴파일러 도구에서 재사용할 수 있도록 역할별로 분...
| 분류 | 컴파일러 툴체인, 저수준 개발 도구 |
|---|---|
| 개발자 | LunaStev |
| 개발 프로젝트 | Wave 생태계 |
| 최초 공개 | 2025년 1월 29일 |
| 공개 형태 | 오픈 소스, 소스 코드 공개 |
| 정식 릴리스 | 미발표 (2026년 10월 25일 기준) |
| 개발 상태 | 초기 개발 중, 구성 요소별 성숙도 상이 |
| 구현 언어 | Rust, Wave |
| Wave 구현 모듈 | 어셈블리·목적 파일 변환 asmobj |
| 인터페이스 | CLI, 구성 요소별 라이브러리 API |
| 실행 명령 | whale |
| 주요 구성 | IR, 어셈블러, 목적 파일, 링커, 바이너리 조사·연동 계층 |
| IR 텍스트 확장자 | .wir |
| 현재 IR 대상 | x86_64-whale-linux (64비트 리틀 엔디언) |
| 어셈블러 대상 | AMD64, AArch64, RV64I, LoongArch64, Apple AMX |
| 목적 파일 형식 | ELF64, 초기 COFF, Mach-O 출력 (대상별 범위 상이) |
| 정적 링크 대상 | Linux AMD64 ELF (초기 부분집합) |
| 제품 빌드 | Meson, Ninja, Cargo, Wave 컴파일러 |
| 초기 완전 제품 호스트 | Linux x86-64 GNU |
| 관련 언어 | Wave |
| 라이선스 | MPL-2.0 |
| 소스 코드 | wavefnd/Whale |
| 빌드 문서 | BUILDING.md |
Whale은 IR, 어셈블러, 목적 파일 라이브러리와 링커 기반을 함께 개발하는 오픈 소스 컴파일러 툴체인이다. LunaStev가 개발을 시작했으며 Wave 생태계의 저수준 코드 생성·검증 기반을 구성한다. 개별 구성 요소를 언어 구현과 컴파일러 도구에서 재사용할 수 있도록 역할별로 분리하는 것이 중요한 방향이다. Wave 소스의 문법과 타입을 해석하는 wavec, 패키지와 의존성을 관리하는 Vex와는 담당 계층이 다르다.[1]
구현은 주로 Rust를 사용하며 어셈블리 결과를 목적 파일 모델로 변환하는 asmobj 모듈은 전체가 Wave로 작성되어 있다. 명령 해석과 인코딩, 섹션·심벌·재배치 매핑 및 목적 파일 직렬화는 구별되는 처리 단계다. Rust와 Wave 사이의 데이터 전달은 해당 모듈 외부의 연동 계층에서 수행한다. 일부 모듈에 Wave를 사용한다는 사실과 툴체인 전체의 셀프 호스팅이 완료되었다는 주장은 구분된다.[2][3]
Whale IR은 타입과 함수·기본 블록·명령 및 데이터 레이아웃을 명시적으로 표현하고 생성·텍스트 입출력·검증과 제한된 해석 실행을 제공하는 실험적인 중간 표현이다. 설계는 잘못된 연산을 포함한 동작을 정의하고 O0에서 필요한 연산과 검사 및 디버깅에 유용한 구조를 유지하는 방향에 초점을 둔다. 검증은 유효하지 않은 IR을 진단하는 과정이며 자동 최적화와는 다르다. 정의되지 않은 동작을 줄이려는 목표와 전체 메모리 안전성·완성된 네이티브 코드 생성은 각각 별도의 구현 과제다.[4]
IR 해석기는 정수·제어 흐름과 추적되는 스택 메모리, 제한된 Whale 호출 및 부동소수점 연산 등을 예산이 정해진 실행으로 검증하는 데 쓰인다. 포인터의 접근 권한과 초기화 상태, 함수 포인터의 시그니처 등은 단순한 정수 비트와 구별하여 추적한다. 실행 중 트랩과 연산 의미를 확인하는 이 경로는 기계어를 생성해 운영체제에서 실행하는 경로와 다르다. 현재 IR의 대상과 레이아웃 지원 범위도 어셈블러가 다루는 아키텍처 범위와 동일하지 않다.[5]
어셈블러는 AMD64와 초기 AArch64·RV64I·LoongArch64 정수 명령 부분집합을 다룬다. 아키텍처별 파서·레지스터·인코딩과 재배치를 분리하며 공통 계층은 섹션·심벌·진단 및 입력 한도 같은 기능을 제공한다. 목적 파일 계층에는 ELF64와 초기 COFF·Mach-O 출력이 포함되지만 지원하는 머신·형식의 조합은 구성 요소별로 다르다. 다른 아키텍처의 목적 파일을 출력할 수 있다는 사실은 그 아키텍처에서 Whale 자체가 실행되거나 모든 명령을 지원한다는 뜻이 아니다.[6]
링커는 목적 파일과 일반 ar 아카이브의 섹션·심벌·재배치를 해석하여 정적 Linux AMD64 ELF 실행 파일을 구성하는 초기 경로를 제공한다. 파일에 기록되는 크기와 메모리에 배치되는 크기, BSS와 진입 심벌을 구분하고 지원되는 재배치 범위를 검증한다. 목적 파일 직렬화와 실행 파일 링크는 서로 다른 단계다. 바이너리 역분석 영역도 제한된 ELF·raw 이미지 조사와 구조화된 결과를 제공하는 범위로, 완성된 디스어셈블러나 제어 흐름 복원과 구분된다.[7][8]
완전한 제품 빌드에는 Meson을 사용해 Wave asmobj 모듈과 Rust 구성 요소를 의존 순서에 따라 연결한다. 고정한 Wave 컴파일러·대응 std와 생성 아카이브의 메타데이터를 확인하며 초기 연결 모듈의 실행 호스트는 Linux x86-64 GNU 환경이다. Cargo로 Rust 구성 요소와 IR 도구를 개발하는 경로도 유지되지만 전체 제품 빌드와 동일하게 취급하지 않는다. 빌드 도구와 컴파일러를 사용하는 시점, 완성된 Whale 실행 파일을 사용하는 시점의 요구 사항도 나누어 관리한다.[9]