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

Pythonの文法そのまま68,000倍 (68,000倍!) のベンチマーク 🔥
Mojo 🔥 の成功の日はPythonエンジニア成功の日です!
世界中のおんぼろコードをMojo 🔥 で書き換える仕事が待ってます。
(誰も難しくて遅いプログラミング言語なんて学ばず、保守する人がいなくなる)
現行のプログラミング教育で使われている言語はScratchかPythonです。
みんなPythonに夢中、その次にくるのは間違いなくMojo 🔥
今から入門して、時代を先取りして、周りのみんなに教えてあげよう!!
開発中の言語なので、情報が日々アップデートされています。
この記事通りにいかないかもしれません。あくまで入門の記録として参考までに。
公式サイト: Mojo 🔥: Powerful CPU+GPU Programming
Mojo 🔥 はSwiftを作り上げた天才Chris Lattnerらが開発元なのでそのうち完成します...!

Playgroundで遊んでみる

インストールしてみる
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.

Mac
- macOS Ventura (13) or later
- Apple silicon (M1/M2/M3/M4 processor)
- Python 3.9 - 3.12
- Xcode or Xcode Command Line Tools
システム要件は満たしているはず
そもそも{{ URL }} not foundになっているのが気になる

同じような問題が報告されているが解決されていない
ChatGPTに質問
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 を使用して開く」のチェックを外します。

再開
$ 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`.
...

自動補完を有効化
$ echo 'eval "$(magic completion --shell zsh)"' >> ~/.zshrc
source ~/.zshrc
bashなら↓
$ BASHRC=$( [ -f "$HOME/.bash_profile" ] && echo "$HOME/.bash_profile" || echo "$HOME/.bashrc" )
echo 'eval "$(magic completion --shell bash)"' >> "$BASHRC"
source "$BASHRC"
tab
キー押すとコマンドが自動補完されるようになる

アップデート
$ magic self-update
> ✔ magic is already up-to-date (version 0.6.2)

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パッケージを使いたい時。ディレクトリ内であればシェルをアクティベートしていなくても使える。

パッケージ管理
magic add
でできる。pip install
みたいな感じ。--
でチャネルも指定できる。
magic update
でアップデートもできる。パッケージのバージョンを固定、変更もできる。
pixi.toml, pyproject.toml, or mojoproject.toml
: プロジェクト設定ファイル
magic.lock
: 自動生成
こんな感じでMojo 🔥 のインストール (MagicのGet started) は終了。
ここからMojo 🔥 の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 # 他の場所ではできないが、シェルのアクティベートは必要ない

Hello, world
新しい言語を学ぶとき、感謝を込めて世界に挨拶
エディタはVS Codeがおすすめみたい。
最近はJETBRAINS社製のエディタを試しているのでPyCharmでもできないかと思ったらプラグインがあった。
PyCharmでプロジェクトを開き、インタープリターは次のように設定(変だったら教えてください)
/Users/username/mojo/life/.magic/envs/default/bin/python3.12

# My first Mojo program!
def main():
print("Hello, World!")
$ magic shell
$ mojo life.mojo
> Hello, World!
こんにちは〜

コンパイル!
Pythonコンパイルするの変な感じ!
$ mojo build life.mojo
$ ./life

(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の方がいいかも?

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

型にはString
の他にInt
やList
もある
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にやらせよう!)

Pythonだと構造体がない(無いよね?)から話が入ってこない。あとで見返す
@value
struct Grid():
var rows: Int
var cols: Int
var data: List[List[Int]]
Mojo 構造体は、構造体のインスタンスが作成、移動、コピー、破棄されたときの動作を定義するさまざまなライフサイクルメソッドをサポートしています。他の型の基本的な集約であり、カスタムのリソース管理やライフサイクル動作を必要としない構造体の場合は、構造体の定義に @value デコレーターを追加するだけで、Mojo コンパイラーが自動的にライフサイクルメソッドを生成します。(DeepL)
よく分からないけど@valueつけておけばいい感じにしてくれる?
Rust入門でライフサイクル、ライフタイムあたりの話たくさん出てきていた印象
構造体はクラスみたいなものだとしてライフサイクルメソッドは追々...

達成度評価
ゼロから完全なMojoアプリケーションを書いたことを祝福します!その過程で、次のことを体験しました:
- Magicを使用してMojoプログラムを作成、ビルド、実行する ✅
- Int、String、ListなどのMojo組み込み型の使用 ✅
- 変数と関数の作成と使用 ✅
- if、while、forなどの制御構造の使用 ✅
- カスタムMojo構造体の定義と使用 🔥
- Mojoモジュールの作成とインポート 🔥
- Mojo標準ライブラリからのモジュールの使用 🔥
- Pythonモジュールのインポートと使用 🔥
🔥は実際に使ってみて理解したいところ
書くのは普通のPythonだけど、すんなりコンパイルできて静的型付けなだけで格が上がった気がする
次: