Grokking V8 closures for fun (and profit?) に、ほんの少しだけ触れられている話なんですが。 ごく最近まで V8 には、オブジェクトリテラルの中で関数リテラルを使った場合に非常に遅くなる(というかGCが多発する)問題があった。 たとえば、 function doit() { for (var i = 0; i < 1000; ++i) { for (var j = 0; j < 1000; ++j) { var o = { f: function () { return i + j; } }; } } } doit(); というコードを node-0.6.19 で実行すると、以下のように mark-sweep GC が大量に発生して処理に時間がかかっていることが分かる。 $ time /usr/local/node-0.6.19/bin/node -
(書いていたら当たり前な感じのことになった。) クロージャとオブジェクト こんな話がある。 クロージャ(閉包)があればオブジェクトは作れる。 クロージャとオブジェクトの機能としての豊かさは等価だ。 オブジェクトは状態を持つ。 あまり厳密な話をする気はないけれど、例えばpythonなどのクラスとクロージャの両方をサポートする言語を使うとき、どちらを使ったら良いか迷うことがあった。 普通にコードを書いている時には一定のガイドラインが頭の中にあるかもしれない。 クロージャもクラスも状態を持つ その状態を利用した機能が1つだけで十分な時にはクロージャを使う。 その状態を利用した機能が複数存在する時にはクラスにすることを考える。 具体的な話。 例えば以下のような感じ。 引数を受け取りその値を状態として保持する。次に適用する時には、保持した状態との和を返す。 そういう機能を持ったものを作りたい。機能は
前回と前々回は,関数型言語MLの一種であるObjective Caml(OCaml)で,単純な独自の命令型言語MyCのインタプリタとコンパイラを実装してみた。MyC言語では,変数はすべてグローバルで,宣言も不要だった。 しかし,グローバル変数だけでは名前の衝突などの問題があり,大きなプログラムを書くことは難しい。そのため,ほとんどの汎用プログラミング言語には,変数の有効範囲(スコープ)を制限する機能がある。例えば,すでに何度も登場しているが,OCamlでは次のような形の式を書くことができる。 このように書くと,式1の値が変数xに置かれる(xが束縛される,という言い方をする)。そのxの値は,式2の中でのみ使うことができる。つまり,xのスコープは式2だけということになる(in以降を省略することもできる。その場合はそれ以降のすべての式がスコープに含まれる)。 ただし,もし式2の中でまた同じ名前の
いつもお世話になってるあの人とかあの人とかが山口家の逆襲->perl-解説->クロージャというクロージャの解説ページをブックマークしてるのをきっかけに、Perl のクロージャについて自分もちゃんと理解できてるのかというのを考えてみましたが、どうも微妙です。 クロージャについて、何でいまいち理解しきれてない感じがあるのかというと、クロージャがどういうものであるかは知ってるけど、クロージャをどういう時に使うと良いのかが具体的にあれとこれという感じで思い付かないからなのではないかと思った。 なので、Perl でクロージャを使ってる実装とかを見て、どんなときに使われるものなのかをリストアップして理解を深めてみよう..のコーナーです。 クラスにデータを保持するためのクロージャ 僕がぱっと思いついたのは Class::DBI の中で使われている Ima::DBI におけるデータベースハンドラのキャッ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く