事件驅動程式設計
事件驅動程式設計(英語:Event-driven programming)是一種電腦編程範型。這種模型的程式執行流程是由用戶的動作(如滑鼠的按鍵,鍵盤的按鍵動作)或者是由其他程式的訊息來決定的。相對於批次程式設計(batch programming)而言,程式執行的流程是由程式設計師來決定。批次處理(batch)的程式設計在初級程式設計教學課程上是一種方式。然而,事件驅動程式設計這種設計模型是在互動程式(Interactive program)的情況下孕育而生的。
事件驅動程式可以由任何程式語言來實作,然而使用某些語言來撰寫會比其他的語言來的簡單。有些整合開發環境(簡稱IDE)也會影響實作事件驅動程式設計的難易程度。有的 IDE 會使的開發工作變的很簡單,有的則否。
概觀
取代傳統上一次等待一個完整的指令然後再做執行的方式,事件驅動程式模型下的系統,基本上的架構是預先設計一個事件迴圈所形成的程式,這個事件迴圈程式不斷地檢查目前要處理的資訊,根據要處理的資訊執行一個觸發函數進行必要的處理。其中這個外部資訊可能來自一個目錄夾中的檔案,可能來自鍵盤或滑鼠的動作,或者是一個時間事件。
對一個事件驅動(event driven)系統進行程式設計,因此可以視為改寫系統預設觸發函數的行為,來符合自己需要的一種動作。輸入的事件可以放進事件迴圈或者是經由已經註冊的中斷處理器來與硬件事件互動;而許多的軟件系統使用了混和這兩種技術的處理。預先設計好的演算法確定了一件事,那就是當他們被需要的時候,就會在適當的時機被觸發。也因此提供了一個模擬中斷驅動環境(interrupt driven environment)的軟件抽象架構。事件驅動程式設計基本上包含了許多小程式片段,這些小程式片段被稱為事件處理器並且被用來回應外部的事件與分發事件。通常尚未被事件處理器處理的事件,都會被系統放在一個稱為事件佇列的資料結構中,等待被處理。
許多情況下,事件處理器可以自己觸發事件,因此也可能形成一個事件串。 事件驅動程式設計的着重於彈性以及非同步化上面,並且企圖盡可能的modeless。 圖形化使用者介面這類程式就是典型的事件驅動設計方式。
計算機作業系統是事件驅動程式的典型範例。在作業系統的最底層,中斷處理器的動作就像是硬件事件的直接處理器,搭配着 CPU 執行分配事件規則動作。對軟件處理程式而言,基本上作業系統可視為一個事件分配器,傳送資料和軟件中斷給用戶自己寫的軟件處理程式。
相對應於批次程式設計
下面是兩個數相加的範例,分別用批次版本與事件驅動版本來撰寫
批次版本
read a number (from the keyboard) and store it in variable A[0] read a number (from the keyboard) and store it in variable A[1] print A[0]+A[1]
事件驅動版本
set counter K to 0 repeat { if a number has been entered (from the keyboard) { store in A[K] and increment K if K equals 2 print A[0]+A[1] and reset K to 0 } }
事件驅動程式框架與程式庫
- Eiffel Event Library [1]
- Liboop, event loop management library [2](頁面存檔備份,存於互聯網檔案館)
- libsigc++, a callback framework for C++
- libevent, an event notification library for C/C++
- REBECA, Event-Based Electronic Commerce Architecture
- Tcl, Tcl language has event driven programming built in
- Twisted, Python
- POE, Perl
- PRADO, a component-based and event-driven Web programming framework for PHP 5
- Gui4Cli, an event driven programming language for Windows