Первая программа
This content is not available in your language yet.
Если окружение уже настроено, напишем первую осмысленную программу и разберём её построчно. Она короткая, но в ней уже видны три главных отличия Mojo от Python.
Программа целиком
Заголовок раздела «Программа целиком»def average(values: List[Float64]) -> Float64: var total = 0.0 for value in values: total += value return total / Float64(len(values))
def main(): var measurements: List[Float64] = [21.5, 23.0, 19.8, 24.2] var mean = average(measurements) print("Средняя температура:", mean)Запустим:
uv run mojo temperature.mojoСредняя температура: 22.125
Разбор по строкам
Заголовок раздела «Разбор по строкам»def main() — обязательная точка входа
Заголовок раздела «def main() — обязательная точка входа»def main(): print("Привет!")В Python код можно писать прямо на верхнем уровне файла, и он выполнится
сверху вниз. В Mojo так нельзя: каждая программа обязана содержать функцию
main() — именно с неё начинается выполнение.
# Работает: код на верхнем уровнеprint("Привет!")# Обязательно внутри main()def main(): print("Привет!")В коротких примерах этого курса def main() иногда опускается ради
краткости — как и в официальном мануале. Но чтобы запустить такой
фрагмент у себя, оберните его в main().
Типы аргументов обязательны
Заголовок раздела «Типы аргументов обязательны»def average(values: List[Float64]) -> Float64:В Python аннотации типов — подсказка для человека и линтера; интерпретатору на них всё равно. В Mojo тип — это указание компилятору, как разместить значение в памяти и какие машинные инструкции сгенерировать. Без типа компилятор не может собрать эффективный код, поэтому типы аргументов и возвращаемого значения обязательны.
Именно отсюда берётся скорость: Float64 — это не объект с заголовком,
счётчиком ссылок и таблицей методов, как float в CPython, а восемь байт
в регистре процессора.
def average(values): return sum(values) / len(values)def average(values: List[Float64]) -> Float64: var total = 0.0 for value in values: total += value return total / Float64(len(values))Аннотация -> Float64 — это не документация, а контракт: компилятор
проверит его на этапе сборки, а не в момент падения программы у пользователя.
var и объявление переменных
Заголовок раздела «var и объявление переменных»var total = 0.0Первое присваивание объявляет переменную, и перед ним пишется var:
var count: Int = 0 # с явным типомvar count = 0 # тип выведен из значенияcount = 1 # это уже не объявление, а изменение значенияПрисваивание без var при первом упоминании пока работает, но компилятор
на него ругается:
warning: implicit declaration of 'count' is deprecated;add 'var' before the assignment targetСегодня это предупреждение, в следующих версиях станет ошибкой — так что
привыкайте сразу писать var.
Компиляция в исполняемый файл
Заголовок раздела «Компиляция в исполняемый файл»mojo temperature.mojo компилирует и сразу запускает программу — удобно
при разработке. Но Mojo — компилируемый язык, и результат можно получить
в виде обычного исполняемого файла:
uv run mojo build temperature.mojo./temperatureСредняя температура: 22.125
Получившийся бинарник не требует ни интерпретатора, ни виртуального окружения — его можно просто скопировать на другую машину с той же архитектурой и запустить. Для Python-разработчика это, пожалуй, самое непривычное ощущение от языка.
Когда что-то пошло не так
Заголовок раздела «Когда что-то пошло не так»error: expected type in function signature
У аргумента функции не указан тип. Компилятор дошёл до имени аргумента, ожидал двоеточие и тип, но не нашёл их.
Допишите тип: def average(values: List[Float64]) -> Float64:.
Привычка из Python писать def average(values) здесь не работает.
error: 'fn' is deprecated, use 'def' instead
Вы используете ключевое слово fn, оставшееся от старых версий языка.
Замените fn на def. Семантика при этом не меняется: в Mojo 1.0
def ведёт себя ровно так, как раньше вёл себя fn — в частности,
функция не считается способной бросать исключения, пока вы явно
не напишете raises.
🎯 Проверь себя
Почему в Mojo нельзя писать код на верхнем уровне файла, как в Python?
Потому что Mojo — компилируемый язык, а не интерпретируемый: у программы
должна быть определённая точка входа, с которой начинается выполнение
собранного бинарника. Эту роль играет функция main().
Чем аннотация типа в Mojo отличается от аннотации типа в Python?
В Python аннотация ни на что не влияет во время выполнения — это подсказка для человека и инструментов. В Mojo тип определяет представление значения в памяти и генерируемый машинный код, поэтому он обязателен и проверяется компилятором.
В чём разница между `var x = 0` и `x = 0` внутри функции?
В области видимости. var x живёт до конца блока, в котором объявлен
(например, внутри if), а x = 0 без var — до конца всей функции,
как в Python.
Что дальше
Заголовок раздела «Что дальше»Дальше разберём систему типов — почему Int в Mojo
это не то же самое, что int в Python, и откуда берётся тип SIMD,
которого в Python нет вовсе.
Тексты курса — CC BY-NC-SA 4.0, код примеров — Apache 2.0