Mojo 入門

第1章

Mojo を始める

Mojo とはどんな言語かを知り、Windows の WSL に開発環境を作って、最初のプログラムを実行・ビルドします。最後に、エラーメッセージの読み方を身につけます。

この章の内容
  1. 1.1Mojo とは何か
  2. 1.2動作環境を確認する
  3. 1.3WSL2 に Ubuntu を入れる
  4. 1.4pixi を入れる
  5. 1.5プロジェクトを作って Mojo を入れる
  6. 1.6VS Code を準備する
  7. 1.7最初のプログラムを書いて動かす
  8. 1.8実行ファイルを作る
  9. 1.9エラーメッセージを読む
  10. 1.10Python との違いの早見表
  11. 1.11まとめ

この章では、Mojo を使える状態にして、最初のプログラムを動かすところまでを一通り体験します。途中で、本書のすべての章で使う道具(WSL、pixi、VS Code)も準備します。

この章を終えると、次のことができるようになります。

1.1Mojo とは何か

Mojo は、Modular 社が開発しているプログラミング言語です。見た目は Python によく似ていますが、中身は コンパイルして動かす言語 です。書いたコードは実行の前に機械語に翻訳されるので、C++ や Rust と同じくらいの速さで動きます。CPU だけでなく GPU 向けのコードも、同じ言語で書けます。

Python・Mojo・MAX とハードウェアの関係 Python 書きやすい・ライブラリが豊富 インタープリターが 1行ずつ解釈して実行 Mojo Python に似た文法 コンパイルして機械語にする CPU と GPU のコードを書ける MAX(AI 推論基盤) Mojo で書かれている ライブラリを 呼び出せる CPU GPU インタープリター経由 機械語で直接
図1-1 Python・Mojo・MAX の関係

図のように、Mojo は Python と隣り合う位置にいます。Python の書きやすさを受け継ぎながら、Python では難しかった「速さ」と「ハードウェアの細かい制御」を言語そのものに組み込んでいます。Modular 社の AI 推論基盤 MAX も、その中身の多くが Mojo で書かれています。

どんな言語か

Mojo の特徴を、Python と比べながら並べてみます。それぞれ、本書のどこで詳しく学ぶかも書いておきます。

Mojo の歴史

Mojo を作っている Modular 社は、2022年に Chris Lattner と Tim Davis が創業した会社です。Chris Lattner は、多くの言語のコンパイラの土台になっている LLVM、Apple の Swift 言語、そしてコンパイラの基盤 MLIR を生み出したことで知られています。Mojo も、この MLIR の上に作られています。

時期できごと
2022年Modular 社の中で Mojo の開発が始まる
2023年5月初めて一般に公開される。最初はブラウザ上の Playground で試すだけだった
2023年9月Linux 向けの SDK が公開され、自分のパソコンで使えるようになる
2023年10月macOS 向けの SDK が公開される
2024年3月標準ライブラリがオープンソースになる
2025年12月1.0 に向けたロードマップが公表される
2026年5月1.0.0 のベータ版が公開され、公式サイト mojolang.org ができる
2026年7月Qualcomm 社による Modular 社の買収が完了する
2026年8月11日Mojo 1.0 が公開される
2026年8月18日コンパイラを含む Mojo の全体がオープンソースになる(Apache 2.0 with LLVM exceptions)

公開されたばかりのころの Mojo は、変更がとても多い言語でした。たとえば、変数を作る let は 2024 年に取り除かれました。関数を作る fn も、2026 年に「非推奨」(使わないよう勧められる状態)になり、def に一本化されました。古い記事やサンプルを読むときは、書かれた時期に気をつけてください。

1.0 は「言語が完成した」という意味ではありません。Modular 社は、1.x の間の変更は主に機能を「足す」ものにし、使い方を壊す変更は慎重に扱うと説明しています。本書は、その 1.x の一つである 1.2.0 を使っています。

Python プログラマーが Mojo を学ぶ理由

