毎回、世界のプログラミング言語を紹介する本連載ですが、今回は新進気鋭の言語「MoonBit」を紹介します。この言語は、ブラウザ上で高速に実行できる「WebAssembly」などを生成できるRust風の新しいプログラミング言語です。Rust風だけどGCがあるのでとても簡単です。今回は、MoonBitの特徴や魅力を紹介していきます。

  • GCありRust風言語のMoonBitを試してみよう

    GCありRust風言語のMoonBitを試してみよう

MoonBitの特徴

MoonBitは、Rustのような安全性とパフォーマンスを持ちながら、ガベージコレクション(GC)を採用しているのが特徴です。これにより、メモリ管理の複雑さを軽減しつつ、高速な実行が可能になっています。また、WebAssembly(wasm/wasm-gc)をターゲットにしているため、ブラウザ上での実行が非常に高速で、クロスプラットフォームな開発が可能です。また、JavaScript/ネイティブバイナリへのコンパイルもサポートしており、幅広い環境で利用できます。

誰が作っている?

MoonBitは、元Meta出身のエンジニアで、プログラミング処理系で豊富な実績を持つZhang Hongbo氏を中心に開発が行われています。彼は、OCamlをJavaScriptへコンパイルするBuckleScriptや、その発展形であるReScriptの開発で知られ、さらにOCamlやFlowにも関わった経歴を持っています。MoonBitの開発においても、これらの経験が活かされており、コンパイラ技術に精通したチームが開発を進めています。

Web IDEを使ってみよう

MoonBitは、公式サイトで提供されているWeb IDEを使って、ブラウザ上で簡単にコードを書いて実行することができます。こちらにあるのですが、チュートリアルを兼ねており、コードを書いてすぐに実行できる環境が整っています。ブラウザさえあれば、特別な環境構築なしでMoonBitの魅力を体験できるのは大きなメリットです。

  • Web IDEを使ってMoonBitをすぐに試すことができる

    Web IDEを使ってMoonBitをすぐに試すことができる

ローカルに環境を構築してみよう

ローカル環境にMoonBitをインストールすることも簡単です。公式サイトのインストールガイドに従って、ターミナルで以下のコマンドを実行するだけで、MoonBitのCLIツールがインストールされます。

# macOS/Linuxの場合
curl -fsSL https://cli.moonbitlang.com/install/unix.sh | bash
# Windowsの場合
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser; irm https://cli.moonbitlang.com/install/powershell.ps1 | iex

また、Visual Studio Codeの拡張機能も提供されており、ローカル環境でより高度な開発を行うことも可能です。VS Code拡張をインストールすることで、コード補完やエラー表示などの機能が利用できます。

FizzBuzzを作ってみよう

MoonBitを使って、定番のFizzBuzz問題を解いてみましょう。FizzBuzz問題とは、1から100までの数字を順番に出力する際、3の倍数のときは「Fizz」、5の倍数のときは「Buzz」、両方の倍数のときは「FizzBuzz」と出力する問題です。

以下は、MoonBitでFizzBuzzを実装した例です。(本稿執筆時点のバージョンは0.9.3でした。)下記のコードをWeb IDEに貼り付けて実行してみてください。

// FizzBuzzを返す関数を定義
fn fizzbuzz(n : Int) -> String {
  if n % 15 == 0 {
    "FizzBuzz"
  } else if n % 3 == 0 {
    "Fizz"
  } else if n % 5 == 0 {
    "Buzz"
  } else {
    "\{n}"
  }
}

fn main {
  // 関数を呼び出して結果を表示
  for i in 1..<=100 {
    println(fizzbuzz(i))
  }
}

また、ローカルでコードをコンパイルするには、まずはターミナルで以下のコマンドを実行します。

# プロジェクトを初期化
moon new fizzbuzz
cd fizzbuzz

すると、プロジェクトの雛形が作成されるので、上記のコードをcmd/main.mbtに貼り付けて保存します。次に、以下のコマンドで実行できます。

moon run cmd/main

