Mojo言語 〜とりあえず動かす〜

Mojoって?

Mojo言語とはなんぞや?
という話については、調べれば出てくるのでざっくりしか言いません。
Mojoとは、「超速いコンパイラ型のPython」です。(語弊たっぷり)
詳しくは他の方の記事や公式サイトを参照してください。

この記事はUbuntuでMojoが動くところまでを記載します。
主な目的は個人的な備忘録となります。

できるだけ多くの人がトレースできるようになるべく平易かつ画像多めで
書くので、冗長に感じる人もいるでしょうが・・・
そう言う人は公式ドキュメントを直接読んでください。



開発環境

  • OS : Ubuntu20.04

  • CPU : Intel Core i7-13700K

  • RAM : 32GB

  • Python : 3.8.10

今回はUbuntuをインストールした直後の環境から開始します。


とりあえず最初にやること

Ubuntuのパッケージリストを更新しましょう。
ターミナルで以下のコマンドを入力してエンターキーを押しましょう。

sudo apt-get update
パッケージリストの更新

sudoで実行するので、ログインパスワードを要求されると思います。
入力しても入力欄には動きがありませんが、ちゃんと入力されています。

パスワード入力済みだが、カーソルは動かない。

更新が終わると以下のような画面になります。

パッケージリスト更新後のターミナル

邪魔にならないように以下のコマンドでターミナルの出力を片付けます。

clear

次に、curlをインストールします。
curlはMojoをインストールするときに使用するコマンドです。

sudo apt-get install curl
curlのインストールコマンド

終わるとこんな感じになります。

インストール後のターミナル

出力が邪魔になったら都度clearを実行しましょう。


Mojoをインストール

では、早速Mojoをインストールしましょう。
手順は以下の公式ドキュメントに従って進めましょう。


Mojoの動作環境

今の所、Ubuntu20.04/22.04とMac(M1,M2)しか対応していないとのこと。
手元のMac(M3)で試したところ、一応動きます。


Ubuntuの動作環境

  • OS : Ubuntu20.04 or Ubuntu22.04

  • CPU : x86-64

  • RAM : 8GB

  • Python 3.8 ~ 3.11


Macの動作環境

  • OS : Monterey(12) ~

  • CPU : Apple silicon M1 or M2 ※非公式だがM3も可

  • Python : 3.8 ~ 3.11


インストール

ターミナルで以下のコマンドを実行しましょう。

curl -s https://get.modular.com | sh -
modularのインストールコマンド

げるすらの環境だと30秒もかからずにインストールが終わります。
回線の状況によっては時間がかかるかもしれませんが、
焦らず待ちましょう。
インストールが終わると以下の出力がターミナルに表示されます。

modularインストール後の出力

次に、ターミナル経由でmodularにサインインします。

modular auth
サインインコマンド

コマンドを実行すると以下の出力が表示されます。

サインインコマンドの出力

上記の「https://developer.modular.com/…」のリンクにCtrlキー+左クリックでアクセスし、modularにサインインします。
アカウントを作成していない場合はアカウント作成をすることになります。

サインインが完了したら、ついにMojoのインストールです。
以下のコマンドを実行しましょう。

modular install mojo
Mojoのインストールコマンド

げるすら環境だとこのコマンドも30秒未満で完了します。
インストールが完了すると以下のような出力が表示されます。

Mojoインストール後の出力

出力内容にもある通り、次はmojoコマンドを実行できるように設定します。

今回はUbuntuなので、
「If you are useing bash, run the following commands :」
と書かれているコマンドをコピペで実行しましょう。
もしくは、以下の公式記載のコマンドを実行しましょう。

MOJO_PATH=$(modular config mojo.path) \
  && BASHRC=$( [ -f "$HOME/.bash_profile" ] && echo "$HOME/.bash_profile" || echo "$HOME/.bashrc" ) \
  && echo 'export MODULAR_HOME="'$HOME'/.modular"' >> "$BASHRC" \
  && echo 'export PATH="'$MOJO_PATH'/bin:$PATH"' >> "$BASHRC" \
  && source "$BASHRC"

どちらを実行しても結果は変わりません。
今回は公式記載のコマンドを実行します。

コマンド

設定ができていればmojoコマンドが認識されるはずです。
試しにmojoコマンドを実行してみましょう。

mojo
mojoコマンドの実行結果

このように、対話型のMojoが実行できていれば問題なく設定できています。


Hello World !

ひとまず環境は準備できたので、Hello Worldを実行してみましょう。


対話型でとりあえず実行してみよう!

以下のコードを対話型環境で実行してみます。

print('Hello World !')

コードを入力したら、エンターキーを2回押してください。
以下のような出力が得られるはずです。

これであなたも Mojo Master !!

対話型環境から出るには、以下のコマンドを実行します。

:quit
対話型環境を終了


Mojoファイルを作成しよう!

お好みの場所に実行ディレクトリ(フォルダ)を作成して、
その中で作成することをお勧めします。
今回はデスクトップに新しくMojoフォルダを作成して、
その中にファイルを作成することにします。

Mojoフォルダを作った

Mojoファイルを作成する方法はお任せします。
ターミナルからvimなどでもいいですし、テキストエディタでも大丈夫です。
今回はテキストエディタで作成します。

ひとまず、Hello Worldを出力するMojoファイルを作成します。
Mojoファイルから実行する場合、メイン関数を定義する必要があります。
対話型環境と同じコードだとエラーになってしまう点に気をつけましょう。

fn main():
    print('Hello World !!')
hello.mojo

コードが書けたら、作業用のフォルダに保存します。
ファイル名は「hello.mojo」とします。

hello.mojoの保存

