コンピュータプログラミングにおいて、データフロープログラミングは、操作間を流れるデータの有向グラフとしてプログラムをモデル化し、データフローの原理とアーキテクチャを実装するプログラミングパラダイムです。 [1]データフロープログラミング言語は関数型言語のいくつかの機能を共有しており、一般的には数値処理に適した言語にいくつかの関数型の概念をもたらすために開発されました。著者の中には、非決定性マシンパラダイムに基づくデータフローコンピューティングやデータフローアーキテクチャとの混同を避けるために、データフローではなくデータストリームという用語を使用する人もいます。データフロープログラミングは、1960年代にMITのジャック・デニスと彼の大学院生 によって開拓されました。
考慮事項
伝統的に、プログラムは特定の順序で行われる一連の操作としてモデル化されます。これは、シーケンシャルプログラミング、[2] : p.3 手続き型プログラミング、[3 ] 制御フロープログラミング(プログラムが特定のパスを選択することを示す)、または命令型プログラミングと呼ばれることがあります。プログラムは、フォン・ノイマン[2] : p.3 のシーケンシャルプログラミングのビジョンに沿って、コマンドに焦点を当てており、データは通常「静止」しています。[3] : p.7
対照的に、データフロープログラミングはデータの移動を重視し、プログラムを一連の接続としてモデル化します。明示的に定義された入力と出力は、ブラックボックスのように機能する操作を接続します。[3] : p.2 操作は、すべての入力が有効になるとすぐに実行されます。[4]したがって、データフロー言語は本質的に並列であり、大規模な分散システムでうまく機能します。[2] : p.3 [5] [6]
州
コンピュータ プログラミングにおける重要な概念の 1 つに、状態という概念があります。これは、基本的にシステム内のさまざまな状態のスナップショットです。ほとんどのプログラミング言語では、通常、プログラマーには見えない、かなり多くの状態情報が必要です。多くの場合、コンピュータ自体には、どの情報が永続的な状態をエンコードしているかがわかりません。並列処理マシンでは、状態情報を複数のプロセッサ間で共有する必要があるため、これは深刻な問題です。ほとんどの言語では、プログラマーは、状態にとって重要なデータとコード部分を示すために、追加のコードを追加する必要があります。このコードは、パフォーマンスの面でコストが高く、読み取りやデバッグも困難になる傾向があります。明示的な並列処理は、データ集約型の非OLTPアプリケーションを構築するときにEnterprise Java Beansのパフォーマンスが低下する主な理由の 1 つです。[引用が必要]
シーケンシャル プログラムは、タスク (操作) 間を移動する 1 人の作業員として考えることができますが、データフロー プログラムは、材料が利用可能になると、それぞれが特定のタスクを実行する、組み立てライン上の一連の作業員に似ています。操作はデータ入力の可用性のみに関係するため、追跡する隠れた状態はなく、すべて同時に「準備完了」になります。
表現
データフロー プログラムは、さまざまな方法で表現されます。従来のプログラムは通常、一連のテキスト命令として表現されます。これは、受信、処理、および返送を行う小さな単一目的のツール間でデータをパイプするシリアル システムを記述するのに適しています。データフロー プログラムは、入力 (おそらくコマンド ラインパラメータ) から始まり、そのデータがどのように使用され、変更されるかを示します。データの流れは明示的で、多くの場合、線またはパイプとして視覚的に示されます。
エンコードの観点では、データフロー プログラムはハッシュ テーブルとして実装され、一意に識別される入力がキーとして使用され、命令へのポインターの検索に使用されます。いずれかの操作が完了すると、プログラムは操作リストをスキャンして、すべての入力が現在有効な最初の操作を見つけ、それを実行します。その操作が完了すると、通常はデータが出力され、それによって別の操作が有効になります。
並列処理の場合、共有する必要があるのはリストだけです。これはプログラム全体の状態です。したがって、状態を維持するタスクはプログラマーから取り除かれ、言語のランタイムに与えられます。並列処理用に設計された実装が単にオーバーヘッドを導入する単一のプロセッサ コアを持つマシンでは、別のランタイムを使用することでこのオーバーヘッドを完全に排除できます。
増分更新
Differential/Timely Dataflowなどの最近のデータフローライブラリでは、増分コンピューティングを使用して、より効率的なデータ処理を実現しています。[1] [7] [8]
歴史
データフロー言語の先駆者は、サンプリングデータシステムを指定するために1961年にジョン・ラリー・ケリー・ジュニア、キャロル・ロックバウム、ビクター・A・ヴィソツキーによって公開されたブロックダイアグラム(BLODI)でした。[9]機能ユニット(増幅器、加算器、遅延線など)とそれらの相互接続のBLODI仕様は、1クロックティックでシステム全体を更新する単一のループにコンパイルされました。
1966年の博士論文「コンピュータ手順のオンライングラフィカル仕様」 [ 10]で、 バート・サザーランドは並列プログラミングを容易にするために、最初のグラフィカルデータフロープログラミングフレームワークの1つを作成した。その後のデータフロー言語は、多くの場合、大規模なスーパーコンピュータラボで開発されました。NSAで開発された、それ以外は従来のデータ処理言語であるPOGOLは、マージ、選択、要約、変換などの複数のファイル間操作で構成される大規模なアプリケーションを、中間ファイルの作成や書き込みを可能な限り排除する効率的なコードにコンパイルしました。[11] ローレンスリバモア国立研究所で開発された人気のあるデータフロー言語であるSISALは、ほとんどのステートメント駆動型言語に似ていますが、変数は一度割り当てる必要があります。これにより、コンパイラーは入力と出力を簡単に識別できます。SISALの派生言語が多数開発されており、その中には、人気のあるCプログラミング言語にできるだけ 近づけようとするSAC、Single Assignment Cがあります。
アメリカ海軍は1980年代初頭から信号処理グラフ表記法(SPGN)とACOSの開発に資金を提供してきました。これは現在、現場で多くのプラットフォームで使用されています。[12]
より革新的なコンセプトはPrographで、これはプログラムを画面上のグラフとして構築し、変数を入力と出力をリンクする線に完全に置き換えます。ちなみに、Prograph はもともとMacintoshで書かれていましたが、 1996 年にDayStar Genesis MPが導入されるまではシングル プロセッサのままでした。[要出典]
データフロープログラミングモデルの効率的な実装を目的としたハードウェアアーキテクチャは数多くあります。[曖昧] MIT のタグ付きトークンデータフローアーキテクチャは、 Greg Papadopoulosによって設計されました。[過度の重み? –議論]
データ フローは、分散システム コンポーネントのグローバルな動作を指定するための抽象化として[誰によって]提案されました。ライブ分散オブジェクトプログラミング モデルでは、分散データ フローは状態を保存および通信するために使用され、Java のようなプログラミング言語の変数、フィールド、およびパラメーターと同様の役割を果たします。
言語
データフロー プログラミング言語には次のものがあります。
- Céu(プログラミング言語)
- アセット
- ビデオ処理用のAviSynthスクリプト言語
- BMDFMバイナリ モジュラー データフロー マシン
- カル
- Cuneiform、関数型ワークフロー言語。
- CMS パイプライン
- ヒューム
- ジュール
- キーサイトVEE
- KNIMEは、無料でオープンソースのデータ分析、レポート、統合プラットフォームです。
- LabVIEW、G [4]
- リンダ
- 明晰[3]
- 光沢
- 最大/MSP
- Microsoft Visual Programming Language -ロボットプログラミング用に設計されたMicrosoft Robotics Studioのコンポーネント
- Nextflow : ワークフロー言語
- Orange -データマイニング、統計データ分析、機械学習のためのオープンソースのビジュアルプログラミングツール。
- Ozも1.4.0から配布されるようになりました
- パイプラインパイロット
- プログラム
- ピュアデータ
- Quartz Composer - Appleが設計。グラフィックアニメーションやエフェクトに使用
- SACシングルアサインメント C
- SIGNAL(マルチクロック仕様を可能にするデータフロー指向の同期言語)
- シミュリンク
- サイザル
- SystemVerilog - ハードウェア記述言語
- Verilog - 2009 年に SystemVerilog 標準に吸収されたハードウェア記述言語
- VisSim - 動的システムのシミュレーションと自動ファームウェア生成のためのブロック図言語
- VHDL - ハードウェア記述言語
- Wapice IOT-TICKET は、 IoTデータの分析とレポート作成のための名前のないビジュアル データフロー プログラミング言語を実装します。
- XEE (Starlight) XMLエンジニアリング環境
- XProc
図書館
- Apache Beam : サポートされている複数の実行エンジン (Apache Spark、Apache Flink、Google Dataflow など) を使用してストリーミング (およびバッチ) 処理を統合する Java/Scala SDK
- Apache Flink : 分散 Hadoop (またはその他の) クラスター上でストリーミング (およびバッチ) 計算を実行できるようにする Java/Scala ライブラリ
- アパッチスパーク
- SystemC : 主にハードウェア設計を目的とした C++ 用ライブラリ。
- TensorFlow : データフロープログラミングに基づく機械学習ライブラリ。
参照
- 俳優モデル
- データ駆動型プログラミング
- デジタル信号処理
- イベント駆動型プログラミング
- フローベースプログラミング
- 関数型リアクティブプログラミング
- 再構成可能コンピューティングの用語集
- 高性能再構成可能コンピューティング
- インクリメンタルコンピューティング
- 並列プログラミングモデル
- 分割されたグローバルアドレス空間
- パイプライン (Unix)
- 量子回路
- 信号プログラミング
- ストリーム処理
- ヤフーパイプ
参考文献
- ^ ab Schwarzkopf, Malte (2020年3月7日). 「データフローコンピューティングの注目すべき有用性」. ACM SIGOPS . 2022年7月31日閲覧。
- ^ abc Johnston, Wesley M.; JR Paul Hanna; Richard J. Millar (2004 年 3 月). 「データフロー プログラミング言語の進歩」(PDF) . ACM Computing Surveys . 36 : 1–34. doi :10.1145/1013208.1013209. S2CID 5257722 . 2013 年8 月 15 日閲覧。
- ^ abcde Wadge, William W.; Edward A. Ashcroft (1985). Lucid, the Dataflow Programming Language (illustrated ed.). Academia Press. ISBN 9780127296500. 2013年8月15日閲覧。
- ^ ab 「データフロープログラミングの基礎」。NI製品入門。National Instruments Corporation。2013年8 月 15 日閲覧。
- ^ Harter, Richard. 「データフロー言語とプログラミング - パート I」。Richard Harter's World。2015年12月8日時点のオリジナルよりアーカイブ。2013年8月15日閲覧。
- ^ 「データフロー プログラミング言語が並列ハードウェアのプログラミングに最適な理由」。マルチコア プログラミングの基礎ホワイトペーパー シリーズ。National Instruments Corporation。2013年8 月 15 日閲覧。
- ^ McSherry, Frank; Murray, Derek; Isaacs, Rebecca; Isard, Michael (2013 年 1 月 5 日). 「差分データフロー」. Microsoft . 2022 年7 月 31 日閲覧。
- ^ 「Differential Dataflow」。Timely Dataflow。2022年7月30日。 2022年7月31日閲覧。
- ^ John L. Kelly Jr.、Carol Lochbaum、VA Vyssotsky (1961)。「ブロック ダイアグラム コンパイラ」。Bell System Tech. J. 40 ( 3): 669–678. doi :10.1002/j.1538-7305.1961.tb03236.x。
- ^ Sutherland, William Robert (1966年1月). コンピュータ手順のオンライングラフィカル仕様 (博士論文). MIT . hdl :1721.1/13474 . 2022年8月25日閲覧。
- ^ Gloria Lambert (1973)。「大規模ファイル処理: POGOL」。POPL '73: プログラミング言語の原理に関する第 1 回 ACM SIGACT-SIGPLAN シンポジウムの議事録。ACM。pp . 226–234。
- ^ 水中音響データ処理、YT Chan
外部リンク
- 書籍: データフローとリアクティブプログラミングシステム
- F# と C# でのデータフロー プログラミングの基礎
- データフロープログラミング - 概念、言語、アプリケーション
- デジタル信号処理のための同期データフロープログラムの静的スケジューリング
- 複雑さを増すことなく膨大な負荷を処理する データフロープログラミングの基本概念、Dr. Dobb's、2011 年 9 月
