v2.2.0
Why

なぜ Melange なのか

OCaml は工業的な強度を持つ最先端の型システムを提供し、非常に少ない型アノテーションで型推論を行うことができるため、大規模なプロジェクトを管理する上で非常に有用である。

JavaScript は、ソフトウェアをデプロイして実行するための最も普及しているプラットフォームの 1 つである。利用可能なさまざまな VM を改善するための長年の努力のおかげで、ブラウザやその他の環境で実行される JavaScript コードは大幅に最適化されており、大規模な製品やツールのユースケースをサポートすることができる。

Melange は、開発者や企業が OCaml プラットフォームの利点をウェブプラットフォームのユーザーに提供し、開発者が両方のエコシステムと簡単に統合できるよう支援します。

歴史

Melange の出自をよりよく理解するために、過去 10 年ほどの間に登場した関連プロジェクトのいくつかを見てみるといいだろう。

Js_of_ocaml

Js_of_ocaml も 2011 年に公開された OCaml から JavaScript へのコンパイラだ。2013 年に発表されたプレゼンテーション・ペーパーでは、当時 OCaml コミュニティがそれほど大きくなかったため、多くのメンテナンス作業を必要とせず、OCaml コンパイラと可能な限り互換性を保つことが設計目標の 1 つであったと明確に述べられている。

この目標を達成するために、Js_of_ocaml は OCaml バッチコンパイルによって生成されたバイトコードを選び、そこから JavaScript を生成する。OCaml バイトコードは非常に安定したインターフェイスを持っているので、Js_of_ocaml はコンパイラの新しいバージョンに簡単にアップグレードできる。この設計上の決定により、ツールやライブラリが C コードに依存しない限り、OCaml エコシステムのほとんどと互換性を保つことができる。

バイトコードを使うことの欠点は、既存の JavaScript コードとの通信が難しくなることだ。これは、Js_of_ocaml が OCaml の値に対して使用できるランタイム表現に制約があることと、1 つのバイトコード・プログラムが 1 つの JavaScript プログラムにコンパイルされるが、1 つの OCaml モジュールから個々の JavaScript モジュールを生成することができないコンパイル・モデルが使用されることによるものである。

もうひとつの欠点は、バイトコードのような低レベルの表現から変換されるため、結果の JavaScript が読みにくいことだ。

BuckleScript

そして 2016 年、Bob Zhang は Js_of_ocaml リポジトリの問題で、バイトコードを使用する代わりに、コンパイルプロセスの早い段階から JavaScript への変換を開始する可能性を提案した。この提案は Js_of_ocaml の当初の設計と目標から根本的に乖離していたため、彼は BuckleScript となるものに取り組み始める。

BuckleScript は、JavaScript オブジェクトをJs.tで表現する方法など、Js_of_ocaml からいくつかのインスピレーションを得ている。また、1 つのモジュールにつき 1 つの.js ファイルを生成するので、既存の JavaScript コードベースとの統合が容易になる。BuckleScript は、外部プリミティブに適用される豊富な属性コレクションを通じて JavaScript コードと通信することに重点を置いています。

Reason

同じ年、Facebook に Reason というプロジェクトが登場する。ジョーダン・ウォルケが率いるこのプロジェクトは、C や JavaScript に近い OCaml の代替構文を作ろうというものだ。Reason は、ネイティブ・アプリケーションのバイナリや、JavaScript をターゲット言語とするウェブ・アプリケーションなど、コードがどのプラットフォームでデプロイされるかを問わないが、BuckleScript は早い段階から Reason をファーストクラスでサポートしている。この時点で、Reason と BuckleScript の組み合わせが素晴らしい相性であることが明らかになった:BuckleScript は JavaScript エコシステムと連携するためのツールとインフラを提供し、Reason は開発者が慣れ親しんだ構文でプログラムを書くことを可能にする。

時間の経過とともに、他の Facebook 従業員や reason-react で React.js のような広範な JavaScript ライブラリへのバインディングを提供するコミュニティの助けを借りて、Reason と BuckleScript の組み合わせは採用されるようになった。

BuckleScript がリブランド

しかし、ある時点で BuckleScript と Reason の両プロジェクトのゴールは両立しにくくなった。2020 年 8 月、BuckleScript チームは ReScript への改名を決定し、Reason パーサーの最新バージョンへのサポートを停止し、構文を変更した新しいパーサーに置き換えた。リブランディングの理由は ReScript の公式ブログポストで説明されています。

リブランディングは、ReScript 言語のオンボーディングと採用を容易にし、プロジェクトが TypeScript のような主流のコンパイル済み JavaScript 言語と競争する機会を増やそうとしている。しかし、BuckleScript や Reason の既存ユーザーの多くにとっては、以前から暗黙のうちに示唆されていたことが明確に確認されたことになる:ReScript の目標は、OCaml エコシステムとうまく統合することとは両立しない。

Melange:OCaml に戻る

ここで Melange の登場だ。BuckleScript が ReScript にリブランディングされてから数週間後、António Monteiro は BuckleScript のフォークに取り組み始めた。

この BuckleScript のフォークは、後に Melange と名付けられる。Ninja から Dune への切り替えが完了した後、OCaml に近づけるためにいくつかの機能が追加された。例えば、Melange が使用する OCaml コンパイラのバージョンをアップグレードしたり、Melange が使用する OCaml コンパイラの変更を、アップストリームコンパイラの完全なフォークではなく、単なるライブラリとしてモデル化したりした。

2022 年 9 月、Ahrefs は Dune と Melange の統合を深めるプロジェクトに資金を提供し、Melange への投資を決定した。このプロジェクトは 2023 年春に完了し、Ahrefs のフロントエンドのコードベースが Melange に移行され、Dune のバージョン 3.8 と Melange のバージョン 1.0 がリリースされました。

今後に向けて

v1.0 への到達は Melange にとって大きなマイルストーンですが、これは旅の始まりに過ぎません。Melange チームは、JavaScript プラットフォームをターゲットとする OCaml 開発者にとって堅牢かつ効率的なツールであり続けるよう、継続的な改善に取り組んでいます。ロードマップ (opens in a new tab)のページでは、Melange の過去の作業と現在の目標について詳しく説明しています。