コンピュータサイエンスにおいて、「コード・アズ・データ」という表現は、プログラミング言語で書かれたソースコードを、文字のシーケンスや抽象構文木(AST)などのデータとして操作でき、特定のコンパイラやインタプリタのコンテキストでのみ実行意味を持つという考え方を指します。[ 1 ]この概念は、S式を主要な構文として用いるLispのような言語のコンテキストでよく使われます。ネストされたシンボルのリストを使ってプログラムを記述すると、ASTとしてのプログラムの解釈が非常に分かりやすくなるためです(これはホモイコニシティと呼ばれる特性です)。[ 2 ] [ 3 ]
これらのアイデアは一般的に、メタプログラミングと呼ばれるもの、つまり他のプログラムをデータとして扱うプログラムを作成する文脈で使用されます。[ 4 ] [ 5 ]例えば、コード・アズ・データでは、第一級関数を移植可能な方法でシリアル化できます。 [ 6 ]別のユースケースとしては、プログラムを文字列に格納し、それをコンパイラで処理して実行可能ファイルを生成する方法があります。[ 4 ]多くの場合、プログラムの構造を言語内のオブジェクトとして公開するリフレクションAPIがあり、不正なプログラムを作成する可能性を減らします。[ 7 ]
計算理論において、クリーネの第2再帰定理は、プログラムが自身のソースコードにアクセスできることを証明することで、コードがデータであるという概念の一形態を提供する。[ 8 ]
コード・アズ・データもフォン・ノイマン・アーキテクチャの原理の一つであり、格納されたプログラムとデータはどちらも同じメモリデバイス内のビットとして表現される。[ 4 ]このアーキテクチャは自己書き換えコードを書く機能を提供する。また、悪意のあるプログラムをユーザーデータに偽装し、エクスプロイトを使用して悪意のあるプログラムに実行を誘導するというセキュリティリスクも生じる。 [ 9 ]
宣言型プログラミングでは、データ・アズ・コード(DaC)の原則は、任意のデータ構造を特殊な言語のセマンティクスまたはAPIを使用して公開できるという考え方を指します。たとえば、整数のリストや文字列はデータですが、LispやPerlなどの言語では、コードとして直接入力および評価できます。[ 1 ]設定スクリプト、ドメイン固有言語、マークアップ言語は、プログラムの実行が明確なコマンドのシーケンスではないデータ要素によって制御されるケースです。[ 10 ] [ 11 ]
動的コードは、動的にコンパイルされるまではデータです。同様に、Lisp のリストや Perl の文字列もデータですが、コードとして評価できます。
式、または記号式は、Scheme を含む Lisp ライクな言語の背後にある構文です。基本的に、S 式はネストされた記号のリストです。S 式は、コードがデータであるという概念をサポートする言語で使用されます。
Lisp と Scheme コミュニティは例外で、コードはデータであるという考え方を強く支持し、言語の大部分をより小さなコア言語で実装する傾向があります。