第1章
Mojo を始める
Mojo とはどんな言語かを知り、Windows の WSL に開発環境を作って、最初のプログラムを実行・ビルドします。最後に、エラーメッセージの読み方を身につけます。
この章の内容
この章では、Mojo を使える状態にして、最初のプログラムを動かすところまでを一通り体験します。途中で、本書のすべての章で使う道具(WSL、pixi、VS Code)も準備します。
この章を終えると、次のことができるようになります。
- Mojo がどんな言語で、Python とどういう関係にあるかを説明できる
- WSL の Ubuntu に pixi と Mojo を入れて、プロジェクトを作れる
mojo runでプログラムを実行し、mojo buildで実行ファイルを作れる- エラーメッセージから、どのファイルの何行目に何の問題があるかを読み取れる
1.1Mojo とは何か
Mojo は、Modular 社が開発しているプログラミング言語です。見た目は Python によく似ていますが、中身は コンパイルして動かす言語 です。書いたコードは実行の前に機械語に翻訳されるので、C++ や Rust と同じくらいの速さで動きます。CPU だけでなく GPU 向けのコードも、同じ言語で書けます。
図のように、Mojo は Python と隣り合う位置にいます。Python の書きやすさを受け継ぎながら、Python では難しかった「速さ」と「ハードウェアの細かい制御」を言語そのものに組み込んでいます。Modular 社の AI 推論基盤 MAX も、その中身の多くが Mojo で書かれています。
どんな言語か
Mojo の特徴を、Python と比べながら並べてみます。それぞれ、本書のどこで詳しく学ぶかも書いておきます。
- Python に似た文法:
defで関数を作り、字下げでブロックを表します。Python を書ける人なら、コードの見た目にはすぐ慣れます。 - コンパイルして動く:プログラム全体を実行の前に機械語へ翻訳します。仕組みは第2章で見ます。
- 静的な型:変数や引数の型がコンパイルのときに決まり、型の間違いは実行の前に見つかります(第6章)。
- 所有権:値を誰が持ち、いつ片付けるかをコンパイラが追いかけます。ガベージコレクションを使わずに、メモリを安全に扱えます(第11章)。
- コンパイル時の計算:型や定数をパラメーターとして渡し、コンパイルのときに処理を組み立てられます(第12章)。
- SIMD と GPU:CPU の SIMD 命令や GPU を、言語の機能として直接使えます(第3章、第20章、第22章)。
- Python との連携:Mojo のプログラムから Python のライブラリを呼び出せます(第16章)。
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)を使います。
| 使っている OS | Mojo を動かす方法 |
|---|---|
| Linux | そのまま入れられる |
| macOS(Apple シリコン) | そのまま入れられる |
| Windows 10 / 11 | WSL2 の Ubuntu の中に入れる |
本書は、Windows 11 の WSL2 で動く Ubuntu を使って説明します。Linux や macOS を使っている人は、1.3 節を飛ばして 1.4 節から読んでください。それ以降の操作はほとんど同じです。
本書のコード例を実際に動かした環境は次のとおりです。
| 項目 | バージョン |
|---|---|
| Mojo | 1.2.0 |
| pixi | 0.83.0 |
| Ubuntu(WSL2) | 26.04.1 LTS |
1.3WSL2 に Ubuntu を入れる
Windows のスタートメニューから「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 で使う ユーザー名とパスワード を決めるよう求めます。上から順に、何をしているのかを見ていきましょう。
Create a default Unix user account:のあとに、Linux で使うユーザー名を半角英小文字で入力します。ここで決めるのは Windows のアカウントとは別のものです。New password:とRetype new password:では、パスワードを2回入力します。入力しても画面には何も表示されません が、ちゃんと入力されています。このパスワードは、あとでsudo(管理者の権限でコマンドを実行する機能)を使うときに必要になるので、忘れないようにしてください。Help improve Ubuntu!から始まる部分は、使い方の統計を Canonical 社(Ubuntu の開発元)に送るかどうかの質問です。yでもnでも、本書の作業には影響しません。
最後の行のように ユーザー名@コンピューター名:場所$ という表示(プロンプト)が出れば、コマンドを入力できる状態です。$ の前の部分は、今いる場所(ディレクトリ)を表します。PowerShell から起動した場合は、PowerShell で開いていた Windows のフォルダー(/mnt/c/...)から始まります。cd とだけ入力すると、Linux の自分のホームディレクトリ(~)に移動できます。次に Ubuntu を開くときは、スタートメニューから「Ubuntu」を選ぶか、Windows Terminal のタブで Ubuntu を選びます。
1.4pixi を入れる
Mojo は pixi という道具を使って入れます。pixi は、プロジェクトごとに必要なソフトウェアをまとめて管理するツールです。Python の venv と pip を合わせたようなもので、プロジェクトのフォルダーの中に、そのプロジェクト専用の Mojo を入れてくれます。
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 が使えることを確かめます。
$ source ~/.bashrc $ pixi --version pixi 0.83.0
バージョンが表示されれば成功です。
1.5プロジェクトを作って Mojo を入れる
pixi では、作業の単位を プロジェクト と呼びます。hello という名前のプロジェクトを作ってみましょう。
~$ 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 から取ってきます。
できたフォルダーに移動して、中身を見てみます。
~$ 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 を入れます。
~/hello$ pixi add mojo ✔ Added mojo >=1.2.0,<2
pixi add は、[dependencies] に Mojo を書き加え、実際にダウンロードして、プロジェクトの中に入れます。もう一度 pixi.toml を見ると、1行増えています。
~/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 のバージョンを確かめましょう。
~/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 の中のファイルを編集する形で使います。
- Windows に VS Code を入れます(code.visualstudio.com からダウンロードできます)。
- VS Code を起動し、左の「拡張機能」(図の①)を開いて、検索欄(②)に「wsl」と入力します。一番上に出る Microsoft の WSL 拡張の「Install」(③)を押して入れます。
123- Ubuntu の画面で
helloフォルダーに移動して、code .を実行します。VS Code が開き、左下に「WSL: Ubuntu」と表示されます。これで、VS Code から WSL の中のファイルを直接編集できる状態になりました。
user@PC:~$ cd ~/hello user@PC:~/hello$ code .
- 窓の上の中央に「hello [WSL: Ubuntu]」(図の①)と表示されていることを確かめます。拡張機能の検索欄(②)に「mojo」と入力し、発行元が Modular の Mojo 拡張の「Install」(③)を押します。WSL につながった状態で入れると、拡張は Ubuntu 側に入ります。
123名前が「mojo」で始まる拡張はほかにもたくさんあります。発行元の名前「Modular」と、その横の青いチェックの印(発行元が確認済みであることを表します)を必ず確かめてください。
「Install」を押すと、確認の画面が2回出ます。1回目は「発行元の Modular を信頼するか」という確認です。Modular 社から拡張を入れるのが初めてのときに出ます。「Trust Publisher & Install」を押します。

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

