Smalltalk
Pharo


きっかけ

Smalltalk歴は半年程度なので最初は「Smalltalk初心者から見たSmalltalkについての小話」的なものを書こうと思ったのですが、簡単にできて面白そうなネタを提供していただいたのでこちらでSmalltalk Advent Calendar 2018の19日目に参加させていただきます。

Smalltalkはダイナミックなプログラミング環境が大きな特徴の一つですよね。自作のクラスだけではなく標準のクラスを拡張してシステムそのものの挙動を変えることもできてしまうため、強力な反面使い方を誤るとシステムが壊れてしまう場合もあります。

……しかし、その「システムが壊れてしまう」タイミングというのはいったいいつなのでしょうか? どれくらいのクラスが残っていればシステムは無事に動いていられるのでしょうか?

そんな疑問に答えてくれるのがSmalltalkJengaです。

Smalltalkのクラスをジェンガのピースに見立て、ランダムにシステムから消していく。たったそれだけのプログラムです。

※1 実際に遊ぶ際は"target removeFromSystem."というコメントアウトしているクラスを削除している部分を元に戻してください。

※2 Smalltalkは書き慣れてないのでソース自体にツッコミどころが満載かもしれませんがご容赦ください。

※3 今のところ動作確認はPharo 7.0 - 64bit(development)でしかしていません。


SmalltalkJengaの遊び方

こちらのファイルをSmalltalkに取り込み、Playground/Workspaceで

SmalltalkJenga play.

を実行すると、Transcriptに

Turn 1!

Delete IceBitbucketRepositoryType!

という風にターン数とランダムなクラス名が表示され、該当クラスが削除されます。

目指せ全クラス制覇!(Pharo7だとこのクラスを除いて記事執筆時点で7814個クラスがあるようです)

最初に試してみた際には18回目でClyClassHierarchyというクラスが消えたことによってエラーが発生し、まともにソースコードが見れなくなってしまいました(一応システム自体はフリーズしていないのでまだ生きていると言えば生きているのですが)。

スクリーンショット 2018-12-19 18.31.35.png

名前から推察するにどうやらシステムブラウザのCalypsoのクラス階層関連のクラスでしょうか。これが消えたことでシステムが深刻なダメージを受けたようです。

ちなみにもっと重要なクラス(例えばObjectとか)を消してしまうと致命傷を受けてシステムがフリーズします。

再起動した時に最後のセッションを復元するかどうか聞いてきますが絶対にNoと答えましょう。


今後の展望

Smalltalkにまだ慣れきっていないので今回は完全にランダムにクラスを消すだけですが、今後はもう少し対話的に入力して消すクラスを指定できるようにしていきたいと思います。

プレフィックスや正規表現を入力させて一気にクラスをまとめて消せるようにしたり、一度にたくさんクラスを消すと高得点になったりとかすると面白そうです。

他にも改善点やこうすると面白そう、といったご意見等あればぜひ教えていただければと思います。

あと結局「システムが壊れてしまう」のがどのくらいかについて明確な回答を用意できていないので、自動化して平均どれくらいまでクラスが消えても大丈夫なのかを調べたり、

機械学習等でシステムが壊れない消し方を学習させて実際にどれくらいまでクラスを削減できるのか試してみたりできたら良いな、と思います……毎回システムがクラッシュしてしまうので難しい気がしますが。

余力があれば冒頭で触れていた「Smalltalk初心者から見たSmalltalkについての小話」的なものも今年のAdvent Calendarで書いてみたいと思います。

それでは。