Да ли је Мојо најбољи језик за развој вештачке интелигенције?

U svetu mašinskog učenja i veštačke inteligencije, Pithon se često ističe kao dominantan programski jezik, pre svega zahvaljujući moćnim bibliotekama poput NumPy, TensorFlow i PyTorch. Međutim, brzim uvidom u GitHub stranice ovih biblioteka, lako je primetiti da je znatan deo njihovog izvornog koda zapravo napisan u C i C++.

Razlog tome leži u činjenici da Pithon nije dovoljno brz za potrebe veštačke inteligencije. Mojo, novi programski jezik, teži da spoji brzinu C/C++ sa elegancijom Pithona.

Mojo: Kratak pregled

Mojo predstavlja novi programski jezik koji, sintaksički podseća na Pithon, ali se može pohvaliti brzinom C jezika. Njegova glavna namena je razvoj u oblastima veštačke inteligencije i sistemskog programiranja, odnosno oblastima koje zahtevaju visoke performanse softvera.

Koristi SIMD paradigmu (Single Instruction, Multiple Data) kako bi maksimalno iskoristio prednosti paralelizma. Takođe, koristi JIT (Just-In-Time) kompilaciju i efikasan je u pogledu memorije.

Važno je napomenuti da Mojo nije potpuno nov jezik; on predstavlja nadskup Pithona, što znači da ga čine Pithon, uz dodatne funkcionalnosti. Slično je odnosu TypeScripta prema JavaScriptu. Ova činjenica je veoma korisna, jer ukoliko već imate iskustva sa Pithonom, neće biti teško usvojiti Mojo.

Mojo je razvijen od strane kompanije Modular, koju je osnovao Kris Latner, tvorac LLVM-a i programskog jezika Swift.

Ukratko, Mojo je novi programski jezik dizajniran da bude sintaksički sličan Pithonu, ali brz kao C/C++. Namenjen je za primenu u razvoju veštačke inteligencije i sistemskom programiranju. Iako projekat još nije dovršen, ima izuzetan potencijal, o čemu će biti reči u nastavku teksta.

Prednosti Moja u odnosu na druge programske jezike

Mojo je stekao veliku popularnost iako još nije javno dostupan. To je pre svega zbog niza značajnih prednosti u poređenju sa drugim programskim jezicima kada je reč o mašinskom učenju i razvoju softvera na sistemskom nivou. U ovom odeljku detaljnije ćemo se posvetiti tim prednostima.

#1. Izvorna podrška za veštačku inteligenciju i zadatke mašinskog učenja

Mojo je prvenstveno razvijen za kreiranje aplikacija zasnovanih na veštačkoj inteligenciji. Shodno tome, poseduje standardnu biblioteku sa funkcijama i modulima za izgradnju neuronskih mreža, obradu kompjuterskog vida i pripremu podataka.

Većina opštenamenskih jezika, poput Pithona, zahteva dodatne biblioteke za ovakve zadatke, dok Mojo sve to nudi odmah po instalaciji.

#2. Pojednostavljena sintaksa i apstrakcije visokog nivoa

Za razvoj brzog i efikasnog softvera, tradicionalno se koriste jezici poput C, C++ i Rust. Iako ovi jezici pružaju visoke performanse, zahtevniji su za učenje i rad. To je zato što vas teraju da radite na niskom nivou kako biste imali veću kontrolu.

Međutim, Mojo zadržava apstrakcije visokog nivoa, poput Pithona, i jednostavnu sintaksu. Ovo ga čini lakšim za rad, u poređenju sa drugim jezicima koji nude slične performanse.

#3. Integracija sa popularnim AI okvirima i bibliotekama

Kao što je već rečeno, Mojo nije potpuno nov jezik – on je nadskup Pithona. Zbog toga se dobro integriše sa postojećim bibliotekama kao što su NumPy i PyTorch. To znači da Mojo, po difoltu, ima ekosistem velik kao Pithon.

#4. Efikasno rukovanje podacima i mogućnosti manipulacije

