eval(イーバル)はいくつかのプログラミング言語が持つ、文字列を式として評価する関数、または複数の文をプログラム中のあるコンテキストで実行するサブルーチンである。eval の類の機能はコンパイラ言語よりもインタプリタ言語でより一般的である。なぜならコンパイラ言語でこのような機能を実現するには、プログラム自体に言語処理系や(変数名などの)実行時情報を埋め込む必要があるからである。eval に近い機能を実現しているコンパイラ言語も存在する。信頼されないソースからのデータを eval するときには特に注意が必要である。例としてインターネット上からデータを得る codice_1 関数を考える。次の擬似コードのようなプログラムは潜在的に危険である。攻撃者がこのプログラムに例えば codice_2 という文字列を与えることができると、codice_3 関数が実行されてしまい、重要なファイルが消されてしまうかもしれない。これを防ぐためには、eval される文字列はすべてエスケープしたり、潜在的に危険な機能を利用できないようにして実行するなどの対策が必要となる。プログラミング言語によっては、外部から入力されたデータを「汚染されている」として印をつけるものもある。eval は非常に強力なため、経験の浅いプログラマは何でも eval を使って済ませてしまうことがある。たいてい、そのような場合には専用のより良い選択肢が存在し、コードのパースにかかる時間が節約できる。例えば、eval は簡易テンプレートエンジンとして使われることがある。PHPでの例を示す。この例は期待した動作をするが、前述のようにセキュリティ上の問題を抱えており、他の方法よりもはるかに遅い。より高速で安全な方法は単に codice_4 という文字列を codice_5 の値で置換することである。eval は表計算ソフトなどの数式を評価する必要のあるアプリケーションで使われることがある。これは数式のパーサを自作するよりも手軽だが、自作や既存の専用のパーサを利用するほうがより良い。前述の問題点に加え、言語組み込みの eval はアプリケーション用にカスタマイズできないからである。おそらく、eval の最も優れた使い道は(LISPなどでの)処理系のブートストラップや、言語の対話的な実行環境でユーザが書いたプログラムを実行することであろう。インタプリタ言語では eval は通常のコードと同じインタプリタで実装されるのがほとんどである。コンパイラ言語では eval を実装するために通常のコンパイラをプログラムに埋め込むこともある。また特別のインタプリタを使うこともあり、その場合はコードの重複が問題となる。JavaScript や ActionScript においては、eval は式の評価器と文の実行器のハイブリッドのような存在である。eval は最後に評価された式の値を返し(JavaScript と ActionScript ではすべての文は式である)、最後のセミコロンは省くことができる。式評価器としての例:文実行器としての例:JavaScript での eval の使用の一例は Ajax などにおける JSON のパースである。しかし、現在は多くのブラウザでより特化した JSON.parse が定義されている。 ActionScript では eval を任意の式を評価するために使うことはできない。Flash 8のドキュメントによれば、その使用は「変数、プロパティ、オブジェクト、ムービークリップの名前」を表す式に限られ、「パラメータは String またはオブジェクトのインスタンスへの直接の参照のどちらでもよい」。Perl の eval は、文字列をプログラムとして解釈するほか、例外処理機構としても機能する。コードの塊をテストし、必要ならそれに関して警告することができる。例えば、除算において実行時エラーが発生するとcodice_6で警告を出力することができる。PHP での eval は、ほぼ、文字列中のコードをまるで codice_7 呼び出しの代わりにファイル中に記述されているかのように実行する。例外は、エラーは codice_7 から復帰した時点で報告され、また return 文で codice_7 の戻り値を返すことができる点である。echo を使った例:値を返す例:PostScript の codice_10 演算子はオペランドを1つ取り、それが単純なリテラルならスタックにプッシュし返す。PostScript の式を含む文字列が来た場合は、その文字列をインタプリタによって実行可能な形式に変換する。例えば、は PostScript の式である codice_11(文字列 Hello World をスタックからポップして画面に表示する)を実行可能な型を持つように変換し、そして実行する。PostScript では codice_12 演算子も似た機能を持つが、代わりにインタプリタそのものがファイル中の PostScript の式を評価する。Python での codice_13 関数は単一の式を評価する。文を実行することはできないが、文を実行する関数を実行することはできる。codice_10 文は文を実行することができる。codice_13 の例(対話モード):codice_10 の例(対話モード):ColdFusion の codice_17 関数は文字列で与えられた式を実行時に評価することができる。これは読み込む変数をプログラム的に選択するときなどに、特に便利である。Ruby には式を評価するコンテキストごとに3種類の eval が存在する。codice_13 はその場または Proc や Binding オブジェクト、codice_19 はインスタンス、codice_20(別名はcodice_21)はモジュールかクラス、それぞれのコンテキストで評価を行う。なお、評価コンテキスト変更のためにcodice_19やcodice_20を使う場合、文字列でなくブロックを引数とすることができる。codice_13 の例(メソッドfooのコンテキストで評価している):codice_19 と codice_20 の例:
出典:wikipedia
LINEスタンプ制作に興味がある場合は、
下記よりスタンプファクトリーのホームページをご覧ください。