Entry

C 言語向けの CGI 用フレームワークというのをボチボチ作ってる

2008年10月20日

データベースのデータを右から左に移すようなアプリケーションでは,あまり必要はないんですけれど,数値計算を Web アプリとしてゴリゴリやってみたいなぁ,とか思って C 言語用のフレームワークみたいなものを作っています。まぁ,フレームワークというほど大げさなもんでもないんですが。

大枠の仕組みとしては,こんな感じのハンドラを持ったコンテキストデータを持たせておいて,「初期化」「処理本体」「ビューへのディスパッチ」「エラー」の各処理をフレームワーク内で調整をとりつつ順番に呼び出すだけです(後処理も必要だな)。

typedef int (*goat_fn__)(goat_request_t *req, goat_response_t *res);
typedef goat_fn__ goat_init_fn;
typedef goat_fn__ goat_proc_fn;
typedef goat_fn__ goat_view_fn;
typedef goat_fn__ goat_error_fn;

typedef struct goat_context_t_ {
    goat_request_t *request;
    goat_response_t *response;
    goat_init_fn init;
    goat_proc_fn processor;
    goat_view_fn view;
    goat_error_fn error;
    goat_error_level_t error_level;
} goat_context_t;

J2EE や PHP のフレームワークでは,ビュー向けのテンプレートやデータソースを抽象化したインターフェイスが用意されていることも,フレームワークの重要な要素なわけですけれど,これらは本質的に別個の話なんじゃないかと思っています。フレームワークとして最低限必要なのは,HTTP リクエストとレスポンスを抽象化する仕組みと,それらを使った定型的な処理フローを策定すること(なんだと思う)。ということで,C++ で実装されている AzaraC のようなテンプレートエンジンは,十分魅力的なものの,似たようなもんを C で書くかはちょいと検討中です。

一方,データソースについても,いろいろと検討中。

通常のフレームワークでは,使用するデータソース(Oracle とか MySQL とか)を切り替えて使えるように,データアクセスのためのインターフェイスを抽象化しています。しかし,こうしたもんを抽象化することは,ある意味「作り手の便利」にあるわけで,使い手のためでは(あまり)ない。簡単にデータソースを切り替えられるといっても,運用に乗ってからバチバチ切り替えるもんじゃありませんもんね。

運用に乗ってからのこうした抽象化は,むしろオーバーヘッドとして悪い方面に傾くことが多いんじゃないだろうか。それだったら,例えば「使用するデータソースは SQLite で決め打ち」みたいな感じで,フレームワークの内部に組み込んでしまった方が,処理の効率からすると都合がいい。

概して,フレームワークは「作り手の便利」にあることが多くて,使い手に寄与することはあまりないんだと思います。もちろん,上流的な観点からすると「開発工数の削減」とか「経営のスピードに追いつく」とかいった話も出てきます。しかし,実のところそれは,「その代わりに一定程度のオーバーヘッドは受け入れる」といった価値判断が働いているわけで,それはすなわち「その代わりにその計算機のリソースを本来の処理に回せなくても許容する」ということでもある。

実際のところ,巷のウェブアプリ(特に業務アプリ)のほとんどは,データベースにアクセスしてちょこっと計算した結果を吐き出しているだけなので,個々のリクエストに対する処理に関する限り,CPU 的にはあまり負荷がかからないことが多い。個々リクエストの処理にかかるコストが「それなり」ですから,それよりは「開発工数」や「経営スピード」の方が重要なわけで,だからこそオーバーヘッドの高いフレームワークも許容される,と,云々。

つことで,趣味で作るもんについては,多少の面倒を引き受ける代わりに,やれることを増やすってのも面白いんじゃないかと思うわけです。AzaraC の素数計算のパフォーマンスを見ても分かるとおり,CPU を効率的に使うことで,今までになかった新しいこともできるんじゃないだろうか,とかとか(Google はそうやってるんでしょうが)。まぁ,単純に複数のデータソースに対応するのが面倒だってのが,主だった理由だったりもするわけですが。

もっとも,やっぱり C で書くといろいろと面倒なことが多くてちと大変です。今のところ,2000ステップ弱くらい書いてるんですけれど,まだ形になるには程遠い感じ。フレームワークだから,ライブラリはなるべくコンパクトにするつもりだったんですけれど,なかなかなかなか……。5000ステップ以内に収めることを目標に,もちっと作りこんでみる。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN