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

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

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 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
Писатель
Сообщения: 21338
Зарегистрирован: 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
Писатель
Сообщения: 21338
Зарегистрирован: 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.

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

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

Непрочитанное сообщение Olej » 21 дек 2023, 17:24

За неимением времени, другим был занят, не смотрел что там с Mojo.
Сейчас решил вернуться посмотреть что там....
Olej писал(а):
11 сен 2023, 18:09

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

olej@R420:~$ modular update mojo
# No updates available for this target.
И вот :-o :cry: :

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

olej@R420:~$ modular update mojo
loc("#M.target<triple = \22x86_64-unknown-linux\22, cpu = \22ivybridge\22, features = \22+64bit,+aes,+avx,+cmov,+crc32,+cx16,+cx8,+f16c,+fsgsbase,+fxsr,+mmx,+pclmul,+popcnt,+rdrnd,+sahf,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3,+x87,+xsave,+xsaveopt\22, data_layout = \22e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128\22, simd_bit_width = 128>":1:50): error: duplicate or unknown struct parameter name: cpu
Please submit a bug report to https://github.com/modularml/mojo/issues and include the crash backtrace along with all the relevant source codes.
Stack dump:
0.	Program arguments: modular update mojo
Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
0  modular   0x000056053154d867
1  modular   0x000056053154b51e
2  modular   0x000056053154df2f
3  libc.so.6 0x00007f8b36703520
4  modular   0x0000560531973ba4
5  modular   0x000056053197322f
6  modular   0x0000560531529354
7  modular   0x000056053152873a
8  modular   0x000056053150f4b3
9  libc.so.6 0x00007f8b366ead90
10 libc.so.6 0x00007f8b366eae40 __libc_start_main + 128
11 modular   0x000056053150e6be
Ошибка сегментирования (образ памяти сброшен на диск)
Давненько я не видел чтоб так вдребезги что-то разлеталось :!:
Вот он ... как установлен месяцев 3-4 назад:

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

olej@R420:~/2023/MY.LAN$ aptitude show modular
Пакет: modular
Версия: 0.3.1
Новый: да
Состояние: установлен
Установлен автоматически: нет
Приоритет: необязательный
Раздел: contrib/devel
Сопровождающий: The Modular Develoeprs <hello@modular.com>
Архитектура: amd64
Размер в распакованном виде: 0
Зависит: python3, python3-pip, libtinfo-dev, libxml2, libxml2-dev
Описание: Modular installation tool

Домашняя страница: https://modular.com

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

olej@R420:~/2023/own.WORK/Mojo$ modular --version
modular 0.3.1 (589ce200)

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

olej@R420:~/2023/own.WORK/Mojo$ mojo --version
mojo 0.2.1 (64d14e85)

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

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

Непрочитанное сообщение Olej » 21 дек 2023, 17:34

Olej писал(а):
21 дек 2023, 17:24
как установлен месяцев 3-4 назад
Переустановить?

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

olej@R420:~/2023/own.WORK/Mojo$ sudo apt-get update && sudo apt-get install modular 
[sudo] пароль для olej:       
Сущ:1 http://neilalexander.s3.dualstack.eu-west-2.amazonaws.com/deb debian InRelease
Сущ:2 http://dl.google.com/linux/chrome/deb stable InRelease                                                                                       
Сущ:3 http://ubuntu.volia.net/ubuntu-archive jammy InRelease                                                                                       
Сущ:4 http://ubuntu.volia.net/ubuntu-archive jammy-updates InRelease                                                                               
Сущ:5 http://ubuntu.volia.net/ubuntu-archive jammy-backports InRelease                                                                             
Сущ:6 https://updates.signal.org/desktop/apt xenial InRelease                                                                                      
Игн:7 https://mirror.host4biz.eu/linuxmint/pkg victoria InRelease                                                                                  
Сущ:8 https://dl.yarnpkg.com/debian stable InRelease                                                                                               
Сущ:9 https://mirror.host4biz.eu/linuxmint/pkg victoria Release                                                                                    
Сущ:10 https://brave-browser-apt-release.s3.brave.com stable InRelease                                                                             
Сущ:11 https://repo.skype.com/deb stable InRelease                                                                                                 
Пол:12 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]                                                                         
Сущ:13 https://linux.teamviewer.com/deb stable InRelease                                                                                           
Сущ:14 https://packages.microsoft.com/repos/ms-teams stable InRelease                                                                              
Сущ:15 https://deb.opera.com/opera-stable stable InRelease                                                                                         
Пол:16 https://dl.modular.com/public/installer/deb/linuxmint vanessa InRelease [5.080 B]                            
Получено 115 kB за 3с (43,5 kB/s)                                           
Чтение списков пакетов… Готово
W: https://dl.yarnpkg.com/debian/dists/stable/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
W: https://repo.skype.com/deb/dists/stable/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
Чтение списков пакетов… Готово
Построение дерева зависимостей… Готово
Чтение информации о состоянии… Готово         
Уже установлен пакет modular самой новой версии (0.3.1).
Обновлено 0 пакетов, установлено 0 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.

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

