CTMCP のために Mozart/Oz を動かす

Posted on 月 08 4月 2019 in 学習

ゼミの輪読で, Concepts, Techniques, and Models of Computer Programming (MIT Press) ,略称 CTM または CTMCP を読むことになった.その為の準備と,ちょっとだけ読んだのでそのまとめ.

Mozart/Oz

この本では, Oz というプログラミング言語を扱っている.と言っても, Oz の実装である Mozart に完全に焦点を当てている. Oz 自体は名前を聞いたことはあったが今まで触ったことはなかった. 公式ドキュメント によると

"Oz is a multi-paradigm language that is designed for advanced, concurrent, networked, soft real-time, and reactive applications."

"Oz はマルチパラダイムな言語で,高度で,並行で,ネットワークを使用し,ソフトリアルタイム [1] でリアクティブ [2] なアプリケーションのために設計されています."

—Tutorial of Oz by Seif Haridi and Nils Franzén

という言語らしい. Mozart は UCL の PLDC 研究グループによって開発が続けられている Oz の主要実装ということになる.

ところで, Mozart/Oz でググると一番最初に出てくる 「Mozart/Oz について話します」 という記事の中で述べられているように,あまり積極的な開発体制が整っているわけではないようだ.また,メジャーバージョン1から現在のメジャーバージョン2に移る時に,開発体制の大規模な移行があったのか,本書で出てくるサイト http://www.mozart-oz.org は稼働しておらず, https://mozart.github.io/ の方に移っている.

ただ,開発自体は続いているようで,半年前ぐらいにメジャーバージョン2の初の安定板, 2.0.1 がリリースされている.とりあえずこれをインストールしたが,今の所 (1章までしか読んでない) 本書のサンプルは問題なく動く.今後に期待という感じだろうか.

Mozart/Oz の使い方

まずは, Mozart をインストールして,動かしてみる.インストールは macOS で行ったので,他の環境でどうなるのかは分からないが,ひとまず リリースページ をみる限り macOS / Debian / RedHat / Windows 向けのインストーラは提供されていそう.今回は,macOS 向けの mozart2-2.0.1-x86_64-darwin.dmg をダウンロードして起動した.で,アプリケーションフォルダに Mozart2.app をインストールする.後 Emacs が必要なので, https://emacsformacosx.com/ とかから適当に入れる.

で,起動すると以下の画面が出てくる:

上下に分かれた Emacs 画面が表示される.

上のバッファがプログラミングする部分,下のバッファがコンパイラの出力画面になる.上のバッファで例えば次のようにプログラミングを行える.

``{Browse 42}`` と書くと 42 を表示するプログラムになる.コンパイルに成功し, accepted と表示されているのが分かる.

ここではプログラム {Browse 42} をコンパイルしている.コンパイルは Oz メニューの「Feed Buffer」という項目から行え, C-. C-b が割り当てられている.なおカーソル位置までを実行したかったら「Feed Region (C-. C-r) 」で行える.対話的なデバッグの際有用だ.「Feed Buffer」後はコンパイラの出力画面に accepted / rejected が表示され, accepted の場合今回の例だと,次のような出力ウィンドウが表示される:

42 と表示されたウィンドウが表示される.

ついでに, Emacs のこの GUI でなく普通のプログラミングスタイルでやりたいなら, /Applications/Mozart2.app/Contents/Resources/bin の中に色々ツールが入ってるのでそれを使う.例えば,簡単な Hello World プログラムは次のように作れる:

$ export PATH=$PATH:/Applications/Mozart2.app/Contents/Resources/bin
$ cat > helloworld.oz
functor
import
  System
define
  {System.showInfo "Hello World!"}
end
$ ozc -x helloworld.oz
$ ls
helloworld  helloworld.oz
$ ozengine helloworld
Hello World!

CTMCP を読む分には, Emacs の実行環境で問題なさそうなので,僕はそれでやる.なお,本書で紹介されてる oz コマンドでの起動はうまくいかなかった.なんでだろね. Mozart2.app から起動すればいいので特に困ることはないんだけど.

後, Browse で一々別のウィンドウが立ち上がるのがめんどいという人は, Oz Emulator というバッファが用意されているので,それを表示して, Browse を適宜 Show 関数に読み替えると良いっぽい.そうすると別ウィンドウが立ち上がる代わりに, Emulator の方に出力が表示される.僕は以下の画面構成で書いてる:

下の画面を分割して,左にコンパイラ出力,右にエミュレータ出力が見えるようにしている.

CTMCP 1章の内容

準備できたので,早速読んでいく.内容の詳細説明はしないので,内容が気になる方とか Oz の文法が知りたい方は普通に読んでくれ.

