Интеграция

Бэкенд Rust

Соберите пакет учебного плана в нативный исполняемый файл и запустите его вне каталога исходников.

Соберите пакет учебного плана в нативный исполняемый файл и запустите его вне каталога исходников. Для запуска на целевой ОС и архитектуре установка Топаза или Cargo не требуется.

Подготовьте пакет

Завершите Первое приложение, включая topaz.toml, topaz.lock и tests/plan.tpz. Установите совместимый инструментарий Rust с Cargo на сборочной машине. Выполняйте команды этой страницы из study-plan.

Компилятор по умолчанию написан на Топазе. Он генерирует код Rust, а Cargo собирает исполняемый файл. Приложение вы продолжаете писать на Топазе.

Сохраните исходный код приложения

Используйте два модуля из первого приложения. Первый файл называется 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

Проверка завершается с кодом 0. Тест сообщает tests/plan.tpz: test-ok. При запуске пакет выводит следующую строку.

Вывод
tasks=2, remaining=25 minutes

При диагностике исправьте указанную строку исходника. При сбое теста сравните ожидаемый результат в tests/plan.tpz с src/plan.tpz. Если --locked сообщает об изменении настроек пакета, проверьте topaz.toml и обновите блокировку по разделу Пакеты и распространение.

Изучите код или соберите исполняемый файл

Для изучения или интеграции созданных исходных файлов Cargo используйте emit.

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

Команда записывает сгенерированный Rust и файлы среды выполнения в ../dist/rust-source. Для создания исполняемого файла используйте build.

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

Цель rust предназначена для генерации исходников через emit. Цель исполняемого файла для build называется native, поэтому build --target rust отклоняется.

Проверьте каталог вывода

Обычная отладочная сборка записывает следующие файлы.

Вывод
dist/native/
├── GENERATED-OUTPUT-NOTICE.txt
├── LICENSE
├── NOTICE
├── target
│   └── debug
│       └── program[.exe]
└── topaz-artifact.json

topaz-artifact.json содержит цель native, требуемые ОС и архитектуру, команду сборки, размер и SHA-256 каждого управляемого файла. Топаз записывает его последним. Повторная сборка отклоняет изменённые управляемые файлы, небезопасные конфликты путей и другую цель в том же каталоге. Восстановление и состав поставки описаны в разделе Артефакты и развёртывание.

Запустите вне каталога исходников

Каталог dist находится вне study-plan. Если source-unavailable уже существует, выберите другое имя, затем переименуйте пакет и запустите собранную программу.

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

В PowerShell переименуйте пакет командой Rename-Item study-plan source-unavailable и запустите .\dist\native\target\debug\program.exe. Программа выводит tasks=2, remaining=25 minutes и завершается с кодом 0. Исходники остаются в source-unavailable для дальнейших изменений.

Решите проблемы сборки и развёртывания

СитуацияДействие
Cargo отсутствует или несовместимИсправьте инструментарий Rust на сборочной машине и повторите сборку
Нужна релизная сборкаДобавьте --release. Путь станет target/release/program[.exe], поведение Топаза сохранится
Компилятору по умолчанию передан --backend nativeДля исполняемого файла используйте --target native. Параметр специализации этот компилятор отклоняет как неподдерживаемый
Нужно проверить нативную специализациюВыберите эталонный компилятор с --compiler rust --backend native. См. Интерпретатор и бэкенды
У места развёртывания другая ОС или архитектураПеред развёртыванием соберите программу для соответствующей поддерживаемой платформы

Интегрируйте сгенерированный код

Сохраняйте изменения приложения в .tpz, поскольку сгенерированный Rust и файлы среды выполнения можно заменить при повторной генерации. Они не предоставляют стабильный API для ручных расширений или FFI на уровне исходного кода Rust. Проверяйте поведение и разрешения написанной вами обёртки отдельно. После интеграции сравните вывод и код завершения программы на нужной цели.

Для приложения принятия решений на Лиспексе перед сборкой пройдите раздел Запуск правил Лиспекса. Все пять нативных релизных платформ поддерживают это приложение. Остальные цели сборки отклоняют его профиль Лиспекса до записи артефактов. Существующие пакеты Топаза 5.18 используют профиль совместимости embedded-core.

Продолжите с раздела Границы интеграции, Интерпретатор и бэкенды или Артефакты и развёртывание.