Представлен релиз языка программирования Mojo 1.2. Язык Mojo развивается под руководством Криса Латнера (Chris Lattner), основателя и главного архитектора проекта LLVM и создателя языка программирования Swift. Код компилятора и сопутствующего инструментария, необходимого для сборки проектов на языке Mojo, распространяется под лицензией Apache 2.0 c исключениями от проекта LLVM, допускающими смешивание с кодом под лицензией GPLv2.
Синтаксис Mojo основан на языке Python, а система типов близка к C/C++. Проект преподносится как язык общего назначения, расширяющий возможности языка Python средствами системного программирования, подходящий для широкого круга задач и сочетающий простоту применения для исследовательских разработок и быстрого создания прототипов с пригодностью для формирования высокопроизводительных конечных продуктов.
Простота достигается благодаря использованию привычного синтаксиса языка Python, а разработке конечных продуктов способствуют возможность компиляции в машинный код, механизмы безопасной работы с памятью и задействование средств для аппаратного ускорения вычислений. Для достижения высокой производительности поддерживается распараллеливание вычислений с задействованием всех имеющихся в системе аппаратных ресурсов гетерогенных систем, таких как GPU, специализированные ускорители для машинного обучения и векторные процессорные инструкции (SIMD). При интенсивных вычислениях распараллеливание и задействование всех вычислительных ресурсов даёт возможность добиться производительности, превосходящей приложения на C/C++. Язык поддерживает статическую типизацию и средства для безопасной низкоуровневой работы с памятью, напоминающие возможности языка Rust, такие как отслеживание времени жизни ссылок и проверка заимствования переменных (borrow checker). При этом в языке доступны и возможности для низкоуровневой работы, например, возможно прямое обращение к памяти в режиме unsafe с использованием типа Pointer, вызов отдельных SIMD-инструкций или доступ к аппаратным расширениям, таким как TensorCores и AMX.
Mojo может использоваться как в режиме интерпретации с использованием JIT, так и для компиляции в исполняемые файлы (AOT, ahead-of-time). В компилятор встроены современные технологии автоматической оптимизации, кэширования и распределённой компиляции. Исходный код на языке Mojo преобразуются в низкоуровневый промежуточный код MLIR (Multi-Level Intermediate Representation), развиваемый проектом LLVM. Компилятор позволяет применять для генерации машинного кода различные бэкенды, поддерживающие MLIR. Среди изменений в Mojo 1.2:
Источник: https://www.opennet.ru/opennews/art.shtml?num=66544
Синтаксис Mojo основан на языке Python, а система типов близка к C/C++. Проект преподносится как язык общего назначения, расширяющий возможности языка Python средствами системного программирования, подходящий для широкого круга задач и сочетающий простоту применения для исследовательских разработок и быстрого создания прототипов с пригодностью для формирования высокопроизводительных конечных продуктов.
Простота достигается благодаря использованию привычного синтаксиса языка Python, а разработке конечных продуктов способствуют возможность компиляции в машинный код, механизмы безопасной работы с памятью и задействование средств для аппаратного ускорения вычислений. Для достижения высокой производительности поддерживается распараллеливание вычислений с задействованием всех имеющихся в системе аппаратных ресурсов гетерогенных систем, таких как GPU, специализированные ускорители для машинного обучения и векторные процессорные инструкции (SIMD). При интенсивных вычислениях распараллеливание и задействование всех вычислительных ресурсов даёт возможность добиться производительности, превосходящей приложения на C/C++. Язык поддерживает статическую типизацию и средства для безопасной низкоуровневой работы с памятью, напоминающие возможности языка Rust, такие как отслеживание времени жизни ссылок и проверка заимствования переменных (borrow checker). При этом в языке доступны и возможности для низкоуровневой работы, например, возможно прямое обращение к памяти в режиме unsafe с использованием типа Pointer, вызов отдельных SIMD-инструкций или доступ к аппаратным расширениям, таким как TensorCores и AMX.
Mojo может использоваться как в режиме интерпретации с использованием JIT, так и для компиляции в исполняемые файлы (AOT, ahead-of-time). В компилятор встроены современные технологии автоматической оптимизации, кэширования и распределённой компиляции. Исходный код на языке Mojo преобразуются в низкоуровневый промежуточный код MLIR (Multi-Level Intermediate Representation), развиваемый проектом LLVM. Компилятор позволяет применять для генерации машинного кода различные бэкенды, поддерживающие MLIR. Среди изменений в Mojo 1.2:
- Добавлена поддержка сопоставления с образцом, используя конструкции match / case. В качестве образца могут использоваться литералы ("case 100:"), логические выражения с литералами ("case 100 | 200:"), кортежи ("case (10, 10, 10):"), структуры, ограничивающие условия ("case limit if limit > 10:") и шаблоны ("case _:"). Дополнительно реализовано выражение "comptime match" для выполнения проверки на этапе компиляции. def classify_point(p: Tuple[Int, Int]) -> String: match p: case 0, 0: return "origin" case x, 0 if x ‹ 0: return String("negative x-axis:", x) case x, 0: return String("x-axis:", x) case 0, y: return String("y-axis:", y) case x, y: return String("point:", x, ",", y) Добавлена поддержка деструктуризации списков, которая может использоваться как отдельно, так и внутри проверок в match: var [first, *middle, last] = values match values: case []: print("empty") case [1, *middle, last]: print(len(middle), last) case [first, *rest]: print(first, len(rest)) В выражения if, elif и while добавлена возможность использования конструкций "if case" и "while case" для проверки и извлечения данных. if case .Some(item) = value: return String("some:", item) else: return "none" while case .Some(item) = get_next(): process(item) В библиотеку std.math добавлено более 20 математических функций (atan(), tan(), cbrt(), erfc(), lgamma(), log10(), remainder(), hypot() и т.п.), доступных в вариантах, способных работать на CPU и GPU, и не использующих системную библиотеку libm. Добавлен тип TargetAccelerator для метаданных аппаратных ускорителей, сочетающий возможности типов GPUInfo и CompilationTarget. Добавлен синтаксис "not ‹Trait›" для отключения реализации определённых типажей (например, "struct Handle(not Movable, Writable):"), который рекомендуется использовать вместо "‹Trait› where False". Появилась возможность определения собственных сообщений об ошибках в проверочных выражениях where - "where ‹condition› else "‹message›". def foo[sc: Int]() where sc › 1 else "scaling factor must be greater than" Компилятор mojo переведён на выделение памяти при помощи библиотеки jemalloc на платформе Linux. Компиляция крупных пакетов и больших ядер для GPU ускорилась на 10-13%. Например, пакет nn теперь компилируется за 61 секунду вместо 98. Проведена оптимизация производительности. Операции выравнивания строк ускорены до 86 раз, а повторения больших строк через оператор "*" примерно в 2 раза. Значительно повышена производительность методов String.startswith() и String.endswith(). В среднем на 20% ускорен разбор чисел с плавающей запятой при помощи функции atof(). Структура StringSpan теперь предоставляет доступ к байтам строки только в режиме чтения (immutable). Поддержка структур MutStringSpan, MutStringSlice и параметра mut, позволявших напрямую изменять данные в строковом буфере, прекращена. Пустой кортеж "()" теперь всегда означает значение кортежа, а не тип. Для указания типа пустого кортежа следует указывать "Tuple[]". Ключевые слова async и await переименованы в "__async" и "__await для индикации их экспериментального статуса (старые варианты сохранены, но будут выдавать предупреждение).
Источник: https://www.opennet.ru/opennews/art.shtml?num=66544