Mojo обновления

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
Чтобы обновить Mojo, сначала обновите modular , а затем запустите это:
modular update mojo

v24.3 (02.05.2024 )

✨ Основные моменты

  • AnyPointerбыл переименован в UnsafePointer и теперь является предпочтительным типом небезопасного указателя Mojo. Он имеет несколько улучшений, в том числе:
    • Тип элемента теперь может быть любым: для этого не требуется Movable.
    • По этой причине take_value()методы emplace_value(), и move_into() были заменены на функции верхнего уровня и переименованы. Новые функции:
    • Новая destroy_pointee() функция запускает деструктор указателя.
    • UnsafePointerможет быть инициализирован непосредственно из Reference with UnsafePointer(someRef)и преобразован в ссылку с помощью yourPointer[]. Оба выводят тип элемента и адресное пространство. Обратите внимание: когда вы преобразуете указатель в ссылку, Mojo не может отслеживать время жизни исходного значения. Таким образом, полученная ссылка не безопаснее исходного указателя.
  • Все типы указателей подверглись некоторой очистке, чтобы сделать их более согласованными, например, unsafe.bitcast() глобальная функция теперь является согласованным bitcast() методом для указателей, который может преобразовывать тип элемента и адресное пространство.
  • Улучшения в поддержке переменных аргументов.
    • Аргументы гетерогенного пакета с вариациями теперь надежно работают даже с типами памяти и имеют более удобный для использования API, определенный типом VariadicPack. Например, упрощенную версию printможно реализовать так:
      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 )

  • DictList, и Setвсе соответствуют Boolableпризнаку. Коллекции оцениваются, Trueсодержат ли они какие-либо элементы, Falseв противном случае:
    deflist_names(names: List[String]):
    if names:
    for name in names:
    print(name[])
    else:
    print("No names to list.")
    

    @gabrieldemarmiesse )

  • Добавлена 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()[])
    

    @gabrieldemarmiesse )

  • 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 )

 Изменился

Изменения в инструментах

  • Поведение 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 ).

!…

Приглашаю всех высказываться в Комментариях. Критику и обмен опытом одобряю и приветствую. В особо хороших комментариях сохраняю ссылку на сайт автора!

И не забывайте, пожалуйста, нажимать на кнопки социальных сетей, которые расположены под текстом каждой страницы сайта.
Mojo обновленияПродолжение тут…

Парк

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Проверка комментариев включена. Прежде чем Ваши комментарии будут опубликованы пройдет какое-то время.