随時更新していくかもしれないし、日付が空いたら別記事にするかも。
Mojo をさわってみたのでメモしていく。
Mojo🔥 on Docker🐳
ローカルで動かせると楽なので
を作ってみた。
ARM CPU の Mac だとまともに動かないので、
Intel チップの Mac をまだ持っていてよかった……。
(ARM CPU でも docker build してみたけど、1時間経っても完了しなかったのでたぶん無理)
所感
- X(旧Twitter)で「Mojo」と検索しても違う情報ばかり引っかかってつらい……
- 参考になるリポジトリ: https://github.com/tairov/llama2.mojo
- GitHub がまだ Mojo に対応していなくて Languages のところに入ってこないのおもしろい
- GitHub で .mojo ファイルを見てもまだシンタックスハイライトは効いていない
- Mojo のビルド、わりと速くてスイスイ試せるのはいいところ
- 変数展開(string interpolation)は今のところないかも?
関数周り
def
と fn
のどちらでも関数の宣言は可能。
def だと Python の世界、fn だと Mojo のルールに則(のっと)ったコーディングが求められる。
Rust の所有権や借用の概念があると聞いていたので、
fn main(): let x = 100 let y = 200 let z = add(x, y) print(x, y, z) fn add(x: Int, y: Int) -> Int: print(x, "+", y, "=", x + y) return x + y
のようなコードを書いてみたけど、エラーにならずに通った。
Rust だと let z = add(x, y)
で x, y の所有権の移動が起きて
print(x, y, z)
のところが実行できないよとコンパイルエラーが通るはずだけれど、
Mojo はデフォルトが borrowed
(借用)モードになっているようで、
アンパサンド( &
)を関数の引数に付けたりしなくていいようになっている。
- borrowed
- inout
- owned
の3種類のアノテーションを引数に付けて管理する方法は、
Rust でややこしくなる参照や参照外しを考えなくて済むようにしていて、
記述のしやすさをサポートしているように思う。
代わりに transfer 演算子 (^
) という新しい概念を生み出してはしまったが。
参考: https://docs.modular.com/mojo/manual/basics/#argument-mutability-and-ownership
ここらへんの差異は、
Rust プログラマーにとっては、理解ができてもややこしく感じる要素になりそう。
owned 引数に対して transfer 演算子を使わないとコピーを作成する挙動が発生するなど、
プログラムの実行スピードに関しては、Rust よりも意識して書かないと速さを出せないかもしれない。