Бэта-выпуск мовы праграмавання Mojo 1.0

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

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

Мова Mojo развіваецца пад кіраўніцтвам Крыса Латнера (Chris Lattner), заснавальніка і галоўнага архітэктара праекту LLVM і стваральніка мовы праграмавання Swift. Сінтаксіс 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.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 разоў).

Крыніца: opennet.ru