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

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

Модератор: Olej

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

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

Непрочитанное сообщение Olej » 11 сен 2023, 18:37

Olej писал(а):
11 сен 2023, 17:08
Hello, world!
Create a statically-linked binary with the build command:

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

olej@R420:~/2023/own.WORK/Mojo$ mojo build hello.mojo

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

olej@R420:~/2023/own.WORK/Mojo$ ls -l hello*
-rwxrwxr-x 1 olej olej 1680056 сен 11 18:31 hello
-rw-rw-r-- 1 olej olej      37 сен 11 18:11 hello.mojo

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

olej@R420:~/2023/own.WORK/Mojo$ ./hello 
Hello, world!

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

olej@R420:~/2023/own.WORK/Mojo$ file hello
hello: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=2ebbef6779d30af60e04b9b8b3861010565db254, for GNU/Linux 3.2.0, not stripped
The executable is a statically-compiled binary, which means it has no external library dependencies and it can run on any system with the same CPU architecture as your own.
Довольно смелое странное утверждение :-o :-( :

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

olej@R420:~/2023/own.WORK/Mojo$ ldd hello
	linux-vdso.so.1 (0x00007fff362e4000)
	libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f765d017000)
	libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f765cdeb000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f765cd04000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f765cce4000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f765cabc000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f765d1c3000)

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

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

Непрочитанное сообщение Olej » 11 сен 2023, 18:45

Hello, world!
1.
If you’re new to Mojo, read the Mojo language basics.
Mojo language basics
Mojo сохраняет динамические функции Python и синтаксис языка и даже позволяет импортировать и запускать код из пакетов Python. Однако важно знать, что Mojo — это совершенно новый язык, а не просто новая реализация Python с синтаксическим сахаром. Mojo выводит язык Python на совершенно новый уровень благодаря функциям системного программирования, строгой проверке типов, безопасности памяти, технологиям компилятора нового поколения и многому другому. Тем не менее, он по-прежнему спроектирован как простой язык, полезный для программирования общего назначения.
Note: The Mojo SDK is still in early development, but you can expect constant improvements to both the language and tools. Please see the known issues and report any other issues on GitHub.
2.
For a deep dive into the language, check out the Mojo programming manual.
Mojo🔥 programming manual

3.
To see all the available Mojo APIs, check out the Mojo standard library reference.
Mojo🔥 modules

4.
If you want to package your code as a library, read about Mojo modules and packages.
Mojo modules and packages

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

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

Непрочитанное сообщение Olej » 11 сен 2023, 18:53

If you’re new to Mojo, read the Mojo language basics.
Mojo language basics
First and foremost, Mojo is a compiled language and a lot of its performance and memory-safety features are derived from that fact. Mojo code can be ahead-of-time (AOT) or just-in-time (JIT) compiled.
If you know Python, you might have expected the function name to be def main() instead of fn main(). Both actually work in Mojo, but using fn behaves a bit differently, as we’ll discuss below.

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

fn main():
    var x: Int = 1
    x += 1
    print(x)
Of course, if you’re building a Mojo module (an API library), not a Mojo program, then your file doesn’t need a main() function (because it will be imported by other programs that do have one).
This is simple: Mojo supports (or will support) all of Python’s syntax and semantics. If you’re not familiar with Python syntax, there are a ton of great resources online that can teach you.

For example, like Python, Mojo uses line breaks and indentation to define code blocks (not curly braces), and Mojo supports all of Python’s control-flow syntax such as if conditions and for loops.
Functions

Mojo functions can be declared with either fn (shown above) or def (as in Python). The fn declaration enforces strongly-typed and memory-safe behaviors, while def provides Python-style dynamic behaviors.

Both fn and def functions have their value, and it’s important that you learn them both. However, for the purposes of this introduction, we’re going to focus on fn functions only.
... дальше нужно давать выборочно в переводе, для быстрого ухвватывания, потому что там достаточно сложные базовые понятия...

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

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

Непрочитанное сообщение Olej » 11 сен 2023, 19:43

Olej писал(а):
11 сен 2023, 18:53
... дальше нужно давать выборочно в переводе, для быстрого ухвватывания, потому что там достаточно сложные базовые понятия...
Вы можете объявить переменные (например, x в приведенной выше функции main()) с помощью var для создания изменяемого значения или с помощью let для создания неизменяемого значения.
Если вы измените var, чтобы разрешить функцию main() выше, и запустите ее, вы получите такую ошибку компилятора:

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

error: Expression [15]:7:5: expression must be mutable for in-place operator destination
    x += 1
    ^
Это потому, что let делает значение неизменяемым, поэтому вы не можете его увеличивать.
А если вы полностью удалите var, вы получите ошибку, поскольку функции fn требуют явного объявления переменных (в отличие от функций def в стиле Python).
Наконец, обратите внимание, что переменная x имеет явный тип Int. Объявление типа для переменных в fn не требуется, но иногда желательно. Если вы его опустите, Mojo определит тип, как показано здесь:

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

