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
終わるとこんな感じになります。
出力が邪魔になったら都度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 -
げるすらの環境だと30秒もかからずにインストールが終わります。
回線の状況によっては時間がかかるかもしれませんが、
焦らず待ちましょう。
インストールが終わると以下の出力がターミナルに表示されます。
次に、ターミナル経由でmodularにサインインします。
modular auth
コマンドを実行すると以下の出力が表示されます。
上記の「https://developer.modular.com/…」のリンクにCtrlキー+左クリックでアクセスし、modularにサインインします。
アカウントを作成していない場合はアカウント作成をすることになります。
サインインが完了したら、ついにMojoのインストールです。
以下のコマンドを実行しましょう。
modular install mojo
げるすら環境だとこのコマンドも30秒未満で完了します。
インストールが完了すると以下のような出力が表示されます。
出力内容にもある通り、次は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が実行できていれば問題なく設定できています。
Hello World !
ひとまず環境は準備できたので、Hello Worldを実行してみましょう。
対話型でとりあえず実行してみよう!
以下のコードを対話型環境で実行してみます。
print('Hello World !')
コードを入力したら、エンターキーを2回押してください。
以下のような出力が得られるはずです。
対話型環境から出るには、以下のコマンドを実行します。
:quit
Mojoファイルを作成しよう!
お好みの場所に実行ディレクトリ(フォルダ)を作成して、
その中で作成することをお勧めします。
今回はデスクトップに新しくMojoフォルダを作成して、
その中にファイルを作成することにします。
Mojoファイルを作成する方法はお任せします。
ターミナルからvimなどでもいいですし、テキストエディタでも大丈夫です。
今回はテキストエディタで作成します。
ひとまず、Hello Worldを出力するMojoファイルを作成します。
Mojoファイルから実行する場合、メイン関数を定義する必要があります。
対話型環境と同じコードだとエラーになってしまう点に気をつけましょう。
fn main():
print('Hello World !!')
コードが書けたら、作業用のフォルダに保存します。
ファイル名は「hello.mojo」とします。
ターミナルからhello.mojoを保存した場所まで移動しましょう。
もしくは、以下の画像のようにエクスプローラーから「端末で開く(E)」
から直接対象の場所でターミナルを開きましょう。
ターミナルから、lsコマンドで「hello.mojo」があるか確認しましょう。
では、MojoファイルからMojoを実行してみましょう。
以下のコマンドを実行します。
mojo hello.mojo
Hello World !! の出力が確認できました。
次は、Mojoファイルをビルドしてバイナリーファイルにしましょう。
以下のコマンドでMojoファイルのビルドができます。
mojo build hello.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をインストールします。
インストールが完了したら、以下のような出力が表示されます。
対話型環境で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)
では、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
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ライブラリ以外はほとんど内容同じなんですけどね!
この記事が気に入ったらサポートをしてみませんか?