Python で書いたプログラムが遅いとき、これまでは「重い部分だけを C や C++ で書き直す」のが定番でした。けれどもそのためには、まったく別の言語とビルドの仕組みを覚えなければなりません。

Mojo なら、Python に近い書き方のまま、速さが必要な部分を書けます。本書では、Python の知識を足場にして、Mojo らしい書き方(型、所有権、SIMD、GPU など)へ少しずつ進んでいきます。

1.2動作環境を確認する

Mojo は Linux と macOS で動きます。Windows では直接は動かないので、Windows の中で Linux を動かす仕組み WSL2(Windows Subsystem for Linux)を使います。

使っている OSMojo を動かす方法
Linuxそのまま入れられる
macOS(Apple シリコン)そのまま入れられる
Windows 10 / 11WSL2 の Ubuntu の中に入れる

本書は、Windows 11 の WSL2 で動く Ubuntu を使って説明します。Linux や macOS を使っている人は、1.3 節を飛ばして 1.4 節から読んでください。それ以降の操作はほとんど同じです。

本書のコード例を実際に動かした環境は次のとおりです。

項目バージョン
Mojo1.2.0
pixi0.83.0
Ubuntu(WSL2)26.04.1 LTS

1.3WSL2 に Ubuntu を入れる

Windows のスタートメニューから「PowerShell」を開き、次のコマンドを実行します。管理者の許可を求める画面が出たら「はい」を選びます。

PowerShell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Users\user> wsl --install -d Ubuntu
ダウンロードしています: Ubuntu
インストールしています: Ubuntu
ディストリビューションが正常にインストールされました。'wsl.exe -d Ubuntu' を使用して起動できます
Ubuntu を起動しています...
Provisioning the new WSL instance Ubuntu
This might take a while...
Create a default Unix user account: user
New password:
Retype new password:
passwd: password updated successfully
usermod: no changes
Help improve Ubuntu!

Help us improve Ubuntu features and compatibility by sharing system reports with Canonical.
Reports are sent anonymously and do not contain any personal data.
For legal details, please visit: https://ubuntu.com/legal/systems-information-notice

We will save your answer to Windows and will only ask you once.

Would you like to opt-in to platform metrics collection (Y/n)? To see an example of the data collected, enter 'e'.
[Y/n/e]: y
user@PC:/mnt/c/Users/user$

Ubuntu のダウンロードとインストールが進み、終わると、同じ画面のまま Ubuntu が起動します。WSL を初めて使うパソコンでは、途中で Windows の再起動を求められることがあります。そのときは再起動してから、もう一度同じコマンドを実行してください。

Provisioning the new WSL instance Ubuntu の行からは、PowerShell ではなく Ubuntu が表示しています。Ubuntu は初めて起動すると準備を始め、Linux で使う ユーザー名とパスワード を決めるよう求めます。上から順に、何をしているのかを見ていきましょう。

最後の行のように ユーザー名@コンピューター名:場所$ という表示(プロンプト)が出れば、コマンドを入力できる状態です。$ の前の部分は、今いる場所(ディレクトリ)を表します。PowerShell から起動した場合は、PowerShell で開いていた Windows のフォルダー(/mnt/c/...)から始まります。cd とだけ入力すると、Linux の自分のホームディレクトリ(~)に移動できます。次に Ubuntu を開くときは、スタートメニューから「Ubuntu」を選ぶか、Windows Terminal のタブで Ubuntu を選びます。

1.4pixi を入れる

Mojo は pixi という道具を使って入れます。pixi は、プロジェクトごとに必要なソフトウェアをまとめて管理するツールです。Python の venv と pip を合わせたようなもので、プロジェクトのフォルダーの中に、そのプロジェクト専用の Mojo を入れてくれます。

Ubuntu の画面で、次のコマンドを実行します。

