У сфері машинного навчання та штучного інтелекту, Python довгий час займав лідируючу позицію, завдяки потужним бібліотекам, таким як NumPy, TensorFlow та PyTorch. Однак, якщо придивитися до вихідного коду цих бібліотек на GitHub, стане очевидно, що значна його частина написана на C і C++.
Причиною цього є відносна повільність Python у виконанні задач ШІ. Mojo — це нова мова програмування, яка прагне поєднати швидкість C/C++ з елегантністю Python.
Mojo: Загальний огляд
Mojo являє собою інноваційну мову програмування, що відзначається синтаксичною схожістю з Python, але при цьому демонструє швидкість виконання, порівнянну з C. Її основне призначення полягає у розробці систем штучного інтелекту та створенні програмного забезпечення для системного рівня, де потрібна висока продуктивність.
Вона використовує парадигму SIMD (Single Instruction, Multiple Data) для ефективного використання можливостей паралелізму. Крім того, Mojo підтримує своєчасну компіляцію та ефективно управляє пам’яттю.
Mojo не є абсолютно новою мовою. Фактично, це розширення Python, тобто Python з додатковими функціями. Аналогічно тому, як TypeScript розширює можливості JavaScript. Ця особливість є значною перевагою, оскільки знання Python значно спрощує вивчення Mojo.
Mojo розроблена компанією Modular, заснованою Крісом Латтнером, винахідником LLVM та мови програмування Swift.
Підсумовуючи, Mojo — це сучасна мова програмування, яка поєднує в собі синтаксичну подібність до Python зі швидкістю, що наближається до C/C++. Її розроблено для застосування у сферах штучного інтелекту та системного програмування. Попри те, що проєкт ще знаходиться в стадії розробки, він має великий потенціал. У наступному розділі ми розглянемо, чому Mojo є перспективним.
Переваги Mojo над іншими мовами програмування
Mojo здобула значну популярність, попри те, що її загальнодоступна версія ще не вийшла. Це обумовлено її значними перевагами перед іншими мовами програмування у контексті машинного навчання та створення системного програмного забезпечення. У цьому розділі ми розглянемо ці переваги.
#1. Вбудована підтримка ШІ та машинного навчання
Mojo розроблена з метою створення програм на основі штучного інтелекту. Тому вона включає в себе стандартну бібліотеку з функціями та модулями, необхідними для побудови нейронних мереж, реалізації комп’ютерного зору та обробки даних.
На відміну від багатьох мов загального призначення, таких як Python, що потребують додаткових бібліотек, Mojo забезпечує цю підтримку з коробки.
#2. Спрощений синтаксис і абстракції високого рівня
Для створення швидкого та ефективного програмного забезпечення зазвичай використовують такі мови, як C, C++ і Rust. Хоча ці мови є швидкими, їх складніше вивчати та використовувати. Це пов’язано з тим, що вони вимагають роботи на низькому рівні для забезпечення більшого контролю.
Однак Mojo поєднує в собі абстракції високого рівня, подібні до Python, і простий синтаксис. Це робить її зручнішою у роботі, порівняно з іншими мовами, які забезпечують аналогічну продуктивність.
#3. Інтеграція з популярними фреймворками та бібліотеками ШІ
Як вже зазначалося, Mojo не є цілком новою мовою, а розширенням Python. Отже, вона добре інтегрується з існуючими бібліотеками, такими як NumPy та PyTorch. Це означає, що Mojo автоматично має таку ж велику екосистему, як і Python.
#4. Ефективна обробка та маніпуляція даними
Mojo спроєктована для ефективної одночасної маніпуляції багатьма значеннями. Це особливо корисно при виконанні операцій лінійної алгебри, на яких значною мірою базується машинне навчання. Mojo також використовує JIT-компіляцію (just-in-time), що дозволяє оптимізувати байт-код для підвищення швидкості. Це робить роботу з даними та машинним навчанням ефективною в Mojo.
#5. Масштабованість та підтримка паралельних обчислень
Mojo розроблена для підтримки паралельної обчислювальної парадигми SIMD (“одна інструкція – кілька даних”). Ця функція вбудована в Mojo і забезпечує їй високу швидкість “з коробки”. Вона також перевершує бібліотеки Python, такі як NumPy, у плані швидкості обчислень.
Ключові елементи Mojo
У цьому розділі ми розглянемо основні принципи написання програм на Mojo. Оскільки Mojo є надмножиною Python, подібно до того, як TypeScript є надмножиною JavaScript, будь-який правильний код Python є правильним кодом Mojo, але не навпаки.
Розробка Mojo ще триває, і деякі можливості Python, такі як класи, ще не підтримуються. Крім того, компілятор поки не є доступним, але Mojo можна використовувати у блокноті для ознайомлення. Однак спочатку потрібно зареєструвати обліковий запис на їхньому веб-сайті.
На даному етапі важко надати вичерпний посібник з використання мови, оскільки деякі функції ще не додані, а інші – ще не підтримуються. Замість цього ми обговоримо деякі ключові доповнення, які Mojo привносить до можливостей Python.
Синтаксис і граматика
Оскільки Mojo є надмножиною Python, їхній синтаксис ідентичний. Як і в Python, програма складається з операторів. Ці оператори можуть бути згруповані у блоки під функціями, циклами або умовними виразами. Оператори всередині блоку повинні мати відступ. Ось приклад програми, написаної мовою Mojo:
def odd_or_even(): for i in range(1, 101): if i % 2 == 0: print("Even") else: print("Odd") odd_or_even()
Цей код повністю ідентичний аналогічній програмі на Python. Проте, Mojo пропонує додаткові функції, які ми розглянемо далі.
Оголошення змінних
У Mojo є два додаткові способи оголошення змінних: за допомогою ключових слів `let` або `var`. Ключове слово `let` оголошує незмінну змінну, тобто після ініціалізації її значення не можна змінити. З іншого боку, змінні, оголошені за допомогою `var`, можуть бути змінені.
Основною перевагою змінних, оголошених за допомогою `let` або `var`, є підтримка специфікаторів типу. Нижче наведено приклад оголошення змінних в 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)
Структури
Окрім додаткових способів оголошення змінних, Mojo підтримує структури. Структури можна розглядати як аналог класів, але з більш жорсткою структурою. На відміну від класів, ви не можете додавати/видаляти або змінювати методи під час виконання, а всі члени повинні бути оголошені за допомогою ключових слів `var` або `let`. Ця жорсткіша структура дозволяє Mojo ефективніше керувати пам’яттю та продуктивністю. Ось приклад структури:
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)
Функції
З прикладу структури ви могли помітити, що ми оголосили метод `__init__` за допомогою ключового слова `fn`, а не `def`. Це пояснюється тим, що в Mojo функції можна оголошувати як за допомогою `fn`, так і за допомогою `def`. Функція, оголошена за допомогою `fn`, є більш суворою, ніж її аналог, оголошений за допомогою `def`.
Зокрема, функція, оголошена за допомогою `fn`, має незмінні аргументи за замовчуванням. Крім того, необхідно вказати тип даних аргументів та значення, яке повертає функція. Усі локальні змінні також мають бути оголошені перед використанням.
fn say_hello(name: StringLiteral): print("Hello,", name) # This would be invalid # fn say_hello(name): # print("Hello,", name) say_hello("John")
Якщо функція може викликати виняток, це необхідно явно вказати під час оголошення функції за допомогою ключового слова `raises`. Також слід зазначити, що Mojo не використовує клас `Exception`, як це робить Python, а натомість використовує клас `Error`.
fn will_raise_error() raises: raise Error('Some error') will_raise_error()
Перевантаження
Mojo також підтримує перевантаження операторів на основі різних типів даних. Це відповідає принципу поліморфізму в об’єктно-орієнтованому програмуванні.
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)
Застосування Mojo у розробці ШІ
Mojo постачається з бібліотеками для створення моделей машинного навчання, включаючи бібліотеки для побудови нейронних мереж. Крім того, вона дозволяє виконувати такі завдання, як обробка природної мови та комп’ютерний зір.
Незважаючи на те, що мова ще не завершена, а її екосистема практично відсутня, можна очікувати, що Mojo надасть багато інструментів для виконання таких задач, як обробка даних, створення моделей, оптимізація, керування моделями та моніторинг.
Чи є Mojo майбутнім розвитку ШІ?
Складно передбачити, як буде розвиватися та прийматися нова технологія. Більшість прогнозів виявляються помилковими, але це не означає, що не можна спробувати зробити їх. Щоб оцінити, чи зможе Mojo замінити Python, розглянемо її переваги, недоліки та обмеження.
Переваги
- Mojo дуже швидка та використовує паралелізм, що є важливим для машинного навчання, оскільки навчання моделей може зайняти багато часу.
- Вона є надмножиною Python, що спрощує її вивчення.
- Зменшує ймовірність помилок у виробництві, виявляючи їх на етапі компіляції.
Недоліки
- Мова ще не завершена.
- Може не мати значних переваг для користувачів фреймворків, які вже використовують їх на Python.
- Не має великої екосистеми інструментів та навчальних ресурсів.
Заключні слова
Судячи з поточного ажіотажу, Mojo, ймовірно, стане популярною мовою для розробки ШІ. Її швидкість є вагомим стимулом для переходу. Її простота — це додаткова перевага. Проте, подібно до того, як TypeScript не повністю замінив JavaScript, цілком імовірно, що Mojo не повністю витіснить Python.
Mojo — це, безсумнівно, мова, за якою варто стежити в майбутньому, коли вона стане зрілішою.
Далі порівняємо типи та інтерфейси в TypeScript.