olej@R420:~/2023/own.WORK/Mojo$ modular clean

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

olej@R420:~/2023/own.WORK/Mojo$ modular install mojo
# Found release for https://packages.modular.com/mojo @ 0.6.1
# Installing to /home/olej/.modular/pkg/packages.modular.com_mojo
# Downloading artifacts. Please wait...
# Downloads complete, setting configs...
# Configs complete, running post-install hooks...
Collecting find_libpython==0.3.0
  Using cached find_libpython-0.3.0-py3-none-any.whl (8.5 kB)
Collecting jupyter_client>=8.3.0
  Downloading jupyter_client-8.6.0-py3-none-any.whl (105 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 105.9/105.9 KB 1.0 MB/s eta 0:00:00
Collecting ipykernel>=6.25.0
  Downloading ipykernel-6.27.1-py3-none-any.whl (114 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 114.6/114.6 KB 2.2 MB/s eta 0:00:00
Collecting python-dateutil>=2.8.2
  Using cached python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
Collecting traitlets>=5.3
  Downloading traitlets-5.14.0-py3-none-any.whl (85 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 85.2/85.2 KB 1.6 MB/s eta 0:00:00
Collecting pyzmq>=23.0
  Downloading pyzmq-25.1.2-cp310-cp310-manylinux_2_28_x86_64.whl (1.1 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 2.2 MB/s eta 0:00:00
Collecting tornado>=6.2
  Downloading tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (435 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 435.4/435.4 KB 2.2 MB/s eta 0:00:00
Collecting jupyter-core!=5.0.*,>=4.12
  Downloading jupyter_core-5.5.1-py3-none-any.whl (28 kB)
Collecting matplotlib-inline>=0.1
  Downloading matplotlib_inline-0.1.6-py3-none-any.whl (9.4 kB)
Collecting nest-asyncio
  Downloading nest_asyncio-1.5.8-py3-none-any.whl (5.3 kB)
Collecting comm>=0.1.1
  Downloading comm-0.2.0-py3-none-any.whl (7.0 kB)
Collecting psutil
  Downloading psutil-5.9.7-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (285 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 285.5/285.5 KB 2.2 MB/s eta 0:00:00
Collecting ipython>=7.23.1
  Downloading ipython-8.18.1-py3-none-any.whl (808 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 808.2/808.2 KB 2.4 MB/s eta 0:00:00
Collecting debugpy>=1.6.5
  Downloading debugpy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.3 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.3/3.3 MB 2.4 MB/s eta 0:00:00
Collecting packaging
  Downloading packaging-23.2-py3-none-any.whl (53 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 53.0/53.0 KB 1.9 MB/s eta 0:00:00
Collecting jedi>=0.16
  Downloading jedi-0.19.1-py2.py3-none-any.whl (1.6 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.6/1.6 MB 2.4 MB/s eta 0:00:00
Collecting decorator
  Downloading decorator-5.1.1-py3-none-any.whl (9.1 kB)
Collecting prompt-toolkit<3.1.0,>=3.0.41
  Downloading prompt_toolkit-3.0.43-py3-none-any.whl (386 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 386.1/386.1 KB 2.1 MB/s eta 0:00:00
Collecting pexpect>4.3
  Downloading pexpect-4.9.0-py2.py3-none-any.whl (63 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 63.8/63.8 KB 1.9 MB/s eta 0:00:00
Collecting pygments>=2.4.0
  Downloading pygments-2.17.2-py3-none-any.whl (1.2 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2/1.2 MB 2.4 MB/s eta 0:00:00
Collecting stack-data
  Downloading stack_data-0.6.3-py3-none-any.whl (24 kB)
Collecting exceptiongroup
  Downloading exceptiongroup-1.2.0-py3-none-any.whl (16 kB)
Collecting platformdirs>=2.5
  Downloading platformdirs-4.1.0-py3-none-any.whl (17 kB)
Collecting six>=1.5
  Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Collecting parso<0.9.0,>=0.8.3
  Downloading parso-0.8.3-py2.py3-none-any.whl (100 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.8/100.8 KB 1.7 MB/s eta 0:00:00
Collecting ptyprocess>=0.5
  Downloading ptyprocess-0.7.0-py2.py3-none-any.whl (13 kB)
Collecting wcwidth
  Downloading wcwidth-0.2.12-py2.py3-none-any.whl (34 kB)
Collecting executing>=1.2.0
  Downloading executing-2.0.1-py2.py3-none-any.whl (24 kB)
Collecting asttokens>=2.1.0
  Downloading asttokens-2.4.1-py2.py3-none-any.whl (27 kB)
Collecting pure-eval
  Downloading pure_eval-0.2.2-py3-none-any.whl (11 kB)
Installing collected packages: wcwidth, pure-eval, ptyprocess, find_libpython, traitlets, tornado, six, pyzmq, pygments, psutil, prompt-toolkit, platformdirs, pexpect, parso, packaging, nest-asyncio, executing, exceptiongroup, decorator, debugpy, python-dateutil, matplotlib-inline, jupyter-core, jedi, comm, asttokens, stack-data, jupyter_client, ipython, ipykernel
Successfully installed asttokens-2.4.1 comm-0.2.0 debugpy-1.8.0 decorator-5.1.1 exceptiongroup-1.2.0 executing-2.0.1 find_libpython-0.3.0 ipykernel-6.27.1 ipython-8.18.1 jedi-0.19.1 jupyter-core-5.5.1 jupyter_client-8.6.0 matplotlib-inline-0.1.6 nest-asyncio-1.5.8 packaging-23.2 parso-0.8.3 pexpect-4.9.0 platformdirs-4.1.0 prompt-toolkit-3.0.43 psutil-5.9.7 ptyprocess-0.7.0 pure-eval-0.2.2 pygments-2.17.2 python-dateutil-2.8.2 pyzmq-25.1.2 six-1.16.0 stack-data-0.6.3 tornado-6.4 traitlets-5.14.0 wcwidth-0.2.12

🔥 Mojo installed! 🔥

Mojo's Python virtual environment created at /home/olej/.modular/pkg/packages.modular.com_mojo/venv

If you are using ZSH (default on macOS), run the following commands:

echo 'export MODULAR_HOME="/home/olej/.modular"' >> ~/.zshrc
echo 'export PATH="/home/olej/.modular/pkg/packages.modular.com_mojo/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

If you are using bash, run the following commands:

BASHRC=$( [ -f "$HOME/.bash_profile" ] && echo "$HOME/.bash_profile" || echo "$HOME/.bashrc" )
echo 'export MODULAR_HOME="/home/olej/.modular"' >> "$BASHRC"
echo 'export PATH="/home/olej/.modular/pkg/packages.modular.com_mojo/bin:$PATH"' >> "$BASHRC"
source "$BASHRC"

Then enter 'mojo' to start the Mojo REPL.

For tool help, enter 'mojo --help'.
For more docs, see https://docs.modular.com/mojo.

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

olej@R420:~/2023/own.WORK/Mojo$ mojo --version
mojo 0.6.1 (876ded2e)
Ну ... это существенно различается?
Olej писал(а):
21 дек 2023, 17:24

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

olej@R420:~/2023/own.WORK/Mojo$ mojo --version
mojo 0.2.1 (64d14e85)
0.2.1 => 0.6.1 - За 3 месяца :!:

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

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

Непрочитанное сообщение Olej » 21 дек 2023, 22:07

Olej писал(а):
11 сен 2023, 15:47
Вы можете без всяких проблем работать на Mojo, если вы знаете Python — у языков программирования есть много общих функций, возможностей и библиотек.
Библиотеки numpy, pandas и matplotlib также доступны в Mojo.
Хотелось бы понимать - это пишут о том, что понимают :?: Тогда вопрос: "как?". У меня не получатся использовать Python код...
Диалоговая консоль как-то непонятно дуркует ... "то ли да, то ли нет":

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

olej@R420:~/2023/own.WORK/Mojo$ mojo
Welcome to Mojo! 🔥

Expressions are delimited by a blank line.
Type `:quit` to exit the REPL and `:mojo help` for further assistance.

  1> import numpy 
  2.  
[User] error: Expression [0]:1:8: unable to locate module 'numpy'
import numpy
       ^


expression failed to parse (no further compiler diagnostics)
  1> import pandas 
  2. import matplotlib 
  3. :quit 
  4. ^C
  1> import numpy 
  2. ^C
  1> :quit
Process 61410 exited with status = 9 (0x00000009) killed
Или это пишут, обещают "в принципе ...", теоретически ... в ближайшие 15 лет будет реализовано... :?: :cry:

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

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

Непрочитанное сообщение Olej » 21 дек 2023, 22:10

Olej писал(а):
21 дек 2023, 22:07
не получатся использовать Python код
Беру из загашников, реализация чисел Фибоначчи, лет 10 назад:

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

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Mojo$ cat fibo.py 
#!/usr/bin/python3

import sys

def fib( n ) :
    if n < 2 : return 1 
    else: return fib( n - 1 ) + fib( n - 2 ) 

print( "{}".format( fib( int( sys.argv[ 1 ] ) ) ) )

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

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Mojo$ python fibo.py 12
233
А теперь:

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

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Mojo$ cp fibo.py fibo.mojo

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

olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Mojo$ mojo build fibo.mojo 
/home/olej/2023/own.BOOKs/NET.2/Nexamples.WORK/Mojo/fibo.mojo:10:1: error: TODO: expressions are not yet supported at the file scope level
print( "{}".format( fib( int( sys.argv[ 1 ] ) ) ) )
^
/home/olej/2023/own.BOOKs/NET.2/Nexamples.WORK/Mojo/fibo.mojo:10:12: error: 'StringLiteral' value has no attribute 'format'
print( "{}".format( fib( int( sys.argv[ 1 ] ) ) ) )
       ~~~~^~~~~~~
mojo: error: failed to parse the provided Mojo
Что значит нет format? :-o

Ответить

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

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

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