Inom fälten maskininlärning och artificiell intelligens har Python länge varit det föredragna programmeringsspråket, med sin tillgång till kraftfulla bibliotek som NumPy, TensorFlow och PyTorch. Vid en närmare granskning av dessa biblioteks källkod på GitHub framgår det dock att en betydande del är skriven i C och C++.
Anledningen till detta är att Python inte är tillräckligt snabbt för avancerade AI-tillämpningar. Som en lösning på detta har Mojo introducerats, ett nytt programmeringsspråk som strävar efter att kombinera C/C++:s snabbhet med Pythons smidighet och användarvänlighet.
Mojo: En introduktion
Mojo är ett nyutvecklat programmeringsspråk som påminner om Python i sin syntax men som presterar i hastighet i nivå med C. Det är primärt designat för att möta kraven inom artificiell intelligens och systemutveckling, områden som kräver högpresterande mjukvara.
Språket använder SIMD-paradigmet (Single Instruction, Multiple Data) för att utnyttja parallell bearbetning. Det är även just-in-time-kompilerat och har en effektiv minneshantering.
Mojo är inte en helt ny konstruktion utan snarare en utökning, eller superset, av Python. Detta innebär att det innehåller alla Pythons funktioner samt ytterligare tillägg. På samma sätt som TypeScript utvidgar JavaScript kan man se Mojo som en förbättrad version av Python. För de som redan kan Python borde därför inlärningskurvan för Mojo inte vara alltför brant.
Bakom Mojo står Modular, ett företag grundat av Chris Lattner, som även är skaparen av LLVM och programmeringsspråket Swift.
Kort sagt är Mojo ett nytt programmeringsspråk som strävar efter att vara lika intuitivt som Python men lika snabbt som C/C++. Dess huvudsyfte är att underlätta utvecklingen inom AI och systemprogrammering. Även om det fortfarande är under utveckling ser projektet lovande ut, och vi kommer i nästa avsnitt att utforska varför.
Mojos fördelar jämfört med andra programmeringsspråk
Mojo har genererat ett stort intresse trots att det ännu inte är officiellt lanserat för allmänheten. Detta beror på dess betydande fördelar jämfört med andra språk, särskilt inom maskininlärning och systemprogrammering. I det här avsnittet kommer vi att gå igenom dessa fördelar i detalj.
#1. Inbyggt stöd för AI och maskininlärning
Mojo är specifikt designat för att utveckla applikationer inom artificiell intelligens och levereras därför med inbyggda funktioner och moduler för att bygga neurala nätverk, hantera datorseende och förbereda data.
De flesta generella programmeringsspråk, som Python, kräver extra bibliotek för dessa uppgifter, men Mojo har direkt stöd för detta.
#2. Förenklad syntax och högnivåabstraktioner
För att utveckla snabb och effektiv mjukvara har man traditionellt behövt använda språk som C, C++ och Rust. Även om dessa språk erbjuder hög prestanda är de också mer komplicerade att lära sig och arbeta med, då de kräver att man arbetar på en lägre nivå för att ha full kontroll.
Mojo erbjuder däremot abstraktioner på högre nivå liknande Python, med en enkel syntax, vilket gör det mer tillgängligt och lättare att använda än andra språk med liknande prestanda.
#3. Integration med populära AI-ramverk och bibliotek
Som tidigare nämnts är Mojo en utökning av Python, vilket gör att det kan integreras smidigt med befintliga bibliotek som NumPy och PyTorch. Det betyder att Mojo som standard kan dra nytta av det omfattande ekosystem som Python har.
#4. Effektiv datahantering och manipulationsförmåga
Mojo är designat för att hantera flera datavärden parallellt, vilket är särskilt fördelaktigt vid linjär algebra som är centralt inom maskininlärning. Genom att vara just-in-time-kompilerat optimeras bytekoden för hastighet, vilket gör datahantering och maskininlärning mer effektivt i Mojo.
#5. Skalbarhet och stöd för parallellberäkning
Mojo är byggt med stöd för SIMD-paradigmet, vilket möjliggör parallell beräkning. Detta stöd är inbyggt i språket, vilket leder till snabbare prestanda direkt, och överträffar även Python-bibliotek som NumPy.
Nyckelelement i Mojo
I detta avsnitt kommer vi att undersöka hur man skriver program i Mojo. Eftersom Mojo är tänkt att vara en superset av Python är all giltig Python-kod även giltig Mojo-kod, men det omvända gäller inte. Det är likadant som med TypeScript och JavaScript.
Mojo är fortfarande under aktiv utveckling, och vissa funktioner från Python, som klasser, stöds ännu inte fullt ut. Dessutom är ingen kompilator tillgänglig än, men Mojo kan användas i en lekplatsmiljö på deras hemsida, vilket kräver ett konto.
I dagsläget är det svårt att ge en komplett handledning då språket inte är färdigt. Istället kommer vi att fokusera på några viktiga tillägg som Mojo introducerar utöver vad Python redan har.
Syntax och grammatik
Eftersom Mojo är en superset av Python, är deras syntax identisk. Liksom Python består ett program av satser som kan grupperas i block under funktioner, loopar eller villkor. Satser inom ett block är indragna. Här är ett exempelprogram skrivet i Mojo:
def odd_or_even(): for i in range(1, 101): if i % 2 == 0: print("Even") else: print("Odd") odd_or_even()
Detta är identiskt med ett Python-program. Mojo erbjuder dock ytterligare funktioner som vi kommer att gå igenom i följande avsnitt.
Variabeldeklarationer
I Mojo finns det ytterligare två sätt att deklarera variabler, med hjälp av nyckelorden let
eller var
. Nyckelordet let
används för att deklarera en oföränderlig variabel som inte kan ändras efter initiering. Variabler deklarerade med var
kan däremot ändras.
En stor fördel med let
och var
är att de tillåter specifikation av datatyper. Följande exempel visar hur variabler deklareras i Mojo:
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)
Strukturer
Mojo stödjer också strukturer som är ett annat sätt att deklarera variabler. Strukturer kan ses som en mer strikt version av klasser. Till skillnad från klasser kan man inte lägga till, ta bort eller ändra metoder under körning, och alla medlemmar måste deklareras med var
eller let
. Denna strikta struktur gör att Mojo kan hantera minne och prestanda mer effektivt. Här är ett exempel på en struktur:
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)
Funktioner
I exemplet ovan ser vi att metoden __init__
deklarerades med nyckelordet fn
istället för def
. I Mojo kan man deklarera funktioner med antingen fn
eller def
. En funktion deklarerad med fn
är mer strikt än en deklarerad med def
.
En funktion deklarerad med fn
har som standard sina argument oföränderliga. Man måste även ange datatypen för argumenten och funktionens returvärde. Alla lokala variabler måste deklareras innan de används.
fn say_hello(name: StringLiteral): print("Hello,", name) # This would be invalid # fn say_hello(name): # print("Hello,", name) say_hello("John")
Om en funktion kan generera ett fel måste det uttryckligen anges vid deklarationen med nyckelordet raises
. Mojo använder klassen Error
istället för Pythons Exception
.
fn will_raise_error() raises: raise Error('Some error') will_raise_error()
Överlagring
Mojo stöder även överlagring av operatorer baserat på olika datatyper. Detta är en grundläggande princip inom objektorienterad programmering och kallas polymorfism.
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)
Hur Mojo används i AI-utveckling
Mojo levereras med bibliotek som stöder skapandet av maskininlärningsmodeller, inklusive bibliotek för att bygga neurala nätverk. Språket möjliggör även uppgifter som Natural Language Processing (NLP) och Computer Vision.
Även om språket och dess ekosystem fortfarande är under utveckling, kan vi förvänta oss att Mojo kommer att inkludera funktioner för uppgifter som datahantering, modellskapande, optimering, modellhantering och övervakning.
Är Mojo framtiden för AI-utveckling?
Det är svårt att med säkerhet förutse hur tekniken kommer att utvecklas och antas. De flesta förutsägelser är ofta felaktiga, men det hindrar oss inte från att försöka. För att spekulera om Mojo kan ersätta Python, låt oss väga samman Mojos fördelar och nackdelar:
Fördelar
- Det är extremt snabbt och byggt för att dra nytta av parallell bearbetning, vilket är kritiskt för maskininlärning där träningsmodeller kan ta lång tid.
- Som en superset av Python är det enklare att lära sig och har en mjukare inlärningskurva, vilket kan främja användning.
- Det minskar risken för fel i produktionen genom att fånga fel som felstavade variabelnamn eller typfel under kompilering, vilket gör det mer tillförlitligt.
Nackdelar
- Det är för närvarande inte färdigutvecklat. Men utvecklingsteamet på Modular arbetar kontinuerligt med att färdigställa språket och dess kompilator.
- Även om det kan förenkla utvecklingen för ramverkskonstruktörer kanske det inte ger en lika stor fördel för dem som använder ramverken i Python, eftersom de redan arbetar med etablerade ramverk för maskininlärning.
- Det saknar fortfarande ett stort ekosystem av verktyg och inlärningsresurser. Även om det är möjligt att använda Pythons bibliotek i Mojo, kan de också användas direkt i Python. För att Mojo ska kunna konkurrera med Python behöver det bibliotek som verkligen drar nytta av Mojos hastighet.
Slutord
Med tanke på det nuvarande intresset verkar det troligt att Mojo kommer att bli ett populärt AI-språk. Jag tror att dess hastighet i sig är en tillräcklig anledning för många att byta. Dess enkelhet är också en stor fördel. Men, precis som att TypeScript inte helt ersatte JavaScript, är det troligt att Mojo inte kommer att ersätta Python fullt ut.
Mojo är definitivt ett språk att hålla ögonen på när det mognar.
Kolla även in Typ vs. Interface i TypeScript.