PythonライクなAI向け新言語「Mojo」
Mojoについて
2023年5月2日、Pythonライクな新言語の「Mojo」がリリースされました。
メールで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