コンピュータサイエンスにおいて、コード・アズ・データという表現は、プログラミング言語で書かれたソースコードは文字列や抽象構文木(AST) などのデータとして操作でき、特定のコンパイラやインタープリタのコンテキストでのみ実行セマンティクスを持つという考え方を指す。[ 1 ]この概念は、S式を主な構文として使用するLisp系言語のコンテキストでよく使用される。これは、ネストされたシンボルのリストを使用してプログラムを記述すると、プログラムを AST として解釈することが非常に透明になるからである (同図像性と呼ばれる特性)。[2] [3]
これらのアイデアは、一般的にメタプログラミングと呼ばれる文脈で使用され、他のプログラムをデータとして扱うプログラムを作成します。[4] [5]たとえば、code-as-dataを使用すると、ファーストクラス関数を移植可能な方法でシリアル化できます。 [6]別の使用例としては、プログラムを文字列に格納し、コンパイラで処理して実行可能ファイルを生成することが挙げられます。[4]多くの場合、プログラムの構造を言語内のオブジェクトとして公開するリフレクションAPIがあり、不正なプログラムが作成される可能性が減ります。[7]
計算理論において、クリーネの第二再帰定理は、プログラムが自身のソースコードにアクセスできることを証明することで、コードはデータであるという形式を提供します。[8]
コード・アズ・データもフォン・ノイマン・アーキテクチャの原理の1つで、保存されたプログラムとデータは両方とも同じメモリデバイス内のビットとして表現される。[4]このアーキテクチャは自己書き換えコードを書く機能を提供する。[要出典]また、悪意のあるプログラムをユーザーデータとして偽装し、エクスプロイトを使用して悪意のあるプログラムを直接実行するというセキュリティリスクも生じる。 [9]
コードとしてのデータ
宣言型プログラミングにおけるデータ・アズ・コード(DaC)原則とは、特殊な言語セマンティクスやAPIを使用して任意のデータ構造を公開できるという考え方を指します。たとえば、整数のリストや文字列はデータですが、LispやPerlなどの言語では、コードとして直接入力して評価することができます。[1] 構成スクリプト、ドメイン固有言語、マークアップ言語は、プログラムの実行がコマンドのシーケンスとして明確に示されていないデータ要素によって制御されるケースです。[10] [11]
参考文献
- ^ ab Poletto, Massimiliano A. (1999年9月). 動的コード生成のための言語とコンパイラのサポート(PDF) (PhD). MIT. p. 20.
動的にコンパイルされるまで、動的コードはデータです。同様に、LispのリストやPerlの文字列はデータですが、コードとして評価することができます。
- ^ Plusch, Mike (2004 年 2 月). 「ConciseXML は XML と S-Expressions の重要な特性に基づいています」. XML Journal . 5 (2). Gale Academic OneFile: 20+ . 2023 年1 月 14 日閲覧.
S-Expressions、またはシンボリック式は、Scheme を含む Lisp のような言語の背後にある構文です。基本的に、S-Expressions はネストされたシンボルのリストです。S-Expressions は、コードがデータであるという概念をサポートする言語で使用されます。
- ^ Riehl, Jonathan ( 2006年 10 月 22 日)。「MetaBorg の同化:: 言語ツールの言語への埋め込み」。第 5 回国際ジェネレーティブ プログラミングおよびコンポーネント エンジニアリング会議の議事録。pp . 21– 28。doi :10.1145/1173706.1173710。ISBN 1595932372. S2CID 11111101。Lisp
および Scheme コミュニティは例外で、コードはデータであるという考え方を固く守り、言語の大部分をより小さなコア言語で実装する傾向があります。
- ^ abc クレックナー、アンドレアス;ピント、ニコラス。イ・ユンソプ。カタンザーロ、ブライアン。イワノフ、ポール。ファシ、アハメッド(2012 年 3 月)。 「PyCUDA と PyOpenCL: GPU ランタイム コード生成へのスクリプト ベースのアプローチ」。並列コンピューティング。38 (3): 157–174 . arXiv : 0911.3456。土井:10.1016/j.parco.2011.09.001。S2CID 18928397。
- ^ ウー、チャール (2010). 「メタプログラミング」。.NET 4 の Pro DLR。 pp. 185–210。土井:10.1007/978-1-4302-3067-0_8。ISBN 978-1-4302-3066-3。
- ^ Tack, Guido; Kornstaedt, Leif; Smolka, Gert (2006 年 3 月). 「Generic Pickling and Minimization」.電子計算機科学理論ノート. 148 (2): 79– 103. doi : 10.1016/j.entcs.2005.11.041 .
- ^ VanderHart, Luke; Sierra, Stuart (2010). 「マクロとメタプログラミング」. Practical Clojure . pp. 167– 178. doi :10.1007/978-1-4302-7230-4_12. ISBN 978-1-4302-7231-1。
- ^ Panangaden, Prakash. 「再帰定理に関する注記」(PDF) . COMP 330 計算理論. マギル大学. 2023年1月15日閲覧。
- ^ Bohme, Rainer; Moore, Tyler (2013 年 8 月 26 日)。「情報セキュリティの簡単な紹介」(PDF)。
- ^ ジルズ、フェビアン;シェーファー、モーリッツ。トヴィー、サミュエル。ケストナー、ヨハネス。ホルム、クリスチャン(2024)。 「ZnTrack -- コードとしてのデータ」。arXiv : 2401.10603 [cs.SE]。
- ^ 「Shuttle-hq/Synth」。GitHub。
