« 0DAY Firefox Remote Code Execution and Denial of Service VulnerabilityWindows Vista のUser Acount Protection(UAP)機能 »

1 comment

Comment from: Yasuo Ohgaki [Member] Email · http://www.ohgaki.net/
クラッシュするのはいかがな物か、と言うのは誰でも思うようでPythonとRubyは深すぎるコールスタックはメモリを使い切るまでに致命的エラーで終了するようです。

Perlは仮想メモリもどんどん使っていくのでLinuxではメモリ管理の仕様もあるので途中でCTRL+C。

PHPは直ぐにクラッシュ、と言った感じです。(多分、静的にVMのスタック領域を確保しているので無限再帰呼び出しでもメモリを使い切らない)

テストコードはこんな感じです。


[yohgaki@dev template-bench]$ cat test.php
<?php

function foo($bar) {
static $i = 0;
$i++;
echo $i.PHP_EOL;
foo($bar);
}

foo('AAAAAAAAAAAAAA');
?>



[yohgaki@dev template-bench]$ cat test.pl
sub foo {
my $bar = shift(@_);
foo($bar);
}

foo('AAAAAAAAAAAAAAAA');



[yohgaki@dev template-bench]$ cat test.rb
def foo(bar)
foo(bar);
end


foo('AAAAAAAAAAAAAAA');



[yohgaki@dev template-bench]$ cat test.py
def foo(bar):
foo(bar)

foo('AAAAAAAAAAAAAAAAA');

Perlの様にいけるところまで行かない分まし(?)なようですがPHPがクラッシュするのは行儀が悪い方みたいですね。これはやはり直すべき? RubyやPythonのコールスタックの制限は結構厳しいですね。Pythonは1000、Rubyは1900弱。これくらいが妥当? PHPは2万回以上の再帰呼び出しが可能です。Perlは10万回以上でも余裕で行けるかも知れません!親切にするには捨てなければならない物もあると言うことですね。

PHPも動作自体を直すのは簡単で、スタックのレベルを保持して2000を超えたら停止とすれば普通にエラーが出せます。ただメモリのアクセス違反関係の領域に達してからだと面倒だったような気がします。当たり前ですがもうメモリが無いのでやれる事は限られてしまいます、という理由だったような気がしますがコードを見ないと分かりません。

Quick Sortとか簡単に2000くらいなら超えるケースはありそうです、と言うよりQuick Sortの最悪のケースはO(n)なのでちょっと大きめの配列のソートなら直ぐに限界に達します。ライトウェイト言語のレベルでQuick Sortなど深い再帰呼び出しが必要な機能を実装すること自体が「間違っている」とも考えれますが、言語のベンチマークサイトでいくつかテストで実行不可とかなっていた分はこれらの仕様のせいかな?(いつ暇になるか分かりませんが、暇なときに見てみよう。PHPには別のレベルの凄い仕様もあるので他の言語の仕様云々を言える言語ではありませんけど。)頭は固い方ではないので「ライトウェイト言語で深い再帰呼び出しなんて使うな」というポリシーもそれなりに良い考えにも思えてきました。

C/C++のバックグラウンドを持つPHPの開発者にはPHPのこの仕様は「まいいんじゃない」と受け止められていますが、ライトウェイト言語は実行環境であるべきか、言語として自由度を最大限にすべきか?難しいですね。

これを議論しだすと先に書いたポリシーの問題になるので結論は出ないかも知れません。しかし、PHPには既にmemory_limitというある意味「凄い」仕様もある訳で「再帰呼び出しをRubyやPythonの様に制限する」のは整合性の面からは妥当な選択とも考えられます。

どうでしょう?
2006/04/25 @ 21:54

Leave a comment


Your email address will not be revealed on this site.

Your URL will be displayed.
PoorExcellent
(Line breaks become <br />)
(Name, email & website)
(Allow users to contact you through a message form (your email will not be revealed.)