ubuntu上でMicroSqueakをビルドする

ふと思い立って(現実逃避ともいう)ずっと放っておいたMicroSqueakに手をつけた。
MicroSqueakは、John Maloneyにより作られた、小さなSqueakのVMとイメージを作るためのパッケージである。以下のサイトで公開されている。
http://web.media.mit.edu/~jmaloney/microsqueak/
MicroSqueakでは以下のような流れで新しいVMとイメージを作成する。

  1. 古いVMで開発用のイメージ(MicroSqueakDev.image)を起動する。
  2. 起動したSqueakで、新しいイメージ(msqueak.image)を生成する。このイメージが新しいVMで使われるイメージとなる。
  3. 同様にSqueakで、新しいVMのソースファイルを生成する。
  4. 生成されたソースファイルから新しいVMをビルドする。
  5. 生成されたイメージを、ビルドしたVMで起動する。

オリジナル版はMac用のソースを吐き出すようになっているが、手元の環境ではビルドできそうになかったのでそのままの状態で放置していた。
そこで、今回はVirtual Box上のubuntu 12.04LTS(32bit版)で動くように、機種依存部を作り(過去のVMソースからパクり)、機種非依存部のコード生成の問題を解決するチェンジファイルを作成した。
20140224a.3.cs
ubuntu上で動くMicroSqueak VMをビルドする手順を以下に示す。

準備

  1. 先ほどのMicroSqueakのサイトから、MicroSqueak(all files).zipというファイルをダウンロードし、適当なフォルダに展開しておく。
  2. また、上の20140224a.3.csというチェンジファイルもダウンロードして同じフォルダに置く。
  3. MicroSqueakの開発版イメージを起動するのに最近のcog VMなどが使えないため、適当なものを用意しておく。私の場合はMacBook Air/Mavericsという環境だったので、Mac SqueakのサイトからCarbon VM(Squeak 4.2.5beta1U)をダウンロードして使った。

他の環境では試していないが、Scratch 1.4で使われているScratch VMがMac上で使えるので、Linux/Windowsなどでもそれを利用できるかもしれない。

MicroSqueakDev.imageの起動

フォルダに展開したMicroSqueakのパッケージにあるMicroSqueakDev.imageを起動する。おそらくたいていの環境では、イメージファイルをVMのアプリにドラッグ&ドロップすれば起動するだろう。うまく起動しない場合でも、古めのVMで動かすとうまくいくだろう。

チェンジファイルの導入

20140224a.3.csというチェンジファイルを使ってMicroSqueakDevの内容を書き換える。

  1. デスクトップでWorldメニューを出し、open… – file listを選んでFile listを起動する。
  2. 右上のペインから20140224a.3.csを選ぶ。
  3. 右上のペインの左側のスクロールバーの右端へマウスを動かすと、メニューの形にアイコンが変わるので、そこでクリックする。
  4. 出てきたポップアップメニューからfileInを選ぶ。

新しいイメージの生成

新しいイメージ(msqueak.image)を生成する。もともとイメージはパッケージに含まれているが、新しいもので置き換える。
World – open… – workspaceでワークスペースを開き、以下をコピー&ペーストする。

MicroSqueakImageBuilder new buildImageNamed: 'msqueak.image'.

ワークスペースの左側のスクロールバーの近くで、メニュー形にアイコンが変わる場所にマウスを移動しクリックする。出てきたメニューからdo itを選ぶ。
“msqueak.image already exists.”というメッセージが出るが、”overwrite that file”を選んで続行すると、同じフォルだにmsqueak.imageファイルが生成される。

新しいVMのソースファイル生成

続いてVMのソースファイルを生成する。ワークスペースに以下をコピー&ペーストし、do itする。

InterpreterSupportCode writeLinuxSourceFiles.
Interpreter translateNoBB: 'interpNoBB.c' doInlining: true.

これによりいくつかのファイルが作られる。

  • msq.h — 共通のヘッダーファイル
  • msqFilePrims.c — ファイル関係のプリミティブ
  • msqLinuxMain.c — Linux用のメインプログラム
  • msqMiscPrims.c — その他のプリミティブ
  • interpNoBB.c — VMのバイトコードインタプリタ本体
  • Makefile — VM生成用のMakefile

新しいVMのビルド

今まではMacなど他のシステムで実行することができるが、ここからはubuntu Linux(Intel 32bit版)で動かすか、そのようなコードを生成するような環境で作業する必要がある。
ビルドの手順はいたって簡単で、単にLinuxのターミナルからmakeを実行すれば良い。

make

ビルドが終わると、squeakという名前の実行形式ファイルが生成されている(はず)。

生成されたVMとイメージの起動

squeak実行形式は、自動的にmsqueak.imageを読み込んで動作するようになっているので、以下のようにして起動すればよい。

./squeak

しばらくたった後で終了すると、同じディレクトリに以下のような内容のlog.txtというファイルが生成されている(はず)。

Welcome to MicroSqueak!
28538812 bytecodes/sec; 2864782 sends/sec
Hello, Linux!
msqueak.image

オレオレmsqueak.imageの作成

MicroSqueakDev.imageでbrowserを起動すると、MSqueak-で始まるクラスカテゴリが見える。この部分がmsqueak.imageにそのまま移されるらしいので、この内容を書き換えれば良いだろう。
ちなみに起動時のふるまいは、MSqueak-Systemクラスカテゴリにある、MSystem class>>#startの内容を変更すれば変えることができる。

動画

VM実行までの様子はYouTubeのビデオとして公開した。

ライセンス

オリジナルのライセンスは、以下の通り。

MicroSqueak
Copyright (c) 2010 John H. Maloney
This copyright notice applies to all classes in the categories “Microsqueak” and “MSqueak-*” in the MicroSqueakDev Smalltalk image/changes files.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the “Software”), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

改変部(20140224a.3.cs)のライセンスも上記と同様の扱いとする。