Mojo je dizajniran da paralelno i efikasno manipuliše sa više vrednosti. Ovo se posebno isplati kod linearne algebre, koja je okosnica mašinskog učenja. Takođe, Mojo koristi JIT kompilaciju, što obezbeđuje optimizaciju bajtkoda za brzinu. Sve to doprinosi efikasnom radu sa podacima i mašinskom učenju u Moji.

#5. Podrška za skalabilnost i paralelno računanje

Kao što je ranije pomenuto, Mojo je dizajniran tako da podržava „Single Instruction, Multiple Data“ paradigmu paralelnog računanja. Ova funkcija je ugrađena u sam jezik, što ga čini bržim. Mojo nadmašuje Pithon biblioteke poput NumPy.

Ključni elementi Moja

U ovom odeljku, detaljnije ćemo se posvetiti načinu pisanja programa u Moji. S obzirom na to da je Mojo zamišljen kao nadskup Pithona (slično kao što je TypeScript nadskup JavaScripta), sav validan Pithon kod je validan i u Moji, ali nije svaki Mojo kod validan u Pithonu.

Mojo je još uvek u razvoju, pa neke funkcionalnosti Pithona još nisu podržane – na primer, klase. Takođe, kompajler još uvek nije dostupan, ali Mojo možete koristiti u Jupyter Notebook okruženju. Pre toga, potrebno je da kreirate nalog na njihovoj web stranici.

U ovom trenutku, teško je dati sveobuhvatni vodič kroz jezik, jer se neke funkcije još dodaju i nisu sve stvari trenutno podržane. Umesto toga, fokusiraćemo se na neke ključne dodatke koje Mojo donosi, a koji nisu prisutni u Pithonu.

Sintaksa i gramatika

S obzirom na to da je Mojo nadskup Pithona, njihove sintakse su identične. Poput Pithona, program se sastoji od naredbi, koje se mogu grupisati u blokove unutar funkcija, petlji ili uslovnih struktura. Naredbe unutar blokova su uvučene. Primer programa u Moji:

def odd_or_even():
    for i in range(1, 101):
        if i % 2 == 0:
            print("Even")
        else:
            print("Odd")

odd_or_even()

Ovaj program je identičan Pithon programu. Međutim, Mojo nudi dodatne funkcionalnosti, koje će biti prikazane u narednim odeljcima.

Deklaracije promenljivih

U Moji, postoje dva dodatna načina za deklarisanje promenljivih. Možete koristiti ključne reči `let` ili `var`. Ključna reč `let` deklarira nepromenljivu promenljivu. Nakon inicijalizacije, ne možete joj dodeliti novu vrednost. Promenljive deklarisane sa `var`, mogu se ponovo dodeliti, jer su promenljive.

Glavna prednost promenljivih deklarisanih sa `let` ili `var` je podrška za specifikaciju tipa podataka. Primer deklarisanja promenljivih u Moji:

let pi: Float64 = 3.141
var greeting = "Hello, World"

# This would be impossible
# pi = 6.283

# But this is possible
greeting = "Ola"

print(pi, greeting)

Strukture

Osim različitih načina deklarisanja promenljivih, Mojo podržava i strukture. Jednostavno rečeno, strukture su slične klasama, ali su rigidnije. Za razliku od klasa, metode se ne mogu dodavati, uklanjati ili menjati tokom izvršavanja, a svi članovi moraju biti deklarisani pomoću ključnih reči `var` ili `let`. Ova čvršća struktura omogućava Moji efikasnije upravljanje memorijom i performansama. Primer strukture:

struct Person:
    var name: StringLiteral
    var age: Int32
    
    fn __init__(inout self, name: StringLiteral, age: Int32):
        self.name = name
        self.age = age


john = Person("John Doe", 32)
print(john.name, john.age)

Funkcije

Iz prethodnog primera strukture, mogli ste primetiti da smo deklarisali metodu `__init__` koristeći ključnu reč `fn` umesto `def`. To je zato što se u Moji funkcije mogu deklarisati koristeći `fn` i `def`. Funkcija deklarisana pomoću `fn` je strožija u poređenju sa `def`.