プログラムを、Web IDEと、ターミナルで実行したのが次の図になります。比較的シンプルなコードで、FizzBuzz問題を解くことができるのがわかります。MoonBitのシンタックスは、RustやJavaScriptに似ているため、これらの言語に慣れている人にとっては、すぐに理解できるでしょう。

  • FizzBuzzのコードをWeb IDEとローカルで実行したところ

    FizzBuzzのコードをWeb IDEとローカルで実行したところ

無名関数やパターンマッチも

MoonBitは現代的な言語では当然用意されている無名関数やパターンマッチもサポートしています。以下のように、無名関数やmatch構文を使ってFizzBuzzのロジックを簡潔に書くこともできます。

fn main {
  // 無名関数でFizzとBuzzの条件を定義
  let is_fizz = n => n % 3 == 0
  let is_buzz = n => n % 5 == 0
  // 1から100までの数を繰り返し
  for i in 1..<=100 {
    // match構文でタプルを使って条件を評価
    match (is_fizz(i), is_buzz(i)) {
      (true, true) => println("FizzBuzz")
      (true, false) => println("Fizz")
      (false, true) => println("Buzz")
      (false, false) => println("\{i}")
    }
  }
}

上記のコードを見ると分かりますが、MoonBitは静的型付けの言語でありながら、型推論も強力にサポートしているため、コードが非常にシンプルになります。

また、構造体(struct)やトレイト(trait)やジェネリクスもサポートされているため、より複雑なデータ構造やアルゴリズムも簡単に実装できます。

// FizzBuzz構造体を定義
struct FizzBuzz {
  n : Int
}
// FizzBuzzの結果を取得するメソッドを定義
fn FizzBuzz::to_string(self : Self) -> String {
  let is_fizz = self.n % 3 == 0
  let is_buzz = self.n % 5 == 0
  match (is_fizz, is_buzz) {
    (true, true) => "FizzBuzz"
    (true, false) => "Fizz"
    (false, true) => "Buzz"
    (false, false) => "\{self.n}"
  }
}

fn main {
  for i in 1..<=100 {
    // FizzBuzz構造体のインスタンスを作成
    let fb = FizzBuzz::{ n: i }
    // メソッドを呼び出して結果を表示
    println(fb.to_string())
  }
}

実行ファイルにコンパイルしてみよう

MoonBitは、WebAssemblyだけでなく、ネイティブバイナリへのコンパイルもサポートしています。以下のコマンドを実行することで、実行ファイルにコンパイルできます。なお、本稿執筆時点のバージョンでは、ネイティブ実行ファイルに変換するには、Cコンパイラ(MSVC/gcc/clangのいずれか)が必要になります。

下記のコマンドを実行します。

# ネイティブバイナリにコンパイル
moon build --target native

すると、フォルダ「./_build/native/debug/build/cmd/main」に実行ファイル「main.exe」が生成されます。これを実行することで、FizzBuzzの結果がターミナルに表示されました。

エコシステム

MoonBitは新しい言語ではありますが、ものすごい勢いでエコシステムが成長しています。公式のパッケージマネージャーである「moon」コマンドを使って、さまざまなライブラリやツールが利用可能になっています。

Node.jsにおけるnpmに相当するパッケージレジストリ「mooncakes.io」も用意されており、コミュニティが活発にライブラリを公開しています。

  • Nodeのnpmに相当する「mooncakes」が用意されている

    Nodeのnpmに相当する「mooncakes」が用意されている

筆者もCRC32を計算するという簡単なライブラリを作って、こちらで公開してみました。とても簡単に作成できましたし、公開も簡単でした。Rust風でありながら、メモリ管理の煩雑さがなく、とても手軽にプログラムを書けるので、とても開発体験が良かったです。

まとめ

以上、今回は、MoonBitについて紹介しました。Rustに影響を受けた簡潔な言語仕様を持ち、GCを採用することで、メモリ管理の複雑さを軽減しつつ、高速な実行が可能な新しい言語です。WebAssemblyを主なターゲットにしていますが、ネイティブバイナリも生成できます。すごい勢いで開発が進んでいるので、今後が楽しみな言語です。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「実践力をアップする Pythonによるアルゴリズムの教科書(マイナビ出版)」「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。