Here’s a simple definition of a struct:Синтаксически самое большое отличие от класса Python заключается в том, что все свойства экземпляра в структуре должны быть явно объявлены с помощью объявления var или let.Код: Выделить всё
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)
язык программирования Mojo
Модератор: Olej
- Olej
- Писатель
- Сообщения: 19694
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
язык программирования Mojo
- Olej
- Писатель
- Сообщения: 19694
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
язык программирования Mojo
Передача управление аргументом, и владение памятью
И в Python, и в Mojo большая часть языка вращается вокруг вызовов функций: многие (очевидно) встроенные варианты поведения реализованы в стандартной библиотеке с помощью методов «dunder» (двойное подчеркивание). Внутри этих магических функций большая часть владения памятью определяется посредством передачи аргументов.
Давайте рассмотрим некоторые подробности о том, как Python и Mojo передают аргументы:
- Все значения, передаваемые в функцию def Python, используют ссылочную семантику. Это означает, что функция может изменять переданные в нее изменяемые объекты, и эти изменения видны за пределами функции. Однако такое поведение иногда может удивить непосвященных, поскольку вы можете изменить объект, на который указывает аргумент, и это изменение не будет видно за пределами функции.
- Все значения, передаваемые в функцию определения Mojo, по умолчанию используют семантику значений. По сравнению с Python это важное отличие: функция def Mojo получает копию всех аргументов — она может изменять аргументы внутри функции, но изменения не видны вне функции.
- Все значения, передаваемые в функцию Mojo fn, по умолчанию являются неизменяемыми ссылками. Это означает, что функция может читать исходный объект (это не копия), но вообще не может его модифицировать.
Это соглашение о передаче неизменяемых аргументов в функции Mojo называется «заимствованием». В следующих разделах мы объясним, как можно изменить поведение передачи аргументов в Mojo как для функций def, так и для fn.
- Olej
- Писатель
- Сообщения: 19694
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
язык программирования Mojo
Почему соглашения аргументации важны
В Python все фундаментальные значения являются ссылками на объекты — как описано выше, функция Python может изменять исходный объект. Таким образом, разработчики Python привыкли воспринимать все как справочную семантику. Однако на уровне CPython или компьютера вы можете видеть, что сами ссылки на самом деле передаются путем копирования — Python копирует указатель и корректирует счетчик ссылок.
Этот подход Python обеспечивает удобную модель программирования для большинства людей, но он требует, чтобы все значения распределялись в куче (и результаты иногда оказываются неожиданными из-за совместного использования ссылок). Классы Mojo (TODO: will) следуют одному и тому же ссылочно-семантическому подходу для большинства объектов, но это непрактично для простых типов, таких как целые числа, в контексте системного программирования. В этих сценариях мы хотим, чтобы значения находились в стеке или даже в аппаратных регистрах. Таким образом, структуры Mojo всегда встраиваются в свой контейнер, будь то поле другого типа или фрейм стека содержащей функции.
Это поднимает несколько интересных вопросов: как реализовать методы, которым необходимо изменять self типа структуры, например __iadd__? Как работает let и как он предотвращает мутации? Как контролируется время жизни этих значений, чтобы Mojo оставался безопасным для памяти языком?
Ответ заключается в том, что компилятор Mojo использует анализ потока данных и аннотации типов, чтобы обеспечить полный контроль над копиями значений, псевдонимами ссылок и контролем мутаций. Эти функции во многом похожи на функции языка Rust, но они работают несколько по-другому, чтобы облегчить изучение Mojo, и они лучше интегрируются в экосистему Python, не требуя огромного количества аннотаций.
В следующих разделах вы узнаете, как можно контролировать владение памятью для объектов, передаваемых в функции Mojo fn.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя