Closed19

PythonエンジニアためのMojo 🔥 入門記録

nerunoinerunoi

Pythonの文法そのまま68,000倍 (68,000倍!) のベンチマーク 🔥
Mojo 🔥 の成功の日はPythonエンジニア成功の日です!

世界中のおんぼろコードをMojo 🔥 で書き換える仕事が待ってます。
(誰も難しくて遅いプログラミング言語なんて学ばず、保守する人がいなくなる)
現行のプログラミング教育で使われている言語はScratchかPythonです。

みんなPythonに夢中、その次にくるのは間違いなくMojo 🔥
今から入門して、時代を先取りして、周りのみんなに教えてあげよう!!

開発中の言語なので、情報が日々アップデートされています。
この記事通りにいかないかもしれません。あくまで入門の記録として参考までに。

公式サイト: Mojo 🔥: Powerful CPU+GPU Programming
https://www.modular.com/mojo

Mojo 🔥 はSwiftを作り上げた天才Chris Lattnerらが開発元なのでそのうち完成します...!

nerunoinerunoi

インストールしてみる

https://docs.modular.com/magic/

Mac (Apple M1, macOS: Sequoia 15.2):

curl -ssL https://magic.modular.com/deb10427-25d9-4592-89cc-ecd1e457661c | bash
$ curl -ssL https://magic.modular.com/deb10427-25d9-4592-89cc-ecd1e457661c | bash 
> Installing the latest version of Magic...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   324  100   324    0     0    255      0  0:00:01  0:00:01 --:--:--   255
error: 'https://dl.modular.com/public/magic/raw/versions/latest/magic-x86_64-apple-darwin' not found.
Sorry, Magic is not available for your OS and CPU architecture.  See https://modul.ar/requirements.
nerunoinerunoi

同じような問題が報告されているが解決されていない

https://github.com/modular/mojo/issues/3550

ChatGPTに質問

ChatGPT o1
Mojoのインストールで失敗しています。システム要件は満たしているはずです。
{{ error_message }}

Apple シリコン(M1/M2)の Mac を使っている場合、ターミナルが Rosetta で動いているとスクリプト側が CPU アーキテクチャを「x86_64」と誤認識し、magic-x86_64-apple-darwinをダウンロードしようとしてしまうことがあります。現在 Mojo は ARM (aarch64-apple-darwin) 向けのバイナリが用意されていますが、x86_64 版が用意されていない、もしくは何らかの理由で取得できていない場合にエラーになります。

ターミナルで確認

$ uname -m
> x86_64 # arm64である必要がある

Rosetta切り忘れてただけでした。

Finder で「アプリケーション」→「ユーティリティ」→「ターミナル」を探します。
ターミナルアプリを右クリックして「情報を見る」を選択します。
「Rosetta を使用して開く」のチェックを外します。

nerunoinerunoi

再開

$ curl -ssL https://magic.modular.com/deb10427-25d9-4592-89cc-ecd1e457661c | bash
> Installing the latest version of Magic...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 29.0M  100 29.0M    0     0  7416k      0  0:00:04  0:00:04 --:--:-- 13.4M
Done. The 'magic' binary is in '/Users/neru/.modular/bin'

Two more steps:
1. To use 'magic', run this command so it's in your PATH:
source /Users/username/.zshrc
2. To build with MAX and Mojo, go to http://modul.ar/get-started

できた。
source /Users/username/.zshrcで環境変数を再読み込みした。

$ magic -h
> magic - A high level package management tool by Modular for developing with Mojo
and MAX.

To get started, run `magic init` in your project directory.

To see all available commands, run `magic --help` or `magic help`.

...
nerunoinerunoi

自動補完を有効化

zsh
$ echo 'eval "$(magic completion --shell zsh)"' >> ~/.zshrc
source ~/.zshrc

bashなら↓

bash
$ BASHRC=$( [ -f "$HOME/.bash_profile" ] && echo "$HOME/.bash_profile" || echo "$HOME/.bashrc" )
echo 'eval "$(magic completion --shell bash)"' >> "$BASHRC"
source "$BASHRC"

tabキー押すとコマンドが自動補完されるようになる

nerunoinerunoi

アップデート

$ magic self-update
> ✔ magic is already up-to-date (version 0.6.2)
nerunoinerunoi

Create a project

いよいよプロジェクトを作る
magic initコマンドを使う
(Mojoを使ってみたいのでPythonプロジェクトの作り方は省略)

$ magic init my-mojo-project --format mojoproject
> ✔ Created /Users/username/mojo/my-mojo-project/mojoproject.toml
✔ Added max >=24.6.0,<25

できた。magic runで実行

$ cd my-mojo-project
$ magic run mojo --version

その他機能

$ magic shell # シェルの起動
$ mojo --version # test
$ exit  # シェルから出る

$ magic add "python==3.9" # mojoでPythonパッケージを使いたい時。ディレクトリ内であればシェルをアクティベートしていなくても使える。
nerunoinerunoi

