Skip to content

Что нового в 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

Самое заметное. В 1.0 InlineArray был вторым именем для Array — оставленным ради кода, написанного до 1.0. В 1.1 его убрали:

error: use of unknown declaration 'InlineArray'

Замена дословная: везде, где стоял InlineArray, пишите Array. Ни поведение, ни параметры не изменились.

var buffer = Array[Int, 8](fill=0)

В 1.0 эти формы ещё работали, ругаясь предупреждением. В 1.1 компилятор отказывается их разбирать:

error: 'for' statement does not support decorators; remove the decorator

Замена та же, что и была: comptime if и comptime for.

Сам декоратор перед вложенной функцией пока работает, но тоже помечен устаревшим:

warning: '@parameter' is deprecated; use '@__parameter'

Двойное подчёркивание в предложенном имени — намёк достаточно прозрачный. Вместо декоратора вложенной функции сегодня пишут список захвата.

Мелочь, но приятная. В 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' instead
error: 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.1 в силе:

УбраноЧем заменять
fndef
letvar
aliascomptime
inout / ownedmut / var
Stringable, RepresentableWritable
отрицательные индексы 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 у вас ещё не стоит — проверьте системные требования и переходите к установке. Если стоит и хочется сразу к делу — первая программа.

Примеры проверены на Mojo 1.1.0

Тексты курса — CC BY-NC-SA 4.0, код примеров — Apache 2.0