<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://w.atwiki.jp/toy-lang/">
    <title>toy-lang</title>
    <link>http://w.atwiki.jp/toy-lang/</link>
    <atom:link href="https://w.atwiki.jp/toy-lang/rss10.xml" rel="self" type="application/rss+xml" />
    <atom:link rel="hub" href="https://pubsubhubbub.appspot.com" />
    <description>toy-lang</description>

    <dc:language>ja</dc:language>
    <dc:date>2012-03-02T10:30:51+09:00</dc:date>
    <utime>1330651851</utime>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://w.atwiki.jp/toy-lang/pages/22.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/toy-lang/pages/21.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/toy-lang/pages/20.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/toy-lang/pages/19.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/toy-lang/pages/18.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/toy-lang/pages/17.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/toy-lang/pages/15.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/toy-lang/pages/14.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/toy-lang/pages/13.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/toy-lang/pages/12.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="https://w.atwiki.jp/toy-lang/pages/22.html">
    <title>GCとPCLの和解</title>
    <link>https://w.atwiki.jp/toy-lang/pages/22.html</link>
    <description>
      GCとPCLの和解
2011.12.23


*はじめに

toy-lang にコルーチンを実装するにあたって、BoehmGC と PCL(Portable Coroutine Library) の間で色々不都合があったのでこれに対応を行ったのでその際の方法をメモとして公開します。

現在の開発中の版ではこれらのライブラリを組み合わせた際の問題はわかっており、すでに解決していますが、解決に至る中でわかったことやプログラミング上のテクニックについて参考になればと思いメモを公開します。

*BoehmGCの動作について

toy-langを実装するにあたっては、できる限り汎用のライブラリを使用して実装することにしています。
toy-langにおいては、GC(ガベージコレクション)はBoehmGCを、コルーチンの実装には PCL を使用しています。

2年ほど前、コルーチンを実装していてどうしてもうまく動かなくて悩んでいました。

まず、GCの動作について非常に簡単ですが説明したいと思います。(Fig.1)

#image(http://www31.atwiki.jp/toy-lang?cmd=upload&amp;act=open&amp;pageid=22&amp;file=gc_and_coroutine.fig1.jpg,)


この構成の場合、メモリが足りなくなりGCが発動すると、「Fig.2GCの行われ方」のように、

-①ヒープ領域のGC
-②スタック領域のGC

が実行され、ごみ(どこからも参照されない)と判断されたメモリ領域の回収プロセスが実行されます。
特に②のスタック領域のGCでは、スタックのトップ(現在のスタックポインタ)からボトムに向かってGCが実行されます。

#image(http://www31.atwiki.jp/toy-lang?cmd=upload&amp;act=open&amp;pageid=22&amp;file=gc_and_coroutine.fig2.jpg,)


*問題発生
 
上に書いたとおり、当初は各コルーチンのスタック領域はヒープ領域に確保していました。
そして、このようにすると、GCのタイミングでプロセスが確実に落ちます。
これでしばらくの間悩んでいました。2008年の冬から2009年    </description>
    <dc:date>2012-03-02T10:30:51+09:00</dc:date>
    <utime>1330651851</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/toy-lang/pages/21.html">
    <title>マニュアル</title>
    <link>https://w.atwiki.jp/toy-lang/pages/21.html</link>
    <description>
      ** toy-lang マニュアル

(2009.9.23) バージョン 0.1.1 に対応しました。

