Perlオブジェクト環境( POE ) は、Rocco Caputo らによって Perlプログラミング言語で書かれた Perl モジュールのライブラリです。
CPAN より:
- 「POE は元々、永続オブジェクト サーバーとランタイム環境の中核として開発されました。その後、汎用のマルチタスクおよびネットワーキング フレームワークへと進化し、 Event やTkおよびGtkツールキットなどの他のイベント ループへの一貫したインターフェイスを包含し、提供しています。」
アーキテクチャと抽象化のレイヤー
POE ( Perl オブジェクト環境) は、小さなモジュール式オペレーティング システムと考えることができます。1 つ以上の POE プログラムまたはインスタンスを同時に実行することができ、一般的に協調型マルチタスクに適しています。POE パッケージは、オープンエンドのCPAN スタイルの規約で POE の将来の開発を導く名前空間と抽象化で構成されています。
イベントレイヤー
非公式のアーキテクチャは、最下部にカーネルがあるレイヤーのセットで構成されています。この小さなカーネルは、実行中の各 POE インスタンスのメイン ループとして動作するイベント レイヤーを表します。最初の呼び出しは、「イベント ディスパッチャー」であるPOE::Kernelです。
POE::Kernel 名前空間には、カーネル自体にプラグインされる関数群が含まれています。これらのループ抽象化は、POE の標準化されたイベント ループ ブリッジ インターフェースであるPOE::Loopに基づいて設計されています。これらを必要に応じて組み合わせて、ランタイム サービスとプロセス間通信用の効率的な機能を提供することができます。基本的な関数は、POE::Loop::Event、POE::Loop::Poll、POE::Loop::Selectです。また、外部環境の他のループ ブリッジへのフックを提供するPOE::Loop::TkとPOE::Loop::Gtkも利用できます。それだけでは不十分な場合は、 POE::Loop カーネル抽象化によって、再利用可能なシグナル コールバック、時間またはアラーム コールバック、ファイルハンドル アクティビティ コールバック、およびイベント ループの初期化、実行、終了などの管理関数が提供されます。
さらに、より高レベルのパッケージング フレームワークである POE::Macro と、それらをテストするためのデバッグ ユーティリティである POE::Preprocessor もあります。このフレームワークによってPOE::Macro::UseBytesが生まれました。
- 注: Perl の伝統に従い、POE も動的なターゲットです。
常にCPAN をチェックして、コミュニティがアーカイブにどのような新しいものを置いたかを確認してください。(...そして、 Larryによる Perl のモットー「方法は 1 つだけではない」を忘れないでください)
実行中のカーネルは、POE::Sessionアーキテクチャによって規定される別の抽象化セットから構築された原始的な有限状態マシンを介して動作します。POE ::Session は、イベントと、それらを処理する関数、クラスメソッド、および/またはオブジェクト メソッドのマップとしてほぼ自明に定義されます。POE::Session オブジェクトには、ヒープと呼ばれる、すべてのイベント ハンドラーによって共有されるストレージ スペースも含まれます。どのような方法でスライスしても、状態は確実に識別され、明確に定義されます。
より機能豊富なイベント ハンドラは、POE::Session のサブクラスであるPOE::NFAです。これは、イベント駆動型の非決定性有限オートマトン(よりスマートな有限状態マシン) です。このイベント ハンドラは、イベント、ポーリング、ユーザー選択、またはその他の外部イベントの要求に応じて、厳密に定義された状態から別の状態に移行します。この状態マシンは、広範囲の汎用イベント駆動型 スレッドをカプセル化するように機能し、比較的非公式な POE::Session よりも実行パスに沿ってより厳密な追跡を可能にします。
I/O層
カーネルの次の要件は、 Wheelsと呼ばれる単一の I/O 層に存在する入出力ハンドラです。 Wheels はアクションを開始し、その結果生じる低レベル イベントを処理し、それらを使用するセッションの高レベル イベントを生成します。 Wheels は、セッションやループと同様に、カーネルの上部にある統一された抽象化セット ( POE::Wheel ) から構築されます。 POE の基本ディストリビューションには、高度に専門化され、明確に定義された 7 つの Wheels があります。
- POE::Wheel::Run - pipe()、fork()、場合によっては exec() を使用して子プロセスを作成し、子プロセスと対話します。対話は子プロセスの標準入力と出力を通じて行われます。
- POE::Wheel::SocketFactory - 確立を待つためにブロックすることなく、クライアント ソケットとサーバー ソケットを作成する方法。
- POE::Wheel::Curses - Cursesテキスト インターフェース ライブラリからの非ブロッキング入力のハンドラー。Curses::UI::POE や Term::Visual などの CPAN コンポーネントは、これに基づいて構築されます。
- POE::Wheel::FollowTail - ログや共同ドキュメントなどの増え続けるファイルの末尾にハンドルを保持して追跡します。
- POE::Wheel::ListenAccept - 既存のサーバー ソケットをリッスンし、リモート クライアントからの接続を受け入れるために使用される POE::Wheel::SocketFactory のサブセット。
- POE::Wheel::ReadLine - Term::ReadLine の非ブロッキング、イベント駆動型類似物。
- POE::Wheel::ReadWrite - POE のドライバーとフィルターを使用して、次のレイヤー (POE 独自の小さなファイル システム) を利用するファイルハンドルに対してバッファリングされた読み取りと書き込みを実行する、 POE 用の高性能NBIOファイル ハンドラーです。
ファイルレイヤー
ドライバは、ファイルハンドルの読み取りと書き込みの実際の作業を行います。ドライバは、 POE::Driverモジュールに含まれる抽象度の低い定義に従って構築されます。この文書の執筆時点で実装されている主なドライバは、POE::Driver::SysRWです。これは、POE::Wheel::ReadWrite 用に特別に設計された汎用ファイルハンドル リーダー/ライターです。
次のレイヤーはPOE::Filterから構築され、おそらくほとんどの Perl 難読化専門家 (下記の POE #POE Humor を参照) の焦点となるPOE::Filterセットです。
「フィルターは生のストリームを変換します そしておいしいダダの塊を調理しました。" per `sungo'
- POE::Filter::Block - 入力を固定長ブロックとして解析します。出力側では、データをそのまま渡すだけです。
- POE::Filter::HTTPD - 入力を HTTP リクエストとして解析し、HTTP::Requestオブジェクトに変換します。出力側では、HTTP::Responseオブジェクトを受け取り、Web クライアント/ユーザー エージェントに送信するのに適したものに変換します。
- POE::Filter::Line - 入力ストリームを行に解析し、出力行をストリームに変換します。以前は非常に基本的な機能でしたが、最近の改良により、改行の自動検出などの興味深い機能が追加されました。
- POE::Filter::Reference - POE プログラム間、または POE と他の Perl プログラム間で Perl 構造を送信するために使用されます。入力側では、凍結されたデータ (Storable、FreezeThaw、YAML、またはその他のシリアル化メカニズム経由) が Perl データ構造に解凍されます。出力では、フィルターに指定された参照が凍結されます。Compress::Zlib がインストールされている場合は、要求に応じてデータを圧縮することもできます。
- POE::Filter::Stream - 何もしません。変更せずにデータを渡すだけです。
完全なリストについてはCPANのPOEを参照してください。
コンポーネント
POE::Componentドキュメントによると、POE にはいくつかの大きなパッケージが書かれています。これらはイベント駆動型モジュールで、その多くは、所属する大きなパッケージにサービスを提供する小さなデーモンとして機能します。これらの中には、モジュール間の高レベルの通信を容易にするものもあります。特に、Perl のメイン ディストリビューションから独立したままにしておく必要のあるスタンドアロン アプリケーションです。
一般的に、POE コンポーネントは、特定の大規模なタスクを実行する既成の高レベル プロシージャです。次に例をいくつか示します。
- Component::Server::TCP - 特殊な用途の TCP サーブレット
- Component::Client::TCP - POE 対応 TCP クライアント
- POE::Component::IRC - ほぼフル機能を備えた IRC クライアント。
- POE::Component::Server::IRC - RFC 2810 から RFC 2813 に準拠した IRC サーバー (開発中)
- POE::Component::UserBase - ユーザー認証およびデータ永続化サーブレット。
「POEコンポーネントは、面倒なタスクを処理する、再利用性の高いライブラリである傾向があります。 プログラマーがより興味深いことに集中できるようになります。 ただし、これはどのライブラリにも当てはまるはずです。」
ユーモア
- CPAN上の Acme::POE::Knee モジュール。
- What POE Is の最後には、ばかげた頭字語の展開がいくつか出てきます。
参照
- イベント駆動プログラミング
- Twisted 、 Pythonプログラミング言語に匹敵するフレームワーク
外部リンク
- POE ホームページ (Wiki サイト)
