язык программирования Mojo

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 19694
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

язык программирования Mojo

Непрочитанное сообщение Olej » 14 сен 2023, 16:03

Olej писал(а):
14 сен 2023, 14:04
типы структур
Here’s a simple definition of a struct:

Код: Выделить всё

struct MyPair:
    var first: Int
    var second: Int

    # We use 'fn' instead of 'def' here - we'll explain that soon
    fn __init__(inout self, first: Int, second: Int):
        self.first = first
        self.second = second

    fn __lt__(self, rhs: MyPair) -> Bool:
        return self.first < rhs.first or
              (self.first == rhs.first and
               self.second < rhs.second)
Синтаксически самое большое отличие от класса Python заключается в том, что все свойства экземпляра в структуре должны быть явно объявлены с помощью объявления var или let.

Аватара пользователя
Olej
Писатель
Сообщения: 19694
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

язык программирования Mojo

Непрочитанное сообщение Olej » 15 сен 2023, 21:44

Передача управление аргументом, и владение памятью

И в Python, и в Mojo большая часть языка вращается вокруг вызовов функций: многие (очевидно) встроенные варианты поведения реализованы в стандартной библиотеке с помощью методов «dunder» (двойное подчеркивание). Внутри этих магических функций большая часть владения памятью определяется посредством передачи аргументов.

Давайте рассмотрим некоторые подробности о том, как Python и Mojo передают аргументы:

- Все значения, передаваемые в функцию def Python, используют ссылочную семантику. Это означает, что функция может изменять переданные в нее изменяемые объекты, и эти изменения видны за пределами функции. Однако такое поведение иногда может удивить непосвященных, поскольку вы можете изменить объект, на который указывает аргумент, и это изменение не будет видно за пределами функции.

- Все значения, передаваемые в функцию определения Mojo, по умолчанию используют семантику значений. По сравнению с Python это важное отличие: функция def Mojo получает копию всех аргументов — она может изменять аргументы внутри функции, но изменения не видны вне функции.

- Все значения, передаваемые в функцию Mojo fn, по умолчанию являются неизменяемыми ссылками. Это означает, что функция может читать исходный объект (это не копия), но вообще не может его модифицировать.

Это соглашение о передаче неизменяемых аргументов в функции Mojo называется «заимствованием». В следующих разделах мы объясним, как можно изменить поведение передачи аргументов в Mojo как для функций def, так и для fn.

Аватара пользователя
Olej
Писатель
Сообщения: 19694
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

язык программирования Mojo

Непрочитанное сообщение Olej » 16 сен 2023, 01:26

Почему соглашения аргументации важны

В Python все фундаментальные значения являются ссылками на объекты — как описано выше, функция Python может изменять исходный объект. Таким образом, разработчики Python привыкли воспринимать все как справочную семантику. Однако на уровне CPython или компьютера вы можете видеть, что сами ссылки на самом деле передаются путем копирования — Python копирует указатель и корректирует счетчик ссылок.

Этот подход Python обеспечивает удобную модель программирования для большинства людей, но он требует, чтобы все значения распределялись в куче (и результаты иногда оказываются неожиданными из-за совместного использования ссылок). Классы Mojo (TODO: will) следуют одному и тому же ссылочно-семантическому подходу для большинства объектов, но это непрактично для простых типов, таких как целые числа, в контексте системного программирования. В этих сценариях мы хотим, чтобы значения находились в стеке или даже в аппаратных регистрах. Таким образом, структуры Mojo всегда встраиваются в свой контейнер, будь то поле другого типа или фрейм стека содержащей функции.

Это поднимает несколько интересных вопросов: как реализовать методы, которым необходимо изменять self типа структуры, например __iadd__? Как работает let и как он предотвращает мутации? Как контролируется время жизни этих значений, чтобы Mojo оставался безопасным для памяти языком?

Ответ заключается в том, что компилятор Mojo использует анализ потока данных и аннотации типов, чтобы обеспечить полный контроль над копиями значений, псевдонимами ссылок и контролем мутаций. Эти функции во многом похожи на функции языка Rust, но они работают несколько по-другому, чтобы облегчить изучение Mojo, и они лучше интегрируются в экосистему Python, не требуя огромного количества аннотаций.

В следующих разделах вы узнаете, как можно контролировать владение памятью для объектов, передаваемых в функции Mojo fn.

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя