こっちでまとめることにする。Twitterの発言*1はこんな感じ。利用中のオブジェクトはGCに回収されないよう保護する必要がありますが、Cのスタックはポータブルに参照できません。そこでC関数実行中に生成したオブジェクトは全部「生きている」とみなす事で保守的に保護します。08:16:45arenaの目的(2)。この保護のためにオブジェクトを記録しておく領域がarenaです。mrubyではデフォルトで100個のオブジェクトを登録できます。08:19:02save/restoreの仕事。現状arenaのサイズは固定なのでC関数実行中にあまり沢山オブジェクトを生成するとarenaが溢れます。08:27:02save/restoreの使い方。オブジェクトを生成する領域の前後をsave/restoreで囲みます。囲まれた範囲内のオブジェクトが保護されなくなりますから、どうしても必要なものはrestore後mrb_gc_protect()で改めて保護してください。08:33:61これを再度まとめてみよう。error」という「謎のエラー」に悩まされることがある。arena」という領域があふれたというエラーだ。プログラムのどこかから参照されているかどうかを判定する必要がある。これはルートと呼ばれる参照から直接・間接に参照可能かどうかで判別する。ルートには、ローカル変数・グローバル変数・定数などが含まれる。VMの中でおさまっている時にはこれは問題ない。VMの持つルートはすべてGCからアクセス可能だからだ。問題はCで記述された関数を実行中の時。C変数からしか参照されていないオブジェクトは死んでいると誤解してしまう。生きているオブジェクトを回収してしまうのは、GCとしてもっともやってはいけないバグだ。Cの変数をルートとしてチェックしている。それが整数を意味する値なのか、ポインタ値を意味する値なのか判別することはできない。この「安全側に倒す」というポリシーのことを「保守的」と呼ぶ。され、このようなCRubyの「保守的GC」にはいくつか問題がある。その最大のものは「移植性のある方法でスタック領域にアクセスする方法がない」ということだ。移植性の高さを実現しようとするmrubyのような処理系では使えないってこと。そこで、mrubyは別の方法で「保守的GC」を実現した。述べたようにCRubyは、Cスタックをスキャンしてゴミのように見えるがゴミでないものを保護している。その方法が使えないmrubyは、より保守的なポリシーを採用した。少なくともゴミでないものを回収してしまう問題は回避できるんじゃないかと。移植性が高いまま、保守的なGCを実現できることになる。CRubyで時々発生する「最適化で参照が削除されてゴミでないのにGCされた」問題とも無縁になる。C関数の実行が終わるとその間に登録されたオブジェクトはポップされる。arenaの存在は別の問題を引き起こすことがある。そのサイズはデフォルトで100とかなり小さめに設定されている。現状は100にしている。arenaがあふれることになる。その対策に用いるのが、表題のmrb_gc_arena_save()とmrb_gc_arena_restore()というふたつの関数である。idx)はarenaのスタック位置を保存された位置に戻す。arena_idx);というような使い方をする。overflowを避けるわけだ。いうものの、具体例を見ないとわからないケースもあるだろう。ここでは、Array#inspectのソースを見てみよう。それらを結合して配列全体のinspect表現を作ることにある。処理途中に生成した各要素の文字列はもはや不要になる。arenaにこれらのオブジェクトを登録しておく必要もない、ということだ。生成中の配列inspect表現文字列に結合mrb_gc_arena_restore()でインデックスを復旧という手順により、arena領域の消費を抑えている。mrb_gc_arena_save()の呼び出しよりも前に生成していることである。しないと、必要なオブジェクトがGCで回収されてしまうことになる。そのうちの一部だけを参照し続けるというケースも考えられる。obj)を呼び出して、そのオブジェクトをarenaに再登録する必要がある。いうことを、Twitterだけで説明するのは現実的じゃないよなあ。errorになることだ。戻り値を使わないmrb_funcall()のようなものを用意すればいいんだと思うんだけど。いい名前が思いつかないんだよなあ。いうところに寄稿したのだが、有料登録しないと後半が読めなくなっていた。交渉して公開許可を頂いたので、ここで全文掲載。現代社会はもはやコンピュータがなければ成り立ちません。コンピュータは誰かが作ってソフトウェアがなければ、まったく役に立ちません。コンピュータは自発的に仕事をしてくれないどころか、誰か人間がソフトウェアという形でどのように仕事をすれば良いのか教えてやらなければ、なんの働きもできないのです。コンピュータが社会に役に立っているのは、ソフトウェアがあるからです。どんなに賢いように感じられるコンピュータでも、自らソフトウェアを開発することはできません。コンピュータは単純な計算をものすごく速く行うことができますし、それを積み重ねることで人間を越える能力を備えていますが、その一方で、なにか新しいことを創りだすなどの創造的な活動は苦手です。いうとまったくダメだと言ってもいいでしょう。当面の間は人間がソフトウェアを作って、コンピュータに仕事を教えてやるしかないのです。社会におけるコンピュータの重要性は明らかで、そのコンピュータがソフトウェアがなければ役に立たず、そのソフトウェアは人間にしか作れないとなれば、ソフトウェアを開発する人間こそが真に重要だということになります。現状、誰でもがソフトウェアを開発することができない以上、ソフトウェアを開発する人、プログラマを養成することは急務です。言うものの、どのような教育を行えば、優秀なプログラマを育成できるのかについて誰でもが合意できる方法はまだ見つかっていないようです。最近、注目されているのが若い人たち、特に小学生や中学生へのプログラミング教育です。確かに優秀なプログラマは若い頃からその才能を発揮している人が多いようです。プログラミング能力はあまり年齢に関係ないようで、天才と呼ばれる小学生プログラマがいると思えば、70歳をはるかに超えて現役で活躍する方もいらっしゃいます。そこで、若いプログラマを育てるために、小学校や中学校での情報処理の教育やプログラミング教育に力を入れようという動きもあるようです。自分自身のプログラマとしての経験から考えると、これにはなかなか困難がつきまとうように思えます。第一の課題は「誰が教えるか」という点です。学校をプログラミング教育の現場にするためには、当然のことながらプログラミングを教える教師が必要です。現在の小学校・中学校の教員でプログラミングの能力を持つ人はごく少数でしょう。教科書通りに教えることができる人は短期間で用意できるかもしれませんが、それでは子供たちにプログラミングに前向きな気持ちを伝えることは困難でしょう。中学生時代にプログラミングをはじめた私自身も含めて、若い頃からプログラミングに「はまった」人たちは、結局、コンピュータを使いこなすのが楽しいからこの道に進んだようなもので、教科書に書いてあるから、あるいは学校の授業だからという理由でプログラミングをはじめた人など見たことがありません。プログラミングを教えるというのであれば、少なくとも教える人はプログラミングの楽しさを自覚している人でなければ成果をあげられないと思いますし、そのような人をそれぞれの学校に配備するのは大変な困難ではないかと思います。第二の課題は「どのように評価するか」ということです。学校の授業であるということは、なんらかの評価をする必要があるわけですが、これがまた困難です。プログラミングの能力は、創造性をともなうという点である種芸術に似ています。いう点では美術の授業に似ているのですが、問題はプログラミングの場合、人によっては非常に短期間で上達するため、小学生であってもプロを越える作品を完成させることがたびたびあることです。人によって出来栄えが10倍、100倍あるいは1000倍も違うようなものを学校の成績としてどのように評価したらよいのか途方にくれます。第三の課題は「なにを教えるか」ですが、この点は最初のふたつの課題に比べればなきに等しいものです。学校教育はプログラマ養成にふさわしくないのであれば、いったいどうすれば未来を担うプログラマを養成することができるでしょうか。正しい答えは私自身も持っていないのですが、私の知っている優秀なプログラマのほとんどが自学自習でプログラミング能力を身につけている現実を考えると、あるいはプログラマとは、養成されるものではなく、発見されるものなのかもしれません。ある調査によれば、大学におけるプログラミング教育の受講者の内6割程度はプログラミングの基本的な部分の理解に困難を感じ、それは他の学科の成績に必ずしも相関しなかったのだそうです。すると、世の中にはプログラミングに向いた性格の人がいて、成績その他では区別することができないことを意味します。あるならば、少しでもたくさんに人にプログラミングに触れる機会を与え、そしてそれに興味を持てた人、才能の片鱗を見せた人にはより豊かな機会を与えるようなプロジェクトを総合的に設計することで、未来のプログラマを「発掘」できるのかもしれません。そのような才能あふれる人たちに適切な待遇を与えることが、このIT社会の競争力を強める最大の方策なのかもしれません。Orleans一年ぶりの更新か。「年刊Matzにっき」だな。今年もニューオーリンズで開催されたRubyConf。同じ都市で二度開催は初めて。しょっぱなが私のキーノート。スライドを見てもらおうか。yukihiro_matzこんな感じ。角谷さんオススメのspeakerdeck.comも使ってみた。キーノート(3)で、最後に「Diversity(多様性)」である。Diversifyをあげていた。多様性は重要なのである。いえ、多様性はいいことばかりでもない。Rubyにおける多様性といえば、昨今数々登場している別実装である。1.8)JRubyRubiniusIronRubyMacRubyMagLevなどなど、多くのRuby実装がある。本当にいくつあるのか見当もつかない。昔はPythonの人たちに「Ruby(とPerl)は複雑すぎて、別実装は登場しそうにない。今や別実装の数ではRubyの方がしのいでいる。Pythonの方もPyPyとか新しいものも登場してるが。このような多様性にはコストがかかる。早く言語(実装)が進歩するような気もしないでもない。モチベーションを維持することの方がはるかに重要だ。多様性は善で、コストは必要経費であるというのが私の認識である。私自ら新たな処理系を送り込もうと思う。あり、組み込みなど小規模なデバイス向けをターゲットとした処理系である。アプリケーションへの組み込みなどはあまり重視されてこなかった。Rubyのような「高級」な言語を使いたいという要求はそれなりにあるようだ。機能はほぼRuby標準規格を満たす最小限。ファイルI/Oなどは取り除く(後で追加可能)実装はLuaを意識VM構造体を提供。グローバル変数を使わない機能はコンポーネントとして提供。コンパイラを外してevalもなし、などが実現できるターゲットの要求に合わせてコンパイル時にさまざまに設定可能。longにするか、など。逆にいうと「どこでも同じように動く」は追求しない浮動小数点数はimmediate(shootout対策w)。VMは32ビットワード命令、レジスタベース。命令セットもLuaに類似。GCはレイテンシを重視。インクリメンタルアルゴリズムを採用。