Знакомство с Топазом

Топаз — лаконичный язык прикладного программирования с единообразным синтаксисом и поддержкой Unicode.

Топаз — компактный язык для прикладных программ. Исходный код читается так же легко, как на Python или TypeScript, однако для каждого типового решения язык предлагает единый последовательный способ записи. Одинаковые правила действуют как для разработчика, так и для генераторов кода.

Rust остаётся подходящим инструментом там, где требуется прямой контроль над аппаратными ресурсами. Топаз работает на более высоком уровне абстракции. Он предназначен для утилит командной строки · обработки данных · серверной логики · конфигурационных файлов · SQL · shell · работы с путями. Один исходный файл можно выполнить напрямую либо скомпилировать в нативную программу, пакет для Python или веб-артефакт.

Эта страница объясняет назначение языка и демонстрирует структуру его кода. Это не вводный урок. Если вы только начинаете работать с Топазом, откройте учебный маршрут или запустите первую программу в песочница. Краткий обзор синтаксиса служит картой языка, а философия языка объясняет принятые проектные решения.

Приведённые ниже примеры проверяются и выполняются официальным инструментарием Топаза.

Как выглядит код Топаза

Unicode по умолчанию

Идентификаторы поддерживают Unicode на уровне лексера. Термины предметной области сохраняются на родном языке, а не транслитерируются в латинские приближения.

TOPAZ
function приветствовать(имя: string, язык: string) -> string {
    return match язык {
        case "한국어" => "안녕하세요, {имя}님!"
        case "Русский" => "Привет, {имя}!"
        case _ => "Hello, {имя}!"
    }
}

let пользователь = "김토파즈"
print(приветствовать(пользователь, "한국어"))
print(приветствовать("Topaz", "Русский"))
Вывод
안녕하세요, 김토파즈님!
Привет, Topaz!

사용자 — обычная переменная. Идентификаторы Unicode представляют собой полноценную часть языка, а не исключение. Топаз не подменяет исходное имя иной формой и отклоняет наименования модулей, которые легко перепутать.

Малая замкнутая поверхность

Для типовых задач предусмотрены стандартные конструкции. Обрабатываемая ошибка представлена Result, отсутствие значения — Option, освобождение ресурсов — defer, а match проверяет полноту вариантов. Эти решения зафиксированы в языке, поэтому каждый файл не превращается в отдельный диалект.

TOPAZ
function разобратьПорт(исходное: string) -> Result<int, string> {
    let число = toInt(исходное) ?? -1
    if число < 1 {
        return Err("not a port: {исходное}")
    }
    return Ok(число)
}

function запустить(исходное: string) -> Result<string, string> {
    defer print("config closed")
    let порт = разобратьПорт(исходное)?
    return Ok("listening on {порт}")
}

print("{запустить("8080")}")
print("{запустить("http")}")
Вывод
config closed
Ok(listening on 8080)
config closed
Err(not a port: http)

Оператор ? передаёт Err вызывающей функции, а defer выполняется при любом завершении работы. По этой причине строка config closed выводится перед обоими результатами.

Шаблоны сохраняют намерение

В языковом реестре доступны теги p · r · sh · sql. К примеру, p"..." формирует шаблон пути, а sql"..." сохраняет структуру SQL отдельно от интерполируемых параметров, не объединяя их в общую строку.

TOPAZ
let таблица = "users"
let запрос = sql"select * from {таблица} where active = {true}"
print("{запрос}")
Вывод
<sql template, 3 part(s), 2 interpolation(s)>

Вывод отображает краткую информацию о структуре. Шаблон сохраняет разграничение между литеральным текстом и подставленными значениями.

Одна проверка, несколько форматов

Топаз — язык со статической типизацией. Проверка охватывает всю программу до её запуска.

TOPAZ
type Светофор = "red" | "yellow" | "green"

function следующий(сигнал: Светофор) -> Светофор {
    return match сигнал {
        case "red" => "green"
        case "green" => "yellow"
        case _ => "red"
    }
}

Команда topaz run разбирает · связывает · проверяет · выполняет программу. Из этого же исходного кода команды topaz emit и topaz build генерируют альтернативные форматы. Целевая платформа Rust создаёт автономный нативный исполняемый файл, а целевая платформа Python формирует program.py и вспомогательный файл topaz_py_rt.py.

Результаты компиляции для Rust и Python проверяются на единых сценариях поведения языка. Сведения о текущей поддержке и ограничениях целевых платформ приведены на странице состояния.

BASH
topaz build app.tpz --target python --out-dir py-out

Когда Топаз не подходит

Используйте Rust · C · Zig, если требуется прямой контроль владения памятью и времени жизни данных, работы с небезопасными границами, встроенными системами, ручной оптимизации критических участков или прямого доступа к системной экосистеме. Ограничения Топаза в подобных сценариях становятся ощутимой издержкой.

Топаз предназначен для иных задач. В их числе — развёртываемая прикладная логика без работы с системным кодом · терминология предметной области непосредственно в программе · компактная грамматика, с которой одинаково предсказуемо взаимодействуют разработчики и агенты. Если подобные требования соответствуют вашему проекту, продолжайте изучение по учебному маршруту.

Единый способ выражения.