Pluto.jlはJuliaのノートブックの一つだ。 ノートブックといえばJupyterのノートブック(拡張子が.ipynbのやつ)が有名だ。 Jupyterの名が示すとおり、JuliaはJupyterノートブックで扱うことができる(IJuliaを使う)。 ではなぜPluto.jlなどというものがあるのだろうか。 実はPluto.jlはJupyterノートブックとはかなり異なるものであり、いくつかのユニークな性質もあるので、それについて書きたいと思う。

Pluto.jlの特徴

先程載せたウェブサイト(https://plutojl.org)には2つ特徴がまとめられている。 それはREACTIVITYREPRODUCIBILITYだ。

Reactivity

Reactivityとは、例を挙げると、MS Excelのようにある場所で値を更新すると、それに依存するすべての部分が再評価される性質である。 Pluto.jlは各セルの間の依存関係を自動で把握し、実行を自動で行ってくれる。 ここで更にHTMLのinput要素などを組み合わせることで、HTMLを介して変数を操作し、その計算結果をreactiveに見ることが簡単にできる(eventの管理などいらない!)。

Reproducibility

Reproducibilityは、(もちろん)再現可能性なわけだが、Pluto.jlはノートブック単体でreproducibilityを達成している。 前提として、Pluto.jlノートブックは通常の.jlフォーマットに従っており、そのファイル自体を実行することもできる。 そしてそのファイルの中に、Project.tomlManifest.tomlに相当するもの1が入っており(Stringとして書いてある)、 その情報でノートブックごとに環境を自動で作成してくれる。

結果の保存

少々脱線するが、Pluto.jlノートブックはただのテキストファイルであるので、Jupyterノートブックのように結果を保存する機能はない。 (実行の様子をアニメーションで保存する)HTMLやPDFとしてエクスポートする機能はあるので、それらを使えば十分であるとも考えられる。 Reactivityという性質も合わさり、大規模な(i.e. 実行に時間のかかる)コードはあまり向いていないと思っている。

上記の特徴を実現するための/に関連するノートブックの特徴

上記はPluto.jlの説明には必ず出てくるような内容だったが、ここからは上記の性質と関連したPluto.jlノートブックらしい性質を並べてみる。

1. セルとはプログラムの"1行"のまとまりである。

Jupyterノートブックのセルは、単純にスクリプトファイルを分割したものであり、分割場所は(セル自体が妥当なプログラムであれば)任意の場所で区切る(もしくはくっつける)ことができる。 一方Pluto.jlではセルはREPLで実行される単位で必ず区切られてなければならない。 つまり例えば、

x = 1
y = 1

とは書けない複数の式を一つのセルに書けない どうしても1セルで書きたい場合2は、スコープを導入しないブロックbegin ... endを使えばよい。

2. 同じ変数を2度定義できない

変数の依存関係が自動で解決されるので、同じ変数を複数のセルで定義することができない。 これも通常のスクリプトでは考えられない制約である。

複数のセルで同じ変数を定義できない

ただもちろん関数定義内やbegin ... endlet ... endブロック内では通常のように変数に上書きできる。

3. セルの順番は実行順番とは関係ない

2.であったように、変数は基本immutableとなる。 そうなるともはやセルの順番は実行順番とは関係なくなる。 したがって、下の方に定義した関数を上のセルで呼び出すことも可能だ。

下のセルで定義した関数を呼ぶ

ではファイルではどのように保存されているのか?

前述の通り、Pluto.jlノートブックは通常の.jlファイルとして実行できる。 しかし、セルの順番は実行順とはことなる場合もある。 したがって、Pluto.jlノートブックは.jlとして保存する際、セルをIDを(コメントで)振りつつ実行順で記述した後、 ファイルの最後あたりにセルの順番でIDを並べている。

その他の特徴

以上でおおよそ書きたいことは書いたのだが、ついでなのでその他の特徴を書いておく。

  • Live Docパネルがあり、カーソル上のExprや検索でヘルプ(Docstring)を見ることができる。
  • HTMLなのでLaTeXはMathJaxで描画される。
  • 少々キーバインディングが特殊(Jupyterほど機能が多くない)
  • PlutoUI.jlを用いればHTML inputの要素を簡単に、かつJuliaらしくかけるようになる。
  • Jupyterのようにmarkdownセルはない。md"..."3を使って書けば、HTMLで描画してくれる。
  • その他DataFrameなどはきれいに表示される

適した用途

以上の特徴を踏まえ、個人的に適してると考えた用途を以下にかく

  • REPLにおけるprototypingの代わりとして
    • reactivity故にいちいち更新する手間が省ける
    • しかし、ノートブックごとに別環境となるのでprecompileもその分時間がかかる
  • 電卓として
    • LaTeXが数式として描写されるので、Latexify.jlとの相性が非常に良い
    • 数式の誤入力に気づきやすい
  • 簡単なアプリケーションのフレームワークとして
    • Web関連技術に基づいた高品質なUIを簡単に作れる
    • とにかくreactiveなので何も考えなくてもinteractiveなものをつくれる
    • reproducibilityが配布時の動作を保証してくれる
    • 上の方にUIをまとめて下に内部の関数定義をまとめるといったことも可能だ(セルは結果だけを表示し、コードを隠すことができる)

Notebook(しかも独自の)という情報だけから主にEditorとしての機能の少なさを嫌って食わず嫌いしていたが、 実際に使ってみるとユニークな機能がたくさんあり、虜になってしまった。 皆さんも是非使ってみてはいかがだろうか。


  1. Juliaのわからない人向けにいうと、Project.tomlCargo.tomlManifest.tomlCargo.lock ↩︎

  2. というかこのような定義をすべて別セルで書くことを強制されるのは嫌だ ↩︎

  3. つまり@md_str ↩︎