본문 바로가기
카테고리 없음

Wave 언어 성능 벤치마크: C, Rust와의 비교

by lunastev 2025. 7. 10.
SMALL

Wave는 Zig처럼 "C 대체 언어"를 목표로 하진 않지만, C와는 독립적인 새로운 저수준 언어다. 현재 활발히 개발 중이며, 시작한 지 약 6개월이 지났다.

현재는 pre-beta 단계로, 여러 버그와 제약이 존재하지만 그만큼 개선 여지도 많다. 앞으로의 가능성은 충분하다.

Wave의 로드맵을 보면 pre-beta에서 Wave의 프론트엔드를 완성을 하고, 다음 단계인 alpha 단계에서는 Wave의 독자 컴파일러 툴체인인 Whale의 개발을 해. 탈 LLVM을 목표로 한다. 현재 계획에 따르면 Whale은 LLVM을 완전히 대체하고 Wave를 위해 최적화된 독립적인 컴파일러 툴체인으로 거듭날 것이다.

하지만 Wave에도 다음과 같은 한계점이 존재한다:

  • 생태계 부족: Wave는 구상된 지는 1년, 개발은 6개월 전부터 시작됐다. 이는 표준 라이브러리의 부재와 개발된 프로그램 조차 없다는 소리다. 알고리즘은 구현이 가능하지만 실질적인 응용 프로그래밍은 할 수 없으며 심지어는 v0.1.2-pre-beta 기준으로 input()과 같은 기본 입출력 함수조차 아직 구현되지 않았다.
  • 기여자 부족: 사실 이거는 신생 프로그래밍 언어의 모든 문제점이기도 하다. 극 초기 언어들은 기여자가 없으며 개발자 한 명이 자신의 철학을 기반으로 한 언어를 확고히 하기 위해서 독단적으로 개발을 진행하는 경우가 많다. 이거는 당연한 것이며 새로운 프로그래밍 언어는 주목을 받기에는 기존 유틸리티 프로그램 보다는 확실하게 느리다.

Wave는 컴파일 언어이며 저수준 프로그래밍 언어이기 때문에 Python이나 JavaScript 같은 언어하고는 비교를 하면 안된다. 애초에 경쟁 상대가 아닐 뿐더러 Wave는 누구하고도 경쟁을 원하지 않는다. 하지만 경쟁 상대를 고르라고 한다면 C랑 Rust가 가장 유력한 경쟁 상대일 것이다.

아까 말했듯이 Wave는 초기 단계이기 때문에 당연히 C랑 Rust랑 비교할 수 없을 정도로 느릴 것이다. 하지만 벤치마크를 돌려서 비교를 해보는 건 좋은 일이며, 어떻게 최적화를 할 수 있을지에 대한 동기를 부여해줄 수 있다.


benchmark

이 그래프는 Wave와 C, Rust를 성능을 비교한 표이다. 문자열 길이를 계산하는 간단한 함수를 1억 번을 실행하여 벤치마크를 하였다.

Wave와 C, Rust 모두 AOT 컴파일 방식으로 테스트를 하였다. 참고로 Wave는 JIT는 지원하지 않을 예정이고 AOT 방식으로만 지원할 예정이다.

각각 소스코드는 이렇다.

fun len(s: str) -> i32 {
    var count: i32 = 0;
    while (s[count] != 0) {
        count = count + 1;
    }
    return count;
}

fun main() {
    var message: str = "hello, world!";
    var result: i32 = 0;
    var i: i32 = 0;
    while (i < 100000000) {
        result = result + len(message);
        i = i + 1;
    }
    println("Wave Result: {}", result);
}

Wave는 아직 time 관련 라이브러리가 없기 때문에 리눅스의 time 명령어를 사용하여 측정을 한 점 간과를 해서 보기를 바란다.


#include <stdio.h>
#include <time.h>

int len(const char* s) {
    int count = 0;
    while (s[count] != 0) {
        count++;
    }
    return count;
}

int main() {
    const char* message = "hello, world!";
    int result = 0;

    clock_t start = clock();
    for (int i = 0; i < 100000000; ++i) {
        result += len(message);
    }
    clock_t end = clock();

    double elapsed = (double)(end - start) / CLOCKS_PER_SEC;
    printf("C Result: %d\n", result);
    printf("C Time: %.3f seconds\n", elapsed);
    return 0;
}

C는 유구한 역사를 자랑하며 오랫동안 최적화와 그 많은 시스템들의 기반이 되는 언어이다. C는 더이상 말할 것 없이 최고의 언어이자 전통적인 언어이다.


use std::time::Instant;
use std::hint::black_box;

fn len(s: &str) -> i32 {
    let bytes = s.as_bytes();
    let mut count: i32 = 0;
    while count < bytes.len() as i32 && bytes[count as usize] != 0 {
        count += 1;
    }
    count
}

fn main() {
    let message = black_box("hello, world!");
    let mut result = 0;

    let start = Instant::now();
    for _ in 0..100_000_000 {
        result += len(message);
    }
    let duration = start.elapsed();

    println!("Rust Result: {}", result);
    println!("Rust Time: {:.3?}", duration);
}

Rust는 Wave를 작성한 언어로써 당연히 벤치마킹에 포함이 되는 언어이다. Rust의 역사는 10년 정도로 프로그래밍 언어 생태계에서는 매우 이른 언어이며, 또한 생태계도 C만큼은 아니지만, 확실히 빠르게 성장 중인 언어다.


이 벤치마크를 보면 "Wave 엄청나게 느리네"라고 할 수 있겠지만 Wave는 아직 초창기이다. Rust가 최초 안정 버전 출시가 10년 됐는데 Wave는 개발을 시작한지 6개월 밖에 안 지났다.

Wave는 C보다 약 5배, Rust보다 약 4.2배 느리다.
하지만 AOT 방식 언어로서 개발 6개월 만에 이 정도 성능이라면 충분히 인상적이다.
가까운 시일 내에 달성하긴 어렵겠지만, Rust급 성능도 충분히 노려볼 수 있는 잠재력이 있다.


Site: https://wave-lang.dev/
GitHub: https://github.com/LunaStev/Wave
Discord: https://discord.com/invite/Kuk2qXFjc5

LIST