Abstract interpretation 抽象解釈と訳されているようである。抽象実行とも訳されることがある。 定義としては、プログラムを全部計算することなく、そのプログラムの意味又は特性を画定することを目的とした部分実行ということになると思う。部分実行であるので、プログラムを全部実行してしまうわけではない。 これは、通常のプログラムの実行と比べると分かりやすい。通常のプログラム実行(通常のインタプリタ等の実行のこと)は、標準解釈(standard interpretation)と呼ばれるが、これとの対比で考えると、抽象解釈とは、コンパイル時に行われ、停止性を持つ、性質の調査には近似的であり、部分的なプログラムの実行であるということができる。それに対して、標準解釈は、実行時に行われ、必ずしも停止するわけではなく、しかし、特性の画定は決定的であり、全部を行うプログラムの実行ということ
this といえば自分自身のインスタンスを参照するもの。OOP に染まったプログラマなら、そう理解しているのが普通だろう。しかし JavaScript において、this の参照先は実行されるコンテキストによって以下のように変化する。 イベント ハンドラ内では、イベントの発生源(イベント ソース)のオブジェクトを参照する。 オブジェクトのプロパティ内では、自分自身のインスタンスを参照する。 ここで重要なのは 1. の方が優先されるってこと。両方が成立する場合、つまりイベント ハンドラにインスタンス メソッドを指定した場合、当該メソッドに出現する this はイベントの発生源を指すということ。 さて注目すべきは、this がイベントの発生源を参照するのは、イベント ハンドラの内だけである点だ。イベント ハンドラから参照されるオブジェクト内では、それは適用されないのである。言い方を変えれば、イ
(2)プロトタイプ・オブジェクトの変更はリアルタイムに認識 プロトタイプ・オブジェクト配下のメンバが(インスタンスにコピーされるわけではなく)暗黙的な参照を通じて、必要都度にアクセスされるという事実には、もう1つ大きなメリットがある。それは、インスタンスを生成した「後」に、基となるプロトタイプ・オブジェクトにメンバを追加した場合にも、これを認識できるという点である。 例えば、以下のような例を見てみよう。 var Animal = function() {}; Animal.prototype.name = "サチ"; var anim = new Animal(); Animal.prototype.sex = "メス"; // インスタンスの生成後にメンバを追加 window.alert(anim.sex); // 「メス」 もっとも、この性質は、先ほどの「暗黙的な参照」を理解していれば
■関数リテラルとFunctionコンストラクタにおけるスコープの違い 前回、関数を定義する構文として「関数リテラル」と「Functionコンストラクタ」について紹介した。 関数リテラル、Functionコンストラクタは構文的な違いこそあるものの、いずれも匿名関数を定義するという意味でほぼ同様の機能を提供する。ただし、関数内で入れ子に関数リテラル/Functionコンストラクタを使用した場合には、スコープの解釈が互いに異なる点に要注意。 以下に、具体的なコード例を挙げてみよう。 var num = 0; function scope() { var num = 1; // Functionコンストラクタ var myScope1 = new Function("", "window.alert(num);"); // 関数リテラル var myScope2 = function() { wi
近ごろプログラマーかいわいで、「関数型プログラミング言語」という言葉をよく耳にするようになった。本連載では、プログラミング言語を取り巻く状況をあらためて俯瞰し、プログラミング言語開発の現場で何が起こっているのかを解説する。 はじめに 「ガーベジコレクション」、「リフレクション」、「アスペクト指向」、「クロージャ」、「イテレータ」、「型推論」など、近年、プログラミング言語の世界に新しい概念が続々となだれ込んでいるように見えます。しかし、これら「プログラミング言語の新潮流」の背景には、実はあまり知られていない歴史が隠されているのです。 プログラミング言語のメインストリーム プログラミング言語はお互いに影響を与えながら成長しています。プログラミング言語の歴史において、主要な言語がどのように影響を与えたかを、概略図に示しましょう(図1)。スペースの関係上この図では非常に簡略化しています*が、実際に
大人のためのブラックボックス読解講座――クロージャとオブジェクトの微妙な関係(その2):プログラミング言語の進化を追え(1/3 ページ) 前回に引き続き、Scheme言語の処理系、Gaucheを開発している川合史朗氏が、クロージャの機能を検証し、関数型言語とオブジェクト指向言語の関係について解説していきます。今回は、クロージャとオブジェクトのより深淵を探求します。 抽象化ツールとしてのクロージャ C++的なオブジェクトの世界では、オブジェクトの実体とは「ひとかたまりの構造体としてメモリ上に置かれたインスタンス変数の値」にすぎません。オブジェクトのポインタを取れば、それは事実上、その構造体へのポインタを持っていることになります。クロージャを「関数」中心で見ていると、その実体は「オブジェクト」の実体とは異質なもののように思えるでしょう。 確かにクロージャのナイーブな「実装」は、関数ポインタと環
Common Lispでの関数の詳細についていろいろと試してみた. 関数の基本 (setf 関数名)という関数名 大域関数と局所関数 関数のパラメータ レキシカル変数と関数とクロージャ 動的スコープ 関数の基本関数は基本的にdefunで定義する. (defun 関数名 パラメータリスト 本体) 引数に1を加えて返す関数は以下のようになる. > (defun hoge (x) (+ x 1)) HOGE > (hoge 1) 2 関数の返り値は,本体の最後の式の返り値,あるいは (return-from 関数名 値) で指定する値である.以下の関数はreturn-fromにより固定値5を返す.+式やformat式は無意味である. > (defun fuga (x) (+ x 1) (return-from fuga 5) (format t "fuga~%")) FUGA > (fuga 1
Common Lispでの関数の詳細についていろいろと試してみた. 関数の基本 (setf 関数名)という関数名 大域関数と局所関数 関数のパラメータ レキシカル変数と関数とクロージャ 動的スコープ 関数の基本関数は基本的にdefunで定義する. (defun 関数名 パラメータリスト 本体) 引数に1を加えて返す関数は以下のようになる. > (defun hoge (x) (+ x 1)) HOGE > (hoge 1) 2 関数の返り値は,本体の最後の式の返り値,あるいは (return-from 関数名 値) で指定する値である.以下の関数はreturn-fromにより固定値5を返す.+式やformat式は無意味である. > (defun fuga (x) (+ x 1) (return-from fuga 5) (format t "fuga~%")) FUGA > (fuga 1
Common Lispでの関数の詳細についていろいろと試してみた. 関数の基本 (setf 関数名)という関数名 大域関数と局所関数 関数のパラメータ レキシカル変数と関数とクロージャ 動的スコープ 関数の基本関数は基本的にdefunで定義する. (defun 関数名 パラメータリスト 本体) 引数に1を加えて返す関数は以下のようになる. > (defun hoge (x) (+ x 1)) HOGE > (hoge 1) 2 関数の返り値は,本体の最後の式の返り値,あるいは (return-from 関数名 値) で指定する値である.以下の関数はreturn-fromにより固定値5を返す.+式やformat式は無意味である. > (defun fuga (x) (+ x 1) (return-from fuga 5) (format t "fuga~%")) FUGA > (fuga 1
freehttp://d.hatena.ne.jp/smeghead/20071216/closure の続きというか今回はもうすこし真面目にあえて、コードレスで、自分の理解しているところのクロージャを説明してみるテストです。まず、誤解を恐れずに書いてしまうと、言語によってクロージャという機能が提供されている訳ではない。クロージャというのは、ある機能の副作用を用いたテクニックの名前である。クロージャと呼ばれているテクニックを使える言語は、以下の機能を提供しています。言い換えると、以下の機能の副作用によってクロージャというテクニックを使用できるようになります。 レキシカルスコープ(静的スコープ)関数がファーストクラスオブジェクト(第一級オブジェクト)であることレキシカルスコープオブジェクト(主に関数)が定義された時に、その場所から参照できる範囲を、オブジェクト(主に関数)の実行時にも参照でき
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く