fn do_math():
    let x: Int = 1
    let y = 2
    print(x + y)

do_math()

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

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

Непрочитанное сообщение Olej » 11 сен 2023, 19:45

Аргументы функции и возвраты
Хотя типы не требуются для переменных, объявленных в теле функции, они необходимы для аргументов и возвращаемых значений функции fn.

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

fn add(x: Int, y: Int) -> Int:
    return x + y

z = add(1, 2)
print(z)
Например, вот как объявить Int в качестве типа аргументов функции и возвращаемого значения:
Изменяемость аргументов и владение
Mojo поддерживает полноценную семантику и обеспечивает безопасность памяти с помощью надежной модели владения значениями (аналогично средству проверки заимствований в Rust). Итак, ниже приводится краткое введение в то, как вы можете обмениваться ссылками на значения через аргументы функции.
Обратите внимание: вышеприведенный метод add() не изменяет x или y, а только считывает значения. Фактически, как написано, функция не может их изменять, поскольку аргументы fn по умолчанию являются неизменяемыми ссылками.
С точки зрения соглашений об аргументах это называется «заимствованием», и хотя это значение по умолчанию для функций fn, вы можете сделать это явным образом с помощью заимствованного объявления, например (это ведет себя точно так же, как и функция add() выше):

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

fn add(borrowed x: Int, borrowed y: Int) -> Int:
    return x + y
Если вы хотите, чтобы аргументы были изменяемыми, вам необходимо объявить соглашение об аргументах inout. Это означает, что изменения, внесенные в аргументы внутри функции, видны за ее пределами.
Например, эта функция может изменять исходные переменные:

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

fn add_inout(inout x: Int, inout y: Int) -> Int:
    x += 1
    y += 1
    return x + y

var a = 1
var b = 2
c = add_inout(a, b)
print(a)
print(b)
print(c)

2
3
5
Другой вариант — объявить аргумент как принадлежащий, что обеспечивает функции полное владение значением (оно изменяемо и гарантированно уникально). Таким образом, функция может изменять значение и не беспокоиться о влиянии на переменные вне функции. Например:

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

fn set_fire(owned text: String) -> String:
    text += "🔥"
    return text

fn mojo():
    let a: String = "mojo"
    let b = set_fire(a)
    print(a)
    print(b)

mojo()

mojo
mojo🔥
В этом случае Mojo создает копию a и передает ее в качестве текстового аргумента. Оригинальная строка все еще жива и здорова.
Однако, если вы хотите передать функцию право собственности на значение и не хотите делать копию (что может быть дорогостоящей операцией для некоторых типов), вы можете добавить оператор «передачи» ^ при передаче функции. . Оператор передачи эффективно уничтожает имя локальной переменной — любая попытка вызвать его позже приведет к ошибке компилятора.
Попробуйте сделать это выше, изменив вызов set_fire() так:

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

let b = set_fire(a^)
Теперь вы получите сообщение об ошибке, поскольку оператор передачи фактически уничтожает переменную a, поэтому, когда следующая функция print() пытается использовать a, эта переменная больше не инициализируется.
Если вы удалите print(a), то все будет работать нормально.
Эти соглашения об аргументах предназначены для того, чтобы предоставить системным программистам полный контроль над оптимизацией памяти, обеспечивая при этом безопасный доступ и своевременное освобождение памяти — компилятор Mojo гарантирует, что никакие две переменные не имеют изменяемого доступа к одному и тому же значению одновременно, а время жизни каждого значения невелико. четко определены, чтобы строго предотвратить любые ошибки памяти, такие как «использование после освобождения» и «двойное освобождение».
Примечание. В настоящее время Mojo всегда создает копию, когда функция возвращает значение.

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

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

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

Структуры
Вы можете создавать абстракции высокого уровня для типов (или «объектов») в структуре. Структура в Mojo аналогична классу в Python: они оба поддерживают методы, поля, перегрузку операторов, декораторы для метапрограммирования и т. д. Однако структуры Mojo полностью статичны — они привязываются во время компиляции, поэтому не позволяют динамически правка или любые изменения структуры во время выполнения. (Mojo также будет поддерживать классы в будущем.)
Например, вот базовая структура:

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

struct MyPair:
    var first: Int
    var second: Int

    fn __init__(inout self, first: Int, second: Int):
        self.first = first
        self.second = second
    
    fn dump(self):
        print(self.first, self.second)
И то как мы можем использовать это:

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

let mine = MyPair(2, 4)
mine.dump()

2 4
Если вы знакомы с Python, то метод __init__() и аргумент self должны быть вам знакомы. Если вы не знакомы с Python, обратите внимание, что когда мы вызываем dump(), мы фактически не передаем значение аргумента self. Значение self автоматически предоставляется вместе с текущим экземпляром структуры (оно используется аналогично имени this, используемому в некоторых других языках для ссылки на текущий экземпляр объекта/типа).

