Chris Lattner, osnivač i glavni arhitekta LLVM-a i kreator programskog jezika Swift, i Tim Davis, bivši šef Google AI projekata kao što su Tensorflow i JAX, predstavili su novi programski jezik, Mojo, koji kombinuje jednostavnost upotrebe za razvoj istraživanja i brza izrada prototipa sa potencijalom za formulisanje krajnjih proizvoda visokih performansi. Prvi se postiže upotrebom poznate sintakse jezika Python, a drugi mogućnošću prevođenja u mašinski kod, mehanizama koji su sigurni u memoriju i upotrebom alata za hardversko ubrzanje.
Projekat je fokusiran na upotrebu za razvoj u oblasti mašinskog učenja, ali je predstavljen kao jezik opšte namene koji proširuje mogućnosti Pythona alatima za sistemsko programiranje i pogodan je za širok spektar zadataka. Na primjer, jezik je primjenjiv u oblastima kao što su računarstvo visokih performansi, obrada podataka i transformacija. Zanimljiva karakteristika Mojo-a je mogućnost navođenja emoji znaka "🔥" kao ekstenzije za datoteke koda (na primjer, "helloworld.🔥"), pored tekstualne ekstenzije ".mojo".
Trenutno je jezik u fazi intenzivnog razvoja i samo je online interfejs ponuđen na testiranje. Obećano je da će odvojeni sklopovi za rad na lokalnim sistemima biti objavljeni kasnije, nakon dobijanja povratnih informacija o radu interaktivnog web okruženja. Planirano je da se izvorni kod za kompajler, JIT i ostala razvoja vezana za projekat otvori nakon što se završi interna arhitektura (model razvoja radnog prototipa iza zatvorenih vrata podsjeća na početnu fazu razvoja LLVM, Clang i Swift). Pošto je Mojo sintaksa bazirana na jeziku Python, a sistem tipova je blizak C/C++, u budućnosti planiraju da razviju alate za pojednostavljenje prevoda postojećih projekata napisanih na C/C++ i Python-u u Mojo, kao i razvijati hibridne projekte koji kombinuju Python kod i Mojo.
Projekt je osmišljen tako da uključi raspoložive hardverske resurse heterogenih sistema u izvođenje proračuna. Na primjer, GPU-ovi, specijalizovani akceleratori mašinskog učenja i vektori instrukcija procesora (SIMD) mogu se koristiti za pokretanje Mojo aplikacija i paraleliziranje računanja. Razlozi koji se navode za razvoj zasebnog podskupa Python-a umjesto pridruživanja postojećem radu na optimizaciji CPython-a su fokus na kompilaciji, integraciju mogućnosti sistemskog programiranja i korištenje fundamentalno različite interne arhitekture koja omogućava izvršavanje koda na GPU-u i raznim hardverski akceleratori. Međutim, Mojo programeri namjeravaju ostati kompatibilni sa CPythonom što je više moguće.
Mojo se može koristiti kako u načinu interpretacije koristeći JIT, tako i za kompilaciju u izvršne datoteke (AOT, unaprijed). Kompajler ima ugrađene moderne tehnologije za automatsku optimizaciju, keširanje i distribuiranu kompilaciju. Izvorni tekstovi na Mojo jeziku se konvertuju u srednji kod niskog nivoa MLIR (Multi-Level Intermediate Representation), razvijen od strane LLVM projekta i koji pruža dodatne mogućnosti za optimizaciju obrade grafa toka podataka. Kompajler vam omogućava da koristite različite pozadine koje podržavaju MLIR za generisanje mašinskog koda.
Korišćenje dodatnih hardverskih mehanizama za ubrzavanje proračuna omogućava postizanje performansi koje su superiornije od C/C++ aplikacija tokom intenzivnih proračuna. Na primjer, prilikom testiranja aplikacije za generiranje Mandelbrot skupa, kompajlirana aplikacija na Mojo jeziku kada se izvršava u AWS oblaku (r7iz.metal-16xl) pokazala se 6 puta bržom od implementacije u C++ (0.03 s vs. 0.20 sek.), a takođe 35 hiljada puta brže od Python aplikacije kada se koristi standardni CPython 3.10.9 (0.03 sek. naspram 1027 sek.) i 1500 puta brže kada se koristi PYPY (0.03 sek. naspram 46.1 sek.) .
Prilikom procene performansi u oblasti rešavanja problema mašinskog učenja, AI stack Modular Inference Engine, napisan na Mojo jeziku, u poređenju sa rešenjem baziranim na TensorFlow biblioteci, bio je 3 puta brži pri obradi jezičkog modela na sistemu sa Intelov procesor, 6.4 puta brži pri obradi izvršenja modela generisanja preporuka i 2.1 puta brži kada se radi sa modelima za obradu vizuelnih informacija. Kada se koriste AMD procesori, dobici pri korišćenju Mojo su bili 3.2, 5 i 2.2 puta, a kada se koriste ARM procesori - 5.3, 7.5 i 1.7 puta, respektivno. Rešenje zasnovano na PyTorch-u zaostajalo je za Mojom 1.4, 1.1 i 1.5 puta na Intelovim procesorima, 2.1, 1.2 i 1.5 puta na AMD CPU-ima i 4, 4.3 i 1.3 puta na ARM CPU-ima.

Jezik podržava statičko kucanje i niskorazine bezbedne funkcije memorije koje podsećaju na Rust, kao što je praćenje referentnog životnog veka i provera zaduživanja. Pored mogućnosti za bezbedan rad sa pokazivačima, jezik takođe nudi funkcije za rad na niskom nivou, na primer, direktan pristup memoriji u nesigurnom režimu pomoću tipa Pointer, pozivanje pojedinačnih SIMD instrukcija ili pristup hardverskim ekstenzijama kao što su TensorCores i AMX .

Da bi se pojednostavilo razdvajanje klasičnog i optimizovanog Python koda za funkcije sa eksplicitnim definicijama tipa za sve varijable, predlaže se korištenje posebne ključne riječi “fn” umjesto “def”. Slično za klase, ako trebate statički spakovati podatke u memoriju tokom kompilacije (kao u C), možete koristiti tip “struct” umjesto “class”. Također je moguće jednostavno uvesti module u C/C++ jezicima, na primjer, da biste uvezli cos funkciju iz matematičke biblioteke, možete specificirati “iz “math.h” import cos”.
izvor: opennet.ru
