読者です 読者をやめる 読者になる 読者になる

観察日記 2010-12-08

%ruby

Javaがわるい

@shyouheiさんがリツイートしてるArrayだけど
Javaで可変長引数がない時代にそれっぽいことをやる定番パターンという気がするな
Groovy?
Groovyで見かけたコードってやつですね
わるいのはGroovyじゃないんです。ぜんぶJavaがわるいんです
わははは
dRubyみたいなことをJavaでやるシステムで
汎用の任意個引数のcallを実現するために
Object call()
Object call(Object obj0)
Object call(Object obj0, Object obj1)
以下Javaの引数の限界まで続く
...
最新版だと多分可変長引数を使うようにリファクタリングされてるんだな
なんせ見かけたのはJava2以前の時代だったし

Rubyの場合

そこで、vm_insnhelper.cの311行目からを見てみましょう。
15個までとは根性が足りない
Cの限界までがんばるべきだ(キリッ
DLがでかい原因じゃないか
処理系限界はどこだったかな
127個ですた
Ruby言語規格のどっかにこの制限書いてあるのかなあ。
11.3には見つけられなかった
MRIにおいてC実装のメソッドを呼び出す場合にのみ発生する制限なので規格上表面化しないのか。
でも、規格厳密合致プログラムを規定する上では必要じゃないかなそれ
どのへんで?
rubyの範囲内では限界がないからいいのか
と、いうことだと思います。
9M個とかでも規格厳密合致なの
無限個の引数をうけつけないと規格厳密合致じゃない(キリッ
Rubyこわい
いやー、処理系限界はやっぱどっかに書くべきだねこれ。
あとリテラルの長さとかさ
スクリプト自体の行数とか。
whenの数とか
なんか色々面倒だな
Cの場合は
* ブロックの入れ子のレベル
* includeの入れ子のレベル
* 型宣言の宣言子の個数
* 宣言子中の括弧の入れ子のレベル
* 普通の式の括弧のレベル
...
などと続きます。1ページ以内に収まってるよ。
思ったより少ない
行数は無制限一本勝負だな。
意外だぜ
でかいプログラムだと落ちるのは甘え
とりあえずMRIの限界を探すか。
この規格は,次の事項を規定しない。
規格適合処理系が受け入れるプログラムテキストの大きさ又は複雑さの限界(キリッ)。
16bit個くらいの引数は余裕か。くそ
では4G個
と思ったがそのスクリプトファイルのサイズが数GBになることに気付いて中止
pipeで食わせれば
NoMemoryErrorで落ちると思うが
18bit個も通った。
このへんで勘弁してやるか。
(おれがつらい)
冒頭に、規定しないとたからかに宣言が
あるね。
なんてこったい。
つまり
引数を0個しか受け付けないという制限を持つRuby処理系を作ったとしても
規格に反していない?
それならぼくでもつくれそうだ
まあ微妙だけど。
プログラムテキストの大きさは0バイトまでです
結局のところ、規格厳密合致プログラムと称して、どれだけ引数の数を増やしてもよくて
こういうメソッドはないとだめだよもん的な話があるから0個はだめぽいな。
あるんだよ
(という設定
こういうメソッドはあるが呼び出す方法はこの処理系にはない(キリッ
こうですね。
うむ
case文中のwhenの数は0個まで
JIS Ruby Hacksだな、もはや
規格適合処理系が受け付けなければならない引数の個数に下限の規定がないので
構文上のブロックのネストは0段まで
「規格適合処理系は、規格厳密合致プログラムを受け付けなければならない」とは書いてあるけど
金物の限界まで受け付けるように作れ、と暗に言っていると読め、ということかこれは
悩ましい。
プログラムテキストの大きさや複雑さが理由で受け入れられないならOKと解すのが妥当(キリッ
まあ、そうだよなあ。
例えばペタバイト長の正規表現リテラルを解釈できないといけないと規格適合じゃないとか言われたら全員死ぬ
0 個、1 個、それ以上は複雑過ぎる
世界最軽量のJIS Ruby互換処理系ってネタが流行るな