Более подробную информацию о структурах и других специальных методах, таких как __init__() (также известных как «методы dunder»), см. в руководстве по программированию.

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

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

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

Mojo🔥 programming manual
Что еще более важно, Mojo позволяет вам использовать всю экосистему Python, чтобы вы могли продолжать использовать знакомые вам инструменты. Mojo спроектирован так, чтобы со временем стать расширенной версией Python, сохраняя динамические функции Python и добавляя новые примитивы для системного программирования. Эти новые примитивы системного программирования позволят разработчикам Mojo создавать высокопроизводительные библиотеки, для которых в настоящее время требуются C, C++, Rust, CUDA и другие системы-ускорители. Объединив лучшее из динамических и системных языков, мы надеемся предоставить унифицированную модель программирования, которая работает на всех уровнях абстракции, удобна для начинающих программистов и масштабируется для многих вариантов использования, от ускорителей до программирования приложений и сценариев.
With the Mojo SDK, you can run a Mojo program from a terminal just like you can with Python. So if you have a file named hello.mojo (or hello.🔥—yes, the file extension can be an emoji!), just type mojo hello.mojo:

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

$ cat hello.🔥
def main():
    print("hello world")
    for x in range(9, 0, -3):
        print(x)
$ mojo hello.🔥
hello world
9
6
3
$
Again, you can use either the .🔥 or .mojo suffix.

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

olej@R420:~/2023/own.WORK/Mojo$ touch hello.🔥
:lol:

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

olej@R420:~/2023/own.WORK/Mojo$ cat hello.🔥
def main():
    print("hello world")
    for x in range(9, 0, -3):
        print(x)

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

olej@R420:~/2023/own.WORK/Mojo$ mojo hello.🔥
hello world
9
6
3

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

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

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

Объявления let и var поддерживают спецификаторы типов, а также шаблоны и позднюю инициализацию:

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

def your_function():
    let x: Int = 42
    let y: Float64 = 17.0

    let z: Float32
    if x != 0:
        z = 1.0
    else:
        z = foo()
    print(z)

def foo() -> Float32:
    return 3.14

your_function()

1.0
Обратите внимание, что let и var совершенно необязательны в функции def (вместо этого вы можете использовать неявно объявленные значения, как в Python), но они необходимы для всех переменных в функции fn.

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

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

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

Olej писал(а):
13 сен 2023, 21:18
you can use either the .🔥 or .mojo suffix
Как легко видеть, CLI команды Linux в терминале отлично принимаеет такое странное расширение как *.🔥 (потому что CLI везде использует UTF-8).
Так же точно, как, скажем IDE/редактор/терминал Geany:
Снимок экрана от 2023-09-14 12-58-08.png
Снимок экрана от 2023-09-14 12-58-08.png (162.16 КБ) 437 просмотров
Но Geany ещё не знает цветовой разметки для языка Mojo (потом что языку от рождения 4 месяца :-o )... хотя Geany, наверное, можно "подсказать" как-то, что для Mojo использовать цветовую разметку Python ... Но я не буду с этим заморачиваться.

P.S. Но вот добавить .🔥 в качестве разрешённых расширений этого форума для прикрепляемых к сообщениям файлов, например, невозможно, потому как phpBB не настолько сообразительный как CLI Linux (bash), и не использует UNICODE, а .🔥 преобразует в .???? (т.е. 🔥 - аж 4-байтный символ UTF-8).

P.P.S. С кодом символа 🔥 мы можем убедиться, например, здесь Юникод-кодировщик:
\ud83d\udd25
Это UTF-16 ... который нас мало интересует...
Или так Unicode Converter - encoding / decoding :
\xf0\x9f\x94\xa5
\ud83d\udd25
u+0001f525
Это, соответственно:
UTF-8
UTF-16
UTF-32

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

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

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

Olej писал(а):
13 сен 2023, 21:18
Mojo🔥 programming manual
типы структур

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

Структура в Mojo похожа на класс Python: они оба поддерживают методы, поля, перегрузку операторов, декораторы для метапрограммирования и т. д. Их различия заключаются в следующем:

Классы Python являются динамическими: они допускают динамическую отправку, обезьяний патч (или “swizzling”, «перемешивание» - Monkey patch) и динамическое связывание свойств экземпляра во время выполнения.

Структуры Mojo статичны: они привязываются во время компиляции (вы не можете добавлять методы во время выполнения). Структуры позволяют жертвовать гибкостью ради производительности, будучи при этом безопасными и простыми в использовании.
P.S. Monkey Patching в Python: объяснение с примерами
03.04.2019
В этой статье рассказано о monkey patching (обезьяний патч см wiki), то есть о том, как динамически обновлять поведение кода во время выполнения. Мы также рассмотрим некоторые полезные примеры monkey patching в Python.

Ответить

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

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

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