データフロープログラミング

提供: miniwiki
移動先:案内検索

データフロープログラミング: dataflow programming)とは、データフローの原理とアーキテクチャを用いたプログラミングパラダイムであり、何らかの操作と操作の間でのデータの流れを有向グラフとしてプログラムを作成する。データフロープログラミング言語関数型言語に一部似ており、一般に数値処理に適した言語に関数型言語的概念を導入するという形で開発された。

データフロープログラミング言語の特徴

データフロー言語は、命令型プログラミングモデルなどの他の主要のプログラミング言語とは対照的である。命令型プログラミングではプログラムは一連の命令文で構成され、データの流れは見えない。この違いは瑣末に思われるかもしれないが、パラダイムとしての違いは非常に大きく、データフロー言語はマルチコアシステムやマルチプロセッシングシステムを自由に使える。

プログラミングにおける重要な概念として「状態」がある。状態とは基本的には、システムの各種条件(変数)の測定値のスナップショットである。多くのプログラミング言語は正しく動作させるために多数の状態情報を必要とするが、一般にプログラマからはそれら情報は隠蔽されている。実世界の例として、3方向の電灯スイッチがある。一般にスイッチを上にすれば電灯が点くが、3方向スイッチでは後ろの電灯が消えるかもしれない。結果は(おそらく視界からは見えない)他のスイッチの状態によって決まる。

実際、状態はコンピュータから見ても隠蔽されていることが多く、ある情報の断片が(一時的ですぐに捨てられる情報だとしても)状態を符号化したものかどうかはコンピュータの関知するところではない。並列処理マシンでは状態情報を複数のプロセッサ間で共有する必要があるため、これは重大な問題となる。どの状態が重要かを知らない場合、多くの言語ではコードやデータの重要性を示すために大量の特別なコードを追加する必要がある。

そのようなコードは性能も低下させ、デバッグも非常に難しくする。性能コストの大きいコードは単一プロセッサで動作させたときもある程度のコストがかかる。このような並列性の問題は、データ集約型で非OLTP型アプリケーションを Enterprise JavaBeans で組んだときの性能の低さの主な原因である。

データフロー言語では、データがプログラムの中心的概念となることを促進する。ただし、プログラムは常にデータを入力されそれを処理して結果を出力するものとは限らない。古いプログラムほどそのような前提が真であることが多く、UNIXオペレーティングシステムにおける単機能ツールをパイプで繋いでデータをやり取りするという形態が典型的である。データフロー言語でのプログラムは、コマンド行パラメータなどの入力を起点として、そのデータがどのように使われ、更新されるかを記述する。データは明示的であり、パイプや線で情報の流れが物理的に描かれることも多い。

処理・操作は入出力のある「ブラックボックス」であり、全てが明示的に定義される。その入力が全て妥当となったとたんに実行される。従来型のプログラムは一連の命令文で構成されているが、データフロープログラムは組み立てラインに労働者が並んでいるようなもので、各労働者は材料が到着したとたんに割り当てられた作業を開始する。データフロー言語が本質的に並列的であるというのはこのためである。各処理・操作には保持すべき隠蔽された状態を持たず、どの処理・操作も同時に実行可能である。

データフロープログラムは一般に、コンピュータ内部でも通常のプログラムとは全く異なった表現をされる。従来のプログラムは単に命令が実行すべき順序に並んでいるだけである。データフロープログラムは巨大なハッシュテーブルとして実装されることもあり、入力をキーとして、データとしてのコードへのポインタを得る。ある処理・操作が完了すると、プログラムは全ての入力が利用可能となっている処理・操作をリストから検索し、それを実行する。処理・操作が完了したとき、一般に出力データが新たに入力データとなり、それによって入力が揃った別の処理・操作が実行可能になる。

共有すべき並列処理はリストの検索部分だけであり、このリストがプログラム全体の状態を表している。従って、状態を管理する作業はプログラマの手を離れ、言語処理系がその役割をする。並列処理向けの処理系を単一プロセッサコアのマシン上で動作させるとオーバーヘッドが生じるが、これは異なる実装の処理系と置換することでオーバーヘッドのない実行が可能となる。

データフロープログラミングを効率的に実装することを指向したハードウェアアーキテクチャも各種存在する。Greg Papadopoulos はMITのタグ付きトークン・データフローアーキテクチャを設計した。

歴史

データフロー言語は本来、並列プログラミングを容易にする目的で開発された。1966年の Bert Sutherland の論文 The On-line Graphical Specification of Computer Procedures[1]では、グラフィカルなデータフロープログラミングのフレームワークが生み出された。その後のデータフロー言語は大型のスーパーコンピュータを持つ研究所で開発されたものが多い。よく知られているSISALEnglish版ローレンス・リバモア国立研究所で開発された。SISALは関数型言語のように見えるが、各変数を一回しか定義できないという制約を設けている。このため、コンパイラは容易に入力と出力を特定できる。SISAL から様々な派生言語が生まれ、その中でもSACEnglish版Single Assignment C)はC言語と可能な限り似せた文法となっている。

より根本的なデータフロー言語としてProgprahがある。これは、画面上でグラフィカルにプログラムを構築するもので、変数の代わりに入力から出力に線を引くようになっている。ただし、これはMacintosh向けに開発された言語であり、Macintoshは1996年までシングルプロセッサのマシンしかなかった。

広く使われているデータフロー言語はより実用的なもので、例えばLabVIEWが有名である。これは本来、プログラマでない人でも実験用機器間のデータのリンクを構築できるようにすることを意図していたが、現在ではより汎用的な用途で使える。VEEEnglish版 もデジタル電圧計やオシロスコープ、波形発生器といった計測機器の活用を意図したものである。

言語

API

  • JavaFBP[9] : Java および C# 向けのオープンソースのフレームワーク
  • DataRush[10]: Java 向けデータフローフレームワーク

関連項目

脚注