Mojo обновления надо регулярно отслеживать.
Пламенный привет посетителям этой страницы, пришедшим из социальных сетей, да и всем остальным тоже!
В апреле 2021-го года наблюдал удивительное явление: обильный поток посетителей из 4-х социальных сетей. В связи с этим настоятельно рекомендую всем неоднократно и регулярно посещать сайт rtbsm.ru — там в общих чертах изложена Российская Теннисная Балльная Система Марии (Шараповой).
Приглашаю всех полюбоваться на Фото и Видео красавицы Марии — надеюсь, что Вы поделитесь адресом сайта rtbsm.ru с друзьями и знакомыми.
Главная проблема — известить Марию, чтобы она лично как можно скорее заявила на весь мир о РТБСМ.
Mojo обновления в 2024-м году появляются регулярно: в среднем примерно раз в месяц, поэтому надо их отслеживать и обновлять свою версию MOJO.
Крайняя версия от 7-го июня 2024-го года:
версия 24.4 (2024-06-07)
✨ Основные моменты
Важные темы для этого выпуска:
- Улучшена производительность и простота использования
def
функций.- Продолжена унификация стандартных библиотечных API вокруг
UnsafePointer
типа.- Множество улучшений качества жизни для стандартных типов библиотечных коллекций.
- Значительные улучшения производительности при вставке в
Dict
. Производительность по этому показателю всё ещё не такая, какой мы хотели бы её видеть, но она значительно улучшена.- Новый
@parameter for
механизм для выражения циклов времени компиляции, который заменяет более ранний (и менее надёжный)@unroll
декоратор.- Новые страницы руководства Mojo по потоку управления, тестированию и использованию небезопасных указателей.
На странице, адрес которой приведен чуть ниже, вверху правой колонки можно посмотреть номер новой версии Mojo и дату её публикации, а в основном тексте перечислены особенности новой версии.
Привожу информацию со страницы https://docs.modular.com/mojo/changelog :
- Проект
- Журнал изменений
Журнал изменений Mojo
Это текущий список существенных изменений языка и инструментов Mojo. Он не включает все внутренние изменения реализации.
Обновите Моджо
Если у Вас ещё нет Mojo, см. руководство по началу работы .
Чтобы увидеть свою версию Mojo, запустите это:
mojo --version
modular update mojo
v24.3 (02.05.2024 )
✨ Основные моменты
AnyPointer
был переименован вUnsafePointer
и теперь является предпочтительным типом небезопасного указателя Mojo. Он имеет несколько улучшений, в том числе:
- Тип элемента теперь может быть любым: для этого не требуется
Movable
.- По этой причине
take_value()
методыemplace_value()
, иmove_into()
были заменены на функции верхнего уровня и переименованы. Новые функции:- Новая
destroy_pointee()
функция запускает деструктор указателя.UnsafePointer
может быть инициализирован непосредственно изReference
withUnsafePointer(someRef)
и преобразован в ссылку с помощьюyourPointer[]
. Оба выводят тип элемента и адресное пространство. Обратите внимание: когда вы преобразуете указатель в ссылку, Mojo не может отслеживать время жизни исходного значения. Таким образом, полученная ссылка не безопаснее исходного указателя.- Все типы указателей подверглись некоторой очистке, чтобы сделать их более согласованными, например,
unsafe.bitcast()
глобальная функция теперь является согласованнымbitcast()
методом для указателей, который может преобразовывать тип элемента и адресное пространство.- Улучшения в поддержке переменных аргументов.
- Аргументы гетерогенного пакета с вариациями теперь надежно работают даже с типами памяти и имеют более удобный для использования API, определенный типом
VariadicPack
. Например, упрощенную версиюfnprint[T: Stringable,*Ts: Stringable](first: T,*rest:*Ts): print_string(str(first)) @parameter fn print_elt[T: Stringable](a: T): print_string(" ") print_string(a) rest.each[print_elt]()
- Mojo теперь поддерживает объявление функций, которые имеют как необязательные, так и переменные аргументы, как позиционные, так и только ключевые слова. Например, теперь это работает:
fnvariadic_arg_after_default( a: Int, b: Int =3,*args: Int, c: Int, d: Int =1,**kwargs: Int ):...
Позиционные вариационные параметры также работают при наличии необязательных параметров. То есть:
fn variadic_param_after_default[e: Int, f: Int =2,*params: Int](): pass
Обратите внимание, что параметры ключевого слова с переменным числом вариантов пока не поддерживаются.
Для получения дополнительной информации см. аргументы Variadic в Руководстве Mojo.
- Команды
mojo build
иmojo run
теперь поддерживают-g
опцию. Этот более короткий псевдоним эквивалентен написанию--debug-level full
. Эта опция также доступна вmojo debug
команде, но уже используется по умолчанию.- Было добавлено множество новых API стандартных библиотек, в том числе множество вкладов сообщества. Изменения перечислены в разделе стандартной библиотеки.
- В Руководстве Mojo появилась новая страница «Типы» .
Языковые изменения
- Некоторые методы dunder, которые принимают индексы (
__getitem__()
,__setitem__()
и__refitem__()
) или имена (__getattr__()
и__setattr__()
), теперь могут принимать индекс или имя в качестве значения параметра, а не значения аргумента. Это становится возможным, когда вы определяете один из этих методов без каких-либо аргументов, кромеself
(для метода получения) илиself
заданного значения (для метода установки).Это позволяет использовать типы, индексация которых может осуществляться только с помощью параметров, а также такие вещи, как следующий пример, в котором имя атрибута передается в качестве параметра, чтобы имена атрибутов можно было проверить во время компиляции.structRGB: fn __getattr__[name: StringLiteral](self)-> Int: @parameter if name =="r":return... elif name =="g":return... else: constrained[name =="b","can only access with r, g, or b members"]() return... var rgb = RGB() print(rgb.b)# Works print(rgb.q)# Compile error
- Mojo теперь позволяет пользователям фиксировать расположение исходного кода и динамически вызывать расположение функций с помощью встроенных функций
__source_location()
и__call_location()
. Например:@always_inline fnmy_assert(cond: Bool, msg: String): ifnot cond: var call_loc = __call_location() print("In", call_loc.file_name,"on line",str(call_loc.line)+":", msg) fnmain(): my_assert(False,"always fails")# some_file.mojo, line 193
Это печатает »
In /path/to/some_file.mojo on line 193: always fails
«. Обратите внимание, что__call_location()
работает только в функциях@always_inline
или@always_inline("nodebug")
. Он дает неправильные результаты, если его поместить в@always_inline
функцию, вызываемую из функции@always_inline("nodebug")
.Ни один из
__source_location()
них не__call_location()
работает при вызове в контексте параметра. Например:@always_inline fnmystery_location()-> String: var loc = __call_location() returnstr(loc.file_name) defmain(): alias doesnt_work = mystery_location()# <unknown location in parameter context>
Изменения в стандартной библиотеке
⭐️ Новинка
List
имеет несколько новых методов:
pop(index)
для удаления элемента по определенному индексу. По умолчаниюList.pop()
удаляет последний элемент в списке. ( @LJ-9801 , исправления #2017 )resize(new_size)
для изменения размера списка без необходимости указания дополнительного значения. ( @mikowals , исправления #2133 )insert(index, value)
для вставки значения по указанному индексу в файлList
. ( @whym1here , исправления #2134 )- Новый конструктор
List(ptr, size, capacity)
, позволяющий избежать необходимости делать глубокую копию существующего непрерывного выделения памяти при создании нового файлаList
. ( @StandinKP , исправления #2170 )Dict
теперь естьupdate()
метод обновления ключей/значений из другого файлаDict
. ( @gabrieldemarmiesse )Set
теперь имеет именованные методы для операций над множествами:
difference()
сопоставление с-
difference_update()
сопоставление с-=
intersection_update()
сопоставление с&=
update()
сопоставление с|=
( @arvindavoudi )
Dict
,List
, иSet
все соответствуютBoolable
признаку. Коллекции оцениваются,True
содержат ли они какие-либо элементы,False
в противном случае:deflist_names(names: List[String]): if names: for name in names: print(name[]) else: print("No names to list.")
- Добавлена
reversed()
функция создания обратных итераторов. Несколько типов диапазонов,List
, иDict
теперь поддерживают обратную итерацию.var numbers = List(1,2,3,4,5) for number inreversed(numbers): print(number)
( @helehex и @jayzhan211 , внесли свой вклад в #2325 )
Optional
теперь реализует__is__
и__isnot__
методы, чтобы вы могли сравнить ихOptional
сNone
. Например:var opt = Optional(1) if opt isnotNone: print(opt.value()[])
Tuple
теперь работает с типами элементов, занимающими только память, например,String
и позволяет напрямую индексировать их с помощью выражения параметра. Это означает, что теперь вы можете просто использоватьx = tup[1]
Python вместоx = tup.get[1, Int]()
. Теперь вы также можете назначать элементы кортежа с помощьюtup[1] = x
.vartuple=("Green",9.3) var name =tuple[0] var value =tuple[1]
Обратите внимание: поскольку нижний индекс должен быть выражением параметра, вы не можете выполнять итерацию с
Tuple
помощью обычногоfor
цикла.- Тип
Reference
претерпел несколько изменений, в том числе:
- Он переехал в
memory.reference
модуль вместоmemory.unsafe
.Reference
теперь имеетunsafe_bitcast()
метод, аналогичный типам указателей.- Было удалено несколько небезопасных методов, в том числе
offset()
,destroy_element_unsafe()
иemplace_ref_unsafe()
. Это потому, чтоReference
это безопасный тип — используйте егоUnsafePointer
для выполнения небезопасных операций.Bool
теперь может быть неявно преобразован из любого типа, соответствующегоBoolable
признаку. Это означает, что вам больше не нужно писать такой код:@value structMyBoolable: fn__bool__(self)-> Bool:... fn takes_boolable[T: Boolable](cond: T):... takes_boolable(MyBoolable())
Вместо этого вы можете просто написать:
fntakes_bool(cond: Bool):... takes_bool(MyBoolable())
Обратите внимание, что вызовы
takes_bool()
будут выполнять неявное преобразование, поэтому в некоторых случаях все же лучше явно объявить параметр типа, например:fn takes_two_boolables[T: Boolable](a: T, b: T): # Short circuit means `b.__bool__()` might not be evaluated. if a.__bool__()and b.__bool__(): ...
PythonObject
теперь соответствуетKeyElement
признаку, а это означает, что его можно использовать в качестве типа ключа дляDict
. Это позволяет вам легко создавать словари Python и взаимодействовать с ними в Mojo:defmain(): d = PythonObject(Dict[PythonObject, PythonObject]()) d["foo"]=12 d[7]="bar" d["foo"]=[1,2,"something else"] print(d)# prints `{'foo': [1, 2, 'something else'], 7: 'bar'}`
FileHandle.seek()
теперь имеетwhence
аргумент, который по умолчанию выполняетos.SEEK_SET
поиск с начала файла. Теперь вы можете установитьos.SEEK_CUR
смещение на текущуюFileHandle
позицию поиска:var f =open("/tmp/example.txt") # Skip 32 bytes f.seek(os.SEEK_CUR,32)
Или
os.SEEK_END
для смещения от конца файла:# Start from 32 bytes before the end of the file f.seek(os.SEEK_END,-32)
FileHandle.read()
теперь можно читать прямо вDTypePointer
:varfile=open("/tmp/example.txt","r") # Allocate and load 8 elements var ptr = DTypePointer[DType.float32].alloc(8) varbytes=file.read(ptr,8) print("bytes read",bytes) print(ptr.load[width=8]())
- Модуль
sys
теперь содержитexit()
функцию, которая завершает программу Mojo с указанным кодом ошибки.from sys import exit exit(0)
- Конструкторы for
Tensor
были изменены, чтобы сделать их более последовательными. В результате конструкторы принимают форму в качестве первого аргумента (а не второго) при построении тензора с данными указателя.Если вы передаете конструктору одно скалярное значениеTensor
, он теперь передает это значение всем элементам тензора. Например,Tensor[DType.float32](TensorShape(2,2), 0)
создает2x2
тензор, инициализированный всеми нулями. Это обеспечивает простой способ заполнения данных тензора.String
теперь естьremoveprefix()
иremovesuffix()
методы. ( @gabrieldemarmiesse )- Функции
ord
иchr
были улучшены и позволяют принимать любые символы Юникода. ( @mzaks , способствует #1616 )atol()
теперь обрабатывает пробелы. Функцияatol()
используется внутриString.__int__()
, поэтомуint(String( " 10 "))
теперь возвращает результат10
, а не выдает ошибку. ( @artemiogr97 )SIMD
теперь реализует__rmod__()
метод. ( @bgreni , исправления #1482 )bool(None)
сейчас реализовано. ( @zhoujingya )- Тип
DTypePointer
теперь реализуетgather()
сборSIMD
вектора по смещениям текущего указателя. Аналогичным образом была добавлена поддержкаscatter()
разбросаSIMD
вектора по смещениям текущего указателя. ( @leandrolcampos )- Функция
len()
теперь обрабатываетrange()
указанное значение с отрицательным конечным значением, поэтому такие вещиlen(range(-1))
работают правильно. ( @сорарос )debug_assert()
теперь печатает его местоположение (имя файла, строку и столбец, в котором он был вызван) в сообщении об ошибке. Аналогично,assert
помощники вtesting
модуле теперь включают в свои сообщения информацию о местоположении.- Функция
testing.assert_equal[SIMD]()
теперь вызывается, если какой-либо из элементов не совпадает в двухSIMD
сравниваемых аргументах. ( @gabrieldemarmiesse )- Функции
testing.assert_almost_equal()
иmath.isclose()
теперь имеютequal_nan
флаг. Если установлено значениеTrue
, NaN считаются равными.- Тип
object
теперь поддерживает операторы деления, по модулю, а также сдвигов влево и вправо, включая варианты на месте и в обратном направлении. ( @LJ-9801 , исправления #2224 )- Добавлены проверяемые арифметические операции для
SIMD
целых чисел.SIMD
Целочисленные типы (включая скаляры целых чисел, такие какInt64
) теперь могут выполнять проверенные сложения, вычитания и умножения, используя следующие новые методы:Проверенная арифметика позволяет вызывающей стороне определить, превысила ли операция числовые пределы типа. Например:
var simd = SIMD[DType.int8,4](7,11,13,17) var product: SIMD[DType.int8,4] var overflow: SIMD[DType.bool,4] (product, overflow)= simd.mul_with_overflow(simd) for i inrange(len(product)): if overflow[i]: print("<overflow>") else: print(product[i])
( @лш )
- Добавлен
os.remove()
иos.unlink()
для удаления файлов. ( @artemiogr97 , исправления #2306 )Изменился
- Функция
parallel_memcpy()
переехала изbuffer
пакета вalgorithm
пакет. Пожалуйста, обновите импорт соответствующим образом.Optional.value()
теперь возвращает ссылку вместо копии содержащегося значения.Чтобы выполнить копирование вручную, разыменуйте результат:var result = Optional(123) var value = result.value()[]
- В соответствии с принятым предложением сообщества « Стандартизировать представление последовательности байтов в виде последовательности 8-битных целых чисел без знака » переход к использованию начался
UInt8
с изменения указателя данныхError
наDTypePointer[DType.uint8]
. ( @gabrieldemarmiesse , вносит свой вклад в #2317 )- Продолжается переход
UnsafePointer
от устаревшегоPointer
типа в различных API и внутренних компонентах стандартной библиотеки. ( @gabrieldemarmiesse )Изменения в инструментах
- Поведение
mojo build
при вызове без выходного-o
аргумента немного изменилось:mojo build ./test-dir/program.mojo
теперь исполняемый файл выводится в путь./program
, тогда как раньше он выводился в путь./test-dir/program
.- Команда
mojo package
больше не поддерживает этот-D
флаг. Все флаги среды компиляции должны быть предоставлены в момент использования пакета (например,mojo run
илиmojo build
).- REPL больше не позволяет неинициализировать объявления переменных уровня типа, например, он будет отклонять
var s: String
. Это связано с тем, что он не обеспечивает надлежащего отслеживания времени жизни (пока!) между ячейками, и такой код может привести к сбою. Эту проблему можно обойти, инициализировав фиктивное значение и перезаписав его позже. Это ограничение применимо только к переменным верхнего уровня, переменные в функциях работают так же, как и всегда.Другие изменения
Языковые изменения
- Была добавлена встроенная функция низкого уровня,
__get_mvalue_as_litref(x)
предоставляющая доступ к базовому представлению памяти в виде!lit.ref
значения без проверки статуса инициализации базового значения. Это полезно в логике очень низкого уровня, но не предназначено для общего удобства использования и, вероятно, изменится в будущем.- Свойства теперь можно указывать во встроенных операциях MLIR:
_ =__mlir_op.`kgen.source_loc`[ _type =( __mlir_type.index,__mlir_type.index,__mlir_type.`!kgen.string` ), _properties =__mlir_attr.`{inlineCount =1: i64}`, ]()
Как показано в примере выше,
_properties
атрибут protected можно передать во время построения операции соDictionaryAttr
значением MLIR.❌ Удален
- Поддержка пакетов вариаций «только для регистрации» удалена. Вместо
AnyRegType
, пожалуйста, обновите свой код доAnyType
таких примеров:fn your_function[*Types: AnyRegType](*args:*Ts):...
Этот шаг дает вам доступ к более удобному API и имеет то преимущество, что он безопасен для памяти и корректен для нетривиальных типов. Если вам нужны конкретные API для типов, используйте правильный признак вместо
AnyType
.List.pop_back()
был удален. Вместо этого используйтеList.pop()
вариант, который по умолчанию выталкивает последний элемент в списке.SIMD.to_int(value)
был удален. Используйтеint(value)
вместо этого.- Магическая
__get_lvalue_as_address(x)
функция удалена. Чтобы получить ссылку на использование значенияReference(x)
и если вам нужен небезопасный указатель, вы можете использоватьUnsafePointer.address_of(x)
.️ Исправлено
- #516 и #1817 и многие другие, например «Невозможно создать функцию, возвращающую две строки».
- #1178 (os/kern) сбой (5).
- #1609 псевдоним с
DynamicVector[Tuple[Int]]
ошибками.- #1987 На данный момент определение
main
в пакете Mojo является ошибкой. Это пока не предназначено для работы, ошибки на данный момент помогут предотвратить случайное неопределенное поведение.- #1215 и #1949 Сервер Mojo LSP больше не отключает предварительный просмотр при наведении для функций с функциональными аргументами, параметрами или результатами.
- #1901 Исправлена обработка Mojo LSP и генерации документации для входных аргументов.
- #1913 -
0__
парсер Mojo больше не аварийно завершает работу.- #1924 Исправлена JIT-отладка на Mac.
- #1941 Вариативные аргументы Mojo не работают с нетривиальными типами, состоящими только из регистров.
- #1963
a!=0
теперь правильно анализируется и форматируется с помощьюmojo format
.- #1676 Исправлен сбой, связанный с
@value
декоратором и структурами с пустым телом.- #1917 Исправлен сбой после синтаксической ошибки во время создания кортежа.
- #2006 Mojo LSP теперь правильно поддерживает типы подписей с именованными аргументами и параметрами.
- #2007 и #1997 Mojo LSP больше не аварийно завершает работу при определенных типах замыканий.
- #1675 Обеспечить
@value
корректный сбой декоратора после ошибки дублирования поля.- #2068 Исправление
SIMD.reduce()
размера _out == 2. ( @soraros ).
…
!…
Приглашаю всех высказываться в Комментариях. Критику и обмен опытом одобряю и приветствую. В особо хороших комментариях сохраняю ссылку на сайт автора!
И не забывайте, пожалуйста, нажимать на кнопки социальных сетей, которые расположены под текстом каждой страницы сайта.
Продолжение тут…