Mojo to nowoczesny język programowania zaprojektowany specjalnie pod potrzeby epoki AI: łączy prostotę Pythona z wydajnością C++/Rust oraz głęboką integracją z akceleratorami obliczeń. Dzięki temu pozwala pisać zarówno kod eksperymentalny, jak i produkcyjne jądra numeryczne i systemy AI w jednym spójnym ekosystemie.

Czym jest język programowania Mojo i kto za nim stoi?
Mojo powstał w firmie Modular, którą współtworzy Chris Lattner – autor LLVM i języka Swift – oraz Tim Davis, specjalizujący się w infrastrukturze AI. Ich ambicją jest „jeden język dla AI”: taki, który nadaje się do szybkiego prototypowania jak Python, ale jednocześnie zapewnia kontrolę nad pamięcią i sprzętem jak języki systemowe.
W praktyce Mojo ma wypełnić lukę między światem researchu (notebooki, biblioteki Pythona) a światem produkcyjnym (ręcznie optymalizowany C++/CUDA, różne runtime’y i toolchainy). Zamiast klejenia wielu technologii, programista ma jeden język i jeden łańcuch narzędzi, który obejmuje CPU, GPU i inne akceleratory.
Fundament: MLIR zamiast „gołego” LLVM
Kluczową przewagą Mojo jest oparcie kompilatora na MLIR (Multi-Level Intermediate Representation), warstwie pośredniej zaprojektowanej do reprezentowania kodu na różnych poziomach abstrakcji. MLIR pozwala zachować informacje o typach, kształtach tensorów i strukturze programu dużo dłużej w kompilacji, co otwiera drogę do głębszych optymalizacji niż w klasycznym pipeline LLVM.
Dzięki różnym „dialektom” MLIR ten sam kod Mojo może być specjalizowany dla CPU, GPU, TPU czy dedykowanych ASIC, przy zachowaniu jednej powierzchni języka. To szczególnie ważne w AI, gdzie model musi być przenoszony między chmurą, lokalnymi GPU, a czasem niestandardowym sprzętem bez przepisywania krytycznych fragmentów.
Składnia i model programowania
Na poziomie składni Mojo jest celowo bardzo zbliżone do Pythona: wykorzystuje wcięcia, znane słowa kluczowe (def, for, if), klasy i „dunder” metody, by próg wejścia dla pythonowców był minimalny. Jednocześnie wprowadza konstrukcje typowe dla języków systemowych: struct zamiast klasy dziedziczącej, kompozycję zamiast dziedziczenia i ścisłą kontrolę nad cyklem życia obiektów.
Język obsługuje zarówno dynamiczne, jak i statyczne typowanie: pisząc prototypy, można korzystać z dynamiki, a w krytycznych fragmentach włączyć mocne typy, parametry typów oraz metaprogramowanie kompilacyjne. Mojo wspiera dwa słowa kluczowe do funkcji – def i fn – oraz rozróżnia parametry kompilacyjne (stałe znane w czasie kompilacji) od argumentów czasu wykonania, co ułatwia generowanie wyspecjalizowanych wersji funkcji.
Własność, referencje i pamięć
Zarządzanie pamięcią w Mojo przypomina podejście znane z Rust i nowoczesnego C++: zamiast garbage collectora stosuje się model własności, referencji i pożyczania. Konwencje przekazywania parametrów – domyślne niezmienne referencje (read), mutowalne (mut) oraz własnościowe (owned) – jasno opisują, kto odpowiada za zasób i kiedy może zostać on przeniesiony lub zmodyfikowany.
Cykl życia typów można wprost kształtować za pomocą specjalnych metod, takich jak init, copyinit (kopiowanie głębokie) czy movecopy (przeniesienie), co zbliża model do RAII z C++, ale w bardziej spójny i przewidywalny sposób. Takie podejście umożliwia pisanie kodu o przewidywalnych czasach działania (brak stop-the-world GC), co ma krytyczne znaczenie w systemach runtime i usługach AI na dużą skalę.