Ubuntu
$ curl -fsSL https://pixi.sh/install.sh | bash
This script will automatically download and install Pixi (latest) for you.
Getting it from this url: https://github.com/prefix-dev/pixi/releases/latest/download/pixi-x86_64-unknown-linux-musl.tar.gz
The 'pixi' binary is installed into '/home/user/.pixi/bin'
Sending an anonymous installation ping to prefix.dev (version, OS, arch). Set PIXI_NO_TELEMETRY=1 or DO_NOT_TRACK=1 to opt out. See https://pixi.sh/latest/reference/telemetry/
Updating '/home/user/.bashrc'
Please restart or source your shell.

最後の行は「シェルを起動し直すか、設定を読み込み直してください」という意味です。設定を読み込み直してから、pixi が使えることを確かめます。

Ubuntu
$ source ~/.bashrc
$ pixi --version
pixi 0.83.0

バージョンが表示されれば成功です。

1.5プロジェクトを作って Mojo を入れる

pixi では、作業の単位を プロジェクト と呼びます。hello という名前のプロジェクトを作ってみましょう。

Ubuntu
~$ pixi init hello -c https://conda.modular.com/max -c conda-forge
✔ Created /home/user/hello/pixi.toml

-c は、ソフトウェアをどこから取ってくるか(チャンネル)の指定です。Mojo は Modular 社のチャンネル https://conda.modular.com/max から、それ以外の一般的なソフトウェアは conda-forge から取ってきます。

できたフォルダーに移動して、中身を見てみます。

Ubuntu
~$ cd hello
~/hello$ ls -a
.
..
.gitattributes
.gitignore
pixi.toml
~/hello$ cat pixi.toml
[workspace]
channels = ["https://conda.modular.com/max", "conda-forge"]
name = "hello"
platforms = ["linux-64"]
version = "0.1.0"

[tasks]

[dependencies]

pixi.toml は、このプロジェクトの設定ファイルです。channels に、さきほど指定した2つのチャンネルが書かれています。[dependencies](依存関係)はまだ空です。

いよいよ Mojo を入れます。

Ubuntu
~/hello$ pixi add mojo
✔ Added mojo >=1.2.0,<2

pixi add は、[dependencies] に Mojo を書き加え、実際にダウンロードして、プロジェクトの中に入れます。もう一度 pixi.toml を見ると、1行増えています。

Ubuntu
~/hello$ cat pixi.toml
[workspace]
channels = ["https://conda.modular.com/max", "conda-forge"]
name = "hello"
platforms = ["linux-64"]
version = "0.1.0"

[tasks]

[dependencies]
mojo = ">=1.2.0,<2"

mojo = ">=1.2.0,<2" は、「1.2.0 以上、2 未満のバージョンを使う」という意味です。入った Mojo のバージョンを確かめましょう。

Ubuntu
~/hello$ pixi run mojo --version
Mojo 1.2.0 (2016d0cd)

pixi run は、「このプロジェクトの環境の中でコマンドを実行する」という意味です。Mojo はプロジェクトの中に入っているので、pixi run を付けずに mojo とだけ打っても見つかりません。

1.6VS Code を準備する

プログラムを書くエディターには、Visual Studio Code(VS Code)を使います。VS Code は Windows 側に入れて、WSL の中のファイルを編集する形で使います。

  1. Windows に VS Code を入れます(code.visualstudio.com からダウンロードできます)。
  2. VS Code を起動し、左の「拡張機能」(図の①)を開いて、検索欄(②)に「wsl」と入力します。一番上に出る Microsoft の WSL 拡張の「Install」(③)を押して入れます。
VS Code の拡張機能で WSL 拡張を検索したところ123
図1-2 VS Code の拡張機能で WSL 拡張を検索したところ
  1. Ubuntu の画面で hello フォルダーに移動して、code . を実行します。VS Code が開き、左下に「WSL: Ubuntu」と表示されます。これで、VS Code から WSL の中のファイルを直接編集できる状態になりました。
