Webアプリ開発事始 第9回

CGIの仕組みを覗く(2)~ゲストブックの仕組みとプログラミング言語 長谷川裕行
有限会社 手國堂

CGIとプログラミング言語

CGIプログラムを作るためのプログラミング言語は多数あります。後々の手直しや異なるOSへ移植するような場合を考えると、扱いやすい言語を選ぶべきでしょう。各言語の特徴を見ておきましょう。


- perlとC言語が代表的 -

CGIと言えばperl――といったイメージを抱く人は多いと思います。また、C言語もよく使われます。

C言語はコンパイル作業が必要なため、動作テストから完成~実装までに手間がかかります。しかしperlはインタプリタ形式のスクリプト言語なので、動作テストに手間がかかりません。手直しも容易です。

ただ、スクリプト言語はソースコードをインタプリタが読み込んで処理を行うため、実行に時間がかかります。高速な処理を望むなら、面倒でもC言語の方が有利です。

以下に、代表的なプログラミング言語の特徴を掲げます。

ソースコードの例として、「現在の日付と時刻を表示するプログラム」を取り上げました。


- perl -

UNIXの標準的なスクリプト言語で、LinuxやFreeBSDにも標準でPerlの動作環境(Perlインタプリタ)が付いています。

元々perlは、テキストファイルの読み書き処理を手軽に行うための言語として開発されました。テキスト形式のデータベース(CSV形式など)を検索するような処理が、エディタで簡単に作れます。

print文を使って標準出力に簡単にデータを送れます。メッセージを中央寄せで表示するなら、

  print "<CENTER>メッセージ</CENTER><BR>\n";

のようにタグを使ったHTMLデータを直接出力できます。

perlのソースコードでは、先頭に

  #!/usr/bin/perl

という1行を記述します。これは、perlインタプリタのプログラム(perl)が存在する場所(パス)で、上の例では“/usr/binディレクトリ”に存在する“perl”というプログラムを起動して、それ以降に記述したソースコードを読み込ませ、実行させることを示しています。

“#”はコメント記号、先頭に$の付いた$sec、$minなどは変数です。

日時の取得は以下のような形となります。

  ($sec, $min, $hour, $mon, $year,
      $wday, $yday, $isdst) = localtime(time);

localtimeは現在の日時を取得する関数で、その戻り値を複数の変数にまとめて代入します。
printは変数の値を標準出力に送る関数で、以下のようにして取得した日時を出力します。

  print "$year/$mon/$day, $hour:$min:$sec\n";

リスト3:現在の日時を表示するperlのプログラム


- C言語 -

UNIXの標準的なプログラミング言語で、UNIXには“GCC”と呼ばれるC言語の開発環境が付属しています。WindowsではVisual C++やBorland C++が使えます。C++はC言語の拡張版なので、C++コンパイラはC言語のソースも処理できます。

C言語は柔軟で高度な処理を記述できるため、習得が難しいと言われます。しかし、CGIプログラムに必要な処理程度なら、さほど苦労することはないでしょう。

ただ、コンパイルやリンクといった処理工程を経なければならないため、小さなプログラムでも完成までに多少の手間がかかります。

UNIXの場合は、標準でC言語のコンパイラなどが付属しているため、別途コンパイラなどを入手する必要はありません。WindowsにもフリーのCコンパイラがあります。

perl同様標準入出力の扱いが容易なので、HTMLデータの処理は簡単です。
メッセージの中央寄せは、以下のようになります。

  puts("<CENTER>サンプルプログラム</CENTER><BR>\n");

C言語では、標準入出力や日時処理など基本的な機能はすべてライブラリに用意されているため、ソースコードではそれらを利用するための指示を書かなければなりません。

ソース先頭の“#include<stdio.h>”は標準入出力、“#include<time.h>”は日付や時刻の処理を利用するための定義ファイルを指定している箇所です。
 C言語のプログラムは

  int main(void)

の行から始まります。C言語のプログラムは、小さな処理単位である“関数”を組み上げて作ります。その入り口がmainです。
/*と*/で囲まれた部分はコメントです。変数は

  time_t t;

のようにデータ型と名前を明示して、必ず宣言しなければなりません。上の1行は、“time_t型の変数t”を宣言しているところです。
日時の取得は、以下のようにtime関数を使います。

  t = time(NULL);

puts関数は文字列を標準出力へ送る関数、“ctime(&t)”は変数tに格納された日時のデータを表示用に変換する関数です。

  puts( ctime(&t) );

の1行は、ctime関数で変換した日付と時刻を表す文字列を、puts関数で標準出力に送る――という処理です。

リスト4:現在の日時を表示するC言語のプログラム


- Visual Basic -

Windowsでは、Visual BasicでCGIプログラムを作ることもできます。但し、準備に少し手間がかかります。

Visual Basicの長所は、ウィンドウを使ったユーザーインターフェイスの構築を簡便化できることです。そのため、ウィンドウを持たないCGIプログラムの開発は、基本的には“守備範囲外”です。しかし、まったく作れない訳ではありません。

Visual Basicで標準入出力を利用するには、WindowsのAPI(Application Program Interface)を使ったプロシージャを作る必要があります。そのための準備に多少手間取りますが、一度作成してしまえば、Visual Basicで作る他のCGIプログラムで再利用できます。

メッセージを中央寄せで表示するには、以下のように記述します。

  PutStr "<CENTER>サンプルプログラム</CENTER><BR>\n"

PutStrはAPIを使って作成したプロシージャで、Visual Basicに標準で備わっている命令ではありません。

リスト5の日時を表示するプログラムでは、最後の“処理の本体ここから”と書かれたところから“処理の本体ここまで”と書かれたところまでが実質的なプログラムの本体部分で、それ以外はVisual Basicで標準入出力を扱えるようにするための準備と下請け処理です。

APIを使用するための前準備で、Visual BasicのソースはperlやC言語に比べて非常に長くなります。しかし「日時を表示する」という処理の本質部分は、以下の3行だけです。

  dtDate = Date
  dtTime = Time
  PutStr ("dtDate, dtTime" + vbCrLf + vbCrLf)

DateとTimeはそれぞれ日付と時刻を取得する関数で、dtDate、dtTimeが日付と時刻を格納する変数です。
“PutStr”は、先述したようにAPIを使って標準出力へ文字列を送り出すプロシージャです。
' の付いた行はコメントです。
Visual BasicでCGIプログラムを作る場合は、“Main()”というSubプロシージャから処理が始まるようにします。

リスト5:現在の日時を表示するVisual Basicのプログラム


- 目次 -
CGIプログラムの基本構造
CGIのデータ受け渡し
ゲストブックの仕組み
CGIの長所と短所
CGIとプログラミング言語
perlとC言語が代表的
perl
C言語
Visual Basic
慣れた言語が一番
あとがき

Copyright © MESCIUS inc. All rights reserved.