V oblasti strojového učení a umělé inteligence se Python etabloval jako dominantní programovací jazyk, a to díky rozsáhlé nabídce výkonných knihoven, jako jsou NumPy, TensorFlow a PyTorch. Nicméně, detailnější pohled na zdrojový kód těchto knihoven na GitHubu odhalí, že značná část z nich je ve skutečnosti napsána v jazycích C a C++.
Důvodem je především fakt, že Python sám o sobě je pro náročné výpočty umělé inteligence často příliš pomalý. Mojo, nový programovací jazyk, se pokouší tento problém vyřešit tím, že kombinuje rychlost C/C++ s elegancí a čitelností Pythonu.
Mojo: Stručný popis
Mojo je moderní programovací jazyk, který se syntaxí blíží Pythonu, avšak s rychlostí srovnatelnou s C. Jeho hlavní zaměření spočívá v oblastech umělé inteligence a vývoji systémového softwaru, což jsou odvětví, která vyžadují maximálně výkonné aplikace.
Využívá princip SIMD (Single Instruction, Multiple Data), který umožňuje efektivní paralelní zpracování dat. Kromě toho, Mojo je kompilován metodou just-in-time a efektivně spravuje paměť.
Je však důležité poznamenat, že Mojo není zcela novým jazykem od základů; je to v podstatě rozšíření Pythonu. To znamená, že přidává nové funkce a možnosti k již existujícímu Pythonu, podobně jako TypeScript rozšiřuje JavaScript. Pro ty, kteří již Python znají, by tak přechod na Mojo neměl být příliš náročný.
Za vývojem Mojo stojí společnost Modular, založená Chrisem Lattnerem, tvůrcem LLVM a programovacího jazyka Swift.
Stručně řečeno, Mojo je nový programovací jazyk, který si klade za cíl spojit uživatelsky přívětivou syntaxi Pythonu s výkonem C/C++. Je primárně určen pro použití v AI a vývoji systémů. I když je projekt ještě v rané fázi, vypadá velmi slibně, a proto se na něj podíváme podrobněji.
Vlastnosti Mojo oproti jiným jazykům
Mojo si získalo značnou popularitu, i když ještě není veřejně dostupné. Důvodem jsou jeho významné výhody oproti jiným programovacím jazykům, zejména v oblasti strojového učení a systémového programování. V následujícím textu se budeme těmito výhodami zabývat.
#1. Nativní podpora pro AI a strojové učení
Mojo bylo od počátku navrženo pro vývoj aplikací umělé inteligence. Proto již ve standardní knihovně nabízí funkce a moduly pro tvorbu neuronových sítí, zpracování obrazu a přípravu dat.
Zatímco většina univerzálních jazyků, včetně Pythonu, vyžaduje pro tyto účely externí knihovny, Mojo tuto podporu poskytuje ihned po instalaci.
#2. Jednoduchá syntaxe a vysoká úroveň abstrakce
Pro vývoj rychlého a efektivního softwaru se obvykle používají jazyky jako C, C++ a Rust. Tyto jazyky jsou sice výkonné, ale jejich učení a používání může být náročné. Vyžadují totiž práci na nízké úrovni, aby programátor mohl mít plnou kontrolu nad procesem.
Mojo však nabízí vyšší úroveň abstrakce, podobně jako Python, a zachovává si jednoduchou syntaxi. Díky tomu je práce s ním snadnější, i když dosahuje srovnatelného výkonu jako výše zmíněné jazyky.
#3. Integrace s populárními AI frameworky a knihovnami
Jak již bylo řečeno, Mojo je nadstavbou Pythonu. Díky tomu se bezproblémově integruje s existujícími knihovnami, jako jsou NumPy a PyTorch. To znamená, že Mojo má již od počátku přístup k rozsáhlému ekosystému Pythonu.
#4. Efektivní zpracování a manipulace s daty
Mojo je navrženo pro efektivní paralelní zpracování velkého množství dat. To je zvláště užitečné při provádění lineární algebry, která je klíčová pro strojové učení. Díky kompilaci metodou just-in-time je bytecode optimalizován pro maximální rychlost. To zefektivňuje práci s daty a strojové učení v Mojo.
#5. Škálovatelnost a podpora paralelního výpočtu
Mojo je postaveno tak, aby nativně podporovalo paralelní výpočet pomocí paradigmatu Single Instruction – Multiple Data. Tato funkce je součástí samotného jádra jazyka, což umožňuje dosažení vyšší rychlosti. Mojo tak překonává i knihovny Pythonu, jako je NumPy, v oblasti paralelního zpracování.
Klíčové prvky Mojo
V této části se podíváme na to, jak se programuje v Mojo. Protože Mojo má být nadmnožinou Pythonu, podobně jako TypeScript je nadmnožinou JavaScriptu, veškerý platný kód Pythonu je zároveň platným kódem Mojo, avšak ne každý kód Mojo je platným kódem Pythonu.
Mojo je stále ve vývoji, a proto zatím nepodporuje některé funkce Pythonu, jako například třídy. Kompilátor také ještě není k dispozici, ale Mojo lze prozatím používat v Jupyter notebooku. K tomu je však potřeba si vytvořit účet na webových stránkách projektu.
V tuto chvíli je obtížné poskytnout komplexní návod na jazyk, protože některé funkce ještě nebyly implementovány a ne všechny aspekty jsou plně funkční. Proto se zaměříme na některé klíčové prvky, které Mojo přidává k již existujícím funkcím Pythonu.
Syntaxe a gramatika
Vzhledem k tomu, že Mojo je nadmnožinou Pythonu, jejich syntaxe je téměř identická. Stejně jako Python, program se skládá z příkazů. Tyto příkazy lze seskupovat do bloků, které jsou součástí funkcí, cyklů nebo podmínek. Příkazy uvnitř bloku jsou odsazeny. Následující příklad ukazuje program napsaný v Mojo:
def odd_or_even(): for i in range(1, 101): if i % 2 == 0: print("Sudé") else: print("Liché") odd_or_even()
Tento kód je naprosto totožný s kódem v Pythonu. Mojo však nabízí další funkce, které si ukážeme v následujících částech.
Deklarace proměnných
V Mojo existují dva další způsoby, jak deklarovat proměnné. Můžete použít klíčové slovo `let` nebo `var`. Klíčové slovo `let` se používá pro deklaraci neměnné proměnné. Jakmile je proměnná inicializována, nemůžete jí již přiřadit jinou hodnotu. Na druhou stranu, proměnné deklarované pomocí `var` mohou být znovu přiřazeny, protože jsou proměnlivé.
Hlavní výhodou proměnných deklarovaných pomocí `let` nebo `var` je, že podporují specifikaci datového typu. Následující příklad ukazuje, jak se deklarují proměnné v Mojo:
let pi: Float64 = 3.141 var pozdrav = "Ahoj, světe" # Toto by nebylo možné # pi = 6.283 # Toto je možné pozdrav = "Zdravím" print(pi, pozdrav)
Struktury
Kromě nových způsobů deklarování proměnných podporuje Mojo také struktury. Jednoduše řečeno, struktury jsou podobné třídám, ale jsou statičtější. Na rozdíl od tříd nemůžete za běhu přidávat, odebírat ani upravovat metody a všechny členy musí být deklarovány pomocí klíčových slov `var` nebo `let`. Tato statičtější struktura umožňuje Mojo efektivněji spravovat paměť a výkon. Následující příklad ukazuje definici struktury:
struct Osoba: var jmeno: StringLiteral var vek: Int32 fn __init__(inout self, jmeno: StringLiteral, vek: Int32): self.jmeno = jmeno self.vek = vek jan = Osoba("Jan Novák", 32) print(jan.jmeno, jan.vek)
Funkce
V předchozím příkladu jste si mohli všimnout, že jsme metodu `__init__` deklarovali pomocí klíčového slova `fn` místo `def`. V Mojo můžete funkce deklarovat pomocí `fn` i `def`. Funkce deklarovaná pomocí `fn` je striktnější než její protějšek `def`.
Konkrétně funkce deklarovaná pomocí `fn` má ve výchozím nastavení neměnné argumenty. Kromě toho je nutné zadat datový typ argumentů a návratovou hodnotu funkce. Všechny lokální proměnné musí být před použitím deklarovány.
fn pozdrav(jmeno: StringLiteral): print("Ahoj,", jmeno) # Toto by nebylo platné # fn pozdrav(jmeno): # print("Ahoj,", jmeno) pozdrav("Jan")
Pokud funkce vyvolává výjimku, musí být tato skutečnost explicitně uvedena při její deklaraci pomocí klíčového slova `raises`. Mojo také nepoužívá třídu `Exception` jako Python, ale používá třídu `Error`.
fn vyvola_chybu() raises: raise Error('Nějaká chyba') vyvola_chybu()
Přetěžování
Mojo také podporuje přetěžování operátorů na základě různých datových typů. To podporuje objektově orientovaný princip polymorfismu.
fn secti_cisla(a: Int32, b: Int32) -> Int32: return a + b fn secti_cisla(a: Int32, b: Int32, c: Int32) -> Int32: return a + b + c let prvni_součet = secti_cisla(2, 3) let druhy_součet = secti_cisla(1, 2, 3) print(prvni_součet, druhy_součet)
Jak se Mojo využívá ve vývoji AI
Mojo nabízí knihovny pro vytváření modelů strojového učení. Mezi tyto knihovny patří nástroje pro budování neuronových sítí. Kromě toho je možné provádět úkoly, jako je zpracování přirozeného jazyka a počítačové vidění.
I když samotný jazyk ještě není kompletní a jeho ekosystém prakticky neexistuje, lze očekávat, že Mojo nabídne mnoho funkcí pro provádění úkolů, jako je zpracování dat, tvorba modelů, optimalizace, správa modelů a monitoring.
Je Mojo budoucností vývoje AI?
Je obtížné předvídat, jak se technologie budou vyvíjet a jak budou přijímány. Většina předpovědí se ukáže jako chybná, ale to neznamená, že to nemůžeme zkusit. Chcete-li předpovědět, zda Mojo pravděpodobně nahradí Python, zvažte výhody a nevýhody/omezení Mojo:
Výhody
- Je velmi rychlý a navržený tak, aby efektivně využíval paralelní výpočty, což je nezbytné pro strojové učení, protože trénování modelů může být časově velmi náročné.
- Je to nadmnožina Pythonu, což usnadňuje jeho učení a snižuje vstupní bariéru. To usnadňuje jeho širší přijetí.
- Snižuje pravděpodobnost výskytu chyb v produkčním prostředí, protože chyby, jako jsou překlepy v názvech proměnných nebo neshody datových typů, jsou zachyceny během kompilace. Díky tomu je jeho používání bezpečnější.
Nevýhody
- V současné době je neúplný. Tým vývojářů z Modular ale intenzivně pracuje na jeho dokončení a vydání kompilátoru.
- I když to usnadňuje práci tvůrců frameworků, pro uživatele, kteří již používají frameworky v Pythonu, to nemusí znamenat velkou výhodu.
- Zatím nemá velký ekosystém nástrojů a výukových zdrojů. I když je možné používat knihovny Pythonu v Mojo, můžete je používat i v samotném Pythonu. Aby Mojo získalo skutečnou výhodu oproti Pythonu, potřebuje vlastní knihovny, které využijí jeho rychlost.
Závěrečné myšlenky
Pokud se současný zájem o Mojo potvrdí, je pravděpodobné, že se stane populárním jazykem pro umělou inteligenci. Jeho rychlost a jednoduchost jsou silnými argumenty. Nicméně, stejně jako TypeScript zcela nenahradil JavaScript, je pravděpodobné, že Mojo zcela nenahradí Python.
Mojo je každopádně jazyk, který stojí za to sledovat, až se jeho vývoj posune dál.
Pro porovnání se můžete podívat také na Type vs. Interface v TypeScript.