Chris Lattner, zakladatel a hlavní architekt LLVM a také tvůrce programovacího jazyka Swift, a Tim Davis, bývalý vedoucí AI projektů Google, jako je TensorFlow a JAX, představili nový programovací jazyk Mojo, který kombinuje snadnost použití pro výzkumný vývoj a rychlé prototypování s vhodností pro vytváření vysoce výkonných konečných produktů. Toho je dosaženo díky použití běžné syntaxe jazyka Python, a také díky možnosti kompilace do strojového kódu, mechanismům bezpečné správy paměti a zapojení prostředků pro hardwarové zrychlení výpočtů.
Projekt se zaměřuje na využití pro vývoj v oblasti strojového učení, avšak je prezentován jako jazyk obecného určení, který rozšiřuje možnosti jazyka Python prostředky systémového programování a je vhodný pro široké spektrum úloh. Například jazyk je použitelný v oblastech jako jsou vysoce výkonné výpočty, zpracování a transformace dat. Zajímavou vlastností Mojo je možnost použití emoji symbolu „🔥“ jako přípony pro soubory s kódem (například „helloworld.🔥“), kromě textové přípony „.mojo“.
V současné době se jazyk nachází ve fázi intenzivního vývoje a pro testování je k dispozici pouze online rozhraní. Oddělené verze pro spuštění na lokálních systémech by měly být vydány později, po obdržení zpětné vazby o fungování interaktivního webového prostředí. Zdrojové kódy kompilátoru, JIT a dalších souvisejících projektů plánují otevřít po dokončení návrhu vnitřní architektury (model vývoje pracovního prototypu za zavřenými dveřmi připomíná počáteční fázi vývoje LLVM, Clang a Swift). Vzhledem k tomu, že syntaxe Mojo je založena na jazyce Python a systémy typů jsou blízké C/C++, v budoucnu se plánuje vyvinout nástroje pro usnadnění převodu existujících projektů napsaných v C/C++ a Python do Mojo, stejně jako pro vývoj hybridních projektů, které kombinují kód v Pythonu a Mojo.
Projekt je zaměřen na využití dostupných výpočetních zdrojů existujících v heterogenních systémech. Například pro provádění aplikací v jazyce Mojo a paralelizaci výpočtů mohou být zapojeny GPU, specializované akcelerátory pro strojové učení a instrukce vektorového procesoru (SIMD). Důvodem pro rozvoj specifického podmnožství jazyka Python, namísto optimalizace stávajícího CPythonu, je zaměření na kompilaci, integraci možností systémového programování a použití fundamentally odlišné vnitřní architektury, která umožňuje provádět kód na GPU a různých hardwarových akcelerátorech. Přitom se vývojáři Mojo snaží co nejvíce dodržovat kompatibilitu s CPythonem.
Mojo může být používán jak v režimu interpretace s použitím JIT, tak pro kompilaci do spustitelných souborů (AOT, ahead-of-time). Kompilátor obsahuje moderní technologie automatické optimalizace, caching a distribuované kompilace. Zdrojové kódy v jazyce Mojo jsou přetvářeny do nízkoúrovňového mezikódu MLIR (Multi-Level Intermediate Representation), vyvíjeného projektem LLVM, který poskytuje další možnosti pro optimalizaci zpracování grafu toků dat. Kompilátor umožňuje používat různé backendy pro generaci strojového kódu, které podporují MLIR.
Využití dalších hardwarových mechanismů pro zrychlení výpočtů umožňuje dosáhnout výkonu, který při intenzivních výpočtech překonává aplikace na C/C++. Například při testování aplikace pro generování množiny Mandelbrot, se ukázalo, že aplikace skompilovaná v jazyce Mojo při běhu v cloudu AWS (r7iz.metal-16xl) byla 6krát rychlejší než implementace v C++ (0.03 sek. proti 0.20 sek.), a také 35 tisíckrát rychlejší než aplikace v Pythonu pomocí standardního CPython 3.10.9 (0.03 sek. proti 1027 sek.) a 1500krát rychlejší při použití PYPY (0.03 sek. proti 46.1 sek.).
Při hodnocení výkonu v oblasti řešení úloh strojového učení se AI-stack Modular Inference Engine napsaný v jazyce Mojo ukázal na systému s procesorem Intel být třikrát rychlejší při zpracování jazykového modelu, 6,4krát rychlejší při provádění modelu doporučení a 2,1krát rychlejší při práci s modely pro zpracování vizuálních informací. Při použití procesorů AMD bylo zvýšení účinnosti s použitím Mojo 3,2, 5 a 2,2krát a při použití procesorů ARM - 5,3, 7,5 a 1,7krát, v tomto pořadí. Řešení na bázi PyTorch zaostávalo za Mojo 1,4, 1,1 a 1,5krát na CPU Intel, 2,1, 1,2 a 1,5krát na CPU AMD a 4, 4,3 a 1,3krát na CPU ARM.

Jazyk podporuje statickou typizaci a prostředky pro bezpečnou nízkoúrovňovou práci s pamětí, připomínající možnosti jazyka Rust, jako je sledování doby života odkazů a kontrola půjčování proměnných (borrow checker). Kromě prostředků pro bezpečnou práci s ukazateli nabízí jazyk i možnosti pro nízkoúrovňovou práci, například přímý přístup k paměti v režimu unsafe pomocí typu Pointer, volání jednotlivých SIMD příkazů nebo přístup k hardwarovým rozšířením, jako jsou TensorCores a AMX.

Pro zjednodušení oddělení klasického a optimalizovaného Python kódu pro funkce s explicitním určením typů pro všechny proměnné bylo navrženo používat samostatné klíčové slovo „fn“ místo „def“. Podobně pro třídy, pokud je potřeba statická balení dat v paměti během kompilace (jak v C), lze použít typ „struct“ místo „class“. Také je možné snadno importovat moduly v jazycích C/C++, například pro import funkce cos z knihovny math lze uvést „from 'math.h' import cos“.
Zdroj: opennet.ru
