frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

多重継承。

OOPperlは多重継承が出来ちゃうし、

public も private も static も区別ないから

カオスが起きやすい。

かくして、昨日もカオスな伝統を受け継ぐソースを見ながら

一体多重継承って、どれくらい深く出来るのかしら?と思った。

そんな訳で今日は朝から cygwin 使って実験。

まずは、use base で指定するクラスは

何個まで指定出来るのか試してみたら、

10000個指定しても、問題なく実行されてしもた。

がっかり。やっぱりこの程度じゃエラらないよね。

ちなみに、10000個に同じ名称のメソッドを用意して実行したのだけど

new した時と、そのメソッドを呼んだ時、

どこのクラスが実行されてるのか調べたら、

use base で一番最初に指定したクラスだった。

がっかり。わりと普通な結果だなぁ。

次に、親クラス←継承クラス1←継承クラス2←継承クラス3…と継承をしまくると

どこの世代まで継承してくれるのか?という実験。

結果、100個までは問題なく実行出来るんだけど、

101個目からは、実行しつつも、エラーメッセージを吐くようになってもた。

Deep recursion on subroutine "base::import" at lib/TestClass1.pm line 3.

Recursive inheritance detected while looking for method '()' in package 'TestClass0'.

それでも継承しまくると、やがてメッセージが変わり

Deep recursion on subroutine "base::import" at lib/TestClass2.pm line 3.

Recursive inheritance detected while looking for method 'import' in package 'TestClass' at ./test3.pl line 5.

BEGIN failed--compilation aborted at .test3.pl line 5.

1000個継承したら、「perl.exe.stackdump」を吐き出した(笑)

Deep recursion on subroutine "base::import" at lib/TestClass899.pm line3.

Segmentation fauilt (code dumped)

Exception: STATUS_ACCESS_VIOLATION at eip=6102B0BB

eax=00000000 ebx=00000000 ecx=00000000 edx=0000003C esi=00203D70 edi=1035D640

ebp=00203D18 esp=00203D18 program=C:\cygwin\bin\perl.exe, pid 3360, thread main

cs=001B ds=0023 es=0023 fs=003B gs=0000 ss=0023

Stack trace:

Frame Function Args

00203D18 6102B0BB (00000000, 00000000, 00203D58, 6101E154)

00203D28 610317F4 (00000000, 00003262, 0000006C, 00000000)

00203D58 6101E154 (00203D70, 0063005C, 00670079, 00690077)

002040C8 6101DEB8 (1035D640, 00000000, 00000011, 6114CF74)

00204118 61096B83 (1035D640, 00204130, 1035D5A0, 00000063)

00204208 610882AF (10110260, 1035D5A0, 100A1EBE, 10118268)

00204308 100A2F53 (10110260, 10110260, 00204328, 100054B9)

00204318 10069529 (10110260, 10110260, 002044A8, 100052BF)

00204328 100054B9 (10110260, 00204470, 00000000, 100F3600)

002044A8 100052BF (10110260, 1035E45C, 00000006, 6108849F)

002044C8 1000A3E0 (10110260, 1035E45C, 002045C8, 10066E4C)

002045F8 1000A17D (10110260, 0000059E, 1035E42C, 1035D520)

00204658 1003BCF7 (10110260, 0000BA95, 1035D540, 00000000)

00204698 1003840D (10110260, 00000001, 0000BA95, 00000000)

00204708 1002F3B6 (10110260, 10111160, 1009C162, 0000000F)

00204738 100A176F (10110260, 00000000, 00000000, 00000000)

End of stack trace (more stack frames may be present)

あらー、メモリ容量の具合次第なのかもしれんけど、

結構少ない数でエラりましたなぁー。

ついでに、OOPとは無関係に、

ダラダラやたら長いperlスクリプトを書いたら

何行まで実行可能なのか?を調べる。

当然、長いスクリプトを手動で書く気力はないので

そのスクリプトを書くための、perlスクリプトを用意して実行すると

1000003行は実行出来た次第。

あら、結構やるなぁ。

そこで一気に 1億行のスクリプトを書き出すように仕掛けたところ、

そのスクリプト自体が何のエラーも出す事なく、突然ダウン(笑)

ディスク容量がフルになったっぽい。あーあ。

とりあえず形跡を辿ってみると、

どうやら 36188121行目を書くところで力尽きたらしい。

スクリプトを開こうとすると、さらにアナウンスが表示されて

E297: Write error in swap file

E303: Unable to open swap file for "test.pl", recovery impossible

"test.pl" 14 lines, 236 characters

Hit ENTER or type command to continue

だそうだ。

あー、もうじゃあ、36188121行でもいいから、実行させてみよう。

えいやっ。

Out of memory during request for 56 bytes, total sbrk() is 351752192 bytes!

…まぁ、案の定って感じか(苦笑)