用語集

GC

GC とはガベージコレクション(Garbage Collection)、「ごみ集め」の意味。 コンピュータでごみ集めと言えば「使わなくなったメモリを自動的に解放すること」 を言う。C で言えば、mallocしたメモリのうち 使わなくなったものを free してまわることが相当する。

どこかで「使えるメモリがこまぎれになっているのを整理するのが GC」 と書いてあったのだがそれは二次的な目的だ。実際、メモリの回収はしても つめなおし (compaction) はしない GC も多い。Ruby の GC もつめなおしは やらない。

lisp

リスプ。LISt Processing language の略。 (こういうふうに(かっこが(たくさん(出てくる(通好みの(言語))))))。 出身は人工知能研究だが、最近は某有名エディタとかウィンドウマネージャ、 あげくのはてにはシェルにまで棲息している。

malloc

C 言語で、スタックと関係なく使えるメモリを得るために使う関数。 メモリブロック先頭へのポインタを返す。使わなくなったときには free で明示的に解放しないといけない。ちなみに (UNIX では) malloc はライブラリ関数で、システムコールではない。新しいメモリを 得るためのシステムコールには brksbrk がある。

scheme

すきーむ (n) 計画。陰謀。であるがソフトウェア業界では scheme と 言えば lisp の一種のこと。lisp には変種が いっぱいあるが、common lisp と並んで有名なのが scheme。scheme は 言語の一般名で、実装には GNU の guile などがある。

segv

Segmentation Fault のこと。具体的にはシグナル SIGSEGV を送りつけられる ことである。たいていの segv は malloc で得た メモリを解放したあとにさわろうとして起きる。このようなバグは、特に オブジェクト指向プログラムでは、非常にみつけにくい。

ちなみに Ruby を使ってプログラムしていれば Ruby のバグ以外では segv ら ない。逆に、segv ったときは Ruby か拡張モジュールにバグがあるということ。

setjmp

longjmp と組で使う C の関数。Ruby の catch throw はそれぞれ setjmp longjmp をラップしたものなので動作はなんとなくわかると思う。

yacc

C 言語用のパーサを作ってくれるツール(パーサジェネレータ)。 名前の由来は歴史的な理由。yacc の使っているアルゴリズムは LALR (Look-ahead Left-Right) といい、現在ある構文主導アルゴリズムの 中では適用範囲が広く、しかもわりと速い。

ちなみに Ruby のためのパーサジェネレータには筆者が作った Racc とかがある(ので使ってね☆)。

オブジェクト

直訳は「物」。しかしオブジェクト指向のオブジェクトは単純に物ではない。 オブジェクトってようするになんなんですかと言われるととても難しいのだが Rubyに限って言えばオブジェクトはデータである。

ちなみに、その昔にはメモリはオブジェクトと呼ばれていた。その前はコアと 呼ばれていた。segvったときに生成される「コアダンプ」の コアがそれである。

この前ちらっと見た某書ではオブジェクト指向のことを「対象指向」と訳して あったのだが…そりゃー違うだろう。

クラス

この言葉を最初に聞いたひとは普通「○年○組」のクラスを思いだすらしい。 この概念を説明するのはとても難しいのだが、プラトンのイデア (すべてのものに存在する雛型)みたいなもんである…と言って理解するひとなら 説明する必要もないかもしれない。…カンだ、カンで理解するのだ。

スキャナ

パーサと共に使うもの。 文字列を「トークン」と呼ばれる単位に切りわける(ついでに空白を捨てたりする)。 すぐにわかるだろうが、これは英語などは空白で単語が区切られているという 事情がかなり影響している。日本語を解析するスキャナはそうそう書けない。 そもそもスキャナとパーサを分けるという仕様自体、かなり英語なイメージがある。

スタック

(1) 超有名なデータ構造その 1 。Ruby の Array を push と pop だけで 使うとスタックになる。

(2) C 言語(など)で書いたプログラムが実行されるときにはメモリに 巨大なスタックを用意して、そこにローカル変数の領域とかをわりあてる。 このスタックを単にスタックと呼ぶことがある。Ruby の Array では push pop する単位はオブジェクトだけど、C のスタックに push pop する 単位はスタックフレームである。

ところで、さっき書いたとおりスタックってのは push と pop しかできない ものだけど、C 言語にあるsetjmp longjmpという関数は これを真っ向から無視して「積んであるスタックの好きなところに戻れる」 というとんでもない機能を提供している。Ruby の catch も似たようなもん。 ていうか catch は setjmp のラッパーだ。

スタックフレーム

スタックの枠。というのは冗談。 スタックの中でも関数一個分に相当する部分。

パーサ

構造を持って書かれた文字列(でなくてもいいが…)の構造を分析するモノ。 単なる単語(でなくてもいいけど)の並びを「これは節」「これは文」 というふうに順々に大きい要素にまとめてくれる。まとめることを 「還元(reduce)」といい、普通、還元するときにはまとめる単語の並びを ユーザがいろいろいじることができる。

ハッシュ

超有名なデータ構造その 2 。その 1 はスタック。 「キー(鍵)」と「データ」の一対一対応を表現するもので、 他の構造に比べて一般的でかつ高速に検索ができることが多い。基本的には、 「キー」からハッシュ値と呼ばれる整数を得てそこからインデックスを計算し、 データを格納する。しかしこれでは当然ながら偶然別々のキーに対して同じ ハッシュ値が計算されることがあるので、そのときはちょっと工夫しなければ いけない。その方法の例としては、その次のハッシュ値を使うとか、 リンクリストをつくってひとつのインデックスに たくさんデータを格納するとかがある。

ちなみに、あらゆるキーに対して完全に相異なるハッシュ値が生成される場合、 そのハッシュを完全ハッシュと言う。Ruby も使っている GNU の gperf は 一定のキーの組に対する完全ハッシュ関数を生成してくれるツールである。

まつもとゆきひろ氏

言わずと知れたRubyの作者様。こんな /:|) 顔らしい。

リンクリスト

正しい名前は linked list すなわち「りんくとりすと」のはずである。 でも日本語だからいいのだ。超有名なデータ構造その 3。その 2 は ハッシュ。…というようなデータ構造のこと (わかるかな?)。

レジスタウィンドウ

スタックスタックフレームが 積みかさなってできているのだが、このスタックフレームにはよく使う情報が 大量に入っている。たとえば引数とかローカル変数とか。これらは本来メモリに あるわけだけど、最近は CPU が速くなりすぎてメモリが CPU においつかなく なってきている。そこでよく使う情報がいっぱいつまっているスタックフレームは 特別に速いメモリに入れちゃえばいいじゃん、というのがレジスタウィンドウ。 ようするに用途を絞ったキャッシュメモリである。sparc とかにあるらしい。