인터롭

Rust 백엔드

검사를 마친 토파즈 패키지 하나를 관리형 플랫폼 실행 제품으로 만듭니다. 토파즈 소스 트리가 없어도 실행됩니다.

빌드 머신의 운영체제와 아키텍처에서 실행되는 플랫폼 실행 파일 하나가 필요할 때 Rust 경로를 고릅니다. Rust는 빌드 대상일 뿐입니다. Rust 토큰이 토파즈 문법이 되지는 않습니다.

준비 사항

  • 첫 애플리케이션study-plan 패키지를 완성합니다.
  • topaz.toml, topaz.lock, src/plan.tpz, src/main.tpz와 선택 테스트를 한곳에 둡니다.
  • 빌드 머신에 호환되는 Rust 도구 모음과 Cargo를 설치합니다.
  • 다음 명령은 study-plan 디렉터리에서 실행합니다.

완성된 실행 파일에는 토파즈와 Cargo, .tpz 파일이 필요하지 않습니다. 다만 빌드한 운영체제와 아키텍처에 맞춰 만들어진 파일입니다.

공유하는 검사 대상 패키지

Python 페이지도 같은 두 토파즈 모듈을 사용합니다. 먼저 src/plan.tpz입니다.

TOPAZ
export record StudyTask {
    title: string,
    minutes: int,
    done: bool = false,
}

function parseMinutes(text: string) -> Result<int, string> {
    match toInt(text) {
        case Some(value) if value > 0 => Ok(value)
        case _ => Err("minutes must be a positive integer")
    }
}

export function makeTask(
    title: string,
    minuteText: string,
    done: bool = false,
) -> Result<StudyTask, string> {
    let minutes = parseMinutes(minuteText)?
    Ok(StudyTask { title: title, minutes: minutes, done: done })
}

export function summarize(tasks: Array<StudyTask>) -> string {
    let mut remaining = 0
    for task in tasks {
        if !task.done {
            remaining = remaining + task.minutes
        }
    }
    "tasks={tasks.length}, remaining={remaining} minutes"
}

패키지 진입점 src/main.tpz입니다.

TOPAZ
import src.plan { StudyTask, makeTask, summarize }

export function main(args: Array<string>, stdin: string) -> Result<int, string> {
    let tasks: Array<StudyTask> = [
        makeTask("Run first program", "10", true)?,
        makeTask("Build application", "25", false)?,
    ]
    print(summarize(tasks))
    Ok(0)
}

토파즈 소스 검증하기

먼저 패키지를 검사합니다. 이어서 선택 테스트를 실행합니다. 마지막으로 기준 출력을 확인합니다.

BASH
topaz check --root . --locked
topaz test tests/plan.tpz --root . --locked
topaz run --root . --locked

테스트는 tests/plan.tpz: test-ok를 보고합니다. 실행 결과는 다음과 같습니다.

출력
tasks=2, remaining=25 minutes

검토에는 emit, 배포에는 build

생성된 Cargo 소스 묶음을 직접 읽어 보거나 다른 코드에 통합해야 할 때만 emit을 사용합니다.

BASH
topaz emit --target rust --root . --locked --out-dir ../dist/rust-source

관리형 플랫폼 실행 제품은 build로 만듭니다.

BASH
topaz build --target native --root . --locked --out-dir ../dist/native

build --target rust는 올바른 명령이 아닙니다. rustemit에 쓰는 대상입니다. build로 만드는 배포 대상은 native입니다.

관리형 제품 확인하기

기본 디버그 빌드에는 다음 파일이 있습니다.

출력
dist/native/
├── GENERATED-OUTPUT-NOTICE.txt
├── LICENSE
├── NOTICE
├── target
│   └── debug
│       └── program[.exe]
└── topaz-artifact.json

topaz-artifact.json에는 native 대상, 실행에 필요한 OS와 아키텍처 조건, 실행 명령, 모든 관리 파일의 크기와 SHA-256이 기록됩니다. 토파즈는 산출물 명세를 맨 마지막에 씁니다. 관리 파일이 바뀐 경우, 안전하지 않은 충돌이 생긴 경우, 같은 출력 디렉터리에 다른 대상이 있는 경우에는 거부합니다.

토파즈 소스를 사용할 수 없는 곳에서 실행하기

dist는 패키지 바깥에 있습니다. 원본 패키지를 다른 이름으로 옮긴 다음 제품만 실행합니다.

BASH
cd ..
mv study-plan source-unavailable
./dist/native/target/debug/program

Windows에서는 Rename-Item study-plan source-unavailable을 먼저 실행합니다. 그다음 .\dist\native\target\debug\program.exe를 실행합니다. 제품은 위와 같은 결과를 출력합니다. 종료 코드는 0입니다.

대상별 복구

  • Cargo 도구 모음이 없거나 호환되지 않을 때는 빌드 머신을 먼저 고칩니다. 그다음 다시 빌드합니다.
  • --releasetarget/release/program[.exe]를 만듭니다. 바뀌는 것은 빌드 프로필뿐입니다.
  • 기본 코드 생성은 값을 감싸는 공통 Rust 실행 환경을 사용합니다. 선택 옵션인 --backend native는 입증된 영역만 특수화합니다. 지원하지 않는 형식은 추측하지 않고 공통 값 표현 그대로 둡니다.
  • 플랫폼 실행 파일을 다른 OS나 아키텍처에 복사해 놓고 지원되는 배포라고 부르면 안 됩니다.

정확한 경계

생성된 Rust 코드와 실행 환경 묶음은 언제든 교체할 수 있는 산출물입니다. 손으로 확장해 쓰는 API나 소스 수준 Rust FFI가 아닙니다. 실행에 성공했다면 이 대상에서 이 프로그램이 낸 출력과 종료 코드에 관한 증거를 얻은 것입니다. 사용자가 작성한 래퍼는 별도의 호스트 코드 계약에 따라 검토합니다.

상호 운용 개요, Python 백엔드, 인터프리터와 백엔드, 산출물과 배포로 이어서 살펴보세요.