Konkretno, funkcija deklarisana pomoću `fn` po difoltu ima nepromenljive argumente. Pored toga, obavezno je navesti tip podataka argumenata i povratnu vrednost funkcije. Sve lokalne promenljive moraju biti deklarisane pre upotrebe.

fn say_hello(name: StringLiteral):
    print("Hello,", name)
    
# This would be invalid
# fn say_hello(name):
#     print("Hello,", name)

say_hello("John")

Ukoliko funkcija izaziva izuzetak, on mora biti eksplicitno naveden prilikom deklaracije funkcije, pomoću ključne reči `raises`. Pored toga, Mojo ne koristi klasu `Exception` kao Pithon, već koristi klasu `Error`.

fn will_raise_error() raises:
    raise Error('Some error')
    
will_raise_error()

Preopterećenje

Mojo takođe podržava preopterećenje operatora na osnovu različitih tipova podataka. Ovo podržava objektno-orijentisani princip polimorfizma.

fn add_numbers(a: Int32, b: Int32) -> Int32:
    return a + b

fn add_numbers(a: Int32, b: Int32, c: Int32) -> Int32:
    return a + b + c

let first_total = add_numbers(2, 3)
let second_total = add_numbers(1, 2, 3)

print(first_total, second_total)

Kako se Mojo koristi u razvoju veštačke inteligencije

Mojo dolazi sa bibliotekama za kreiranje modela mašinskog učenja, uključujući biblioteke za izgradnju neuronskih mreža. Osim toga, podržava zadatke kao što su obrada prirodnog jezika i kompjuterski vid.

Iako jezik još nije završen, a njegov ekosistem praktično ne postoji, možemo očekivati da će Mojo ponuditi mnoge funkcije za obavljanje zadataka kao što su obrada podataka, kreiranje modela, optimizacija, upravljanje modelom i praćenje.

Da li je Mojo budućnost razvoja veštačke inteligencije?

Teško je predvideti kako će se tehnologija razvijati i usvajati. Većina predviđanja je pogrešna, ali to ne znači da ne treba da pokušamo. Da bismo predvideli da li će Mojo verovatno zameniti Pithon, razmotrimo njegove prednosti i nedostatke/ograničenja:

Prednosti

  • Izuzetno je brz i dizajniran da iskoristi paralelizma bez mnogo truda, što je od suštinskog značaja za mašinsko učenje, jer treniranje modela može trajati dugo.
  • To je nadskup Pithona, stoga je lakši za učenje i ima blagu krivu učenja, što olakšava njegovo usvajanje.
  • Smanjuje mogućnost grešaka u produkciji, jer se greške poput pogrešno unetih imena promenljivih ili neusklađenosti tipova otkrivaju tokom vremena kompilacije. Zbog ovoga je poželjniji.

Nedostaci

  • Trenutno je nedovršen, ali naravno, tim u Modularu aktivno radi na izdavanju jezika i njegovog kompajlera.
  • Iako pojednostavljuje rad proizvođačima okvira, možda neće imati veliku prednost za korisnike tih okvira, jer oni već koriste okvire za mašinsko učenje u Pithonu.
  • Još uvek nema veliki ekosistem alata i resursa za učenje. Iako možete koristiti Pithonove biblioteke u Moji, isto tako ih možete koristiti i u samom Pithonu. Da bi Mojo imao prednost u odnosu na Pithon, potrebne su mu biblioteke koje donose brzinu samog Moja.

Završne reči

Ako se trenutna popularnost nastavi, Mojo će verovatno postati popularan jezik za veštačku inteligenciju. Smatram da je sama brzina dovoljan razlog da se ljudi prebace. Njegova jednostavnost je dodatni plus. Međutim, kao što TypeScript nije u potpunosti zamenio JavaScript, verovatno je da Mojo neće u potpunosti zameniti Pithon.

Mojo je svakako jezik koji bi trebalo da pratite kako bude sazrevao.

U nastavku pogledajte poređenje tipa i interfejsa u TypeScriptu.