言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Tweak のスクリプトプロセスとスケジューラ

以前中途半端に調べた物の完結編です。Tweak では、スクリプトプロセスという物を積極的に使います。これはバリバリマニアックな機能なので、リリース時にはもう少しユーザからみえなくなっているんじゃないかと思いますが、今の時点ではプログラマスクリプトプロセスの動作に熟知している事が求められますので、つらつらとメモっておきます。スクリプトプロセスとは、etoys プログラムにある、あの「チクタク」機能のような物をシステム記述の中心にすえてやろうという考え方で、E 言語 http://www.erights.org/ が起源です。

伝統的なプログラム動作の考え方は以下の通りです。これから行おうとする処理が書いてある表があって、一人の人が書いてある順番にこなしてゆきます。この処理を行う人の事をプロセスと呼びます。一方最近のコンピュータ環境では、プロセスは一人じゃなくて沢山あり、同時にいくつもの仕事を行う事が出来ます。沢山あるプロセスを管理する部品がスケジューラです。たまに一人ずつしか見てはいけない表があったりするので、スケジューラはその交通整理をします。

Tweak では、処理のまとまりをスクリプトと呼びます。例えば、マウスをクリックしてボタンに影をつけるまでが一つのスクリプトです。メソッドやクラス等が、処理の静的なメモリ上でのまとまりを表すのに対して、スクリプトは動的な、時間的なまとまりです。一つのスクリプトに一つのプロセスが割り当てられます。つまり、とっても沢山プロセスを使うという事です。メリットは。。。なんだか良くわかりません。Croquet では本質的な意味があると思いますが、正直アンドレアスの実験台として苛められている気分です。

普通スケジューラは OS が支配している物ですが、Tweak ではスケジューラも単なるオブジェクトなので自由自在に使います。一つのスケジューラが同時に実行出来るスクリプトプロセスは一つだけです。つまり、かっこよく言うとノンプリエンティブ、古い言葉で擬似マルチタスクです。プロセスはセマフォの待ち合わせまでとりあえず突き進みますので、排他処理が簡単です。

スクリプトスケジューラの根源的な動作を確かめるため、Tweak では無く、Morphic 環境上でテストスクリプトを書きます。

スクリプトプロセスを作る。

| schedular process |
self island project: CProject2 new. "おまじない"

schedular := ScriptScheduler new. "スケジューラ生成"
process := nil startScript: #inspect. "プロセス生成"
process setScheduler: schedular.
process resume. "プロセスが目覚める"
process hand: ActiveHand. "マウスカーソルをなぜか登録"
schedular run "実行"

もっとも簡単なサンプルです。startScript: は nil inspect を実行する「スクリプトプロセス」を返します。#inspect の所にはメソッド名かブロックを書けます。これをスケジューラーに登録して run で一回回します。プロセスは一回起動すると消滅します。

イベントつきのスクリプトプロセスを作る。

| object process schedular script |
object _ CObject new. "イベントには CObject のインスタンスが必要"
schedular _ ScriptScheduler new.
process _ object startScript: [script _ object startScript: #inspect when: #fire]. "イベント付きスクリプトを生成するプロセス"
process setScheduler: schedular.
process resume.
schedular run. "startScript: の中のブロックを実行。新しいプロセスのスケジューラとして schedular が使われる。"

object signal: #fire. "イベントで目覚める。valueWithEvent: のなかで resume される"
schedular run. "目覚めたスクリプトを実行"

startScript: はイベント記述を持たない特別なスクリプト生成メソッドで、他のスクリプトプロセスのブートストラップに使われます。普通はイベント記述つきのスクリプトを使を生成するため、startScript:when: 等を使います。普通は Tweak システムが schedular run を実行するので、signal: だけでスクリプトは実行されますが。自分でスケジューラを管理したいときは自分で呼びます。

  • startScript: (イベントなし)
    • プロセスが返る
    • 一度実行したら消滅
  • startScript:when: (イベントつき)
    • スクリプトが返る
    • signal: のたびに新しくプロセスが生成される。

タイマつきのスクリプトプロセスを作る。

| object process schedular script |
object _ CObject new.
schedular _ ScriptScheduler new.
process _ object startScript: [script _ object startTicking: #inspect at: 0.3].
process setScheduler: schedular.
process resume.
schedular run.

[object island project signal: #tick.
schedular run] repeat.

etoys で言う「チクタク」は上のように書きます。チクタクイベントはプロジェクトに #tick イベントを特殊な形で登録する事により実現されています。シグナルされても、一秒間に0.3回、つまり10秒に3回しか実行されません。