1章の内容は, Oz の説明と簡単な文法,それから取り入れられてる機能の説明っぽい.まあ概要だしね.これからやってく内容を,サンプルプログラムを元にちょっとずつ説明していく感じ.全くプログラミングをやったことない人にはきついが,どれかのプログラミング言語の入門書を読んだくらいのレベルなら読めそう.大体は以下の内容:

  1. 最初は簡単なプログラムから,ちょっと複雑なプログラムまで,徐々に Oz に慣らしていく.
  2. プログラムの正しさの検証の話.
    • 数学的な推論に基づくプログラム検証の話.
    • 目次を見る限り, 13 章でやるのかな? 後でやるとは言っているが,どれくらい後なのかは特に本文では言及されてない.
  3. 計算の複雑性の話.
    • 主に,プログラムの計算量の話かな.
    • これも特に本文では述べられていないが, 3.5 とかで出てきてそう.
  4. 遅延評価の話.
    • 2.0.1 では表示が本文と違うが,多分気にしちゃいけないやつ.
    • Oz は遅延評価関数がサポートされていて,それを使ってどういうことができるかという話.
    • これは, 4.5 に書いてあるのかな. 3.6 とかにもありそうだし飛び飛びって感じそう.
  5. 高階プログラミングの話.
    • 関数を引数にとる高階関数を使ったプログラミングの話.
    • これは, 3.6 に説明があるのかな.
  6. 並行性の話
    • Oz は並行プログラミングがサポートされていて,それを使ってどういうことができるかの話.
    • これは, 4 / 5 あたりが主にこの内容になってそう.あと 8 もそうだしそこかしこに出てきそう.
  7. データフローの話
    • Oz でサポートされている,データフローに基づく並行実行のアーキテクチャの説明.
    • これは, 4.2 / 4.9 とかなんかな.よく分からん.
  8. 明示的状態の話
    • Oz は可変な変数がサポートされていて,それを使ってどういうことができるかの話.
    • これも同じく後で詳しくやるって言って具体的な章番号は書いていないが,多分 6 がその内容っぽい.
  9. オブジェクトの話
    • オブジェクト指向の話っぽい. Oz では,カプセル化ができるという話が出てくる.
    • てか,次で諸にオブジェクト指向の話が出てきた.
  10. クラスの話
    • オブジェクトのクラスを, record と factory という機能を使って作れるよって話.
    • 後,オブジェクト指向の用語の説明とかが書いてある.
    • 何故かここでは,オブジェクト指向プログラミングは 7 章でやると書いてある.
  11. 非決定性の話
    • 並行性と可変な変数による非決定性の話.
    • レースコンディションって怖いねって話.
    • これは, 4.7 とかなのかな.
  12. 不可分性の話
    • Oz は排他制御をサポートしていて,それを使ってどう言うことができるかの話.
    • これは, 8.3 っぽい.

後は,演習問題って感じ.まだ 1 章しか読んでなくて,目次だけ見て「ここに出てきそう」って言ってるので出現場所の精度は期待しないでくれ.

演習問題もざっと目を通したけど,自分で考えるための脚注みたいな感じだった.本文に書かれてないけど,考えておいた方がいいことを,答えを伏せて書くみたいな,行間を目に見える形にしたみたいな感じ.知識の確認にはあまり使えなそう.まあ今回はそこまでちゃんとした話ではなかったのもあるかもしれないけど.ただ,もしこの形式で演習問題が続くなら,最後に確認のためやるというよりは,それぞれの節を読んだら演習問題を見に行くぐらいの方が良さそう.

まとめ

CTMCP を読むための準備とか諸々をした.トピックがかなり網羅的で面白そうではあるが,内容が古そうなのは気になる. Mozart 2.0.1 だと動かないサンプルとか出てこないか心配.頑張っていくか.なお,一応 1 章のまとめは書いたが,これ以降の章は多分特にまとめとか書かない気がする.今回は環境構築メモるついでって感じだし.というわけで,よろしく.

[1]ソフトリアルタイム (soft realtime) とは,制御工学の用語の一つで,リアルタイムシステムのクラスの 1 つを表す.リアルタイムシステムの中でも処理時間の期限に求める制約が一番緩いクラスで,処理時間の期限をすぎると徐々に処理結果の価値が下がっていくようなシステムのことを指す.プログラミング言語がそのようなアプリケーションに対応しているということはつまり,高度なスケジューリングシステムを備えていると言いたいのだと思う.
[2]一口にリアクティブ (reactive) と言っても,正直システムによって定義はかなり異なるが,一般的にはユーザからの入力に対して即座に出力を返すようなシステムのことを指す.