Ubuntu
user@PC:~$ cd ~/hello
user@PC:~/hello$ code .
  1. 窓の上の中央に「hello [WSL: Ubuntu]」(図の①)と表示されていることを確かめます。拡張機能の検索欄(②)に「mojo」と入力し、発行元が Modular の Mojo 拡張の「Install」(③)を押します。WSL につながった状態で入れると、拡張は Ubuntu 側に入ります。
WSL に接続した VS Code で Mojo 拡張を検索したところ123
図1-4 WSL に接続した VS Code で Mojo 拡張を検索したところ

名前が「mojo」で始まる拡張はほかにもたくさんあります。発行元の名前「Modular」と、その横の青いチェックの印(発行元が確認済みであることを表します)を必ず確かめてください。

「Install」を押すと、確認の画面が2回出ます。1回目は「発行元の Modular を信頼するか」という確認です。Modular 社から拡張を入れるのが初めてのときに出ます。「Trust Publisher & Install」を押します。

発行元を信頼するかの確認
図1-5 発行元を信頼するかの確認

2回目は「このフォルダーの作者を信頼するか」という確認です。VS Code は、初めて開いたフォルダーを「制限モード」(Restricted Mode)で開きます。窓の上に出ている「Restricted Mode is intended for safe code browsing.」という帯がその印です。制限モードでは、フォルダーの中身を勝手に実行するおそれのある機能が止められていて、Mojo 拡張も動きません。hello は自分で作ったフォルダーなので、「Trust Workspace & Install」を押して信頼します。

フォルダーを信頼するかの確認
図1-6 フォルダーを信頼するかの確認

Mojo 拡張を入れると、Mojo のコードに色が付き、入力の補完やエラーの表示が使えるようになります。

1.7最初のプログラムを書いて動かす

VS Code で hello フォルダーに新しいファイル hello.mojo を作り、次のように入力して保存します。

hello.mojo
def main():
    print("Hello, Mojo!")
VS Code で hello.mojo を編集しているところ123
図1-7 VS Code で hello.mojo を編集しているところ

窓の上に「hello [WSL: Ubuntu]」(①)、左のエクスプローラーに hello.mojo(②)が表示され、def や文字列に色が付いていれば(③)、Mojo 拡張が働いています。

窓の下のバーも見てください。

VS Code の窓の下のバー
図1-8 VS Code の窓の下のバー

左端の「WSL: Ubuntu」は、Ubuntu につながっていることを表します。その右の「Mojo 1.2.0 (env)」は、Mojo 拡張がこのプロジェクトの pixi の環境に入っている Mojo 1.2.0 を見つけたことを表しています。「Mojo LSP」は、補完やエラー表示を担当する部品が動いていることを表します。

短いプログラムですが、Mojo の基本が詰まっています。

保存したら、Ubuntu の画面(VS Code の中のターミナルでもかまいません)で実行してみましょう。

Ubuntu
~/hello$ pixi run mojo run hello.mojo
Hello, Mojo!

Hello, Mojo! と表示されれば成功です。おめでとうございます。これが、あなたの最初の Mojo プログラムです。

mojo run は、ファイルをコンパイルしてすぐに実行します。run は省略できて、mojo hello.mojo と書いても同じ意味になります。

print には、Python と同じように複数の値をカンマで区切って渡せます。値の間には空白が入ります。hello.mojo を次のように書き換えて、もう一度実行してみましょう。

hello.mojo
def main():
    var name = "Mojo"
    print("Hello,", name)
    print("1 + 2 =", 1 + 2)
Ubuntu
~/hello$ pixi run mojo run hello.mojo
Hello, Mojo
1 + 2 = 3

var name = "Mojo" は、name という変数を作って "Mojo" を入れています。Mojo では、新しい変数を作るときに var を付けます。変数については第7章で詳しく学びます。

1.8実行ファイルを作る

mojo run は、実行するたびにコンパイルからやり直します。何度も使うプログラムは、mojo build でコンパイルした結果を 実行ファイル として保存しておくと、Mojo がない場所でもすぐに起動できます。

