マルチコア対応 Forth 系言語 Paraphrase の紹介

# はじめに： Paraphrase での並列処理
　Paraphrase では、括弧もしくは二重括弧で囲むだけで並列処理が記述できます。ある並列処理から別の並列処理へと情報を渡すパイプ（チャネル）も用意されているので、scatter-gather モデルによる並列計算も可能です。

<dl>
  <dt>単一の別スレッドで実行：</dt>
  <dd>単一の大括弧 [ と ] で囲んで、<b>[ doSomething ]</b> と書けば、
      別スレッドで doSomething が実行されます。</dd>
  <br>
  <dt>複数のスレッドで実行：</dt>
  <dd>二重大括弧 [[ と ]] で囲んで、<b>[[ doSomething ]]</b> と書けば、
      複数のスレッドで doSomething が実行されます。
      デフォルトでは CPU の数分のスレッドが走り出すので、
      4 コア 8 (CPU)スレッドの環境であれば、8 個の並列処理が開始されます。
      AMD の 2990wx は 32 コア 64 (CPU) スレッドとのことですので、
      64 個の並列処理が走ることでしょう（未確認）。
  </dd>
  <br>
  <dt>普通にメインスレッドで実行：</dt>
  <dd>括弧で囲まずにそのまま <b>doSomething</b> と書けば、
      インタプリタのメインスレッドにて doSomething が実行されます。</dd>
</dl>

# 目次
1. 特徴
2. プログラム例
3. ダウンロード
4. インストール
5. 起動方法
6. 終了方法
7. チュートリアル等

# 1. 特徴
1. 整数値だけではなく、浮動小数点値や多倍長整数、リストなども使用可能
2. マルチプラットフォーム対応 - Mac, Linux(Ubuntu),Windows10 で動作を確認
3. 作者が日本人 - 日本語で OK

# 2. プログラム例
```
// 1〜1,000 万までに存在する素数の個数を調べる。

"prime?" :
    switch
        dup 1 ==    -> drop false break
        dup 2 ==    -> drop true  break
        dup 2 % 0?  -> drop false break
        // otherwise
        true swap dup sqrt ceil >int 3 swap
        for+ dup i % 0? if swap drop false swap leave then 2 step next drop
    dispatch
;

reset-pipes
// 奇数については並列処理で調べる
[ 3 10000000 for+ i >pipe 2 step next ]

[[  // 複数スレッドで検証作業（=woker thrread)
    while-pipe
        dup prime? if >pipe else drop then
    repeat
]]

() 2 dup prime? if append then // 2 については、ここで調査
while-pipe append repeat { < } sort
( "numOfPrime=%d (%d ... %d)\n" ${ size } ${ car } ${ last } ) printf
drop
```

上のプログラムを実行すると、

```
numOfPrime=664579 (2 ... 9999991)
 ok.
```

と表示されます。素数の個数と、7 桁の最大の素数 9999991 も正しく表示されています。

　マルチコアスケールアウトの状況ですが、上記のプログラムを 4 コア 8 スレッドの Core i7-7700K (4.2 GHz) で実行したところ、以下のような結果となりました。

注：Windows では time コマンドがないので、-t オプションにて計測できるようにしてあります。

```
C:\...\Paraphrase\samples>test_countPrimeMT -t
numOfPrimes=664579 (2 ... 9999991)
real: 8.4077[s]
user: 63.4063[s]
sys : 0.0938[s]
```

user/real の値は約 7.5 となり、ほぼ全コア（全 CPU スレッド）がフル稼働になっていることが分かります。

# 3. ダウンロード
　各プラットホーム用ビルド済みライブラリは [GitHub (https://github.com/iigura/Paraphrase/releases)](https://github.com/iigura/Paraphrase/releases) より入手して下さい。

# 4. インストール
　ビルド済みパッケージを使用する場合、インストール作業は不要です。適当な場所に展開して下さい。boost や readline を使用しているので、場合によってはこれらが必要になるかもしれません。必要に応じて、boost や readline をインストールして下さい。

　ソースコードからビルドする場合は、git clone https://github.com/iigura/Paraphrase.git して、Paraphrase ディレクトリの直下にある [BUILD.txt](https://github.com/iigura/Paraphrase/blob/master/BUILD.txt) を参考にビルドして下さい。

# 5. 起動方法
　Paraphrase ディレクトリ直下にある para （Windows の場合は para.exe）を実行して下さい。

# 6. 終了方法
　Windows では Ctrl-Z を入力（リターンキーも押して下さい）するか Ctrl-C で終了します。Mac および Linux 版では Ctrl-D もしくは Ctrl-C にて終了します（readline のヒストリに記録されるので、Ctrl-D の使用がオススメです）。

# 7. チュートリアル等
　現在、処理系の開発が終わったばかりであり、解説文書や入門ドキュメント等まで手が回っていません。現在のところはワードリファレンス（単語辞典: docs/words/index.html）しかありませんが、各ワードにおける使用例を載せていますので参考にしてみて下さい。

　Paraphrase に関する解説文書や入門書などは今後作成していく予定です。不明な点などがありましたら、この文書に対するコメント（およびメンション）等を使って知らせていただければ助かります。ニーズの高そうなものから順次書いていきたいと思います。

　その他、Twitter ( @[paraphrase_lang](
https://twitter.com/paraphrase_lang) ) や Facebook ( [Paraphrase ユーザー会](
https://www.facebook.com/groups/219684655627070/) ) にて発信中です。バグレポートや要望・質問などは Facebook の方に書いて頂ければ助かります。