Version bêta 1.0 du langage de programmation Mojo

Представлен первый бета выпуск языка программирования Mojo 1.0, который ознаменовал стабилизацию языка и реализацию всех базовых возможностей. Выпуск оценивается как почти готовый к повсеместному использованию. Финальный релиз Mojo 1.0 ожидается в начале осени. Использование данной ветки позволит начать разрабатывать крупные проекты, не опасаясь появления в языке изменений, нарушающих совместимость.

В состав платформы включены компоненты, необходимые для разработки приложений на языке Mojo, включая компилятор, runtime, интерактивную REPL-оболочку для сборки и запуска программ, отладчик, дополнение к редактору кода Visual Studio Code (VS Code) с поддержкой автодополнения ввода, форматирования кода и подсветки синтаксиса, модуль для интеграции с Jupyter для сборки и запуска Mojo notebook. Исходный код стандартной библиотеки Mojo открыты под лицензией Apache 2.0 c исключениями от проекта LLVM, допускающими смешивание с кодом под лицензией GPLv2. Исходный код компилятора планируют открыть после завершения стабилизации внутренней архитектуры.

Le langage Mojo est développé sous la direction de Chris Lattner, fondateur et architecte en chef du projet LLVM et créateur du langage de programmation Swift. La syntaxe de Mojo est basée sur le langage Python et le système de types est proche du C/C++. Le projet est présenté comme un langage à usage général qui étend les capacités de Python avec des capacités de programmation système, convient à un large éventail de tâches et combine la facilité d'utilisation pour le développement de la recherche et le prototypage rapide avec l'adéquation aux produits finaux hautes performances.

La simplicité est obtenue grâce à l'utilisation de la syntaxe Python familière, et le développement des produits finaux est facilité par la capacité de compiler en code machine, des mécanismes de sécurité de la mémoire et l'utilisation d'outils d'accélération matérielle. Pour obtenir des performances élevées, la parallélisation des calculs est prise en charge en utilisant toutes les ressources matérielles des systèmes hétérogènes disponibles dans le système, telles que les GPU, les accélérateurs spécialisés pour l'apprentissage automatique et les instructions de processeur vectoriel (SIMD). Pour les calculs intensifs, la parallélisation et l'utilisation de toutes les ressources informatiques permettent d'atteindre des performances supérieures aux applications C/C++.

Le langage prend en charge le typage statique et des fonctionnalités de bas niveau de sécurité de la mémoire qui rappellent Rust, telles que le suivi de la durée de vie des références et le vérificateur d'emprunt. Dans le même temps, le langage offre également des opportunités de travail de bas niveau, par exemple, il est possible d'accéder directement à la mémoire en mode non sécurisé à l'aide du type Pointer, d'appeler des instructions SIMD individuelles ou d'accéder à des extensions matérielles telles que TensorCores et AMX.

Mojo peut être utilisé aussi bien en mode interprétation à l'aide de JIT que pour la compilation en fichiers exécutables (AOT, en avance). Le compilateur intègre des technologies modernes pour l'optimisation automatique, la mise en cache et la compilation distribuée. Le code source du langage Mojo est converti en code intermédiaire de bas niveau MLIR (Multi-Level Intermediate Representation), développé par le projet LLVM. Le compilateur vous permet d'utiliser divers backends prenant en charge MLIR pour générer du code machine.

Среди изменений в Mojo 1.0.0b1:

  • Ключевое слово «fn» объявлено устаревшим — для объявления функций следует использовать ключевое слово «def» (возможности «fn» и «def» объединены, и в «def» реализована семантика «fn» без генерации исключений).
  • Унифицирована реализация замыканий (closure). Не учитывающие контекст замыкания (stateless closure) теперь автоматически преобразуются в функции верхнего уровня и могут использоваться как callback-вызовы в FFI (Foreign Function Interface). Добавлена поддержка захвата по ссылке (ref capture). При объявлении функций добавлен признак «thin» для объявления простого типа указателя на функцию без захвата состояния.
  • Указатели с типом UnsafePointer теперь не могут принимать значение null по умолчанию, а для работы с null-указателями необходимо использовать «Optional[UnsafePointer[…]]», что позволяет исключить накладные расходы при работе с null-указателями и сохранить возможность безопасного применения в FFI.
  • По умолчанию в коде для CPU в коллекциях включена проверка допустимых границ (на GPU проверка отключена для производительности, но может быть включена при сборке с «mojo build -D ASSERT=all»). Прекращена поддержка указания отрицательных значений в индексах (запрещено «x[-1]», но можно указывать «x[len(x)-1]»).
  • Из стандартной библиотек удалён тип NDBuffer, вместо которого следует использовать TileTensor.
  • Расширена поддержка работы с GPU через графический API Metal на системах Apple (например, появилась поддержка print() и матричных инструкций M5). Добавлена поддержка ускорителей AMD MI250X и NVIDIA B300.
  • Идентификаторы примитивов GPU (индексы потоков и блоков) переведены на возвращение типа Int вместо UInt.
  • Контекст CPU (‘DeviceContext(api=»cpu»)’) стал потокозависимым (stream-ordered). Для упорядоченного выполнения задач добавлены функции enqueue_cpu_function() и enqueue_cpu_range().
  • В типах String и StringSlice добавлена поддержка графемных кластеров (Unicode UAX #29), позволяющая корректно вычислять длину и обрезать строки с emoji и комбинированных символов. Добавлены методы graphemes() и count_graphemes(), а также синтаксис слайсов «[grapheme=…]».
  • Реализовано уточнение типов (Type Refinement) на этапе компиляции для автоматического сужения типов внутри выражений «where», «if» и «assert» (позволяет обойтись без явного указания trait_downcast).
  • Предложен унифицированный API рефлексии, в котором предложена новая функция reflect[T](), возвращающая Reflected[T] и заменяющая семейство функций struct_field_* и старые методы get_type_name().

Одновременно сформирован выпуск движка MAX Framework 26.3, предлагающего платформу для разработок в области машинного обучения. MAX Framework дополняет инструментарий Mojo средствами для разработки и отладки приложений, использующих модели машинного обучения в различных форматах (TensorFlow, PyTorch, ONNX и т.п.). В новой версии MAX Framework добавлена возможность генерации видео, расширена поддержка работ с использованием нескольких GPU, значительно повышена производительность интерпретатора (некоторые операции стали выполняться быстрее в 10-20 раз).

Source: opennet.ru