Mojo 拡張を入れると、Mojo のコードに色が付き、入力の補完やエラーの表示が使えるようになります。
1.7最初のプログラムを書いて動かす
VS Code で hello フォルダーに新しいファイル hello.mojo を作り、次のように入力して保存します。
def main():
print("Hello, Mojo!")
123窓の上に「hello [WSL: Ubuntu]」(①)、左のエクスプローラーに hello.mojo(②)が表示され、def や文字列に色が付いていれば(③)、Mojo 拡張が働いています。
窓の下のバーも見てください。

左端の「WSL: Ubuntu」は、Ubuntu につながっていることを表します。その右の「Mojo 1.2.0 (env)」は、Mojo 拡張がこのプロジェクトの pixi の環境に入っている Mojo 1.2.0 を見つけたことを表しています。「Mojo LSP」は、補完やエラー表示を担当する部品が動いていることを表します。
短いプログラムですが、Mojo の基本が詰まっています。
def main():は、mainという名前の関数を定義しています。Mojo のプログラムはmain関数から実行が始まります。print("Hello, Mojo!")は、文字列を画面に表示します。Python のprintと同じように使えます。- 字下げ(インデント)でブロックを表すのも Python と同じです。
保存したら、Ubuntu の画面(VS Code の中のターミナルでもかまいません)で実行してみましょう。
~/hello$ pixi run mojo run hello.mojo Hello, Mojo!
Hello, Mojo! と表示されれば成功です。おめでとうございます。これが、あなたの最初の Mojo プログラムです。
mojo run は、ファイルをコンパイルしてすぐに実行します。run は省略できて、mojo hello.mojo と書いても同じ意味になります。
print には、Python と同じように複数の値をカンマで区切って渡せます。値の間には空白が入ります。hello.mojo を次のように書き換えて、もう一度実行してみましょう。
def main():
var name = "Mojo"
print("Hello,", name)
print("1 + 2 =", 1 + 2)~/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 build を試してみましょう。
~/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 でプロジェクトに入れましょう。
~/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)のバージョン指定です。
あらためてビルドします。
~/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 で変えられます。
~/hello$ pixi run mojo build hello.mojo -o greet ~/hello$ ./greet Hello, Mojo 1 + 2 = 3
1.9エラーメッセージを読む
プログラムを書いていると、エラーは必ず出ます。エラーメッセージを読めるようになることは、最初に身につけたい大切な技術です。ここでは、わざと間違えたプログラムを3つ動かして、メッセージの読み方を練習します。
名前の打ち間違い
print を prnt と打ち間違えたプログラムです。
def main():
print("start")
prnt("Hello, Mojo!")~/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行目を分解して読んでみましょう。
/home/user/hello/typo.mojo… 問題のあるファイル:3:5… 3行目の5文字目error: use of unknown declaration 'prnt'… 何が問題か(「prntという名前は宣言されていない」)did you mean 'print'?… 直し方の候補(「printのことではありませんか?」)
その下には問題の行がそのまま表示され、^~~~ の印で問題の部分が示されます。さらにその下の print は、印の位置に入れるべき候補です。最後の行は「ソースの解析に失敗した」というまとめです。
ここで注目してほしいのは、2行目の print("start") も実行されていない ことです。Mojo は実行の前にプログラム全体をコンパイルするので、どこか1か所でも間違いがあると、何も実行しません。
関数の外に文を書いた
1.7 節で触れたとおり、Mojo では関数の外に print を書けません。
print("Hello, Mojo!")~/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 のエラーメッセージは、直し方まで教えてくれることがよくあります。
型が合わない
最後は、整数の変数に文字列を入れようとしたプログラムです。
def main():
var count: Int = "three"
print(count)~/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 との主な違いをまとめます。
| 項目 | Python | Mojo |
|---|---|---|
| 実行の仕組み | 1行ずつ解釈しながら実行する | 全体をコンパイルしてから実行する |
| 実行の始まり | ファイルの先頭から | main 関数から |
| 関数の外の文 | 書ける | 書けない(エラー) |
| 新しい変数 | name = "Mojo" | var name = "Mojo" |
| 名前の打ち間違い | その行を実行したときにエラー | 実行の前にエラー |
| 実行ファイル | ふつうは作らない | mojo build で作れる |
| 環境の管理 | venv と pip | pixi |
1.11まとめ
- Mojo は Python に似た文法を持つ、コンパイルして動かす言語です。CPU と GPU の両方のコードを書けます。
- Windows では WSL2 の Ubuntu の中で使います。Mojo は pixi でプロジェクトごとに入れます。
pixi initでプロジェクトを作り、pixi add mojoで Mojo を入れ、pixi run mojo run ファイル名で実行します。- Mojo のプログラムは
main関数から始まります。実行する文は関数の中に書きます。 mojo buildで実行ファイルを作れます。そのためには C コンパイラが必要です。- エラーメッセージは「ファイル:行:文字目: error: 内容」の形です。Mojo は実行の前にプログラム全体を確かめるので、間違いが1つでもあると何も実行しません。
確認クイズ
Windows で Mojo を使うには、何を使いますか?
解答を見る
WSL2(Windows Subsystem for Linux)です。WSL2 の Ubuntu の中に pixi と Mojo を入れます。
pixi run mojo --versionのpixi runには、どんな意味がありますか?解答を見る
「このプロジェクトの環境の中でコマンドを実行する」という意味です。Mojo はプロジェクトの中に入っているので、
pixi runを付けるか、pixi shellの中で実行します。次のプログラムを
mojo runで実行すると、どうなりますか?print("Hi")という1行だけのファイルです。解答を見る
エラーになり、何も表示されません。Mojo では実行する文を関数の中に書く必要があり、実行は
main関数から始まります。mojo runとmojo buildの違いは何ですか?解答を見る
mojo runはコンパイルしてすぐに実行し、実行ファイルは残しません。mojo buildはコンパイルした結果を実行ファイルとして保存します。mojo buildには C コンパイラが必要です。エラーメッセージ
typo.mojo:3:5: error: use of unknown declaration 'prnt'から、何が分かりますか?解答を見る
typo.mojoの3行目の5文字目で、宣言されていない名前prntを使っていることが分かります。
練習問題 自己紹介プログラム
hello プロジェクトに me.mojo を作り、あなたの名前と好きなプログラミング言語を2行で表示するプログラムを書いて、mojo run で実行してください。名前は変数に入れてから表示してください。
解答例を見る
たとえば次のように書けます。
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 で名前を指定します。
$ 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つの間違いから複数のエラーが出ることもあるので、エラーはふつう 一番上から 順に読んで直していきます。