mojo run と mojo build の流れ mojo run 毎回コンパイルしてすぐ実行。ファイルは残らない hello.mojo コンパイル 実行 Hello… mojo build コンパイルとリンクの結果を実行ファイルとして保存 hello.mojo コンパイル +リンク(C コンパイラ) hello 実行ファイル ./hello 何度でもすぐ起動
図1-9 mojo run と mojo build の違い

さっそく mojo build を試してみましょう。

Ubuntu
~/hello$ pixi run mojo build hello.mojo
/home/user/hello/.pixi/envs/default/bin/mojo: error: unable to find suitable c compiler for linking

失敗しました。メッセージは「リンクに使える C コンパイラが見つからない」という意味です。

C コンパイラも pixi でプロジェクトに入れましょう。

Ubuntu
~/hello$ pixi add c-compiler "sysroot_linux-64>=2.34"
✔ Added c-compiler >=2.0.0,<3
✔ Added sysroot_linux-64>=2.34

c-compiler が C コンパイラ本体、sysroot_linux-64>=2.34 はリンクに使う Linux の基本ライブラリ(glibc)のバージョン指定です。

あらためてビルドします。

Ubuntu
~/hello$ pixi run mojo build hello.mojo
~/hello$ ls -l hello
-rwxr-xr-x 1 user user 19752 Oct 24 21:26 hello
~/hello$ ./hello
Hello, Mojo
1 + 2 = 3

今度は何も表示されずに終わり、hello というファイルができました。ls -l の行の先頭にある x は、このファイルが実行できることを表しています。./hello で実行すると、mojo run のときと同じ結果が表示されます。

実行ファイルの名前は -o で変えられます。

Ubuntu
~/hello$ pixi run mojo build hello.mojo -o greet
~/hello$ ./greet
Hello, Mojo
1 + 2 = 3

1.9エラーメッセージを読む

プログラムを書いていると、エラーは必ず出ます。エラーメッセージを読めるようになることは、最初に身につけたい大切な技術です。ここでは、わざと間違えたプログラムを3つ動かして、メッセージの読み方を練習します。

名前の打ち間違い

print を prnt と打ち間違えたプログラムです。

typo.mojo
def main():
    print("start")
    prnt("Hello, Mojo!")
Ubuntu
~/hello$ pixi run mojo run typo.mojo
/home/user/hello/typo.mojo:3:5: error: use of unknown declaration 'prnt'; did you mean 'print'?
    prnt("Hello, Mojo!")
    ^~~~
    print
/home/user/hello/.pixi/envs/default/bin/mojo: error: failed to parse the provided Mojo source module

1行目を分解して読んでみましょう。

その下には問題の行がそのまま表示され、^~~~ の印で問題の部分が示されます。さらにその下の print は、印の位置に入れるべき候補です。最後の行は「ソースの解析に失敗した」というまとめです。

ここで注目してほしいのは、2行目の print("start") も実行されていない ことです。Mojo は実行の前にプログラム全体をコンパイルするので、どこか1か所でも間違いがあると、何も実行しません。

関数の外に文を書いた

1.7 節で触れたとおり、Mojo では関数の外に print を書けません。

top.mojo
print("Hello, Mojo!")
Ubuntu
~/hello$ pixi run mojo run top.mojo
/home/user/hello/top.mojo:1:1: error: expressions must not appear at file scope; move this into a function body
print("Hello, Mojo!")
^
/home/user/hello/.pixi/envs/default/bin/mojo: error: failed to parse the provided Mojo source module

メッセージは「式をファイルの一番外側に書いてはいけない。関数の中に移しなさい」という意味です。このように、Mojo のエラーメッセージは、直し方まで教えてくれることがよくあります。

型が合わない

最後は、整数の変数に文字列を入れようとしたプログラムです。

types.mojo
def main():
    var count: Int = "three"
    print(count)
