✅ この記事でわかること
- Mojoとはどんな言語?なぜ話題なのか
- PythonやC++、Rustとの違い・共通点
- Mojoの基本文法とサンプルコード
- MojoでAIアプリケーションを開発する手順
- 実際に動作するAIモデルのコード例
- Mojoの実行環境構築、現在の制約・今後の展望
🔥 はじめに:Mojoって何者?
2023年、Modular社が開発した新しいプログラミング言語**「Mojo」**が世界中の開発者の間で大きな注目を集めました。
その理由はズバリ、
Pythonのように書けて、C++のように爆速で動く。
この理想的な特徴を掲げ、AI開発のボトルネック(Pythonの実行速度やC++の記述性)を克服するために設計されたのがMojoです。
🚀 Mojoのキャッチコピー
“The programming language for all AI developers.”
AIのための言語。しかも、書きやすい・速い・安全・拡張性が高い。
この4拍子がそろった言語は、これまで存在しなかったのです。
🧠 Mojoってどういう言語?
🔹 公式の定義(by Modular社)
Mojo combines the usability of Python with the performance of C, unlocking unparalleled programmability of AI hardware and extensibility of AI models.
つまり:
- Pythonの書きやすさをそのまま継承
- LLVMやMLIRベースでC/C++に匹敵する低レベル性能
- GPUやTPU、AIアクセラレータに直接最適化
- JITコンパイル・静的型付きで安全性も高い
🔸 実際の使用感(筆者の所感)
- 構文は完全にPythonに見える
- でも裏側はコンパイルされるC言語クラスのよう
- NumPyのように書いて、Rustのように動く
これがMojoの一番の魅力です。
🆚 Python・C++・Rustとの比較表
言語 | 書きやすさ | 実行速度 | メモリ安全性 | GPU対応 | 学習コスト |
---|---|---|---|---|---|
Python | ◎ | ✕ | △(非厳格) | △ | ◎ |
C++ | ✕ | ◎ | ✕ | ◯ | ✕ |
Rust | △ | ◎ | ◎ | △ | ✕ |
Mojo | ◎(ほぼPy) | ◎ | ◎(オプション) | ◎ | ◯(Python経験者向け) |
📦 Mojoのインストールと環境構築
公式推奨方法(2025年現在):
curl https://get.modular.com | sh
modular install mojo
必要なのは modular
CLI(Modular社が提供)だけ。
インストール後は、
mojo hello.mojo
でスクリプトが即実行できます。
🧪 Mojoの基本文法入門
まずはPythonとそっくりなMojoコードを見てみましょう。
📄 例1:Hello World
fn main():
print("Hello, Mojo!")
Pythonとほぼ同じ。でもこれはコンパイルされて高速に動作します。
🧮 例2:ループとリスト操作
fn main():
let numbers = [1, 2, 3, 4, 5]
for n in numbers:
print(n * 2)
let
はRust風の不変変数。var
なら変更可能。
📏 例3:関数に型注釈
fn square(x: Int) -> Int:
return x * x
静的型付き言語として安全な記述が可能です。
🧠 例4:高速ベクトル演算(AI向け)
import math
fn dot_product(a: List[Int], b: List[Int]) -> Int:
let mut result = 0
for i in range(len(a)):
result += a[i] * b[i]
return result
型を指定することで、JIT最適化がかかり爆速になります。
🧠 MojoでAI開発してみよう:ステップバイステップ
🎯 目標:
- ベクトルの線形変換(Dense Layer)を実装
- Pythonのように書き、C++のように高速に動作
🧱 ステップ1:ベクトルクラスを定義
struct Vector:
values: List[Float32]
fn dot(self, other: Vector) -> Float32:
let mut result = 0.0
for i in range(len(self.values)):
result += self.values[i] * other.values[i]
return result
🧱 ステップ2:行列 × ベクトル(Dense Layer)
struct DenseLayer:
weights: List[Vector]
bias: Vector
fn forward(self, input: Vector) -> Vector:
let mut output: List[Float32] = []
for w in self.weights:
output.append(w.dot(input))
return Vector(output)
🧪 ステップ3:推論
fn main():
let input = Vector([0.1, 0.5, 0.9])
let w1 = Vector([0.2, 0.4, 0.6])
let w2 = Vector([0.3, 0.7, 0.1])
let bias = Vector([0.0, 0.0])
let dense = DenseLayer([w1, w2], bias)
let output = dense.forward(input)
print(output.values)
🧩 MojoのAI向け特徴まとめ
機能 | 解説 |
---|---|
GPU対応 | MLIRベースでGPU/NPU最適化可能 |
型による最適化 | Float32 指定でSIMD化・JIT対象に |
C拡張と同等性能 | NumPyに頼らず爆速処理可 |
複数レベル並列化 | マルチスレッド対応あり(予定) |
🌐 Mojoの活用例・今後の展望
分野 | 活用方法 |
---|---|
AI研究 | モデル構造をJIT最適化して学習時間を短縮 |
自作ライブラリ | Python APIから呼べるMojo関数で高速化 |
エッジAI | Raspberry Piで高速NN推論処理を |
GPU開発 | カスタム演算モジュールを記述しCUDA不要に |
🧠 PythonからMojoへの橋渡し
from python import Python
@python
def load_data():
import pandas as pd
return pd.read_csv("data.csv")
Pythonコードをインポートして使える柔軟性も◎!
📚 Mojoの学習リソース(英語)
✅ まとめ:MojoはAI時代のC言語になる
Mojoは、
- Pythonに近い構文で
- C++やRustに近い性能を
- GPUにもそのまま叩き込める
次世代のAI特化型言語です。
今後、
- TensorFlowやPyTorchのバックエンド高速化
- 自作AIライブラリのJIT実行
- モバイル/IoTでの高速推論実装
などにおいて、圧倒的に注目される存在になるでしょう。
日本語記事がまだまだ少ない今こそ、
Mojoを学び、発信してバズるチャンスです!
おまけ(ベクトル類似検索エンジン作成)
おまけとして、ベクトル類似検索エンジンを1から構築する手順を紹介します。
- 検索対象:商品や文章の埋め込みベクトル(CSV)
- 技術構成:Mojo(検索処理)+ Python(UI)+ Streamlit(Web UI)
- Mojo呼び出し/実行例付き
📁 ディレクトリ構成
ai_search_mojo/
├── app.py # Streamlit UI(Python)
├── data.csv # 検索対象ベクトル
├── mojo/
│ ├── similarity.mojo # 類似度計算ロジック(Mojo)
│ └── __init__.py # Python ↔ Mojo ラッパー
├── embedding.py # テキスト→ベクトル生成
├── README.md
🧠 ステップ1:Mojoのインストール
curl https://get.modular.com | sh
modular install mojo
🧪 ステップ2:ベクトルデータの用意
data.csv
として用意して下さい
id,title,vector
1,レモンティー,"[0.12, 0.45, 0.33, 0.91]"
2,ダージリン紅茶,"[0.14, 0.42, 0.30, 0.88]"
3,緑茶,"[0.01, 0.11, 0.90, 0.12]"
ステップ3:Mojoコード(mojo/similarity.mojo
)
fn cosine_similarity(a: List[Float32], b: List[Float32]) -> Float32:
let mut dot_product = 0.0
let mut norm_a = 0.0
let mut norm_b = 0.0
for i in range(len(a)):
dot_product += a[i] * b[i]
norm_a += a[i] * a[i]
norm_b += b[i] * b[i]
return dot_product / (math.sqrt(norm_a) * math.sqrt(norm_b))
struct SearchResult:
id: Int
title: String
score: Float32
fn search(query: List[Float32], dataset: List[(Int, String, List[Float32])], top_k: Int = 3) -> List[SearchResult]:
let mut results: List[SearchResult] = []
for (id, title, vec) in dataset:
let score = cosine_similarity(query, vec)
results.append(SearchResult(id, title, score))
results.sort(by = (a, b) -> b.score - a.score)
return results.slice(0, top_k)
🔁 ステップ4:Python → Mojo ラッパー(mojo/__init__.py
)
# ダミー構成(実装例)
def search_similar(query_vec):
# Mojoでビルドされた.soファイルを呼び出す予定
# 現状はPython模倣で返す
return [
{"title": "レモンティー", "score": 0.982},
{"title": "ダージリン紅茶", "score": 0.977},
{"title": "緑茶", "score": 0.544},
]
✨ ステップ5:UI(app.py
)
import streamlit as st
from embedding import get_embedding
from mojo import search_similar
st.title("Mojo AI 高速検索エンジン")
query = st.text_input("検索語を入力:")
if query:
vec = get_embedding(query)
results = search_similar(vec)
st.subheader("検索結果:")
for res in results:
st.write(f"🔹 {res['title']}(スコア: {res['score']:.3f})")
📚 ステップ6:ベクトル化(embedding.py
)
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
def get_embedding(text):
return model.encode(text).tolist()
▶ 実行方法
pip install streamlit sentence-transformers
streamlit run app.py