인터롭

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 학습과제 {
    제목: string,
: int,
    완료: bool = false,
}

function 분해석(텍스트: string) -> Result<int, string> {
    match toInt(텍스트) {
        case Some() if > 0 => Ok()
        case _ => Err("minutes must be a positive integer")
    }
}

export function 과제만들기(
    제목: string,
    분문자열: string,
    완료: bool = false,
) -> Result<학습과제, string> {
    let = 분해석(분문자열)?
    Ok(학습과제 { 제목: 제목, : , 완료: 완료 })
}

export function 요약(과제들: Array<학습과제>) -> string {
    let mut 남음 = 0
    for 과제 in 과제들 {
        if !과제.완료 {
            남음 = 남음 + 과제.
        }
    }
    "tasks={과제들.length}, remaining={남음} minutes"
}

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

TOPAZ
import src.plan { 학습과제, 과제만들기, 요약 }

export function main(인자: Array<string>, 표준입력: string) -> Result<int, string> {
    let 과제들: Array<학습과제> = [
        과제만들기("Run first program", "10", true)?,
        과제만들기("Build application", "25", false)?,
    ]
    print(요약(과제들))
    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가 아닙니다. 실행에 성공했다면 이 대상에서 이 프로그램이 낸 출력과 종료 코드에 관한 증거를 얻은 것입니다. 사용자가 작성한 래퍼는 별도의 호스트 코드 계약에 따라 검토합니다.

패키지가 제한 Lispex 규칙을 결합한다면 빌드하기 전에 한정 Lispex 결정 애플리케이션을 따르세요. 승인된 네이티브 대상만 이 애플리케이션 프로필을 운반하며, 지원하지 않는 경로는 산출물을 쓰기 전에 실패합니다. 상호 운용 개요, Python 백엔드, 인터프리터와 백엔드, 산출물과 배포로 이어서 살펴보세요.