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]

역사

개발 배경

명칭의 유래

최초 커밋과 초기 IR

어셈블러·목적 파일·링커의 발전

모듈화와 대상 확장

Wave 구현 모듈 도입

공개 개발과 릴리스 상태

설계 철학

동작과 오류 의미의 명시

정의되지 않은 동작에 대한 접근

O0와 디버깅 가시성

구성 요소의 분리와 재사용

대상 독립 계층과 아키텍처별 구현

전체 구조

IR과 프런트엔드 연결

어셈블러 계층

asmobj 변환 계층

목적 파일 계층

링커 계층

바이너리 조사와 역분석 계층

도구 연동과 대상 레지스트리

공통 진단

Whale IR

모듈·함수·기본 블록

타입과 값

명령과 종결자

텍스트 형식과 버전

데이터 레이아웃

선언·링키지와 호출 규약

IR 생성과 직렬화

검증 규칙

연산 의미

정수 연산

시프트와 비트 연산

checked 연산과 트랩

부동소수점 저장과 비트 표현

부동소수점 산술과 비교

수치 변환과 반올림

상수 표현식

IR 메모리 모델

할당과 주소

포인터와 접근 권한

초기화 상태

정렬과 범위

구조체·배열과 타입 기반 주소 계산

바이트 복사와 채우기

함수 포인터와 호출 검증

IR 해석 실행

실행기와 검증 오라클

지원 명령과 값

제어 흐름과 phi

직접 호출과 간접 호출

실행 예산과 제한

실행 오류와 진단

네이티브 코드 생성과의 구분

프런트엔드 연동

타입이 있는 AST 입력

AST JSON과 스키마

IR lowering

라이브러리 API

Wave Typed HIR 연동

다른 언어 구현에서의 활용

어셈블러

소스 문법과 지시어

섹션·레이블과 심벌

명령 선택과 인코딩

분기 범위와 재배치

AMD64

AArch64

RISC-V 64

LoongArch64

대상 등록과 확장

asmobj

모듈의 책임과 데이터 모델

Wave 구현

섹션·심벌·재배치 매핑

Rust와의 데이터 전달

아카이브 생성과 메타데이터

대상별 연결과 실행 범위

목적 파일

공통 객체 모델

대상·형식·바이트 순서

ELF64 읽기와 쓰기

COFF 출력

Mach-O 출력

BSS와 파일·메모리 크기

크기 예산과 검증

링커

입력 객체와 아카이브

심벌 해석

섹션 배치

재배치 적용

진입점과 실행 파일 생성

정적 Linux AMD64 ELF

지원 범위와 향후 확장

바이너리 조사와 역분석

ELF와 raw 이미지 입력

구조화된 조사 결과

입력 범위와 작업 예산

디코딩·제어 흐름 분석의 구현 범위

명령줄 인터페이스

asm

object

ir

link

바이너리 조사 명령

디버그 출력과 덤프

입력·출력 경로와 원자적 게시

종료 상태와 오류

빌드와 설치

Meson 제품 빌드

Rust와 Cargo 개발

Wave 컴파일러 부트스트랩

asmobj 아카이브 재사용

빌드 디렉터리와 캐시

교차 빌드

설치와 실행 시 의존성

지원 대상

실행 호스트와 출력 대상

IR 대상과 데이터 레이아웃

어셈블러별 지원 범위

목적 파일 형식별 지원 범위

링커 지원 범위

테스트와 실제 실행 검증

Wave 생태계와의 관계

Wave

wavec

Vex

LLVM과의 관계

셀프 호스팅과 장기 계획

개발과 거버넌스

작업 공간과 모듈 소유권

기여와 코드 검토

테스트와 지속적 통합

버전·형식 호환성

라이선스

활용 분야

특징과 한계

관련 문서

외부 링크

  1. Whale — Project overview ↩
  2. Whale — Building with Meson ↩
  3. Whale — Assembly modules ↩
  4. Whale — Design goals ↩
  5. Whale — IR interpretation ↩
  6. Whale — Assembler architectures and object output ↩
  7. Whale — Static linking ↩
  8. Whale — Current capabilities ↩
  9. Whale — Product build and module reuse ↩