Mojo 馃敟 - nowy j臋zyk programowania, 艂atwy jak python szybki jak C
Ostatnimi czasy na rynku pojawi艂a si臋 informacja o nowym j臋zyku programowania, kt贸ry 艂膮czy w sobie prostot臋 Pythona, a jednocze艣nie ma by膰 szybki jak C.
Wczesny dost臋p do Mojo: https://www.modular.com/get-startedTre艣膰 artyku艂u:
- Dlaczego python jest z艂y?
- Global Interpreter Lock (GIL)
- Historia Mojo 馃敟
- Dlaczego Mojo?
- MLIR (Multi-Level Intermediate Representation), kompilator przysz艂o艣ci
- Podstawy Mojo
- Zmienne
- Funkcje
- Struktura (struct)
- Integracja z Pythonem
- Podsumowanie
Dlaczego python jest z艂y?
Wed艂ug firmy modular, czyli firmy odpowiedzialnej za j臋zyk Mojo, Python ma znane problemy takie jak s艂aba wydajno艣膰 niskopoziomowa i mechanizm GIL w j臋zyku CPython (wyja艣nione poni偶ej). Cho膰 istnieje wiele aktywnych projekt贸w, kt贸re maj膮 na celu napraw臋 tych niedogodno艣ci, to jednak problemy te maj膮 g艂臋bsze konsekwencje i szczeg贸lnie wp艂ywaj膮 na dziedzine sztucznej inteligencji. A w roku 2023, czyli roku sztucznej inteligencjii te ograniczenia maj膮 dalszy wp艂yw.
Global Interpreter Lock (GIL)
GIL to skr贸t od Global Interpreter Lock, jest to mechanizm stosowany w implementacji CPython j臋zyka Python. GIL zapewnia, 偶e tylko jedna linia wykonywana jest w tym samym czasie w obr臋bie jednego procesu interpretacji Pythona, co ma na celu zapobieganie problemom z synchronizacj膮 dost臋pu do zasob贸w wsp贸艂dzielonych w wielow膮tkowych programach. Oznacza to, 偶e w jednym momencie tylko jeden w膮tek mo偶e wykonywa膰 kod Pythona w ramach jednego procesu, co mo偶e wp艂yn膮膰 negatywnie na wydajno艣膰 program贸w wielow膮tkowych.
Historia Mojo 馃敟
Modular zaczyna艂 swoj膮 dzia艂alno艣膰 bez zamiaru tworzenia nowego j臋zyka programowania. Jednak podczas budowania platformy, kt贸ra mia艂a na celu zjednoczenie infrastruktury uczenia maszynowego i sztucznej inteligencji na ca艂ym 艣wiecie. Zauwa偶ono wtedy, 偶e zaprogramowanie tego wszystkiego jest zbyt trudne. Chciano wi臋c stworzy膰 innowacyjny i skalowalny model programowania, kt贸ry m贸g艂by by膰 skierowany do akcelerator贸w [1] i innych system贸w, powszechnych w uczeniu maszynowym. Oznacza艂o to potrzeb臋 stworzenia j臋zyka programowania, kt贸ry oferowa艂by silne metaprogramowanie [2] podczas tworzenia kodu, a tak偶e umo偶liwi艂by zastosowanie r贸偶nych technik kompilacji, buforowanie procesu kompilacji oraz wiele innych funkcji, kt贸rych brakowa艂o w istniej膮cych j臋zykach programowania.
akcelerator [1] - jest to specjalnie zaprojektowane urz膮dzenie s艂u偶膮ce do przy艣pieszenia oblicze艅 w konkretnych dziedzinach. Tutaj chodzi o akceleratory u偶ywane w uczeniu maszynowym i sztucznej inteligencji, czyli procesory graficzne (GPU) lub specjalne procesory do AI (TPU).
metaprogramowanie [2] - technika programowania, kt贸ra umo偶liwia generowanie lub modyfikacj臋 kodu programu w czasie jego wykonania. Jest szczeg贸lnie przydatne w programach o z艂o偶onej strukturze i wykorzystywane w j臋zykach skryptowych. Metaprogramowanie jest stosowane w Pythonie i jest to jedna z cech, kt贸re czyni膮 Python bardzo elastycznym j臋zykiem programowania.
Dlaczego Mojo?
Mojo 艂膮czy prostot臋 j臋zyka Python z wydajno艣ci膮 j臋zyk贸w takich jak C++ czy Rust. Dodatkowo, Mojo umo偶liwia korzystanie z popularnych bibliotek Pythona, takich jak numpy, pandas czy matplotlib. Dzi臋ki temu programi艣ci mog膮 tworzy膰 czytelne i zwi臋z艂e programy, kt贸re osi膮gaj膮 wysok膮 wydajno艣膰, a jednocze艣nie maj膮 dost臋p do szerokiego zakresu funkcjonalno艣ci oferowanej przez te biblioteki.
MLIR (Multi-Level Intermediate Representation), kompilator przysz艂o艣ci
MLIR w prostych s艂owach
MLIR to narz臋dzie, kt贸re pomaga programistom tworzy膰 programy, kt贸re dzia艂aj膮 na r贸偶nych rodzajach sprz臋tu (np. komputery, smartfony, tablety). Dzia艂a ono na zasadzie tzw. reprezentacji po艣redniej, co oznacza, 偶e przetwarza kod programu na taki, kt贸ry 艂atwo mo偶na dopasowa膰 do r贸偶nych rodzaj贸w sprz臋tu. Dzi臋ki temu programy dzia艂aj膮 szybciej i wydajniej na r贸偶nych urz膮dzeniach, bez konieczno艣ci r臋cznej modyfikacji kodu dla ka偶dego z nich.MLIR szczeg贸艂owo
Je偶eli chcesz dowiedzie膰 si臋 o MLIR wi臋cej, przeczytaj ten artyku艂 -> MLIR - rewolucyjne narz臋dzie stosowane w systemach AI.
Podstawy Mojo
S膮 to tylko podstawy, mojo pozwala na o wiele wiele wi臋cej (jak np. RayTracing, mno偶enie macierzy, zbi贸r mandelbrota czy obs艂uge pami臋ci rodem z C).
Zmienne
-
let - jest zmienn膮 sta艂膮, co oznacza, 偶e po przypisaniu warto艣ci nie mo偶e by膰 ona zmieniona.
-
var - dzia艂a podobnie jak w j臋zyku Python. Mo偶e by膰 ona przypisana do dowolnej warto艣ci i mo偶na j膮 p贸藕niej zmienia膰.
def your_function(a, b):
let c = a
var e = a
c = b # zwroci error: c is immutable
e = b
if c != b:
let d = b
print(d)
your_function(2, 3)
Funkcje
-
def - dzia艂a podobnie jak w przypadku Pythona. Umo偶liwia deklaracj臋 funkcji i jej implementacj臋. Przyk艂ad u偶ycia:
def add(a, b): return a + b -
fn - s艂u偶y do definiowania funkcji, kt贸re wymagaj膮 okre艣lenia typu danych dla argument贸w. W ten spos贸b mo偶emy precyzyjnie okre艣li膰, jakie typy danych powinny by膰 przekazywane do funkcji. Na przyk艂ad:
fn add(a: Int, b: Int) -> Int: return a + b
Struktura (struct)
Typ struct w j臋zyku Mojo jest podobny do struktur znanych z innych j臋zyk贸w programowania, takich jak C, C++ czy Go. Istotn膮 r贸偶nic膮 w por贸wnaniu do klas jest konieczno艣膰 jawnego zadeklarowania wszystkich w艂a艣ciwo艣ci zmiennych wewn膮trz struktury za pomoc膮 deklaracji var lub let. Ta jasna deklaracja umo偶liwia kompilatorowi dok艂adne rozplanowanie i dost臋p do warto艣ci w pami臋ci bez konieczno艣ci korzystania z po艣rednictwa. Dzi臋ki temu struktury w Mojo mog膮 by膰 efektywnie wykorzystywane do przechowywania danych i manipulacji nimi w spos贸b zoptymalizowany pod k膮tem wydajno艣ci.
struct MyPair:
var first: Int
var second: Int
fn __init__(inout self, first: Int, second: Int):
self.first = first
self.second = second
# funkcja ktora pozwala uzywac operatora < do por贸wnywania zmiennych
fn __lt__(self, rhs: MyPair) -> Bool:
return self.first < rhs.first or
(self.first == rhs.first and
self.second < rhs.second)
Integracja z Pythonem
W mojo mo偶esz importowa膰 dowolny modu艂 Pythona do swojego programu.
from PythonInterface import Python
# Odpowiednik `import numpy as np` z Pythona
let np = Python.import_module("numpy")
# Teraz mo偶na u偶yc numpy tak samo jak w Pythonie
array = np.array([1, 2, 3])
print(array)
Typy Pythona w Mojo
def type_printer(my_list, my_tuple, my_int, my_string, my_float):
print(type(my_list))
print(type(my_tuple))
print(type(my_int))
print(type(my_string))
print(type(my_float))
Podsumowanie
Podsumowuj膮c, Mojo mo偶e by膰 jedn膮 z najbardziej obiecuj膮cych nowo艣ci w 艣wiecie programowania. Dzi臋ki prostocie i bibliotekom j臋zyka Python, programi艣ci b臋d膮 mogli tworzy膰 szybkie aplikacje, kt贸re b臋d膮 kompatybilne z r贸偶nymi urz膮dzeniami, dzi臋ki kompilatorowi MLIR. To otwiera nowe mo偶liwo艣ci dla tw贸rc贸w oprogramowania i mo偶e przynie艣膰 rewolucj臋 w dziedzinie programowania.