Chris Lattner, der Gründer und Hauptarchitekt von LLVM sowie der Schöpfer der Programmiersprache Swift, und Tim Davis, ehemaliger Leiter von KI-Projekten bei Google, wie TensorFlow und JAX, haben eine neue Programmiersprache namens Mojo vorgestellt. Mojo kombiniert die Benutzerfreundlichkeit für Forschungsentwicklungen und schnelle Prototypenerstellung mit der Eignung zur Erstellung hochleistungsfähiger Endprodukte. Dies wird durch die Verwendung der vertrauten Python-Syntax erreicht, während die Eignung für leistungsstarke Anwendungen durch die Möglichkeit der Kompilierung in Maschinencode, sichere Speicherverwaltung und die Nutzung von Hardwarebeschleunigung realisiert wird.
Das Projekt konzentriert sich auf die Verwendung in der Entwicklung von maschinellem Lernen, wird jedoch als allgemeine Programmiersprache präsentiert, die die Möglichkeiten von Python durch systemnahe Programmierung erweitert und für eine Vielzahl von Aufgaben geeignet ist. Der Sprache ist in Bereichen wie Hochleistungsrechnen und Datenverarbeitung sowie -umwandlung anwendbar. Eine interessante Eigenschaft von Mojo ist die Möglichkeit, das Emoji-Symbol „🔥“ als Dateierweiterung für Code-Dateien zu verwenden (zum Beispiel „helloworld.🔥“), zusätzlich zur textuellen Erweiterung „.mojo“.
Die Sprache befindet sich derzeit in einer intensiven Entwicklungsphase und bietet nur eine Online-Oberfläche zu Testzwecken an. Abgetrennte Versionen für den Einsatz auf lokalen Systemen sollen später veröffentlicht werden, nachdem Rückmeldungen zur Funktionalität der interaktiven Webumgebung eingeholt wurden. Der Quellcode des Compilers, der JIT und anderer projektbezogener Entwicklungen wird nach Abschluss der Planung der internen Architektur zur Verfügung gestellt (das Entwicklungsmodell des funktionsfähigen Prototyps hinter verschlossenen Türen erinnert an die Anfänge von LLVM, Clang und Swift). Da die Syntax von Mojo auf der Programmiersprache Python basiert und das Typsystem dem von C/C++ ähnlich ist, ist geplant, in Zukunft Werkzeuge zu entwickeln, die die Übersetzung bestehender Projekte in Mojo, die in C/C++ und Python geschrieben sind, sowie die Entwicklung hybrider Projekte, die Code in Python und Mojo kombinieren, erleichtern.
Das Projekt zielt darauf ab, die vorhandenen Hardware-Ressourcen heterogener Systeme für Berechnungen zu nutzen. So können beispielsweise GPUs, spezialisierte Beschleuniger für maschinelles Lernen und Vektorprozessoranweisungen (SIMD) zur Ausführung von Anwendungen in der Sprache Mojo und zur Parallelisierung von Berechnungen herangezogen werden. Ein Grund für die Entwicklung eines spezifischen Teils der Sprache Python anstelle der Optimierung des bestehenden CPython ist der Fokus auf die Kompilierung, die Integration von Systemprogrammierungsfunktionen und die Verwendung einer grundsätzlich anderen internen Architektur, die es ermöglicht, Code auf GPUs und verschiedenen Hardware-Beschleunigern auszuführen. Gleichzeitig beabsichtigen die Entwickler von Mojo, soweit möglich die Kompatibilität mit CPython zu wahren.
Mojo kann sowohl im JIT-Interpretationsmodus als auch für die Kompilierung in ausführbare Dateien (AOT, ahead-of-time) verwendet werden. Der Compiler integriert moderne Technologien zur automatischen Optimierung, Caching und verteilten Kompilierung. Quelltexte in der Mojo-Sprache werden in niederwertigen Zwischen-Code MLIR (Multi-Level Intermediate Representation) umgewandelt, das vom LLVM-Projekt entwickelt wird und zusätzliche Möglichkeiten für die Optimierung der Datenflussgraphverarbeitung bietet. Der Compiler ermöglicht die Verwendung verschiedener Backends zur Generierung von Maschinencode, die MLIR unterstützen.
Der Einsatz zusätzlicher Hardwaremechanismen zur Beschleunigung von Berechnungen ermöglicht eine Leistung, die bei intensiven Berechnungen die von C/C++-Anwendungen übertrifft. So war beispielsweise bei einem Test einer Mandelbrot-Mengen-Generator-Anwendung die kompilierte Anwendung in Mojo, die in der AWS-Cloud (r7iz.metal-16xl) ausgeführt wurde, sechsmal schneller als die Implementierung in C++ (0,03 Sek. gegenüber 0,20 Sek.) und 35.000-mal schneller als die Anwendung in Python mit Standard CPython 3.10.9 (0,03 Sek. gegenüber 1.027 Sek.) sowie 1.500-mal schneller bei Nutzung von PYPY (0,03 Sek. gegenüber 46,1 Sek.).
Bei der Leistungsbewertung von Machine-Learning-Lösungen stellte sich heraus, dass der AI-Stack Modular Inference Engine, geschrieben in der Sprache Mojo, im Vergleich zur TensorFlow-basierten Lösung auf einem Intel-Prozessor dreimal schneller bei der Verarbeitung des Sprachmodells, 6,4-mal schneller bei der Ausführung von Empfehlungsmodellen und 2,1-mal schneller bei der Arbeit mit Modellen zur Verarbeitung visueller Informationen war. Bei der Verwendung von AMD-Prozessoren erzielte Mojo eine Leistungssteigerung von 3,2, 5 und 2,2-mal, während bei ARM-Prozessoren die Steigerungen 5,3, 7,5 und 1,7-mal betrugen. Die PyTorch-basierte Lösung lag im Vergleich zu Mojo um das 1,4-fache, 1,1-fache und 1,5-fache bei Intel-CPUs zurück, um das 2,1-fache, 1,2-fache und 1,5-fache bei AMD-CPUs und um das 4-fache, 4,3-fache und 1,3-fache bei ARM-CPUs.

Die Sprache unterstützt statische Typisierung und bietet Sicherheitsmechanismen für low-level Speicherarbeit, ähnlich den Funktionen der Sprache Rust, wie beispielsweise die Verwaltung der Lebensdauer von Referenzen und die Überprüfung des Variablenleihens (borrow checker). Neben den Sicherheitsmechanismen für Pointer bietet die Sprache auch Möglichkeiten für low-level Arbeiten, z. B. den direkten Zugriff auf den Speicher im unsafe-Modus mit dem Typ Pointer, die Ausführung spezifischer SIMD-Operationen oder den Zugriff auf Hardware-Erweiterungen wie TensorCores und AMX.

Um die Trennung von klassischem und optimiertem Python-Code für Funktionen mit expliziter Typdefinition für alle Variablen zu erleichtern, wird vorgeschlagen, ein separates Schlüsselwort „fn“ anstelle von „def“ zu verwenden. Ähnlich können für Klassen, falls eine statische Speicherung von Daten im Gedächtnis während der Kompilierung (wie in C) erforderlich ist, anstelle von „class“ der Typ „struct“ verwendet werden. Ein einfacher Import von Modulen in C/C++-Sprachen ist ebenfalls möglich, zum Beispiel für den Import der Funktion cos aus der Bibliothek math kann „from „math.h“ import cos“ angegeben werden.
Quelle: opennet.ru
