LoginSignup
34
36

Python の 35,000 倍速いプログラミング言語 Mojo🔥 とは

Last updated at Posted at 2023-05-22

Mojo🔥とは、LLVMSwift の生みの親として知られる Chris Lattner 氏が率いる Modular 社が開発した新しい汎用プログラミング言語です。
Python 互換の使いやすい構文と C 言語並みの処理速度を特徴とし、AI 開発に利用されることが期待されています。

Mojo の特徴

開発環境

クラウド型の開発環境である Mojo Playground または Mojo SDK を利用することができます。

  • Mojo Playground
    スクリーンショット 2023-05-22 19.38.51.png

  • Mojo SDK

Hello World!

Mojo は Python 互換の構文を持っているため、簡単なコードであれば Python のコードをそのまま実行することできます。

print("Hello Mojo!")

let と var

Mojo は Python と同様に変数を宣言し、値を代入することができますが、以下の 2 つの課題が残ります。

  1. 値がイミュータブル(不変)であることを宣言したい。
  2. 代入時に変数名を誤って入力した場合はエラーとしたい。

これらの課題を解決するために、letvar の宣言をサポートしています。
let はイミュータブル(不変)、var はミュータブル(可変)の変数を宣言します。

def your_function(a, b):
    let c = a
    # Uncomment to see an error:
    # c = b  # error: c is immutable

    if c != b:
        let d = b
        print(d)

your_function(2, 3)

struct

struct は Python の class とよく似ていますが、いくつか違いがあります。

  • すべてのプロパティを var または let で宣言する必要があります。これにより、オーバーヘッドなしでプロパティにアクセスできるようになります。
  • 静的に宣言されるため、実行中にメソッドの追加や削除はできません。
struct MyPair:
    var first: Int
    var second: Int

    # We use 'fn' instead of 'def' here - we'll explain that soon
    fn __init__(inout self, first: Int, second: Int):
        self.first = first
        self.second = second

    fn __lt__(self, rhs: MyPair) -> Bool:
        return self.first < rhs.first or
              (self.first == rhs.first and
               self.second < rhs.second)

fn

fn は Python の def とよく似ていますが、いくつか違いがあります。

  • 引数は型指定が必要となる。
  • 引数はイミュータブル(不変)となる。
  • 戻り値の型が指定されていない場合は、None が指定されたものと見なされる。
  • 関数内のローカル変数は let または var で宣言する必要がある。
struct Complex:
    var re: F32
    var im: F32

    fn __init__(inout self, x: F32):
        """Construct a complex number given a real number."""
        self.re = x
        self.im = 0.0

    fn __init__(inout self, r: F32, i: F32):
        """Construct a complex number given its real and imaginary components."""
        self.re = r
        self.im = i

強力な型チェック

Python と同様に動的型付けを使用することもできますが、強力な型チェックを利用することもできます。

def pairTest() -> Bool:
    let p = MyPair(1, 2)
    # Uncomment to see an error:
    # return p < 4 # gives a compile time error
    return True

Python モジュールの利用

Python.import_module を使って簡単に Python モジュールを利用することができます。

def make_plot(m: Matrix):
    np = Python.import_module("numpy")
    plt = Python.import_module("matplotlib.pyplot")
    colors = Python.import_module("matplotlib.colors")
    dpi = 64
    width = 10
    height = 10 * yn // xn

    fig = plt.figure(1, [width, height], dpi)
    ax = fig.add_axes([0.0, 0.0, 1.0, 1.0], False, 1)

    light = colors.LightSource(315, 10, 0, 1, 1, 0)

    image = light.shade(m.to_numpy(), plt.cm.hot, colors.PowerNorm(0.3), "hsv", 0, 0, 1.5)
    plt.imshow(image)
    plt.axis("off")
    plt.show()

make_plot(compute_mandelbrot())
print("finished")

さいごに

Python と Mojo の関係は、C と C++ の関係に似ています。
Mojo は Python のスーパーセットを目指して開発が進められており、段階的な置き換えができるようになるでしょう。

現在の AI 開発では、Python の他に C、C++、Cython、CUDA など複数のプログラミング言語が使用されますが、一般的なデバッガは複数のプログラミング言語を跨いでデバッグすることができません。
もし Mojo だけで AI 開発を完結できるようになれば、生産性が大きく改善するでしょう。

注意点として、Mojo はまだ未完成のプログラミング言語であり、現時点では完全な Python 互換ではありません。
また、処理速度を大幅に向上させるには、Python コードをそのまま移植するだけでなく、静的なコードに書き換えるなどの最適化が必要になります。

Mojo はまだ開発の初期段階ですが、大きなポテンシャルを持っていると感じています。
Mojo Playground では、チュートリアルも用意されていますので、ぜひ一度触ってみてください。

34
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
36