パッケージ管理

magic addでできる。pip installみたいな感じ。--でチャネルも指定できる。
magic updateでアップデートもできる。パッケージのバージョンを固定、変更もできる。

pixi.toml, pyproject.toml, or mojoproject.toml: プロジェクト設定ファイル
magic.lock: 自動生成

こんな感じでMojo 🔥 のインストール (MagicのGet started) は終了。
ここからMojo 🔥 のGet started

nerunoinerunoi

https://docs.modular.com/mojo/manual/get-started

新規プロジェクトの作成

magic init life --format mojoproject

ファイルが自動生成される

$ cd life
$ ls -a
mojoproject.toml # 初期のマニュフェストファイル
magic.lock # 実際の依存関係やバージョン
.magic # condaの仮想環境
.gitattributes
.gitignore

プロジェクトフォルダ内ならどこでもmagic runできる

magic run mojo --version # 他の場所ではできないが、シェルのアクティベートは必要ない
nerunoinerunoi

Hello, world

新しい言語を学ぶとき、感謝を込めて世界に挨拶

エディタはVS Codeがおすすめみたい。

最近はJETBRAINS社製のエディタを試しているのでPyCharmでもできないかと思ったらプラグインがあった。

https://plugins.jetbrains.com/plugin/23371-mojo/versions/stable

PyCharmでプロジェクトを開き、インタープリターは次のように設定(変だったら教えてください)

/Users/username/mojo/life/.magic/envs/default/bin/python3.12
nerunoinerunoi
life.mojo
# My first Mojo program!
def main():
    print("Hello, World!")
$ magic shell
$ mojo life.mojo
> Hello, World!

こんにちは〜

nerunoinerunoi

コンパイル!

Pythonコンパイルするの変な感じ!

$ mojo build life.mojo
$ ./life
nerunoinerunoi

(PyCharmについて)

Mojoのプラグインにある実行構成から実行すると次のエラーが出る

$ /Users/username/mojo/life/.magic/envs/default/bin/mojo run --no-optimization --debug-level full /Users/username/mojo/life/life.mojo
> Failed to initialize Crashpad.  Crash reporting will not be available.  Cause: while locating crashpad handler: unable to locate crashpad handler executable

実行に問題はない(Crash reportingがされないだけ)ので放置でも大丈夫だが気になるので消したい
mojo shellしてコマンドコピペ(or mojo life.mojo)で実行すれば出ないからプラグインの問題?
PyCharmのMojoプラグイン不安定だからVS Codeの方がいいかも?

nerunoinerunoi

var xxx: String = 'string'みたいに型宣言できる。しなくても大丈夫だが明示的な方が良い

nerunoinerunoi

型にはStringの他にIntListもある
Listの中に入れる型をしていできるa = List[Int](), b = List[String]()
初期値を入れてもOK: nums = List(12, -7, 64) # A List[Int] containing 3 Int values
Listはメソッド色々使える: .append(), .pop(), スライシング nums[:-1] もできる
二次元(入れ子)にもなる`List(List(), List()), スライスできる gird[1][0]

複雑になってきた(面倒なことはPythonChatGPTにやらせよう!)

nerunoinerunoi

Pythonだと構造体がない(無いよね?)から話が入ってこない。あとで見返す

@value
struct Grid():
    var rows: Int
    var cols: Int
    var data: List[List[Int]]

Mojo 構造体は、構造体のインスタンスが作成、移動、コピー、破棄されたときの動作を定義するさまざまなライフサイクルメソッドをサポートしています。他の型の基本的な集約であり、カスタムのリソース管理やライフサイクル動作を必要としない構造体の場合は、構造体の定義に @value デコレーターを追加するだけで、Mojo コンパイラーが自動的にライフサイクルメソッドを生成します。(DeepL)

よく分からないけど@valueつけておけばいい感じにしてくれる?
Rust入門でライフサイクル、ライフタイムあたりの話たくさん出てきていた印象
構造体はクラスみたいなものだとしてライフサイクルメソッドは追々...

nerunoinerunoi

達成度評価

ゼロから完全なMojoアプリケーションを書いたことを祝福します!その過程で、次のことを体験しました:

- Magicを使用してMojoプログラムを作成、ビルド、実行する ✅
- Int、String、ListなどのMojo組み込み型の使用 ✅
- 変数と関数の作成と使用 ✅
- if、while、forなどの制御構造の使用 ✅
- カスタムMojo構造体の定義と使用 🔥
- Mojoモジュールの作成とインポート 🔥
- Mojo標準ライブラリからのモジュールの使用 🔥
- Pythonモジュールのインポートと使用 🔥

🔥は実際に使ってみて理解したいところ

書くのは普通のPythonだけど、すんなりコンパイルできて静的型付けなだけで格が上がった気がする

次:
https://docs.modular.com/mojo/manual/

https://docs.modular.com/mojo/lib

このスクラップは2025/01/21にクローズされました