Примечание: документация отражает канонический синтаксис Topaz v5.2 — строгого надмножества замороженного v5.1. Модули — новинка v5.2: см. Модули и видимость.
Ответ в одно предложение: если вы хотите писать на Rust — пишите на Rust. Topaz — для людей и агентов, которые хотят записывать замысел приложения в одной малой, читаемой, канонической форме.
Вопрос обычно задан не на том уровне
«Почему Topaz, а не Rust?» предполагает, что два языка живут на одном уровне. Это не так.
- Уровень Rust: аллокаторы, async-рантаймы, сетевые стеки, границы unsafe, высокопроизводительные структуры данных — переговоры с машиной.
- Уровень Topaz: CLI-процессы, преобразование данных, серверная склейка, логика на основе конфигурации, оркестрация SQL/shell/путей — описание замысла.
На этом уровне настоящие конкуренты Topaz — Python и TypeScript, и сравнение прямое: читается как они, но статически типизирован, имеет единственную каноническую форму и спроектирован для нативного развёртывания без установки рантайма (инструменты развёртывания — этап дорожной карты; см. раздел о честных границах ниже). Сегодня v0.3 разбирает, резолвит и выполняет Topaz v5.2 от начала до конца — точную границу отслеживает состояние тулчейна.
Производительность — линия обороны, а не аргумент продажи: цель проектирования в том, чтобы выбор Topaz ничего не стоил, а не в том, чтобы бенчмарки были причиной выбора.
Четыре опоры
1. Малая замкнутая поверхность
Там, где Rust отдаёт экспертам все рычаги, Topaz решает политику на
уровне языка: восстановимая ошибка — Result, отсутствие —
Option, ошибка программиста — fault (не значение, не
перехватывается), очистка — defer, параллельное ожидание —
concurrent(timeout:) ... else. Одна конвейерная идиома (|>),
никаких неявных числовых преобразований, исчерпывающий match.
Половина цикла проектирования v5.1 ушла на удаление вторых способов
сказать то же самое — осталась одна каноническая форма на замысел.
2. Unicode-first, а не Unicode-терпимость
Большинство языков допускают неанглийские идентификаторы. Topaz делает их первоклассным вводом — официальные примеры и парс-корпус компилятора содержат корейские и эмодзи-идентификаторы; ключевые слова остаются английскими, имена следуют вашей предметной области:
function 인사하기(이름: string) -> string {
return "안녕하세요, {이름}님!"
}Это не сентиментальность. Перевод предметных понятий на английский теряет информацию и превращает код-ревью в проверку перевода.
3. Поверхность, которую можно доверить агентам
Topaz спроектирован для эпохи генерации, и это утверждение проверяемо, а не декларативно:
- спецификация мала и замкнута — каждая форма достижима из
Program, запрещённые формы перечислены; - канонические профили — машинно-проверяемые нормативные документы, а не рекомендации по стилю;
- каждый канонический
topaz-фрагмент на этом сайте проходит проверку парсером тулчейна, исполняемые примеры выполняются с выводом, зафиксированным байт в байт, а показанные транскрипты обязаны совпадать с записями реальных запусков — документация, разошедшаяся с грамматикой или рантаймом, не проходит проверку (как проверяется этот сайт); - режимы отказа узкие: нет неявных преобразований, исчерпываемость
matchтребуется спецификацией (до выхода чекера — динамическая страховка), граница fault/Resultфиксирована.
Язык для агентов конкурирует консистентностью и проверяемостью сгенерированного кода, а не выразительностью.
4. Шаблоны, несущие намерение
То, что в других местах требует макросов и библиотечной дисциплины, здесь — грамматика:
let report = sql"""
SELECT name, total
FROM orders
WHERE region = {region}
ORDER BY total DESC
"""По грамматике шаблон sql хранит части и интерполяции раздельно —
он не схлопывается в строку, поэтому инъекции через конкатенацию
негде случиться. Политики рендеринга по доменам (связывание
параметров, экранирование shell, нормализация путей) отложены до
будущего решения v5; v0.3 проносит структурированное значение через
рантайм. Реестр тегов закрыт — сгенерированный код не может
изобретать псевдо-DSL.
Кому Topaz не подходит
Этот раздел — актив доверия, а не слабость. Используйте Rust (или C, или Zig), если вы:
- нуждаетесь в прямом контроле lifetimes и ownership;
- работаете с границами unsafe, FFI или встраиваемыми платформами;
- вручную оптимизируете узкие места производительности;
- хотите полную мощь экосистемы crates;
- воспринимаете сужение свободы как цену — узкая дорога Topaz для вас реальный недостаток.
Целевая аудитория Topaz — противоположная: люди, которым нужен развёртываемый результат без системного уровня, команды, оставляющие предметный язык в коде, и операторы агентов, которым нужна малая поверхность со стабильной генерацией.
Вопрос о запасном выходе
Каждый язык, компилируемый в другой, в итоге судят по его запасному выходу. Позиция Topaz зафиксирована:
- Встроенного запасного выхода нет. Исходники Topaz никогда не содержат чужого кода: смешение разрушает и малую поверхность, и контроль генерации.
- Границы имеют форму модулей. Связь с внешним кодом происходит только на явно помеченных модульных границах (модульная система существует начиная с v5.2; механизм interop появится в более поздней версии — ничего встроенного, никогда).
- Сгенерированный артефакт — не формат авторства (видение — это обязательство для будущего конвейера компиляции; сегодня Topaz не поставляет кодогенерацию). Если для решения проблемы приходится читать сгенерированный код — это классифицируется как баг компилятора, как и любая утечка чужой диагностики. Диагностика Topaz указывает на исходники Topaz.
Так что нет — принятие Topaz по замыслу никогда не потребует учить Rust. Это зафиксированное проектное обязательство, а не готовый инструментарий; если будущий тулчейн его нарушит — сообщите об этом как о проектном баге.
Куда дальше
- Поверхность языка: Введение
- Первая программа — транскрипты, записанные с реального бинарника: Начало работы
- Что существует сегодня и что это доказывает: Состояние тулчейна