RSqueakを触ってみました

![rsqueak.png](https://qiita-image-store.s3.amazonaws.com/0/13174/81a5bdcc-af08-d187-db9d-29187e20d229.png) RSqueak[^RSqueakアイコン]

# はじめに
とある興味[^Movidius]から Python のライブラリを Smalltalk で利用する方法はないだろうか？と思い少し調べていたのですが、以前、Smalltalk勉強会で [Hasso-Plattner-Institute] (https://www.hpi.uni-potsdam.de/hirschfeld/index.html) の方々がドイツとオンラインでレビュー[^レビュー]していただいた RSqueak を思い出しました。
[squeak.org のサイト] (http://squeak.org/development/) からも紹介されていて、Githubでの更新もされている[^build]ので、この RSqueak を試してみました。

- [RSqueak Github リポジトリ] (https://github.com/hpi-swa/RSqueak) https://github.com/hpi-swa/RSqueak

# RSqueakとは
PyPy(Python処理系)やTopaz(Ruby処理系)などのVMの実装に用いられている [RPython] (https://ja.wikipedia.org/wiki/PyPy#RPython) を使ってVMを実装したものが RSqueak です。


# 結果
## pre-built 版を使う
本来はVMをビルドするところから始めるべきですが、今回は時間も無いので pre-built版を使ってみます。これは Linux/Mac/Windows向けに All-in-one形式になっています。

## 起動した印象
Windows10環境で実行しました。
コマンドプロンプトにASCIIアートで懐かしいSqueakアイコンが表示されSqueak5.1イメージのGUIが開きます。
![opening.png](https://qiita-image-store.s3.amazonaws.com/0/13174/c86d59a7-36d2-3143-5683-f31de004dafa.png)

![desktop.png](https://qiita-image-store.s3.amazonaws.com/0/13174/74b9f368-3778-1af3-c396-47693f7d6c7b.png)

起動と描画にはもたつくところがありますがこれには以下の3つの理由が解説されてました。
<dl>
<dt>理由1</dt>
<dd>イメージファイルをメモリレイアウトとは分離して独自のフォーマットで扱っており、起動時にこれを変換しているため時間がかかっています。
なお、この設計により32bitでも64bitでもどちらのイメージファイルであっても1つのVMで開くことが出来ます。</dd>

<dt>理由2</dt>
<dd>元のSqueakでは画面描画には BitBlt および Baloon グラフィックをCコードで実装したプラグインを使用していますが、RSqueakでは使用していません。ピュアSmalltalkのSlangのコードで動かしています。それでもJIT最適化が働けばCコードの5% - 30%の性能は出せています。</dd>

<dt>理由3</dt>
<dd>JITが巧く効くためにウォームアップが必要。しばらく操作すると軽くなります。</dd>
</dl>

なお、コマンドプロンプトにエラーメッセージが出てますが、pre-built版ではネットワークは使えませんでした。

## ベンチマーキング
VMのベンチマーク・メトリクスは以下のサイトで収集されてますので参考にしてください。

-  [Codespeed] (http://squeak.org/codespeed/) http://squeak.org/codespeed/

一部Hash関係などではCogよりもいい性能を出しています。

## Ruby(Topaz)処理系とのインタフェースについて
Pythonとのインタフェースを期待していたのですが、bre-built版にはPython処理系(PyPy)は含まれてません。代わりにTopaz(Ruby)が含まれていてRubyのコードが実行できます。
Workspace で実行します。

``` smalltalk:
Ruby primEval: 'puts ''hello world'' ' 
```

文字列を eval 渡しする以外に以下のようにProxyオブエジェクトを経由して透過的に実行することもできます。ただ制限事項(たとえば Ruby kernel Array: nil は落ちます) も多そうです。

``` smalltalk:
Ruby kernel puts: 'hello world'
Ruby kernel Array: 'abc'
```

![ruby.png](https://qiita-image-store.s3.amazonaws.com/0/13174/52011a9a-d30f-54f1-958b-6599b00bb1ca.png)

![hello_world.png](https://qiita-image-store.s3.amazonaws.com/0/13174/6286ba74-bf96-b0ec-d6f7-e95edd0b6f41.png)

# おわりに(宿題)
基本的にはVMについての調査・研究のための実装で、業務に用いるものではないのかもしれませんが、VMに関する実験試作や他言語インタフェースの実験プラットフォームとして便利ではないかと思います。

今回の宿題としては以下のものがあげられます。
<dl>
<dt>既存のプラグイン</dt>
<dd>プラグインに関するVMコードが無いことによりCogなどと比較するとVMのソースがかなり小さいのがメリットなのですが。とはいえやはり描画が遅いのはつらいので、既存のBitBltプラグインが利用できないのかどうか確認したいです</dd>

<dt>Pythonライブラリの利用方法</dt>
<dd> AllInOneではRuby処理系のTopazがサブシステムとして提供されてます。
 一方、Pythonの場合はどうしたらいいのか今回はわかりませんでした。
 以前のレビューでは Jupyter のような環境を考えてるような話もあったのですが、この確認も宿題です。</dd>

<dt>ビルドをしてみる</dt>
<dd> 上記2点に共通しますが、やはり一度VMをビルドしてみると色々と分かるのではないかと考えています(ポエム感)。</dd>
</dl>

以上

# 注
[^RSqueakアイコン]: [山海経](https://ja.wikipedia.org/wiki/%E5%B1%B1%E6%B5%B7%E7%B5%8C)の女媧ではありません。

[^Movidius]: [Movidius Neural Compute Stick] (https://developer.movidius.com/) を入手したのでした。

[^レビュー]: 確か飛び入りでのレビューだったので記録は残ってないような。

[^build]: 現時点(2017-12-24)ではビルドにfailしてるようですが