Перейти к содержимому
Топаздокументация
Загрузка

Поиск в документации

Проект и руководство

Выберите результат стрелками и нажмите Enter, чтобы открыть его.

Введите имя API, номер диагностики, правило или тему проекта.

    Планы развития

    На этой странице собраны выпущенные версии с 5.21.0 по 5.21.3 и план следующего публичного выпуска 6.0.0. Здесь видно, что каждый из них меняет для ваших проектов. Полный список выпущенных изменений находится в истории.

    ВерсияСтатусЧто в неё входит
    5.21.0ВыпущенаРежим языка topaz-5.21, std.typeset и литералы Length, встроенный Лиспекс 1.21
    5.21.1ВыпущенаИсправления вывода типов, вызовов, диагностики и границ среды выполнения
    5.21.2ВыпущенаБолее быстрые повседневные команды и подписанные записи сборки
    5.21.3Текущая версияПроверка подписи в установщике npm, подписанный открытый исходный код и файлы выпуска без путей сборки
    6.0.0ОжидаетсяНовый типизированный движок компилятора, изменения языка по спецификации, официальный исполняемый файл, который любой может пересобрать из открытого исходного кода, сопоставимые бенчмарки, способ пересборки компилятора и инструмент перехода
    Долгосрочная инициативаСроки не определеныБолее лёгкое хранение локальных записей и коллекций

    Выпущенные версии с 5.21.0 по 5.21.3 используют режим языка topaz-5.21. Следующий публичный выпуск 6.0.0 объединяет новый движок компилятора с изменениями языка по спецификации и начинает режим языка topaz-6.0. Руководство и инструмент перехода помогают перенести существующие программы на 6.0.0.

    Версия 5.21.0

    Версия 5.21.0 выпущена. С неё начался режим языка topaz-5.21. Глобальные функции, статические пространства имён, конструкторы и стандартные модули перешли в методы значений и модули std, а все замены перечислены в разделе Переход на 5.21. В 5.21.0 также появились литералы Length и std.typeset, шестнадцатеричные и двоичные целые с разделителями разрядов и битовые операции над целыми, а Топаз стал включать Лиспекс 1.21. Полный список изменений находится в истории.

    Версия 5.21.1

    Версия 5.21.1 выпущена. Это совместимый патч. Он исправляет вывод типов для обобщённых обратных вызовов и вызовов в скобках, уточняет диагностику, чтобы она называла нужный модуль и значение, и исправляет нативную и Web-сборку, а также границы среды выполнения, например сортировку с NaN и некорректные даты. Полный список изменений находится в истории.

    Версия 5.21.2

    Версия 5.21.2 выпущена, её результаты описаны в истории. Это совместимый патч, который избавляет повседневные команды от повторной работы. В том же выпуске появились подписанные записи, связывающие каждый исполняемый файл со сборкой, в которой он получен.

    Повторное использование поиска типов и импортов

    Компилятор один раз строит упорядоченный список объявлений-кандидатов для каждого модуля, области видимости и имени и использует его при каждом поиске. Программам с большим числом ссылок на типы больше не нужно просматривать всю программу ради каждой ссылки. Результат в 5.21.2

    Закрытые объявления, затенение, номинальная идентичность типов и циклы импорта работают как прежде. Изменение любого модуля перестраивает списки.

    Чтение обычного текста строки за один шаг

    Длинные строковые литералы, например встроенные таблицы данных, компилятор читает участками обычного текста, а не по одному символу. Экранирование, интерполяция и места ошибок внутри литерала остаются прежними. Результат в 5.21.2

    Запуск проверенной программы напрямую

    topaz run выполняет программу, которую компилятор только что проверил. Шаг, на котором проверенная программа преобразуется в другую форму и читается обратно, исчезает. Вывод, коды завершения, ошибки выполнения, лимиты шагов и отмена не меняются. Результат в 5.21.2

    Изменения по сравнению с прежним планом

    Измерения до начала реализации изменили объём работ. Ссылки на прежние пункты ведут сюда.

    Кэш синтаксических ссылок переносится в 6.0.0. Типизированные запросы в 6.0.0 связывают каждое использование с объявлением, поэтому отдельный кэш сейчас был бы заменён в следующем выпуске.

    Сокращение временных массивов компилятора не входит в выпуск. На него почти не уходило время компиляции, а типизированная модель программы в 6.0.0 читает операнды напрямую.

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

    Упрощение выражений сгенерированного Rust не входит в выпуск. Разбиение выражений на шаги не сократило ни время компиляции Rust, ни расход памяти.

    Четыре рассматривавшихся улучшения не проявились в измерениях и не входят в выпуск. Накладные расходы асинхронности в сгенерированном коде устраняют прямые вызовы в 6.0.0.

    Проверка выпуска

    5.21.2 также меняет способ проверки загруженного выпуска. На результаты выполнения программ это не влияет.

    Связь исполняемых файлов со сборкой

    Каждый загружаемый исполняемый файл опубликован вместе с подписанной записью связи. Запись связывает файл с редакцией исходного кода, сгенерированным компилятором, а также со средой сборки и проверками, в которых он получен. Результат в 5.21.2

    Каждая запись связи представляет собой подписанное проектом утверждение о том, из какого исходного кода и какой сборкой получен исполняемый файл. Записи перечислены в подписанных файлах контрольных сумм, поэтому проверка подписи Ed25519 со страницы установки охватывает и их. Открытый процесс проверки в studiohaze/topaz сверяет каждую запись с исполняемым файлом, на который она указывает, и проверяет, что указанные в ней открытый коммит и compiler.rs совпадают с открытым репозиторием. Процесс описан в инструкции по проверке аттестации выпуска (внешняя ссылка).

    Указатель на последнюю версию переключился на 5.21.2 после того, как подписи и все опубликованные файлы были повторно прочитаны по открытым адресам. Файлы прежних выпусков не меняются, и новые записи для них не создаются.

    Совпадение исходного кода стандартных модулей

    Открытый исходный код и Topaz Core Kit берут стандартные модули std.bytes, std.fs, std.io, std.json и std.toml из тех же файлов, что и официальный CLI. Программы уже сейчас дают одинаковые результаты. Диагностика, указывающая внутрь стандартного модуля, сообщает одно и то же место во всех дистрибутивах. Результат в 5.21.2

    Пересборка компилятора из начального комплекта 5.21.1

    Способ пересборки 5.21.2 (внешняя ссылка) начинается с открытого начального комплекта 5.21.1 и исходного кода 5.21.2. В нём приведены команды, ожидаемая контрольная сумма компилятора, измеренные память и время выполнения. История ведёт к опубликованному результату.

    Версия 5.21.3

    Версия 5.21.3 выпущена. Она улучшает установку Топаза и проверку файлов выпуска. Язык и компилятор остаются такими же, как в 5.21.2, поэтому программы собираются и работают точно так же, как раньше.

    Проверка подписи в установщике npm

    npx topaz-lang и npm install topaz-lang перед установкой проверяют подпись Ed25519 у списка контрольных сумм выпуска. Это та же проверка, что описана на странице установки. Затем установщик сверяет архив и исполняемый файл с подписанным списком. Если подписи нет или она неверна, установка останавливается и объясняет причину. Результат выпуска 5.21.3

    Исходный код и задачи из npm

    Пакет npm ссылается на открытый репозиторий studiohaze/topaz, где можно читать исходный код и сообщать о проблемах. Результат выпуска 5.21.3

    Подписанный открытый исходный код

    Коммиты и теги, которые каждый выпуск добавляет в открытый репозиторий, подписаны, и GitHub показывает их как проверенные. Результат выпуска 5.21.3

    Файлы выпуска без путей сборки

    В исполняемых файлах, среде выполнения WebAssembly для песочницы и других файлах выпуска нет путей с машины сборки. Перед публикацией каждый файл проверяется на такие пути. Результат выпуска 5.21.3

    Примеры, проверенные на CLI выпуска

    Перед выходом выпуска все примеры на Топазе в файлах README и в документации запускаются на CLI этого выпуска, и их вывод должен совпадать со страницей. Результат выпуска 5.21.3

    Запланированная версия 6.0.0

    Следующим публичным выпуском Топаза станет 6.0.0. Он объединяет новый движок компилятора с изменениями языка по спецификации. В выпуск входят официальный исполняемый файл, который любой может пересобрать из открытого исходного кода, способ пересборки компилятора, бенчмарки и инструмент перехода.

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

    Изменения определяют два принципа. В Топазе один способ сказать, и Топаз остаётся универсальным языком программирования со встроенной вёрсткой.

    Новый движок компилятора

    Компилятор, написанный на Топазе, работает с типизированными данными, даёт известным типам собственное представление в Rust и вызывает функции напрямую.

    Официальный исполняемый файл, который можно пересобрать

    В 6.0.0 официальный исполняемый файл topaz использует Core Kit как основу с дополнениями. Любой может пересобрать базовый исполняемый файл из открытого исходного кода по опубликованным входным данным и инструкциям. Результат можно побайтно сравнить с базовым исполняемым файлом официального выпуска.

    • Основа. Компилятор, команды CLI, языковой сервер и сервер MCP собираются из открытого исходного кода. Любой может пересобрать официальный базовый исполняемый файл и получить те же байты на каждой целевой платформе выпуска. Подпись по-прежнему показывает, что выпуск наш, а его содержимое можно проверить самостоятельно.
    • Лиспекс. Лиспекс работает как отдельный модуль WebAssembly внутри открытого хоста. Хост, интерфейс между Топазом и Лиспексом и ограничения ресурсов открыты, а модулю доступно только то, что ему передаёт хост. std.lispex использует этот модуль, а рекомендуемая загрузка и пакет npm включают Лиспекс.
    • Эталонный компилятор. Эталонный компилятор для сравнения переходит из официального исполняемого файла в необязательное дополнение. Компилятором по умолчанию остаётся только компилятор, написанный на Топазе.

    Команды CLI Core Kit написаны на Топазе. Rust остаётся только там, где исполняемый файл работает с операционной системой, хостом WebAssembly и криптографией. Основа и дополнения следуют командам, флагам, выводу, кодам завершения и диагностике, определённым для 6.0.0.

    Типизированная модель программы и запросы

    Компилятор хранит программу как типизированные данные с числовыми идентификаторами и отвечает на вопросы об именах, сигнатурах и типах через кэшируемые запросы. Каждый ответ запоминает, что он прочитал, поэтому правка пересчитывает только ответы, зависящие от изменённого кода. Имена, которые искали и не нашли, тоже учитываются, так что новое объявление обновляет все места, где оно требовалось.

    При сборке выпуска стандартные модули проверяются один раз, и результат поставляется вместе с компилятором. Поэтому программа, импортирующая std.typeset, при каждой команде проверяет только собственный код, а не весь модуль заново.

    Инструменты получают JSON-вывод компилятора в формате, определённом для 6.0.0.

    Записи, строки и newtype как типы Rust

    Тип записи, у которого известны все поля, становится структурой Rust, а чтение поля становится прямым доступом. Записи с необязательными полями по-прежнему отличают отсутствующее поле от поля со значением None. Обновление записи по-прежнему не меняет прежние копии.

    Строки передаются между скомпилированным кодом и средой выполнения без преобразования. newtype остаётся отдельным типом и использует представление обёрнутого типа. match по строковым литералам компилируется в прямые сравнения в том же порядке. Поведение символов, байтов и Юникода не меняется.

    Перечисления, Option и Result как перечисления Rust

    Перечисления, Option и Result с полностью известными типами становятся перечислениями Rust. match без охранных условий, охватывающий все случаи, компилируется в match Rust.

    Прямые вызовы

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

    Лимиты шагов, ограничения по времени, отмена, ограничения глубины рекурсии и defer работают как прежде. Вызов через значение-функцию с неизвестной целью идёт прежним путём.

    Инкрементальная проверка в редакторе

    Языковой сервер сохраняет результаты запросов между правками. Правка тела функции заново проверяет это тело и код, который читает его результаты, и не трогает несвязанные модули. Диагностика показывается только для последней версии каждого файла.

    Пересборка компилятора из открытого исходного кода

    В 6.0.0 будет опубликован способ пересборки компилятора из его открытого исходного кода и опубликованных входных данных. Цепочка воспроизведения начинается заново с 6.0.0. Этот способ заново создаёт compiler.rs и проверенные стандартные модули, поставляемые с компилятором, чтобы любой мог побайтно сравнить их с опубликованными файлами. В нём указаны команды, входные данные, условия сборки, расход памяти и время выполнения.

    Кэш сборки

    topaz build сохраняет скомпилированные зависимости и неизменённую работу между сборками, а не начинает каждый раз с пустого каталога. Ключом кэша служат набор инструментов, целевая платформа, профиль сборки, среда выполнения и входные данные, поэтому при изменении любого из них устаревший результат не используется.

    Один способ сказать

    Если одно и то же можно написать двумя способами, 6.0.0 оставляет один. Вид перевода строки, регистр букв и скобки больше не меняют смысл программы. Например, defer требует блок, лямбды всегда заключают параметры в скобки, префиксы систем счисления и шестнадцатеричные цифры пишутся строчными буквами, if без else всегда имеет значение unit, а все команды, выводящие JSON, принимают --format json.

    Спецификация, которую можно проверить

    Каждое правило в новом справочнике объясняет, зачем оно есть в языке, и ссылается на примеры, которые выполняются на выпуске. Поведение, которому компилятор ещё не следует, отмечено как известное ограничение, пока компилятор не начнёт ему следовать. Нынешний справочник остаётся доступным для 5.21.

    Документация после 6.0

    Руководство 6.0 будет находиться по адресу /v6.0. Исправления 6.0.x сохранят этот адрес, а следующая версия 6.1 получит свой. Руководство Топаза 5 останется в состоянии выпуска 5.21.3, с уведомлением вверху о том, что это предыдущая версия, и старые ссылки 5.x будут вести на него. Классика станет руководством Топаза 5.6, снимком более раннего этапа, с таким же уведомлением. На обе версии можно перейти из истории.

    Переход на 6.0

    6.0.0 начинает режим языка topaz-6.0. Руководство по переходу перечисляет все изменения, а инструмент перехода за один проход заменяет каждую удалённую форму на оставшуюся. Удалённые формы не сохраняются на период предупреждений.

    Все наши продукты на Топазе перейдут на Топаз 6 с этим выпуском.

    Открытые бенчмарки

    Вместе с 6.0.0 будут опубликованы результаты бенчмарков рядом с TypeScript, Python и Rust, выполняющими те же программы в тех же условиях. Результаты охватывают время запуска, время выполнения, расход памяти и число строк кода. Чистая первая сборка и пересборка после изменения одного файла измеряются отдельно.

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

    Условия выпуска

    6.0.0 выйдет, когда новый движок будет готов и выполнит условия раздела Что сохраняет каждое изменение движка. Официальный базовый исполняемый файл и компилятор должны пересобираться из открытого исходного кода. Оставшиеся решения о языке должны быть приняты, а все примеры нового справочника должны проходить на компиляторе. Инструмент перехода должен преобразовывать существующие программы, а результаты бенчмарков должны быть опубликованы. Инкрементальная проверка и кэш сборки также входят в этот план, и каждая из них войдёт в первый выпуск, к которому будет готова.

    Что сохраняет каждое изменение движка

    Спецификация языка (SPEC) определяет значения, порядок вычислений и ошибки, а способ хранения значений оставляет реализации. Изменения движка сохраняют эти правила для каждого режима языка, меняя хранение и вызовы.

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

    Долгосрочная архитектурная инициатива

    Эти планы охватывают несколько выпусков после 6.0.0 и не привязаны к номеру версии.

    Более лёгкое хранение локальных записей и коллекций

    Каноническое понижение без накладных расходов (ZOCLE) убирает накладные расходы времени выполнения из кода Rust, который генерирует Топаз. Первая часть этой работы входит в 6.0.0 в виде типизированных записей, перечислений и прямых вызовов. Следующие шаги идут в этом порядке на той же типизированной модели программы. Каждый шаг принимается, только если измерения показывают выигрыш без удлинения сборки, роста памяти и размера результата.

    1. Локальные записи. Запись, которую не возвращают, не сохраняют и не захватывают, становится структурой Rust или отдельными локальными значениями. Тогда ей не нужны выделение памяти в куче и счётчик ссылок.
    2. Типизированные массивы и словари. Массивы и словари с известным типом элементов получают типизированное хранилище Rust вместо общего значения среды выполнения.
    3. Слияние циклов. Цепочки методов коллекций, например filter и map, а также включения выполняются одним циклом без промежуточных массивов. Компилятор объединяет их, только если результат, вывод и ошибки выполнения не меняются. Так бывает, например, когда обратные вызовы не выполняют ввод и вывод и не меняют состояние let mut.
    4. Повторное использование памяти. Обновление записи вида User { ...before, status: Status.Paused("review") } или метод коллекции, возвращающий новый массив, занимает память источника, если на источник больше не ссылается другой код. Оставшийся код этой разницы не видит.
    5. Векторизация. Массивы int и float хранятся как непрерывные векторы Rust, а циклы по ним генерируются в форме, которую rustc и LLVM могут векторизовать. Векторные инструкции зависят от процессора и возможностей WebAssembly, поэтому каждую целевую платформу измеряют отдельно.

    От плана к результатам выпуска

    У каждой версии и каждого улучшения на этой странице есть постоянная ссылка. После выпуска версии её запись в истории ссылается на этот план, а включённые улучшения получают ссылки на фактические результаты выпуска.

    Если пункт переносится или меняется его объём, эта страница объясняет причину и показывает, куда он перешёл. История описывает фактически выпущенные изменения.

    Эта страница охватывает текущую линию и следующий публичный выпуск. Когда выходит новая линия, страница начинается заново с её первого выпуска. Предыдущие линии остаются в истории.

    Меню

    Загрузка