🐕

PythonライクなAI向け新言語「Mojo」

2023/06/11に公開

Mojoについて

2023年5月2日、Pythonライクな新言語の「Mojo」がリリースされました。
https://www.modular.com/get-started
申し込みが必要ですが、申し込みをすれば数時間程度の早い段階で許可がおります。
メールでjupyter notebookのURLが共有されます。

notebook

メールに記載されているURLを開くとjupyter notebookが利用できます。

Mojoのコーディング

MojoはPythonライクな言語でPythonの既存のパッケージをインポートしてこれまでと
同様に利用できます。

特徴としては
・Pythonがベースで構文が似ている
・動的型付け、静的型付けの両方がある
・処理速度が非常に早い
・コンパイル型言語
・システムプログラミング言語
・中間表現にMLIRを採用している

letとvar宣言

変数の宣言はletとvarがあり、関数内では関数スコープの変数が暗黙的に作成されます。
値を固定化したい場合、あとから値を代入したい場合に応じて使い分けます。
次の例では3が出力されます。

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 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に似ていますが、いくつか違うところがあります。

・引数は型の指定が必要
・引数はimmutable(不変)
・関数内のローカル変数は暗黙的にはできず、明示的な宣言が必要
・戻り値に型を指定しない場合は、Noneとなる

struct Complex:
    var re: Float32
    var im: Float32

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

    fn __init__(inout self, r: Float32, i: Float32):
        """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と同様に引数の型を指定せずに、データ型を推測せることができます。
ただし、型の安全性を確保したい場合は、オーバーロードされた関数がサポートされます。

struct Complex:
    var re: Float32
    var im: Float32

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

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

オーバーロードは、モジュール関数、クラス、構造体どこにでも実装ができます。

Pythonの統合

Mojoでは、使い慣れたPythonのモジュールが簡単に利用できます。
任意のPythonモジュールをMojoプログラミングにインポートします。
次はMojoでNumpyを利用するときの例です

from PythonInterface import Python

# This is equivalent to Python's `import numpy as np`
let np = Python.import_module("numpy")

# Now use numpy as if writing in Python
array = np.array([1, 2, 3])
print(array)

Mojoの型

Mojoプリミティブ型は暗黙的にPythonオブジェクトに変換されます。
現時点では、リスト、タプル、整数、文字列、浮動小数点、ブール値がサポートされています。

%%python
def type_printer(my_list, my_tuple, my_int, my_string, my_float):
    print(type(my_list))
    print(type(my_tuple))
    print(type(my_int))
    print(type(my_string))
    print(type(my_float))
type_printer([0, 3], (False, True), 4, "orange", 3.4)

次が出力されます

<class 'list'>
<class 'tuple'>
<class 'int'>
<class 'str'>
<class 'float'>

最後に

詳しいドキュメントはこちらで公開されています。
AIに特化された新言語「Mojo」を体験してみましょう。

株式会社マインディア テックブログ

Discussion