IRC (あいあーるしー) 「教養チャンネル」とも「衒学チャンネル」とも呼ばれる。ほとんどのタイミングで日本史か中欧史か仏教史か英語史の話をしている。たまにRubyの話題になると逆に違和感が…
ISeq (あいせく) RubyVM::InstructionSequence のこと。長いので誰も正式名称で呼ぼうとしない。
rubyスクリプトのいくつかある表現型の中でもっとも低レベルな表現。現在、rubyスクリプトからISeqを生成する機能は公開されているが、そのようにして生成したISeqを実行する機能はセキュリティ上の懸念から(作られてはいるが)封印されている。→ AST
ID (あいでぃー) 型。rubyレベルでいうSymbolにほぼ相当するもの(ちょっとだけ違う)。objcプログラマーはこれを見てVALUEと混乱しないように。
assn (あさしん) IRCで彼らがアサシンと呼んでいるものは暗殺者のことではなくアソシエーションの略なので、びっくりしないこと。たまにジャーゴンであることを忘れてIRCの外でも使ってしまい、通じなくて恥をかく。
Qundef (あんでふ) Qは黙字。実装上はQtrue, Qfalse, Qnilと並ぶruby第4の即値定数だが、実装詳細として頑なに表舞台に出てくることを拒んでいるため、rubyスクリプトから見かけることは非常にまれであり、見かけたときにはほぼ間違いなくバグなので、バグ報告しよう。
Emacs (いーまくす) 過去のある時点においてrubyはEmacs Lispでどこまで変態な文法が処理できるかの挑戦として作られたという事実がある[1]。現在でもEmacs上では正しくシンタックスハイライトされるが他のエディターではされない、というケースはまま見受けられる(特にネストしたヒアドキュメントが鬼門)。rubyのへんな文法はたいていEmacsのせいと思ってよい。
1.8 (いってんはち) 輝かしい先駆者にして現在まで落とす影も大きい。なお現在のrubyに対する1.8に相当するポジションとして、1.8にはPerlという存在があった。
iter (いてれーたー) rubyが出たばかりのころこんな機能がある言語はかなりマイナーなものに限られていたが、今となってはC++ですらラムダリテラル構文がある。rubyのようなイテレーターというアイディアは十分に業界に浸透したといえるだろう。必ずしもrubyだけの功績ではないとは思うが、まったくrubyと無関係ってこともないはずだ。
Windows (ういんどうず) てか実のところWindows専用アプリでもないにも関わらずこれほど力を入れてWindows対応がなされているものって、なかなか見ないよ。本当に。頭が下がります。ただ、ユーザー定義したライブラリとかで対応が残念な事があって、そのため結局総体としては残念なことになってしまうって場合はまま見受けられるので、その点残念。
Encoding (えんこーでぃんぐ) 抽象概念「文字」の抽象的な「列」である「文字列」を具象としてビットパターンに落とし込むための符号化方式、にrubyが名前をつけたもの。rubyではそのような符号化を一意に定めず、文字列ごとにそれぞれ別の符号化であることを許容している。こういうのをCSIというそうだ。
なおASCIIという符号化方式との間にある種の互換性がないような符号化はrubyでは二級市民として差別されている。
configure.in (おーとこんふ) 「「「移植性を確認するプログラム(C)」を生成するプログラム(sh)」を生成するプログラム(M4)」という、少々常軌を逸した営み。あるいは穢れを一身に引き受けてプロジェクトの他の部分を清く保ってくれているとも言える。
Makefile.am (おーとめーく) rubyにはない。理由はautomakeが生成したMakefileがgmake依存だから。逆にいうと、rubyのMakefile.inは驚くべきことに、gmakeにもbmakeにもnmakeにも有効なとてもポータプルなものである。
PoLS (おどろきさいしょうげんそく) Principle of Least Surprise, 驚き最小の原則。一時期よく設計方針として言及されていたが、あまりに誰も彼もが安易に使ってしまったので現在は嫌われている。少なくとも「誰にとっての驚きか?」という部分の曖昧さが指摘されている。
objspace (おぶじぇくとすぺーす) → heap
拡張ライブラリー (かくちょう -) なんだかんだでrubyの設計者はCプログラマーだったということである。現在のrubyはCで拡張ライブラリーを書くことが容易になることを主眼として設計されている。主眼、である。Cさえ諦めればおよそありとあらゆる部分がより速く、あるいはよりシンプルに、再設計できる。しかしそうはなっていない。少々の速度よりも「Cで拡張ライブラリーを書くこと」のほうを優先しているからだ。
型 (かた) rubyでは変数には型がないが値に型がある。一方、Cでは変数に型があるが値には型がない。Javaでは変数にも型があるし値にも型がある(しかも一致するとは限らない)。このように言語によって型の性質が異なるため、一般的に言って型とは何か、というのは突き詰めると難しい問題を孕んでいる。rubyにおいては、値が型を持つ、というところまではだいたい合意が取れている。が、具体的にそれは何か? というのは議論が分かれる。メジャーな意見としては「それはクラスだ」というものと、「それはダックタイプだ」というものがある。
完全言語の探求 (かんぜんげんご - たんきゅう) 必読書。→ バベル17
企業 (きぎょう) コミッター数ではNaCl (matz shugo gotoyuzo nari takaokouji)が、コミット数ではHeroku (matz nobu ko1 ayumin)が、他より頭一つ抜き出ている。
基本ブロック (きほん -) 途中で分岐がないような一連のプログラム素片。途中で、というのは、最初と最後にあってもよいという意味であり、通常は基本ブロックといえば最初に他の基本ブロックからの条件分岐で入ってきて、一本道でいくつか処理をして、最後に条件分岐かreturnで他の基本ブロックへと抜けていくような構造である。大きなプログラムを複数の基本ブロックに分割してからそれら同士の関係を有向グラフとして処理するのがプログラミング言語処理の常套手段だ。
ところがrubyでは事情が異なる。例外があるからだ。つまり例外が起こるような任意の場所は基本ブロックの途中には出現できない。この制限は思いのほか強く、メソッド呼び出しなどほとんどの操作は例外を発生しうるので、rubyにおいては基本ブロックというのはたいてい単一の操作しか含まないようにしかできない。
クズポイント (くずぽいんと) コミッターに付くポイント。計算方法はバグ管理上、何件のバグがその人にアサインされているか。多い方がよい(その人の責任を表す)という意見と少ない方がよい(その人の几帳面さを表す)という意見がある。
Quine (くわいん) 自己複製プログラム、つまり自分自身を出力するプログラム。ある種のパズルとしてGolfなどと似た要素がある。が、rubyのQuineは短く書こうと思うとすごく短いやつでも書けてしまうのであんまり面白くない。どちらかというと字面の面白さなどを狙う方がよく見かける。
計算量 (けいさんりょう) Rubyistならずともプログラマーであればプログラムの書き方とかより先に最低限理解しておくべきもの。有り体に言えば「スケーラビリティー」をもうすこし学術的に厳密にしたような概念であり、厳密な部分をさておくとすれば(しないほうがよいが)、概論を追うのは本当に容易だ。にもかかわらず今年も多くのプログラマーが計算量を理解しないまま実践に投入されてゆく。嘆かわしい限りである。
言語 (げんご) 自然言語とか人工言語とかそういう分類を越えたところに言語の面白さはある、と思う。
コミッターに必要なもの (- ひつよう -) rubyコミッターなんて
神聖ローマ皇帝をシャルルマーニュからフランツII世まで順にそらんじることができなくてもなれるし
ヘイムスクリングラやベオウルフを読んだことがなくてもなれるし
EsperantoやfrançaisやKiswahiliやΚοινὴやLatinaやLogibanや文言文やसंस्कृतम्が読めなくてもなれるし
amd64やia64やmips64やppc64やsparc64のアセンブラーが読めなくてもなれるし
pthread_cond_timedwait(3posix)のRATIONALEを読んでなくてもなれるし
LALR(1)パーザーを手書きできなくてもなれるし
application/x-www-form-urlencodedを目で見てデコード後のエンコーディングを推定できなくてもなれるし
もう少し真面目に言うと、rubyコミッターになるには、そりゃ、持ってたほうがいいスキルはたくさんあるけど、最低限必要なのは、
Golf (ごるふ) コードゴルフとも。少ない打鍵数でプログラムを書くパズル。愛好家はゴルファーと呼ばれる。rubyにはゴルフ用ruby実装gorubyがついてくるように、ゴルフとの親和性は高めである。
3PI (さーどぱーてぃーいしゅー) 3PIと書いてあっても3×πで9.5くらいか?と思うと全然関係なくて、3rd Party's Issue == だれか他の人が怪しいよ、ということ。あるいはライブラリーのユーザーからのバグ報告に対して、「まずライブラリー作者にライブラリーが悪いかどうかを切り分けてもらってください」といったニュアンスのもとに発効される場合もある。
サピア・ウォーフの仮説 (- かせつ) 人間はものを考える時に使ってる言語にひっぱられて考え自体が変わってしまうんだよ(大意)、という仮説。仮説というくらいだから何ら証明されたものではないが、SFの世界ではもはや真説を通り越して定説に近く、この説を採用する例はオーウェル「1984」を嚆矢として、ディレイニー「バベル17」、チャン「あなたの人生の物語」、伊藤「虐殺器官」など枚挙にいとまがない。
もちろんrubyに関係する人物はもれなくこの仮説を篤く信奉している。
GC (じーしー) Garbage Collection. まあ今時あるのが普通。rubyのものは非compaction非copying非exact非generational非parallel型と分類できるGCで、この非○○という部分を回避できれば勇者。ただし現在のアルゴリズムはそれなりの経緯でこのチョイスになっているわけで、そう簡単に変えられるわけではない。
.gdbinit (じーでぃーびーいにっと) rubyのソースコードに付いてくる。使うとrubyのデバッグがしやすくなる。
GVL (じーぶいえる) GILとも。Global VM Lock。嫌われもの。だがパフォーマンスを犠牲にしつつもみんなを[BUG]から守ってくれてるんだぞ。もっと感謝すべきだ。
signal (しぐなる) どこからかやってくるなにか。ただし問題はどこから、ではない。どこにくるかと、いつくるかだ。シグナルはこの2点に関して非常に困った特徴を備えている。また、それは考えなしに設計したから困ったのではなくて、どちらかというと人類の智慧では現状が限界、といった趣き。
なおrubyにおける実装方針は参考になると思われるので解説しておく。signalには付随するhandlerとmaskという資源があり、ハンドラはプロセス固有でマスクはスレッド固有だ。そこでrubyではほぼすべてのスレッドはすべてのシグナルをマスクしており、シグナルを受け付けるスレッドを同時にたかだか一つに制限している。このスレッドのことをシグナルスレッドと呼び、専用スレッドだった時期もあればメインスレッドが兼務していた時期もある。さらにハンドラはタイミングの問題があるので、来たことを記録するだけのとても簡素なものになっている。シグナル固有の複雑な処理はあとでゆっくり行われる。これはカーネルにおける割り込みの処理(upper half/bottom half)などと似ているとも言える。
仕様 (しよう) 仕様とは何か? 近年rubyはISO化の経緯から仕様に対する理解が進んだ。
まず de jeur standard としての仕様がある。ISO30170 / JISX3017 が該当する。
次に de facto standard としての仕様があり、これは現在であれば rubyspec などがある。rubyの実際の実装もこれに含む。
そして最後に、みんなの心の中にある「こうなってたらいいなー」の総体としてのrubyのあるべき姿、とでもいうべきものがある。これを漠然と仕様と呼ぶことがある。
1と3が同じならよかったのかもしれないが、現実には異なるので、得体の知れない3ベースで会話が進むことがあり、気が抜けない。しかし3がないと2のバグが発見できないのでまったくなくすのも無理である。
真の値trueと偽の値falseがある。それ以外はそのどちらかに変換してから真偽判定する
というパターンが多いが、rubyはそのどちらでもない、少々珍しい判定方式である。
Symbol (しんぼる) 文字列のような見た目をしているが実態はどちらかというと整数である。そもそも1.6くらいまでSymbolクラスは存在しなかったし、Symbolを文字列っぽくしようという過去の試みは失敗に終わった。Symbolという概念がLispから由来していることに疑いの余地はないが、じゃあLispのSymbolは何が由来なのかというのは、rubyistたちの間ではすでに失伝してしまっており、よくわかない。人工知能だからシニフィアンとかシニフィエとかあのへんと関係あるのかなー、と漠然と思う。
人狼BBS (じんろうびーびーえす) 説得ゲーム。他の人狼系ゲームと違ってロールプレイは程々でみんなガチ勝利を目指している点が特異である。ruby界隈に経験者多し。rubyにおけるSFと並ぶ二大基礎教養と思われる。
人狼BBSは日本語専用なので当然海外ではそのものは行われないが、それでも海外rubyistにおいても人狼系ゲーム熱は熱い。RubyConfなどで夜中に集まって車座でオフライン人狼をやる集団が目撃されている。
ZSUPER (ずーぱー) ほとんどすべての局面でrubyにおける括弧は演算子優先順位などの統語論には影響するが意味論には影響を与えない。ところが唯一、superにおいては、 super() と (super) では意味が異なる。このような例は他にはない。この、後者のsuperの用法から出来上がってくる意味論のことをZSUPERと呼ぶ。
スタック (-) 普通の言語と違ってrubyは実行時コンテクストにおけるスタックが一本ではない。RHGでは七本がリストアップされており、その後実装の変遷にともない本数は上下している、というか誰も把握していない。
正規表現 (せいいひょうげん) rubyの正規表現エンジンは現在のものになるよりも前からずっとNFAとよばれる種類のものである。このクラスのエンジンは正規表現の書き方によっては指数時間計算量で走る。そのため正規表現が(人間が生きてる間には)止まらない、という現象が起こりうるが、これは正規表現の書き方が悪いのである。ちなみにrubyの場合のようなバックトラックがあるNFAエンジンはNP完全なので、計算量を本質的に下げる方策はない、と多くの専門家が信じている。あと、正規表現を実行する前にわるい正規表現かどうかチェックすればいいじゃないか、という発想は、チューリングマシーン停止問題なので、輪をかけて難しい。眼力によるデバッグしかない。
select (せれくと) システムコール。あまりに使い方が難しいためLinuxでは select(2) のマニュアル自身に加えて select_tut(2) というチュートリアルが別途用意されているほどである。なおPerlのselectはシステムコールのselectの機能の他に出力を選ぶ機能もついていて輪をかけてイミフ。
Rubyにおいてはファイルディスクリプタは「読み込めるようになるまで読み込まない」「書き込めるようになるまで書き込まない」という方針である。なんでかというと読み込めないのに読み込もうとするとブロックするからだ。そしてブロックしてほしくない。このため、読み込めるかや書き込めるかの確認のために(UNIXにおいては)selectが使われている。
即値 (そくち) いまいち定義が怪しいリテラルに比べて、即値に関してはいわゆるVALUE埋め込みオブジェクト、すなわち TrueClass FalseClass NilClass Fixnum Symbol のインスタンスということでおおむね衆目が一致している。
大クラス主義 (だい - しゅぎ) rubyのクラス階層に関してしばしばこのように形容される。たとえばデータ構造のスタックとキューと配列は、それぞれ別とすることにもそれなりの妥当性があり、実際にC++などそのように分かれているが、rubyでは全部ひとまとめにしてArrayクラスだ。
タイマースレッド (-) rubyにはGVLがある。ではそのロックはいつ開放するのか、というと、タイマーで定期的に開放させるということになる。そのためのタイマーが動いているスレッドがタイマースレッド。OSレベルのスレッドであり、rubyスクリプトからは観測することができない、はずなのだが、ときどき影響が出ることがある。たとえばちょっと前のNetBSDでforkできなかったりとか、こいつのせい。
tagged pointer (たぐどぽいんたー) ポインターと同じサイズで、かつ、そのメンバーうちの少なくとも一種類はポインター型であるような共用体のこと。中身がポインターかどうかを判定するのにタグとよばれるビットを使うことからこの名前がある。rubyの場合( → VALUE)、LSBがタグであり、これが立っているものはポインターではない。
多言語 (たげんご) 難しいものの代表。難しくした犯人はバビロニア人。
他言語 (たげんご) Rubyistは意外に他言語について詳しい。単にそういうの好きな人達だからというのもあるだろうが、やはり他山の石として他言語にあるバグrubyにもないかとか他言語の新機能がrubyにも適用できないかとか研究すべき部分が多いということと、あわよくば他言語にてrubyを実装できないかと虎視眈々と伺っているからでもある。ただし最後の意味ではJVM系の言語はすでにJRubyがあるため、あまり興味を引かないようだ。
執筆時点では特にD言語およびGHCによるruby処理系に期待が高まる。
多値 (たち) 様々なモデルが提唱されたが結局どうなったんだろう。
deoptimization (だつさいてきか) プログラムを最適化する際に、最適化しやすい便利な夢(たとえばプログラムの途中でメソッドの再定義は起きない、とか)を見ながら最適化する、と、最適化しやすい夢なんだから当然最適化が効く。で、その夢から醒めるような事態が発生した時に、やおら正気に戻って真面目に再計算しなおせば、その再計算はペナルティとしても、とりあえず夢が見つづけられている間は幸せなんじゃないの、という戦略。あるいは、概ねのプログラムは夢から醒めるような変な事はしないからだいたい幸せなんだけど、万が一そうじゃないときにも一応遅いながらもちゃんと動きますよ、とも言える。この「遅いながらもちゃんと動きます」のことを脱最適化という。
Akrの^C原則 (たなかさんのしゅみ) ユーザーがCtrlキーとCキーを同時押しした瞬間にフォアグラウンドなプロセスは可及的速やかに死ね(大意)、というルール。これを達成するため、rubyではすべての操作は^Cに関係なく可及的速やかに処理が終了するか、そうでなければ^Cで中断可能であるように設計されている。
しかしこれはかなり厳しい条件であり、たとえばrubyの場合Mutexがブロックしているのであっても^Cで中断できる。つまり、Mutexをlockしようとした際にlockの呼び出しが戻ってきても、必ずしもロックが取れているとは限らないということである。これは強烈。こんな特性のMutexは他の言語にはない。
AST (ちゅうしょうこうぶんぎ) Abstract Syntax Tree, 抽象構文木。 rubyスクリプトを意味を保ちつつ、構造体が複数連なった形式に変換したもの。構文木というくらいだから木の形をしている。1.8まではこれを直に解釈していた。現在はASTからさらにISeqへと変換する。
定数 (ていすう) rubyには定数と呼ばれるものはあるが、少々警告が出る程度で何事もなく再代入できるのであり、まったく定数としての責務を果たそうとしていない。しかも逆に普通のローカル変数のような見た目をしているのにどう頑張っても再代入できない変数、などというものもrubyには存在する。rubyはいいかげんだ、とみなすか、そんなのでもそれっぽく運用できているあたり人間の方がいいかげんだ、とみなすか。
独語 (どいつご) Eigenclassなどの用語からrubyコミッターはみんな独語が読めるかのような錯覚を受けるが、実はそうでもない。ただ独語圏内から無活用独語とでもいうしかないような謎の英文(現地ではそういうのを Denglisch と呼ぶらしいぞ)でバグレポートが来ることはたまぁーにある。
特異クラス (とくい -) rubyではあらゆるすべてのオブジェクトは通常の意味のクラスの他に、そのオブジェクトだけをインスタンスとするようなクラスを持ち得て、これを特異クラスと呼ぶ。ところでrubyではクラスもオブジェクトである。だから特異クラスもオブジェクトだ。すなわち特異クラスにもクラスがあり、また特異クラスの特異クラスがある。特異クラスの特異クラスもクラスだから、以下無限に続く。
TravisCI (とらびすしーあい) 最近、rubyでも使ってるCIツール。githubと連携してくれるので便利。
名前 (なまえ) 名前重要といいつつrubyの場合は実は実装上ローカル変数は配列で管理されているのであまりたくさん(数十万個とか)名前があると変数の検索に時間をとられてパフォーマンスが悪化する。なにごともやりすぎはよくない。
native thread (ネイティブスレッド) ふつうのスレッド。nativeとわざわざ言うからにはnon-nativeなスレッドも当然存在する。それのことをgreen threadと呼んだりする。
NODE (のーど) データ構造。ASTのメモリ上の表現である。オブジェクト (→ RVALUE) と同じサイズであり、1.9の途中のタイミングまではRVALUEと一緒に混在してた(→ heap)。なのでビットパターンにある種の互換性があり、rubyのGCは今でもNODEを理解する。しかしながらNODEは一度作ったら滅多に減らないという特徴がある(ASTなんざそう頻繁に書き換えない)。これを毎回GCがスキャンするというのはコストがだいぶ無駄である。という理由により現在はheapからは隔離されている。
parser (ぱーざー) 魔窟。ruby 1.0が出たころのruby 2.0の目標としてパーザーと評価器の刷新、があったはずだが、評価器はYARVが入ったものの、parse.yに関してはついに秘伝のタレを継ぎ足しつづけて20年だ。底のほうでどんな虫が繁殖してるか分かったもんじゃない。また、理解している人間が少ないので数人欠けるとやばい。後継者の養成は急務といわざるをえない。
[BUG] (ばぐ) ruby処理系がなんらかの理由でそれ以上正常動作しつづけることができなくなった時に、断末魔として出力する内容に含まれている特徴的な文字列。転じて、ruby処理系がそのような状況に至ること。「[BUG]った」など。
RHG (はっきんぐがいど) 「Rubyソースコード完全解説」という名前で出版されたが皆ハッキングガイドと呼ぶ。UNIXにおけるLions' Commentaryのようなものである。よい本。今となっては情報が古いのが難点。また、よいからと言って売れたわけでもないらしいというのが悲しい。現在古書としてプレミアがついている。
patch (ぱっち) モンスターから手に入れるもの。
バベル17 (- せぶんてぃーん) 必読書。 → 完全言語の探求
VALUE (ばりゅー) 型。Cレベルにおけるrubyの値の表現。だいたいポインターだが時々違う。→ tagged pointer → 即値
RVALUE (ばりゅー) データ構造。VALUEがポインターである場合は(ぶっこわれてなければ)その指すポインターの先はRVALUEだ。そしてRVALUEのホモジニアスな配列がheapだ。RVALUEは伝統的に構造体であり、ポインター5個ぶんのサイズで、先頭からポインターひとつぶんの領域が管理領域、その次がクラスへのポインター、残りがクラス固有のデータである。この仕組みは正直にいって古く、現代のプロセッサ・アーキテクチャから見ればいけてない。キャッシュラインの幅で割り切れないからだ。典型的なケースであるamd64アーキテクチャでLLP64の場合、RVALUEは40byteとなるが、1word減らして32byteとするか、3word増やして64byteとするのが現代的には妥当といえる。
heap (ひーぷ) rubyコア用語としてはheapとはrubyオブジェクトプールのことである。この用法は特殊なのでruby以外では通じない。実装上はrubyオブジェクトはheapとよばれる単位でOSから確保され、これを少しずつ切り売りしていく。なくなったらGCが走る。GCの結果heap上のすべてのオブジェクトが回収された場合、OSに返すこともある。このような管理機構はobjspaceと呼ばれ、rubyスクリプトからは定数ObjectSpaceとして見える。
bigzero (びっぐぜろ) Bignumのインスタンスで値が0のもの。というと、みんな最初は「えっ」という顔をするのだけれど、BignumとFixnumというのは実は互いに素ではない。というかBignumはFixnumの真のsupersetである。とくに0付近の、0, 1, -1 といった代表的な値は、Fixnum, Bignum, Float, BigDecimal, Complexのいずれでも表現可能といえる。
Fixnum (ふぃくすなむ) VALUE埋め込みオブジェクト。いくつかの点でその他のrubyオブジェクトとも、あるいはJavaなどのプリミティブ型などとも異なった振る舞いをする。
Fixnumの幅は必ずしもintptr_tと同じではない。同じではない例としてWin64が挙げられる。したがって変にFixnumの幅を仮定したプログラムを書くと変なことが起こる。そのようなプログラムはrubyスクリプトとしては稀だが、拡張ライブラリーとしてはありえる。
fairness (ふぇあねす) 単にfairnessと言った場合は大抵、スレッド間のコンテキストスイッチの公平さに関して言っている。これを本当に公平にしつつちゃんと物理コア数に対してリニアにスケールさせるのはマジムズい、らしい。
仏語 (ふらんすご) 仏語話者の人は独語話者の人たちに比べて結構違和感のない英文でバグ報告してくる気がするなあ。なんでだろう。
flip-flop (ふりっぷふろっぷ) rubyで一、二を争うへんな機能(もう一個は → once)。意図的にプログラムを難読化する目的か、ワンライナーで使われる。「rubyから削りたい機能」という話題で毎回必ず提案される(読めないから)が、flip-flopで実現できるものをflip-flopなしで書くのがひじょうに面倒なので、毎度却下されている。
ところでまったく同じものがPerlにもあるのだが、Perlでflip-flopが特別へんな機能という認識の人は少ない気がする。なにがこの差を生んでいるのか。
flonum (ふろなむ) VALUE埋め込みオブジェクト。最近導入された。64bitマシンにおいて整数と浮動小数点数とポインターはマシンレベルで全部幅が一緒だ。だからそれらを共用体として一緒に扱おうというのはある程度妥当な発想ではある。ただ浮動小数点数には余ってるビットとかは(常には)ないので、ある64bitのなにかが整数か浮動小数点数かの判定をどうするかが若干トリッキーではある。rubyのflonumの方式はささださんが一本論文を書いた程度には新規性のある方式。
BASERUBY (べーするびー) rubyのソースコードは一部、名状しがたいレシピファイルのようなものから機械的に生成されているが、その生成機構もrubyで書かれているので、再生成しようと思えば完動品のrubyが必要になる。このときに使うrubyのことをBASERUBYと呼ぶ。普通に生きている限りはよほどのことがないかぎり再生成は不要で、したがって普段は問題にはならない。普通ではない、再生成が頻繁に必要なタイプの人間は、普段から十指に余るrubyバイナリーに囲まれて暮らしているような人種であり、これも問題にならない。
Concurrentとparallel (へいれつとへいこう) なんかよくわからんということだけは確かだ。
母衣小 (ほろしょう) 松江市立母衣小学校。これといって何の変哲もないただの小学校だが、NaCl本社をその校区に含むという点が少々特殊である。ちなみに上は二中→東高。
本屋 (ほんや) rubyistたちが本気を出すとジュンク堂書店池袋本店の総合売上ランキングが歪むくらい売れる。あれはただの書店というより、ほとんど兵站。
matzruby (まっつるびー) 昔そういうブランチがあった。今はもう放棄されている。
micro benchmark (マイクロベンチマーク) プロパガンダ以上の意味はない。とはいえプロパガンダだからやらなくてよいというものでもない。
MVM (まるちぶいえむ) 昔あったブランチのひとつ。一つのrubyプロセスの上で複数の処理系を走らせることで、プロセスよりも細粒度だがスレッドよりは粗粒度な並行実行を実現しようとしていた。一応諦めてないことになってるが、だいぶ放棄ぎみ。
M17N (まるちりんがらいぜーしょん) 昔あったブランチのひとつ。名前のとおり多言語化を目的としていた。現在は放棄済みで、実現しようとしていた機能はもう取り込まれている。→ 多言語
malloc (まろっく) mallocに一家言持つ人は多いが残念ながらrubyではmallocが少々速くなったところでさして意味はない。GCがあるうえにGVLもあるから、mallocが一般的に想定しているマルチスレッドアプリケーションのメモリ確保戦略とはまるで違うのだ。
miniruby (みにるびー) rubyをコンパイルするためにrubyが必要なので、rubyのコンパイルでは初段としてまずはブートストラップのために最低限の機能だけをもったrubyのサブセットを作成する。これがminiruby。動的リンクモジュール機能を欠くため、あらゆる必要な機能が単一バイナリーに詰め込まれており、そのため実は最終的にできあがるrubyよりでかい。なおminirubyを作成するにもrubyが必要で、それはBASERUBYと呼ばれる。
メソッド探索 (- たんさく) rubyで一番か二番目に重い処理。他のボトルネック(ファイルIOとか)をどんどん改善していくと最後にこれが残ることが多い。
rubyのメソッド探索は動的、つまりメソッド名や引数からどのメソッド実体を呼ぶかコンパイル時には決められない。じゃあ実行時に一回決まればあとは同じかというと、そうでもなくて、呼び出すメソッド実体がどんどん変わっていくことがよくある。もちろん、変わらないことの方が全体としてはよくあるので、一回でも探索したメソッド実体はキャッシュされている。が、どんどん変わるようなやつがいるとキャッシュがどんどんパージされていってヒット率が下がり、パフォーマンスが悪化する。メソッドキャッシュのinvalidateアルゴリズムが本来残っててもいいキャッシュエントリまで消してしまっていることはよく指摘されるが、じゃあどれが本来残っててもいいのか、というのを判定するのはそう容易ではない。後から検証したら不要な操作でしたね、というのと、操作を行う前にそれが不要かどうかを判定するというのでは、難しさが全然違う。
メソッド呼出し (- よびだし) rubyで一番か二番目に重い(中略)これが残ることが多い。
rubyのメソッド呼出しは動的、(中略)変わっていくことがよくある。ということはつまり、メソッド呼び出しのインライン展開ができないということである。rubyにおいては 1+2 のような常識的に考えて 3 だろそれは、みたいな状況でも律儀にメソッドを呼び出す。このオーバーヘッドが積み重なって無視できないペナルティになるのだ。
vm_exec_core() (めいんるーぷ) rubyのメインループは一個ではない。というのも、C関数と入り乱れる事があるからだ。なんらかのrubyのコードがメソッドを呼び出したときにそれがC関数に帰着することが良くある。しかしそのC関数の中から(yieldしたりして)またrubyのコードが実行されるというのも、これまたよくある。そのときにrubyでは、Cスタックを巻き戻してメインループに戻るようなことはせずに、メインループの中から伸びたCスタックの上にさらに新しいメインループを開始する。面倒なことをしていると思うかもしれないし実際面倒だが、もとのメインループに戻るのよりはまだ簡単なのだ。このようなことが積み重なって、ある瞬間のrubyにはメインループが何個もあることになる。
YARV (やるう゛) というコードネームがあったのさ。一時期言わなかったけど最近またYARV言うようになってきたのはなぜだろうね。
yield (以ーるど) よみづらさに定評がある。
羅語 (らてんご) rubyコミッターはみんな羅語が読めるかのような錯覚を受けるが、実はそうでもない。というかせいぜい羅語のフレーズは読めても、羅語の作文ができる人はいないと思われる。
LSP (りすこふのちかんげんり) Liskov's Substitution Principle, リスコフの置換原理。サブクラスに関する設計指針として有名だが、rubyではユーザークラスにおいて必ずしもLSPを強制しない。rubyでは変数に型がないので、変数への代入によるダウンキャスト・アップキャストが行われないからだ。rubyにおいてはキャストのような操作は常にオブジェクトのコピーが生成され、bitcastやreinterpret_castとよばれるものはない。したがって、暗黙のうちにあるオブジェクトが別のクラスとみなされるということがない。そのため、LSPは、依然としてとても有効な設計指針ではあるものの、かならずしも言語側で強制する必要がなくなっている。
リテラル (-) コンパイル型言語と違ってrubyにおいてはリテラルという概念は曖昧だ。たとえば多くのコンパイル型言語では文字列はリテラルの代表的なものだが、rubyだと "string#{rand()}" のような例はいくらでも作れる。
例外 (れいがい) 1.8までは例外はbeginでコストがかかりrescueではほとんどノーコストだったが、1.9移行で逆転し、現在はbeginはほとんどノーコストだがrescueが重い。つまりrescue節に実際に入ってこなければ、beginやrescueが書いてあったとしてもさしてペナルティーにならないということである。意外に最近でも1.8のくせを引きずったスタイルを見かける。気をつけよう。
Rails (れいるず) べつにrails嫌いじゃないですよ。好きでもないけど。
Railsの人たちにとってrubyがないとrailsが成立しないけど、rubyにとってrailsなくてもべつにrubyは成立する、という非対称さから、rails側から見るとrubyの開発は冷淡に見えるのかなあ、とは思われる。しかしrubyの側から見ればべつにrailsだけを特別どうこう思っているというわけではない。
Redmine (れっどまいん) rubyのIRCでredmineと言ったらそれはプロダクトのことではなくてredmineを使って動いている bugs.ruby-lang.org (旧アドレス redmine.ruby-lang.org)のことである。
long (ろんぐ) Cの整数の一種。昔からrubyのさまざまな箇所でlongを悪用して整数じゃない意味で使ってる部分がある。1.9の期間を通じて、それらは徐々に intptr_t や st_data_t に置き換えられていった。ただ、時々まだ残ってる。そのためソースコードでlongが出現する箇所をいじる際にはある種の緊張感がある。
once (わんす) rubyで一、二を争うへんな機能(もう一個は → flip-flop)。rubyの正規表現には「一回だけ評価」というモードがあるが、この機能を実現するためだけにスレッド間でブロックすることすらあるという、どうしてこうなった感しか残らない機能である。