コンピュータプログラミングにおいて、データ駆動型プログラミングとは、プログラムステートメントが、実行すべき一連の手順を定義するのではなく、照合するデータと必要な処理を記述するプログラミングパラダイムである。 [ 1 ]データ駆動型言語の標準的な例としては、テキスト処理言語のsedとAWK [ 1 ]、および文書変換言語XSLTがあり、データは入力ストリーム内の行のシーケンスであるため、これらは行指向言語とも呼ばれ、パターンマッチングは主に正規表現または行番号によって行われる。
データ駆動型プログラミングは、パターンマッチングとそれに基づく処理という構造を持ち、通常はメインループによって実装されるという点で、イベント駆動型プログラミングと類似していますが、一般的には異なるドメインに適用されます。条件/アクションモデルは、アスペクト指向プログラミングにも類似しており、ジョインポイント(条件)に到達すると、ポイントカット(アクション)が実行されます。同様のパラダイムは、 DTraceなどの一部のトレーシングフレームワークでも使用されており、プローブ(計測ポイント)とそれに関連付けられたアクションをリストアップし、条件が満たされたときに実行します。
抽象データ型の設計手法をオブジェクト指向プログラミングに適用すると、データ駆動型設計になります。[ 2 ]このタイプの設計は、ソフトウェアの構想段階でクラスを定義するためにオブジェクト指向プログラミングで使用されることがあります。
データ駆動型プログラミングは、通常、構造化データのストリームに適用され、フィルタリング、変換、集計(統計計算など)、または他のプログラムの呼び出しに使用されます。典型的なストリームには、ログファイル、区切り文字で区切られた値、電子メールメッセージなどがあり、特に電子メールのフィルタリングに使用されます。たとえば、AWKプログラムは、ログステートメントのストリームを入力として受け取り、たとえば、すべてのステートメントをコンソールに送信し、WARNINGで始まるステートメントを「WARNING」ファイルに書き込み、いずれかの行が「ERROR」で始まる場合はシステム管理者に電子メールを送信できます。また、1日にログに記録された警告の数を記録することもできます。あるいは、区切り文字で区切られた値のストリームを処理し、各行または集計された行(合計や最大値など)を処理することもできます。電子メールでは、procmailのような言語を使用して、特定の電子メールに一致する条件と、実行するアクション(配信、バウンス、破棄、転送など)を指定できます。
データ駆動型言語の中には、AWKやsedのようにチューリング完全なものもあれば、フィルタリングなどの機能を意図的に非常に制限しているものもあります。後者の極端な例はpcapで、フィルタリングのみで構成され、「キャプチャ」というアクションしかありません。それほど極端ではないsieveにはフィルタとアクションがありますが、基本標準では変数やループはなく、ステートレスなフィルタリングステートメントのみが許可されています。つまり、各入力要素は独立して処理されます。変数によって状態が保持され、集約(入力の合計)やスロットリング(送信者ごとに1時間あたり最大5通のメールを許可したり、ログメッセージの繰り返しを制限したり)など、複数の入力要素に依存する操作が可能になります。
データ駆動型言語には、多くの場合、デフォルトの動作が設定されています。条件に一致するものがなかった場合、行指向型言語では行を出力したり(sed のように)、メッセージを出力したりします(sieve のように)。フィルタリングなどのアプリケーションでは、マッチングは排他的に行われる場合(つまり、最初に一致したステートメントのみ)もあれば、すべてのマッチングステートメントが適用される場合もあります。いずれの場合も、パターンに一致しないことは「デフォルトの動作」となる場合もあれば、エラーとみなされ、最後に包括的なステートメントで捕捉される場合もあります。
実装によって利点と問題点は異なる可能性があるものの、このパラダイムにはいくつかの大きな潜在的な利点と問題点がある。機能を実現するには、操作対象の変数の抽象データ型を知っているだけでよい。関数とインターフェースは、例えばオブジェクトの「位置」など、同じデータフィールドを持つすべてのオブジェクトで使用できる。データは、ほとんど、あるいは全く問題なく、好みに応じてオブジェクトまたは「エンティティ」にグループ化できる。
データ駆動型設計はデータと機能の結合を防ぐという利点がある一方で、特に抽象的なデータを扱う場合、データ駆動型プログラミングはオブジェクト指向設計に悪影響を及ぼす可能性があると指摘されている。これは、純粋にデータ駆動型のオブジェクトやエンティティは、その表現方法によって定義されるためである。オブジェクトの構造を変更しようとすると、それに依存する機能が即座に動作しなくなる。
例えば、運転ルートを、ドライバーが右折または左折しなければならない交差点(交差する2本の道路)の連続として表現するとします。米国における交差点を、郵便番号(5桁の数字)と2つの道路名(文字列)でデータ表現した場合、道路が複数回交差する都市に遭遇するとバグが発生する可能性があります。この例は単純化しすぎているかもしれませんが、バグの排除、効率の向上、新機能のサポートなどを目的として、データの再構築はソフトウェアエンジニアリングにおいて非常に一般的な課題です。
[AWKは]データ駆動型言語と呼ばれることが多い。プログラムステートメントは、プログラムの手順のシーケンスではなく、照合および処理する入力データを記述する。