Представлен первый бета выпуск языка программирования Mojo 1.0, который ознаменовал стабилизацию языка и реализацию всех базовых возможностей. Выпуск оценивается как почти готовый к повсеместному использованию. Финальный релиз Mojo 1.0 ожидается в начале осени. Использование данной ветки позволит начать разрабатывать крупные проекты, не опасаясь появления в языке изменений, нарушающих совместимость.
В состав платформы включены компоненты, необходимые для разработки приложений на языке Mojo, включая компилятор, runtime, интерактивную REPL-оболочку для сборки и запуска программ, отладчик, дополнение к редактору кода Visual Studio Code (VS Code) с поддержкой автодополнения ввода, форматирования кода и подсветки синтаксиса, модуль для интеграции с Jupyter для сборки и запуска Mojo notebook. Исходный код стандартной библиотеки Mojo открыты под лицензией Apache 2.0 c исключениями от проекта LLVM, допускающими смешивание с кодом под лицензией GPLv2. Исходный код компилятора планируют открыть после завершения стабилизации внутренней архитектуры.
Mojo тили LLVM долбоорунун негиздөөчүсү жана башкы архитектору жана Swift программалоо тилинин жаратуучусу Крис Латтнердин жетекчилиги астында иштелип жатат. Моджонун синтаксиси Python тилине негизделген жана тип системасы C/C++ га жакын. Долбоор Python'дун мүмкүнчүлүктөрүн системалык программалоо мүмкүнчүлүктөрү менен кеңейтүүчү, тапшырмалардын кеңири спектри үчүн ылайыктуу жана илимий-изилдөөлөрдү иштеп чыгуу жана тез прототиптөө үчүн колдонуунун жөнөкөйлүгү менен жогорку өндүрүмдүүлүктөгү акыркы өнүмдөрдүн ылайыктуулугун айкалыштырган жалпы максаттуу тил катары таанылат.
Жөнөкөйлүккө тааныш Python синтаксисин колдонуу аркылуу жетишилет, ал эми акыркы өнүмдөрдү иштеп чыгууга машина кодуна компиляциялоо, эстутумда коопсуз механизмдер жана аппараттык тездетүү куралдарын колдонуу жардам берет. Жогорку өндүрүмдүүлүккө жетишүү үчүн эсептөөлөрдү параллелизациялоо системада бар гетерогендик системалардын бардык аппараттык ресурстарын колдонуу менен колдоого алынат, мисалы, GPU, машинаны үйрөнүү үчүн адистештирилген тездеткичтер жана вектордук процессордун көрсөтмөлөрү (SIMD). Интенсивдүү эсептөөлөр үчүн, бардык эсептөө ресурстарын параллелизациялоо жана пайдалануу C/C++ тиркемелеринен жогору көрсөткүчтөргө жетишүүгө мүмкүндүк берет.
Бул тил статикалык терүүнү жана Rustту эске салган төмөнкү деңгээлдеги эстутумда коопсуз функцияларды колдойт, мисалы, маалымдама өмүр бою көзөмөлдөө жана карыз текшерүүчү. Ошол эле учурда, тил төмөнкү деңгээлдеги иштөө үчүн мүмкүнчүлүктөрдү берет, мисалы, Pointer түрүн колдонуу менен кооптуу режимде эстутумга түздөн-түз жетүү, жеке SIMD инструкцияларын чакыруу же TensorCores жана AMX сыяктуу аппараттык кеңейтүүлөргө жетүү мүмкүн.
Mojo JIT аркылуу интерпретация режиминде да, аткарылуучу файлдарга компиляциялоо үчүн да колдонсо болот (AOT, мөөнөтүнөн мурда). Компилятордо автоматтык оптималдаштыруу, кэштөө жана бөлүштүрүлгөн компиляция үчүн заманбап технологиялар орнотулган. Mojo тилиндеги булак коду LLVM долбоору тарабынан иштелип чыккан MLIR (көп деңгээлдүү орто өкүлчүлүк) төмөнкү деңгээлдеги орто кодуна айландырылат. Компилятор машина кодун түзүү үчүн MLIRди колдогон ар кандай бэкенддерди колдонууга мүмкүндүк берет.
Среди изменений в 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
