프로그램 구조

최상위 선언, main 진입점, import 순서와 프리스탠딩 엔트리를 설명합니다.

Wave Foundation

소스 파일의 최상위 항목

Wave 소스는 다음과 같은 최상위 항목을 구성할 수 있습니다.

  • import(...)
  • const, static
  • type
  • struct, enum, proto
  • extern(...), export(...)
  • fun
  • 지원되는 항목 앞의 #[target(...)] 조건

가져올 수 있는 선언 앞에는 pub을 붙입니다. 지역 var 선언은 함수나 블록 안에 둡니다.

일반 실행 프로그램

import("std::string::len")::{len};

const EXIT_OK: i32 = 0;

fun main() -> i32 {
    var message: str = "Wave";
    println("{} {}", message, len(message));
    return EXIT_OK;
}

일반적인 실행 파일은 main을 진입 함수로 사용합니다.

선언 순서와 import

import는 다른 소스 파일에 공개된 항목을 프로그램에서 사용할 수 있게 합니다. 표준 라이브러리는 std::, 로컬 파일은 ./, 패키지는 패키지 이름으로 시작하는 경로를 사용합니다.

import("std::string::len");
import("./helpers" as helpers);
import("math")::{Vector};
import("math::ops");

모듈 전체를 가져오면 helpers::function_name처럼 경로를 붙여 접근할 수 있습니다. 선택 가져오기는 지정한 이름을 이 파일의 이름 공간에 놓습니다. pub import("./module")::{Name};은 선택한 공개 항목을 다시 내보냅니다.

소스 파일을 작은 책임 단위로 분리하고, 각 파일이 직접 사용하는 모듈을 명시적으로 import하면 의존성 관계를 읽기 쉽습니다.

프리스탠딩 프로그램

커널, 부트 코드 또는 런타임이 없는 대상은 프리스탠딩 빌드 옵션을 사용할 수 있습니다.

wavec build kernel.wave \
  --freestanding \
  --entry=_start \
  --linker-script=linker.ld \
  --no-start-files

--freestanding은 기본 라이브러리 의존을 끄는 빌드 계획과 연결되며, --entry는 링커 엔트리 심볼을 설정합니다. 실제 부팅 가능한 산출물을 만들려면 대상 아키텍처, 링커 스크립트와 오브젝트 형식까지 함께 설계해야 합니다.