Smalltalk Zoo の Smalltalk-80 を強引に動かす

[17日目](https://qiita.com/sumim/items/6b3c2246a853724fc9ef)で紹介した「[Smalltalk Zoo](https://smalltalkzoo.thechm.org/)」ですが、執筆時点では残念ながら「[Smalltalk-80](https://smalltalkzoo.thechm.org/HOPL-Squeak.html?earlyst80)」で肝心の Apple Smalltalk（リリース前のv1がベース）や Xerox Smalltalk-80 v2.0（リリース版のv2）は動かせない状態です。必要なファイルが見つからないことを告げる（そのため、別のファイルの指定を促す）ポップアップが出て、エラーになってしまいます。

歴史的観点からは Smalltalk-72 や -76/78 も大変興味深い存在ですが、やはり Smalltalk と言えば Smalltalk-80 。最新で非常に活発なコミュニティを有する [Pharo](https://pharo.org/) やその元になった [Squeak](https://squeak.org/) 、商用の [VisualWorks](http://smalltalk.cincom.jp/main/) といったその直系の子孫はもとより、旧IBM VisualAge for Smalltalk（現[VA Smalltalk](https://www.instantiations.com/products/vasmalltalk/index.html)）などの企業独自実装の商用処理系を懐かしむファンが多いかと思うので是非とも動かしたいところです。

Smalltalk Zoo で Smalltalk-80 の「Launch Apple St-80」および「Launch Xerox St-80 v2.0」ボタンが機能しない理由は、前述のエラーからも察せられるように使用する仮想イメージが入っていないからのようです。そこで、ネットから探して手に入れることで少々強引に動かしてみることにしましょう。

##Apple Smalltalk-80
Apple Smalltalk は、Apple が自社の Lisa や Macintosh 向けに Xerox からライセンスを受けて開発した Smalltalk-80 処理系です。旧APDA（The Apple Programmers and Developers Association）から 100ドル程度で販売されましたがそこまでで、 Apple は商用処理系向けの v2 のライセンスは取得せず v1 で開発をやめてしまいます（その結果 Xerox は自社、正確にはその子会社の ParcPlace Systems で Macintosh 用の処理系を開発しなければならなくなったとか…）。

Apple Smalltalk はしばらく放置されていたのですが、教育現場向けのオーサーウエアを開発したいアラン・ケイらが発掘し Squeak として生まれ変わらせたくだりは Smalltalk Zoo にもある「Back to the future: the story of Squeak, a practical Smalltalk written in itself」で読むことができます。（umejava さんによる[あらすじ](http://www.mars.dti.ne.jp/~umejava/smalltalk/squeak/index.html)も是非）

バージョン 0.4 まで開発された Apple Smalltalk は、現在、旧Mac 向けのソフトをアーカイブするサイトで入手可能ですので、そこから仮想イメージを抽出してみましょう。たとえば Macintosh Garden というアーカイブならこちらから。

- [Apple Smalltalk-80](https://macintoshgarden.org/apps/apple-smalltalk-80)

V0.4.sit として入手できるファイルは、旧Mac時代に主流だった StuffIt というユーティリティで圧縮された.sit 形式のファイルですので、同フォーマットを解凍できるユーティリティを使って中身から仮想イメージファイルを取り出します。たとえば本家の解凍ツール「StuffIt Expander」が今も使えます。

- [StuffIt Expander](https://www.stuffit.com/)

解凍した中にある「Smalltalk.image」というファイルが使いたい仮想イメージファイルなので保存場所を覚えておいてください。

##Xerox Smalltalk-80 v2.0

Apple Smalltalk-80 などがベースにした v1 をさらにブラッシュアップして商用を目指したのが v2 です。製品だったこともあってか、その仮想イメージはなかなか入手できませんが、Mario Wolczko さんという方がかつて Smalltalk-80 v2 の仮想マシンの実装を手がけたときに使用した仮想イメージが現在入手可能です。ちなみに「ブルーブック」というのは Addison-Wesley 刊の「[Smalltalk-80: The Language and Its Implementation](https://www.amazon.co.jp/dp/0201113716)」を指します。（同書の 26章～30章には処理系の仕様とも言える実装のしかたが [Smalltalk 自身で記述されたコードで解説されていました](http://www.mirandabanda.org/bluebook/)）

- [The Blue Book VM](http://www.wolczko.com/st80/)
- [http://www.wolczko.com/st80/image.tar.gz](http://www.wolczko.com/st80/image.tar.gz)（直リン）

image.tar.gz を解凍して得られるファイルのうち、VirtualImage というファイルが今回使う仮想イメージです。これを「snapshot.im」とリネームしておいてください。

##Smalltalk Zoo の Smalltalk-80 へ仮想イメージをインポート

Smalltalk Zoo の Simulations 欄にある「Smalltalk-80」のリンクをクリックすると、[Lively Web](https://lively-web.org/)（Squeak の Morphic GUI フレームワークを JavaScript に移植した動的な Webアプリフレームワーク） 内で動いている、[SqueakJS](https://squeak.js.org/)（JavaScript で記述された Squeak 仮想マシン） で動いている、Squeak3.6 で動いている、Squeak に移植された Hobbes（Smalltalk-80 エミュレーター）に（!!）、前述の Apple Smalltalk-80 および Xerox Smalltalk-80 v2.0 の仮想イメージを読み込ませて動かすことができます。

各ファイルのインポートは、Squeak の画面の下にある Import: 脇のボタンを使います。

![ScreenClip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49275/b62ed643-31b9-f0c0-47e8-e79de61bf46f.png)


「Smalltalk.image」と「snapshot.im」それぞれを選択して「開く」等の操作でインポートすることができたら（ちなみに、これらのファイルは今動いている Squeak3.6 の仮想イメージ「EarlySt80.image」等と一緒に Web ブラウザのローカルストレージに保存されます）、「Launch Apple St-80」および「Launch Xerox St-80 v2.0」ボタンを押して環境を立ち上げることが可能になっているはずです。

![ScreenClip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49275/2868422d-83e7-ef66-3292-7bf924a42ca8.png)

![ScreenClip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49275/41583c85-24a4-47c6-e57c-9b5f56a422fb.png)

ただ残念ながら、システムブラウザなどで閲覧するソースコードは、バイトコードプログラムの逆コンパイルで生成されたもので、仮引数や一時変数が t1、t2 … などに化けてしまっており、MVC などの学習には向かないかもしれません。あくまで、古典的な Smalltalk-80 実装がどんな風に動いていたのかを体験したり、昔を懐かしむのに使う程度に止めておくのがよいと思います。

なお、Apple Smalltak-80 は第二ボタンクリックメニュー（今の PC でいうところのコンテクストメニューに相当）はスクロールバーの右端（ペイン＝枠 との境界寄りの領域）、第三ボタンクリックメニュー（ウインドウを操作するのに使用するポップアップメニュー）はタイトルバーのクリックで呼び出せます。

同様に Xerox Smalltalk-80 v2.0 のエミュレーターでは、スクロールホイールクリック（あれば）か、画面左上の「⇄」(双方向矢印ボタン)をクリックして 赤-青-黄 に左隣のタイルを入れ替えてから右クリックすることで第二ボタンクリックをエミュレートできます。また、shift キーを押しながら第二ボタンクリックすることでさらに第三ボタンをエミュレートできます。