Topazdocs
Обзор

Почему Topaz?

Кому и зачем нужен Topaz — официальный ответ на вопрос «почему не просто Rust или Python?».

Примечание: документация отражает канонический синтаксис 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 делает их первоклассным вводом — официальные примеры и парс-корпус компилятора содержат корейские и эмодзи-идентификаторы; ключевые слова остаются английскими, имена следуют вашей предметной области:

TOPAZ
function 인사하기(이름: string) -> string {
    return "안녕하세요, {이름}님!"
}

Это не сентиментальность. Перевод предметных понятий на английский теряет информацию и превращает код-ревью в проверку перевода.

3. Поверхность, которую можно доверить агентам

Topaz спроектирован для эпохи генерации, и это утверждение проверяемо, а не декларативно:

  • спецификация мала и замкнута — каждая форма достижима из Program, запрещённые формы перечислены;
  • канонические профили — машинно-проверяемые нормативные документы, а не рекомендации по стилю;
  • каждый канонический topaz-фрагмент на этом сайте проходит проверку парсером тулчейна, исполняемые примеры выполняются с выводом, зафиксированным байт в байт, а показанные транскрипты обязаны совпадать с записями реальных запусков — документация, разошедшаяся с грамматикой или рантаймом, не проходит проверку (как проверяется этот сайт);
  • режимы отказа узкие: нет неявных преобразований, исчерпываемость match требуется спецификацией (до выхода чекера — динамическая страховка), граница fault/Result фиксирована.

Язык для агентов конкурирует консистентностью и проверяемостью сгенерированного кода, а не выразительностью.

4. Шаблоны, несущие намерение

То, что в других местах требует макросов и библиотечной дисциплины, здесь — грамматика:

TOPAZ
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 зафиксирована:

  1. Встроенного запасного выхода нет. Исходники Topaz никогда не содержат чужого кода: смешение разрушает и малую поверхность, и контроль генерации.
  2. Границы имеют форму модулей. Связь с внешним кодом происходит только на явно помеченных модульных границах (модульная система существует начиная с v5.2; механизм interop появится в более поздней версии — ничего встроенного, никогда).
  3. Сгенерированный артефакт — не формат авторства (видение — это обязательство для будущего конвейера компиляции; сегодня Topaz не поставляет кодогенерацию). Если для решения проблемы приходится читать сгенерированный код — это классифицируется как баг компилятора, как и любая утечка чужой диагностики. Диагностика Topaz указывает на исходники Topaz.

Так что нет — принятие Topaz по замыслу никогда не потребует учить Rust. Это зафиксированное проектное обязательство, а не готовый инструментарий; если будущий тулчейн его нарушит — сообщите об этом как о проектном баге.

Куда дальше