ターミナルからhello.mojoを保存した場所まで移動しましょう。
もしくは、以下の画像のようにエクスプローラーから「端末で開く(E)」
から直接対象の場所でターミナルを開きましょう。

ターミナルを開く

ターミナルから、lsコマンドで「hello.mojo」があるか確認しましょう。

hello.mojoが確認できる

では、MojoファイルからMojoを実行してみましょう。
以下のコマンドを実行します。

mojo hello.mojo
Mojoファイルの実行

Hello World !! の出力が確認できました。
次は、Mojoファイルをビルドしてバイナリーファイルにしましょう。
以下のコマンドでMojoファイルのビルドができます。

mojo build hello.mojo
Mojoファイルをビルド

ソースコードに不備がなければ特に出力はありません。
lsコマンドで現在のフォルダを確認してみましょう。

作業フォルダの中身を確認

ビルドする前は「hello.mojo」しかありませんでしたが、
新しく「hello」が増えています。
これがhello.mojoをビルドして作成されたバイナリーファイルです。
では、バイナリーファイルを実行しましょう。

./hello
バイナリーファイルを実行

実行できましたね!
これで純粋なMojoを動かせる環境は一通り揃ったと思います。


Pythonのライブラリが使いたい!

そんな気分になることもあるでしょう。
MojoはPythonの資産を使えるように設計されているので、
MojoからPythonのライブラリを使うことが可能になっています。


ライブラリのインストール

MojoからPythonのライブラリを使用するには、
MojoではなくPythonの環境を作る必要があります。
これは、MojoがPythonライブラリを直接操作できるようになっている
わけではなく、MojoはPythonを呼び出す機能を持っているだけだと
個人的には認識しています。
なので、Mojoから使用したいPythonライブラリをPythonにインストール
することになります。
今回はひとまずNumPyを使ってみたいと思います。

pip install numpy

ターミナルからpipでNumPyをインストールします。

pipインストール

インストールが完了したら、以下のような出力が表示されます。

インストール完了


対話型環境でNumPyを使ってみる

この状態でMojoの対話型環境でNumPyを使ってみましょう。
以下のコードを実行してみたいと思います。

from python import Python
var np = Python.import_module('numpy')
var x = np.arange(0, 5, 0.1)
var y = np.sin(x)
NumPyで変数xとyを宣言

では、xとyを出力しましょう。

print(x)
print(y)
青い文字がズラズラ出力されるが、気にしないでいい

ちゃんとNumPyが使えていますね!


MojoファイルでNumPyを使ってみる

もちろん、MojoファイルからもNumPyが使えます。

Hello Worldと同じ手順で、今度は「numpy.mojo」を作りましょう。
コードは以下の通りです。

from python import Python


fn get_numpy() raises -> PythonObject:
    var np = Python.import_module('numpy')
    return np


fn main():
    try:
        var np = get_numpy()
        var x = np.arange(0, 5, 0.1)
        var y = np.sin(x)
        print(x)
        print(y)
    except:
        print('Error!')

get_numpy()は、インポートしたNumPyをPythonObjectとして返します。
PythonObjectとして返さず、get_numpy()の中で全部処理してもOKです。
その場合は以下のようなコードになります。

from python import Python


fn use_numpy() raises:
    var np = Python.import_module('numpy')
    var x = np.arange(0, 5, 0.1)
    var y = np.sin(x)
    print(x)
    print(y)


fn main():
    try:
        use_numpy()
    except:
        print('Error!')

どちらのMojoファイルも出力は同じなので、お好みでどうぞ。

こんな感じ

実行方法も先ほどと同じです。

mojo numpy.mojo
ちゃんと動いてる

NumPy以外でも、OpenCVやmatplotlibなども試しに動かしてみたところ、
問題なく動きました。


matplotlibも使ってみた

NumPyと一緒にmatplotlibも使ってグラフを表示してみましょう。
コードは以下の通りです。

from python import Python


fn get_numpy() raises -> PythonObject:
    var np = Python.import_module('numpy')
    return np


fn get_matplotlib() raises -> PythonObject:
    var plt = Python.import_module('matplotlib.pyplot')
    return plt


fn proc(np: PythonObject, plt: PythonObject) raises:
    var x = np.arange(0, 5, 0.1)
    var y = np.sin(x)
    plt.plot(x, y)
    plt.show()


fn main():
    try:
        var np = get_numpy()
        var plt = get_matplotlib()
        proc(np, plt)
    except:
        print('Error!')
こんな感じ。

名前は「matplotlib.mojo」で保存して以下のコードを実行。

mojo matplotlib.mojo
NumPy + matplotlibの実行結果

Pythonで記述する所の、

from matplotlib import pyplot as plt

は、Mojoで記述すると

var plt = Python.import_module('matplotlib.pyplot')

となります。

NumPyの導入は記述がストレートで分かりやすいですが、
matplotlibのように
matplotlibの中のpyplotをimportしたい!
みたいな導入は上記のような形式で解決します。


おわりに

純粋なMojoの実行と、Pythonのライブラリを使うところまではこの記事で
大体解決できるかな〜と思います。
次の記事を作るのであれば、Mojoの機械学習系サービス「MaxEngine」
について書きたいなとふんわり考えています。

ちなみに、MacでMojo+Pythonライブラリを実行する場合はminiconda
を用いた環境の方が便利だと思います。
というか、げるすらのMacではそれ以外でPythonライブラリを使うことに
成功しませんでした・・・。

MacにMojoを導入する方法について記事を書くかは分かりません。
まぁ、Pythonライブラリ以外はほとんど内容同じなんですけどね!

この記事が気に入ったらサポートをしてみませんか?