Memo

【Mojo入門】Pythonの書きやすさ×C++の爆速性能!次世代AI言語Mojoを完全解説|基本構文〜AI開発実例まで

✅ この記事でわかること

  • 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関数で高速化
エッジAIRaspberry 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