コンピュータプログラミングにおいて、イベント駆動型プログラミングとは、プログラムの流れが外部イベントによって決定されるプログラミングパラダイムです。マウス、キーボード、タッチパッド、タッチスクリーン、外部センサー入力などのUIイベントが一般的な例です。イベントは、他のプログラムからのメッセージ、他のスレッドからの通知、その他のネットワークイベントなど、プログラムによって生成されることもあります。
イベント駆動型プログラミングは、グラフィカル ユーザー インターフェイスアプリケーションやネットワーク サーバーで使用される主要なパラダイムです。
イベント駆動型アプリケーションでは通常、イベントをリッスンし、イベントの 1 つが検出される とコールバック関数をトリガーするイベント ループが存在します。
イベント駆動型プログラムはどのプログラミング言語でも記述できますが、高レベルの抽象化を提供する言語を使用すると記述が簡単になります。
割り込み処理と例外処理はイベント駆動型モデルに完全には適合しませんが、多くの類似点があります。
イベント駆動型とメッセージ駆動型(キュー駆動型とも呼ばれる)のパラダイムを区別することが重要です。イベント駆動型サービス(例:AWS SNS)は、そのコンシューマーから分離されています。一方、キュー/メッセージ駆動型サービス(例:AWS SQS)は、そのコンシューマーと結合されています。[1]
イベントを取得してディスパッチするイベント ループはアプリケーション間で共通であるため、多くのプログラミング フレームワークはイベント ループの実装を提供しており、アプリケーション開発者はイベント ハンドラーを記述するだけで済みます。
IBMの初期のプログラミング言語であるRPG は、1960 年代の設計コンセプトが前述のイベント駆動型プログラミングに似ており、組み込みのメインI/Oループ (「プログラム サイクル」と呼ばれる) を提供し、計算はサイクルの早い段階で設定された 「インジケーター」(フラグ)に従って応答しました。
実際のロジックはイベントハンドラルーチンに含まれています。これらのルーチンは、メインプログラムが応答するイベントを処理します。例えば、GUIプログラムで「保存」コマンドボタンをマウスで1回クリックすると、データベースにデータを保存するルーチンがトリガーされます。また、「終了」ボタンをクリックすると、プログラムを終了するルーチンがトリガーされます。イベントループは、このようなすべてのコマンドボタンやその他のGUI要素からイベントを受け取り、各ボタンに適切なイベントハンドラルーチンを送信します。
イベントハンドラルーチンは特定のイベントにバインドする必要があります。これにより、イベントループはイベントに応じて適切なルーチンをディスパッチできます。多くのIDEは、ボタンのクリックなど、特定のイベントごとにイベント処理テンプレートを提供することでこのプロセスを簡素化し、プログラマーがイベント処理コードの作成に集中できるようにします。
シーケンシャルプログラムでは、実行順序と履歴の追跡は通常簡単です。しかし、イベントドリブンプログラムでは、イベントハンドラーは外部イベントに応じて非シーケンシャルに実行されます。イベントハンドラーがどのような順序で呼び出されても適切に動作するように、特別な注意と計画が必要です。
既存のGUIアーキテクチャのほとんどはイベント駆動型プログラミングを採用しています。[2] Windowsにはイベントループがあります。Java AWTフレームワークは、イベントディスパッチスレッドと呼ばれる単一のスレッドですべてのUI変更を処理します。同様に、JavaフレームワークJavaFXにおけるすべてのUI更新は、JavaFXアプリケーションスレッドで行われます。[3]
Node.jsなどのほとんどのネットワークサーバーやフレームワークもイベント駆動型です。[4]
JavaFXアプリケーションのグラフィカルユーザーインターフェースを表すJavaFXシーングラフはスレッドセーフではなく、JavaFXアプリケーションスレッドとも呼ばれるUIスレッドからのみアクセスおよび変更できます。