そう。まさにこれを言いたかった訳です。
Kazuho@Cybozu Labs: re: javascript vs perl - オブジェクトのメモリー効率言語仕様のメモリ効率性を考えるのにあたって、(メモリの潤沢な環境向けの) 特定の実装間の比較をしても意味がないと思います。
実はこの場合でも(2)だけではなく(2)-(1)の結果を見ると、私の手元では
defval js 3348 pl 2680 [FreeBSD]
とperlの方がよいという結果が出ちゃいましたが、それはさておき、この場合でもPerlは以下の工夫を施すことによりさらにメモリー効率を上げることができます。
defval.pl2#! /usr/bin/perl use strict; use warnings; package Thingy; sub new{ bless {}, shift }; sub bool{ my $self = shift; $self->{bool} = shift if @_; $self->{bool} || 0 } sub num{ my $self = shift; $self->{num} = shift if @_; $self->{num} || 0 } sub str{ my $self = shift; $self->{str} = shift if @_; $self->{str} || '' } sub ary{ my $self = shift; $self->{ary} = shift if @_; $self->{ary} || [] } sub obj{ my $self = shift; $self->{obj} = shift if @_; $self->{obj} || {} } package main; my @thingies; for (my $i = 0; $i < 10000; $i++) { $thingies[$i] = Thingy->new(); $thingies[$i]->num($i); } 1 while 1;
pl2 1472
むしろ、Perlの方に注目すると、この例はClassical Object Modelがむしろメモリー節約に役立った例と言えるでしょう。
しかし、ここで言いたいのはBenchmarkのよしあし、ということではなく、OOの場合、メモリー効率というのはObject Modelではなく実装次第ということなのです。OOの実装がユーザーに任されているPerl 5だと、このように難しいことをしなくてもそれがよく見えます。
だから、JavascriptがPrototypal Object Modelを採用したのは、少なくともメモリー効率のためではありますまい。実際パソコン用ブラウザーというのは、普通の人が使用する上では、現在に最もメモリーを多く費消するアプリケーションで、ただ立ち上がっているだけで40MBもってきますし、使っているうちに1GBを超えちゃうこともしばしばです。extensionをたくさん入れている人はもっとでしょう。
404 Blog Not Found:javascript vs perl - オブジェクトのメモリー効率-Tetsさんのコメントところで、Danさんはjavascriptがなぜプロトタイプベースのオブジェクト指向言語になったんだと思いますか?
これに対する答は是非機会があればBrendan Eichあたりにインタビューしたいところですが、下司なりに勘ぐってみると、「納期」なのかも知れません。
当時彼が抱えていた課題は、「Javaに見た目が似ている、ブラウザーを制御するための言語を開発せよ」だったはずです。Cに対するcshみたいなものですね。しかし大事なのは「ブラウザーを制御する」の部分です。今はとにかく当時はあくまでブラウザーが主で、言語は従だったはずです。しかも当時はNetscapeは一営利企業。納期のプレッシャーは今のオープンソースベースの開発の比ではなかったはずです。
こんなとき、あなたならどうするでしょう?
新言語にきれいにフィットするようにブラウザーのソースまでrefactorするでしょうか?
それよりむしろ、そこにあったブラウザーのソースの改変を最小限に留めるような言語仕様にするはずです。
それの傍証としては、document objectの迷走があります。DOM以前と以後ではまるで違うのですから。
一番のキーであるオブジェクト、document(の内部実装)がClassicalなOOにフィットしていたとはとても言えない。かといって、windowだけならとにかくdocumentまでいじくりたいのでOOは絶対採用したい。そこで出た解決策が、Prototypalな実装だったのではないでしょうか。
Dan the Javascripting Perl Monger
ではなぜ C++ が、オブジェクト指向の開発で使われるのでしょう? C よりも C++ のほうが OO するのに向いているからですよね。
同様の理由で、Prototype-based OO のほうが Class-based OO よりもメモリに優しいモデルである、と言えると私は考えています。
問題は、メモリの節約が言語設計者の意図であったとしても、言語使用者はそんなこと気にしていない、という点にあるのかもしれません。