[[ここ&gt;http://www31.atwiki.jp/toy-lang?cmd=upload&amp;act=open&amp;pageid=21&amp;file=manual.pdf]]からダウンロードできます。

























----    </description>
    <dc:date>2009-09-23T18:28:52+09:00</dc:date>
    <utime>1253698132</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/toy-lang/pages/20.html">
    <title>SandBox</title>
    <link>https://w.atwiki.jp/toy-lang/pages/20.html</link>
    <description>
      **誰でも書き込めます。
コメントがあればどうぞ。

#comment






























----    </description>
    <dc:date>2009-02-15T20:59:19+09:00</dc:date>
    <utime>1234699159</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/toy-lang/pages/19.html">
    <title>作成の動機</title>
    <link>https://w.atwiki.jp/toy-lang/pages/19.html</link>
    <description>
      もともと昔は業務アプリのプログラマをやっていました。
10年ほど前までプログラミングをしていましたが、その後主な業務がプロジェクトの管理の方面に移って行きました。

最近、久々にプログラミングを再開してみたくなり、自分の言語を作り始めました。
プログラミングの対象がたまたま言語処理系だったということですね。
簡単な言語であれば、ごく小規模なコードで実現できますので日曜プログラマにはうってつけな趣味だと思います。

特別、言語や言語の作成について勉強を行った訳ではありませんので、設計や実装には自信はありません。
ただ、その昔 Tcl/Tk でアプリを作っていたころの影響が強く出ていると思います。
今思い起こせば、昔から自分の言語を作ってみたかったのだと思い出しました。

今から言語の斬新なアイデアを考え付くことは無いと思っていますが、純粋にプログラミングを楽しむために、自分の中の小さなアイデアを試すために、細々と作り続けてゆこうと考えています。

こんな言語ですが、宜しくお願い致します。















----    </description>
    <dc:date>2008-08-13T23:54:41+09:00</dc:date>
    <utime>1218639281</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/toy-lang/pages/18.html">
    <title>開発の記録など</title>
    <link>https://w.atwiki.jp/toy-lang/pages/18.html</link>
    <description>
      ** 2009.11.1
バージョン 0.1.2 をリリースしました。
末尾再帰を書くための goto コマンドを追加しています。
使い方は [[サンプル]] のコードを参考にしてください。
あと、String::split を作りました。今まで無かったのが手抜きなのです。

** 2009.9.23
バージョン 0.1.1 をリリースしました。

** 2009.9.5
toy-langを開発しはじめておおよそ1年。それを記念してバージョンを0.1.0としてリリースしました。[[マニュアル]]も、稚拙ながら全体をとりあえず記述しました。
全体的に最適化など施すも、効果は薄かった。高速化を考えるのであれば、VMの導入を考える必要がありますな。できないけど。

** 2009.8.30
BoehmGC alpha2 が出ていますね。そのうち検証してみなくちゃ。
昨日はLLTVに行ってきました。gaushe の川合さんのお話が面白かった。無印良品の基幹システムすべてをshで作ったという話。これも面白かった。情報システム部門の判断は英断だよな。そのほかについては、レイヤーが上の話が多くて、あまり言語実装のヒントになるようなネタは拾えませんでした。

** 2009.7.6
久しぶりですが、0.0.27をリリースします。
マニュアル(まだベータ版でかつ[[リファレンス]]がありませんが)も一緒にリリースしました。

** 2009.6.30
マニュアルがなかなか進みません。
case のシンタックスを変更しました。
Lisp の cond と似た条件分岐コマンドを作ってみました。

** 2009.6.1
6月なのに寒いですね。
プログラミングは一旦お休みして、現在マニュアルを書いています。
今までちゃんと解説をしたことがなかったので。

** 2009.5.17
遅延評価の仕組みを導入。
関数のパラメータ定義の仮引数に &#039;&amp;&#039; を付けることで、参照時にはじめてその引数(クロージャ)を一度だけ実行します。たらい回し関数が一瞬で終わります。ただし、ソートのような全ての引数を評価するような関数にはほとんど効果がありません。

** 2009.5.10
しばらく間が空いてしまいましたが、細々と続けています。    </description>
    <dc:date>2009-11-01T23:02:50+09:00</dc:date>
    <utime>1257084170</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/toy-lang/pages/17.html">
    <title>サンプル</title>
    <link>https://w.atwiki.jp/toy-lang/pages/17.html</link>
    <description>
      **サンプル

***円周率計算
    defun pi () {
        set (k a b a1 b1) (2 4 1 12 4);
    
        loop {
            set (p q k)
                ([$k * $k] [[2 * $k] + 1] [$k + 1]);
            set (a b a1 b1)
                ($a1 $b1 [[$p * $a] + [$q * $a1]] [[$p * $b] + [$q * $b1]]);
    
            set (d d1) ([$a / $b] [$a1 / $b1]);
    
            while {$d = $d1} do: {
                print file: $stdout $d;
                $stdout flush;
    
                set (a a1) ([10 * [$a % $b]] [10 * [$a1 % $b1]]);
                set (d d1) ([$a / $b] [$a1 / $b1]);
            };
        };
    };

実行例:
    $ toysh
    *** Start toy-lang interpreter version 0.3.0.
    &gt; pi
    31415926535897932384626433832795028841971693993751058209....

上記プログラムは1995年頃、rubyが公開されて間もない頃 rubyで書いたもの(現在rubyのsampleとしてソースと同時に配布されている)ですが、それを今回 toy-lang に書き換えたものです。

***Yコンビネータ（本体）
    defun Y(f) {
        [fun (g) {
            fun (m) {
                [$f [$g $g]] $m;
                </description>
    <dc:date>2012-07-16T18:34:35+09:00</dc:date>
    <utime>1342431275</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/toy-lang/pages/15.html">
    <title>やりたいこと</title>
    <link>https://w.atwiki.jp/toy-lang/pages/15.html</link>
    <description>
      ** やりたいこと

- まだまだ関数が足りない
- 正規表現の実装
- ファイルIO → とりあえず File クラスを実装 (2008.8.5)
- シグナルハンドル
- デバッガ
- Tkとの連携 (Tcl/Tk の Tk)
- そのほかたくさん









----    </description>
    <dc:date>2008-08-05T23:23:29+09:00</dc:date>
    <utime>1217946209</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/toy-lang/pages/14.html">
    <title>リファレンス</title>
    <link>https://w.atwiki.jp/toy-lang/pages/14.html</link>
    <description>
      **型
- nil
-- ソース中では nil で表現されます。
- SYMBOL
-- シンボルです。英数字と記号で表現します。
- REF
-- シンボルの先頭に &#039;$&#039; をつけたもので、シンボルの内容を現します。
- LIST
-- &#039;(&#039; と &#039;)&#039; で囲まれた任意の型表現です。
- INTEGER
-- 整数です。
- REAL
-- 浮動小数点です。
- STRING
-- &quot; と &quot; で囲まれた文字列です。
- BLOCK
-- &#039;{&#039; と &#039;}&#039; で囲まれたスクリプトです。実行時にはクロージャになります。
- EVAL
-- &#039;[&#039; と &#039;]&#039; で囲まれたスクリプトで、行が実行される際に事前に評価されます。
- OBJECT
-- オブジェクトです。new コマンドと class コマンドによって生成されます。
- EXCEPTION
-- 例外です。throw コマンドによって生成されます。
- CLOSURE
-- BLOCK が実行されるとクロージャになります。クロージャは実行時の環境(ローカル変数、オブジェクト)を保持します。
- FUNC
-- 関数です。fun コマンド、defun コマンドや、method コマンドで生成されます。
- CONTROL
-- return/break/continue/redo/retry により生成されます。
- RQUOTE
-- 正規表現を記述します。シングルクオート(&#039;) で囲んだ文字列です。

**評価の方法

-スクリプトは、複数の行から構成されます。
-各行は &#039;;&#039; (セミコロン) で終了します。
-スクリプトの各行が順次実行されます。
-各行の評価方法は次のとおりです：
--行内の各、REF(ex. $XXX)、EVAL(ex. [XXX; ...]) を評価します。
--行の先頭のシンボルを調べ、これが関数の場合は、その行の残りをパラメータとして関数を実行します。
--行の先頭がオブジェクトの場合、2番目のシンボルを調べ、オブジェクトのメソッドであれば、3番目以降を引数としてメソッドを実行します。
-すべての関数、制御構造は、上記のとおり関数として実行します。

例:

    if {$i &gt;     </description>
    <dc:date>2009-02-15T20:42:46+09:00</dc:date>
    <utime>1234698166</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/toy-lang/pages/13.html">
    <title>ビルド方法</title>
    <link>https://w.atwiki.jp/toy-lang/pages/13.html</link>
    <description>
      ** ビルド方法

1. お助けライブラリの準備
1.1 GCに Boehm GC ライブラリを使いますので、以下のURLより入手してインストールしてください。
http://www.hpl.hp.com/personal/Hans_Boehm/gc/

1.2 正規表現ライブラリに鬼車を使わせていただきました。以下のURLより(バージョン 5.9.1を)入手してインストールしてください
http://www.geocities.jp/kosako3/oniguruma/index_ja.html

1.3 バージョン0.1.3よりコルーチンのサポートを入れ始めました(未完成)。コルーチンの実現には、PCL(Portable Coroutine Library)を使用しています。
以下のURLよりダウンロードしてインストールしてください。
http://www.xmailserver.org/libpcl.html

ただし、PCLについて、Windows CYGWIN 環境ではコンパイルでエラーがでます。取り急ぎ以下の対処をしてしのいでいます。

    ソース: pcl/pcl.c
    #if defined(CO_HAS_SIGSTACK)
    ....
    #endif

上記ブロック(3箇所ほどあります)をまとめてコメントアウトしています。

1.4 多倍長整数演算にGMPを使用します。以下のURLよりダウンロードしてインストールしてください。
http://gmplib.org/

基本的に、1.1～1.4のライブラリについて、./configure; make; make install でインストールできています(PREFIX が /usr/local の場合)。

2. [[ソース公開]]からダウンロードした tar ball を展開して、

2.0 展開したディレクトリに入ります。

   cd toy

2.1 最初に、Makefile の PREFIX を調整してください。

2.2 その後、

    make

とすると実行ファイルができます。

2.3 最後に、

    make install

とすると、PREFIX にインストー    </description>
    <dc:date>2012-07-16T18:40:06+09:00</dc:date>
    <utime>1342431606</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/toy-lang/pages/12.html">
    <title>ソース公開</title>
    <link>https://w.atwiki.jp/toy-lang/pages/12.html</link>
    <description>
      ** ソースを公開しています

高々10,000ステップのソースですが。
ソースも洗練されておりません。
しかも、コメントがほとんどありません、、、
それでも、もし興味があれば、ダウンロードして見て下さい。

最新のソースは、GitHub からでも取得が出来ます。
https://github.com/mitchan0321/toy

実行形式の作成は、[[ビルド方法]]をご参照ください。

-[[20120716&gt;http://www31.atwiki.jp/toy-lang?cmd=upload&amp;act=open&amp;pageid=12&amp;file=toy-20120716.tar.gz]]
-- 多倍長整数が扱えるようになりました。
-- 多値代入が出来るよう、set コマンドの書式を拡張しました。

-[[20120610&gt;http://www31.atwiki.jp/toy-lang?cmd=upload&amp;act=open&amp;pageid=12&amp;file=toy-20120610.tar.gz]]
-- コルーチン機能の実装（コルーチンでCスタックを使用する処理を書きました）。
-- データタイプを判断するためのコマンドを追加。
--- symbol?/nil?/list?/integer?/real?/string?/rquote?/block?/closure?/func?/object?/dict?/vector?
-- パーサに &#039;:&#039; マクロを追加。以下の様に使います（→が &#039;:&#039; マクロを使用した例）:
--- [[[self] vars] len] + 1 → self : vars : len : + 1
-- スコープのデータ構造・処理を変更。これにより、Yコンビネータが正しく動くようになりました。
-- 64ビット環境での動作。Linux、FreeBSD での64ビットOSに対応しました。

-[[20110828&gt;http://www31.atwiki.jp/toy-lang?cmd=upload&amp;act=open&amp;pageid=12&amp;file=toy-20110828.tar.gz]]
--Hashクラス/Arrayクラスにかわるdict型、vector型を追加。
--辞書を取得するコマ    </description>
    <dc:date>2012-07-16T18:44:24+09:00</dc:date>
    <utime>1342431864</utime>
  </item>
  </rdf:RDF>
