Chris Lattner, oprichter en hoofdarchitect van LLVM en bedenker van de programmeertaal Swift, en Tim Davis, voormalig hoofd van Google's AI-projecten zoals Tensorflow en JAX, hebben een nieuwe programmeertaal onthuld: Mojo. Deze taal combineert gebruiksgemak voor onderzoek en snelle prototyping met geschiktheid voor hoogwaardige eindproducten. Het eerste wordt bereikt door gebruik te maken van de bekende syntaxis van de Python-taal, en het tweede door de mogelijkheid om te compileren naar machinecode, mechanismen voor veilige geheugenverwerking en het gebruik van hardwareversnelde computing.
Het project richt zich op ontwikkelingen in machine learning, maar wordt gepresenteerd als een algemene taal die de mogelijkheden van Python uitbreidt met systeemprogrammeertools en geschikt is voor een breed scala aan taken. De taal is bijvoorbeeld toepasbaar op gebieden zoals high-performance computing, dataverwerking en transformatie. Een interessante functie van Mojo is de mogelijkheid om het emoji-symbool "🔥" te specificeren als extensie voor codebestanden (bijvoorbeeld "helloworld.🔥"), naast de tekstextensie ".mojo".
De taal bevindt zich momenteel in een intensieve ontwikkelingsfase en biedt alleen een online interface voor tests. Er wordt beloofd om later aparte assembly's te publiceren voor gebruik op lokale systemen, na feedback op de interactieve webomgeving. De broncode van de compiler, JIT en andere gerelateerde ontwikkelingen zal naar verwachting openbaar worden gemaakt na voltooiing van het interne architectuurontwerp (het model voor de ontwikkeling van een werkend prototype achter gesloten deuren lijkt op de beginfase van de ontwikkeling van LLVM, Clang en Swift). Omdat de syntaxis van Mojo gebaseerd is op Python en het typesysteem nauw verwant is aan C/C++, is het de bedoeling om in de toekomst een toolkit te ontwikkelen om de vertaling van bestaande projecten, geschreven in C/C++ en Python, naar Mojo te vereenvoudigen, en om hybride projecten te ontwikkelen die Python- en Mojo-code combineren.
Het project is ontworpen om de hardwarebronnen van heterogene systemen te betrekken bij de uitvoering van berekeningen. Zo kunnen GPU's, gespecialiseerde versnellers voor machine learning en vectorprocessorinstructies (SIMD) worden ingezet bij de uitvoering van applicaties in Mojo en bij parallellisatie van berekeningen. De focus op compilatie, integratie van systeemprogrammeermogelijkheden en het gebruik van een fundamenteel andere interne architectuur die codeuitvoering op GPU's en verschillende hardwareversnellers mogelijk maakt, worden genoemd als reden om een aparte subset van Python te ontwikkelen in plaats van de bestaande CPython-taal te betrekken bij de optimalisatie. Tegelijkertijd zijn de ontwikkelaars van Mojo van plan om zoveel mogelijk te streven naar compatibiliteit met CPython.
Mojo kan zowel in de JIT-interpretatiemodus als voor compilatie naar uitvoerbare bestanden (AOT, ahead-of-time) worden gebruikt. De compiler beschikt over moderne technologieën voor automatische optimalisatie, caching en gedistribueerde compilatie. Bronteksten in de Mojo-taal worden omgezet naar een low-level intermediate code MLIR (Multi-Level Intermediate Representation), ontwikkeld door het LLVM-project en biedt extra mogelijkheden voor het optimaliseren van de verwerking van data flow-grafieken. De compiler maakt het mogelijk om verschillende backends die MLIR ondersteunen te gebruiken om machinecode te genereren.
Door extra hardwaremechanismen te gebruiken om berekeningen te versnellen, kunnen prestaties worden bereikt die, bij intensieve berekeningen, C/C++-applicaties overtreffen. Zo bleek bij het testen van een applicatie voor het genereren van de Mandelbrot-set een gecompileerde applicatie in Mojo, draaiend in de AWS-cloud (r7iz.metal-16xl), 6 keer sneller dan de C++-implementatie (0.03 sec. versus 0.20 sec.), 35 keer sneller dan de Python-applicatie bij gebruik van de standaard CPython 3.10.9 (0.03 sec. versus 1027 sec.) en 1500 keer sneller bij gebruik van PYPY (0.03 sec. versus 46.1 sec.).
Bij het evalueren van de prestaties op het gebied van het oplossen van machine learning-problemen bleek de Modular Inference Engine AI-stack, geschreven in Mojo, vergeleken met de op de TensorFlow-bibliotheek gebaseerde oplossing 3 keer sneller te zijn op een systeem met een Intel-processor bij het verwerken van een taalmodel, 6.4 keer sneller bij het uitvoeren van een aanbevelingsmodel en 2.1 keer sneller bij het werken met modellen voor de verwerking van visuele informatie. Bij gebruik van AMD-processors was de winst bij Mojo respectievelijk 3.2, 5 en 2.2 keer, en bij gebruik van ARM-processors 5.3, 7.5 en 1.7 keer. De op PyTorch gebaseerde oplossing bleef respectievelijk 1.4, 1.1 en 1.5 keer achter bij Mojo op Intel-CPU's, 2.1, 1.2 en 1.5 keer op AMD-CPU's en 4, 4.3 en 1.3 keer op ARM-CPU's.

De taal ondersteunt statische typering en low-level geheugenbeveiligingsfuncties die vergelijkbaar zijn met die in Rust, zoals het bijhouden van de levensduur van referenties en een 'lean checker'. Naast pointerbeveiligingsfuncties biedt de taal ook low-level functies, zoals directe geheugentoegang in de onveilige modus met behulp van het pointertype, het aanroepen van individuele SIMD-instructies of het benaderen van hardware-extensies zoals TensorCores en AMX.

Om de scheiding tussen klassieke en geoptimaliseerde Python-code voor functies met expliciete typedefinitie voor alle variabelen te vereenvoudigen, wordt voorgesteld om een apart trefwoord "fn" te gebruiken in plaats van "def". Evenzo kan voor klassen, als statische datapacking in het geheugen vereist is tijdens de compilatie (zoals in C), het type "struct" worden gebruikt in plaats van "class". Eenvoudige import van modules in C/C++ is ook mogelijk. Om bijvoorbeeld de functie cos uit de wiskundebibliotheek te importeren, kunt u "from "math.h" import cos" opgeven.
Bron: opennet.ru
