Что нового в Mojo
This content is not available in your language yet.
Курс написан под Mojo 1.1. Эта страница — о том, что изменилось по сравнению с 1.0, и о том, почему почти всё, написанное до неё, всё-таки придётся править.
Коротко
Заголовок раздела «Коротко»Ветка 1.x обещает совместимость, и в целом обещание держится: из ста пятидесяти примеров этого курса переход с 1.0 на 1.1 сломал четыре. Но сломал по-настоящему — с ошибкой сборки, а не с предупреждением.
| Что | Было в 1.0 | Стало в 1.1 |
|---|---|---|
InlineArray | переходное имя для Array | удалено, только Array |
@parameter if / @parameter for | предупреждение об устаревании | ошибка |
присваивание без var (x = 1, if (x := …)) | предупреждение об устаревании | ошибка |
alias | предупреждение, замена — comptime | ошибка, слово неизвестно |
конвенция read | предупреждение, замена — imm | ошибка: 'read' was removed |
@parameter перед вложенной функцией | работал молча | предупреждение, замена — список захвата |
run[f]() из std.benchmark | единственная форма для замыканий | удалена, осталась run(f) |
as_c_string_slice() у String | работал молча | предупреждение, замена — as_c_string_span() |
mojo package -o файл.mojopkg | предупреждение об устаревании | ошибка: нужно расширение .mojoc |
файлы .mojoc, собранные 1.0 | — | не загружаются, пересоберите |
файлы .mojopkg при импорте | находились | не ищутся: unable to locate module |
InlineArray удалён
Заголовок раздела «InlineArray удалён»Самое заметное. В 1.0 InlineArray был вторым именем для Array —
оставленным ради кода, написанного до 1.0. В 1.1 его убрали:
error: use of unknown declaration 'InlineArray'Замена дословная: везде, где стоял InlineArray, пишите Array.
Ни поведение, ни параметры не изменились.
var buffer = Array[Int, 8](fill=0)@parameter перед if и for — теперь ошибка
Заголовок раздела «@parameter перед if и for — теперь ошибка»В 1.0 эти формы ещё работали, ругаясь предупреждением. В 1.1 компилятор отказывается их разбирать:
error: 'for' statement does not support decorators; remove the decoratorЗамена та же, что и была: comptime if и comptime for.
Сам декоратор перед вложенной функцией пока работает, но тоже помечен устаревшим:
warning: '@parameter' is deprecated; use '@__parameter'Двойное подчёркивание в предложенном имени — намёк достаточно прозрачный. Вместо декоратора вложенной функции сегодня пишут список захвата.
run[f]() заменена на run(f)
Заголовок раздела «run[f]() заменена на run(f)»Мелочь, но приятная. В 1.0 у функции замера было две формы, и обе
неудобны: run(f) не принимала захватывающие замыкания, а run[f]()
принимала, но ругалась предупреждением «используйте run(f)».
Выбирать приходилось между предупреждением и невозможностью померить.
В 1.1 параметрическую форму убрали, а обычная научилась принимать замыкания:
def work() {imm data}: ...
var report = run(work, max_runtime_secs=0.3)Предкомпилированные пакеты надо пересобрать
Заголовок раздела «Предкомпилированные пакеты надо пересобрать»Формат .mojoc привязан к точной версии компилятора, и обещание
совместимости исходников на него не распространяется. Файл, собранный
Mojo 1.0, версия 1.1 не загрузит:
error: Mojo precompiled file is incompatible with the current version of the Mojo compiler. Precompiled file 'shapes.mojoc' version 1.0.0 is older than compiler version 1.1.0. To proceed, recreate the precompiled file with `mojo precompile`, or use the version of the compiler it was created with.Лечится пересборкой: mojo precompile пакет -o пакет.mojoc. Старая
команда mojo package в 1.1 ещё работает с предупреждением, но только
если выходной файл называется .mojoc — расширение .mojopkg теперь
ошибка:
warning: 'package' is deprecated; use 'precompile' insteaderror: output path must have a '.mojoc' extensionПодробнее — в главе Упаковка и распространение.
Что не изменилось
Заголовок раздела «Что не изменилось»Проверено на компиляторе 1.1 — всё это осталось как было:
comptime,comptime if,comptime forи вся параметризация;- списки захвата в замыканиях;
- трейты, включая отсутствие
Stringable,RepresentableиEqualityComparable— их убрали ещё в 1.0; simd_width_ofи работа с SIMD;parallelizeпо-прежнему живёт в пакетеmax, а не в стандартной библиотеке;- взаимодействие с Python:
Python.import_module, преобразованияpy=,PythonModuleBuilder.
Что осталось из 1.0
Заголовок раздела «Что осталось из 1.0»Большая часть ловушек, описанных в курсе, никуда не делась. Напомним главные — они появились ещё в 1.0 и в 1.1 в силе:
| Убрано | Чем заменять |
|---|---|
fn | def |
let | var |
alias | comptime |
inout / owned | mut / var |
Stringable, Representable | Writable |
отрицательные индексы x[-1] | x[len(x) - 1] |
Полный список — в главе Что устарело.
🎯 Проверь себя
Код из статьи 2024 года использует `InlineArray`. Он соберётся?
Нет. В 1.0 это имя ещё работало как второе имя для Array,
а в 1.1 его удалили: use of unknown declaration 'InlineArray'.
Замена дословная — пишите Array, поведение то же.
Чем отличается судьба `@parameter for` от судьбы `@parameter` перед вложенной функцией?
@parameter for и @parameter if в 1.1 стали ошибкой —
'for' statement does not support decorators. А декоратор перед
вложенной функцией пока работает, но помечен устаревшим и предлагает
заменить себя на @__parameter. Практически его писать незачем:
вместо него пишут список захвата.
Старый код зовёт `run[work](max_runtime_secs=0.3)`. Как переписать?
run(work, max_runtime_secs=0.3). В 1.0 параметрическая форма была
единственной, принимавшей захватывающие замыкания; в 1.1 её убрали,
а обычная форма их принимает. Стало и короче, и без предупреждения.
Проект собирается, но компилятор печатает предупреждения. Можно ли их не трогать?
Можно, но недолго. Предупреждение об устаревании — это анонс: так
было с @parameter for, который в 1.0 предупреждал, а в 1.1 стал
ошибкой. Разбирать их дешевле сразу, пока правка механическая.
Что дальше
Заголовок раздела «Что дальше»Если Mojo у вас ещё не стоит — проверьте системные требования и переходите к установке. Если стоит и хочется сразу к делу — первая программа.
Тексты курса — CC BY-NC-SA 4.0, код примеров — Apache 2.0