Ubuntu
~/hello$ pixi run mojo run types.mojo
/home/user/hello/types.mojo:2:22: error: cannot implicitly convert 'StringLiteral["three"]' value to 'Int'
    var count: Int = "three"
                     ^~~~~~~
/home/user/hello/.pixi/envs/default/bin/mojo: error: failed to parse the provided Mojo source module

var count: Int は、「count は整数(Int)を入れる変数だ」と宣言しています。そこに文字列を入れようとしたので、「文字列の値を Int に変換できない」というエラーになりました。Python なら何も言わずに入ってしまいますが、Mojo は型の食い違いを実行の前に見つけます。型については第II部で詳しく学びます。

1.10Python との違いの早見表

この章で出てきた、Python との主な違いをまとめます。

項目PythonMojo
実行の仕組み1行ずつ解釈しながら実行する全体をコンパイルしてから実行する
実行の始まりファイルの先頭からmain 関数から
関数の外の文書ける書けない(エラー)
新しい変数name = "Mojo"var name = "Mojo"
名前の打ち間違いその行を実行したときにエラー実行の前にエラー
実行ファイルふつうは作らないmojo build で作れる
環境の管理venv と pippixi

1.11まとめ

確認クイズ

  1. Windows で Mojo を使うには、何を使いますか?

    解答を見る

    WSL2(Windows Subsystem for Linux)です。WSL2 の Ubuntu の中に pixi と Mojo を入れます。

  2. pixi run mojo --version の pixi run には、どんな意味がありますか?

    解答を見る

    「このプロジェクトの環境の中でコマンドを実行する」という意味です。Mojo はプロジェクトの中に入っているので、pixi run を付けるか、pixi shell の中で実行します。

  3. 次のプログラムを mojo run で実行すると、どうなりますか? print("Hi") という1行だけのファイルです。

    解答を見る

    エラーになり、何も表示されません。Mojo では実行する文を関数の中に書く必要があり、実行は main 関数から始まります。

  4. mojo run と mojo build の違いは何ですか?

    解答を見る

    mojo run はコンパイルしてすぐに実行し、実行ファイルは残しません。mojo build はコンパイルした結果を実行ファイルとして保存します。mojo build には C コンパイラが必要です。

  5. エラーメッセージ typo.mojo:3:5: error: use of unknown declaration 'prnt' から、何が分かりますか?

    解答を見る

    typo.mojo の3行目の5文字目で、宣言されていない名前 prnt を使っていることが分かります。

練習問題 自己紹介プログラム

hello プロジェクトに me.mojo を作り、あなたの名前と好きなプログラミング言語を2行で表示するプログラムを書いて、mojo run で実行してください。名前は変数に入れてから表示してください。

解答例を見る

たとえば次のように書けます。

mojo
def main():
    var name = "Hanako"
    print("Name:", name)
    print("Favorite language: Python")

pixi run mojo run me.mojo で実行すると、2行が表示されます。

練習問題 実行ファイルに名前を付ける

練習問題1の me.mojo から、whoami-mojo という名前の実行ファイルを作って実行してください。

解答例を見る

-o で名前を指定します。

Ubuntu
$ pixi run mojo build me.mojo -o whoami-mojo
$ ./whoami-mojo
Name: Hanako
Favorite language: Python

練習問題 わざと壊してみる

hello.mojo の print の行の字下げ(先頭の空白)を消して実行し、どんなエラーメッセージが出るかを確かめてください。メッセージは何個出ましたか? それぞれ何を伝えていますか?

解答例を見る

エラーが2つ出ます。1つは「式をファイルの一番外側に書いてはいけない」というものです。字下げがなくなったので、print の行が関数の外にあるとみなされたためです。もう1つは「関数の本体が空だ」というものです。def main(): の下に字下げされた行がなくなったためです。1つの間違いから複数のエラーが出ることもあるので、エラーはふつう 一番上から 順に読んで直していきます。