枕草子 (My Favorite Things)

【第342回】 言語選択(2000年7月14日)

東京では寝苦しい夜だったと思うが,長野ではクーラーなしでもまあ眠れるくらいの涼しさになる昨今である。この利点を思えば新幹線通勤など何の苦でもない。安眠できるから睡眠時間が短くてももつわけで,1:00頃眠って5:00頃目覚めると4時間しか眠っていない勘定だが,まあ何とかなっている。今日も無事始発に乗ることができた。

今日の本題の言語選択とは,自然言語ではなく,プログラム言語の選択である。実はエコポイント・チェックの自動集計をさせるプログラムを書きたくて,最初はPerlで書きかけた(というかエコポイントを計算させるためのCGIの機能に含めようとした)のだが,計算速度とセキュリティの面からCで書くべきだと気づいたのである。CGIに集計機能を入れて,利用される都度集計も更新するようにすれば便利な気もするが,万が一利用者が多くなってきたときオーバーヘッドが大きすぎて破綻することが予測されたので,それは断念したというわけだ。

定期的にcronで動かすならCで書いてコンパイルした方がPerlで書くより優れている。とくに実行速度が段違いである。データが大きい場合もPerlよりCで書く方がよい(巷にはRubyとかJavaとか高機能な言語は他にもあるが,実行時の安定性と速度においてCに優るものはほとんどないと思う)。欠点は日本語の扱いである。まあjisに変換してiso-2022-jpで出力させるくらいは何とかなるが,それにしてもPerlのjcode.plほど便利なモジュールはない。今回の集計結果には日本語は必要ないことも,Cを選んだ理由の一つだ。コーディングの所要時間1時間くらいだった。Perlで書くより若干長くかかったが,慣れの問題もあるしこんなものかとも思う。更新時刻を自動的に表示させたくてtime.hヘッダをincludeすることは知っていたが,どの関数を組み合わせて呼び出すべきか試行錯誤するのに結構時間がかかった。やはり関数マニュアルくらいは持っておくべきかもしれない。

C言語で書いたプログラムは,一般にコンパイルしてマシン語コードに変えないと実行できない。Cインタープリタなんてものが存在したこともあったが,あれならPerlの方がずっとましだと思う。コンパイルするときには,ソースプログラムがいくつかのファイルに分かれていたり,外部のライブラリを利用していたりすることがあるので,たんにgcc hogehoge.cと打つだけでは実行ファイルが作れないことが多々ある。もちろんオプションをずらずら並べたバッチファイル(unix系OSの環境ならシェルスクリプト)を書いてもいいのだが,こんなときに便利なコマンドがmakeである。Makefileというファイルにコンパイル規則を書いて,ソースプログラム一式と一緒に置いておけば,makeと打つだけでコンパイルが完了するというわけだ。しかも,ソースプログラムが複数に分かれているとき,一部だけ修正した後コンパイルし直すときには,変更のあったファイルだけをコンパイルし直してくれるのだ。これはバッチファイルにはきわめて難しい芸当といえよう。

Makefileの書き方の基礎は簡単である。#で始まる行は注釈である。空行も無視される。=でつなぐことによってマクロを定義できる。:でつなぐことでターゲット名とそれに使われるファイル名を指定できる(最終産物となるターゲット,つまり実行ファイルを最初に指定する)。その直下にタブコードで始まるターゲット作成コマンドを書く。後はコンパイルしたい順にターゲット名をずらずらと並べていくだけだ。ターゲットが1つしかない場合でも,コンパイルオプションが面倒なら,Makefileを作っておいて損はないと思う。たとえば,eco_stat.htmlを出力するコマンドuserstatのMakefileは下記の通りである。

# making userstat - 13 July 2000 Minato Nakazawa
CC = gcc -O3
userstat: userstat.c
	$(CC) userstat.c -lm

ただしWindows2000のコマンドプロンプトでgcc-2.95-2付属のmakeを使う場合は,上記Makefileではuserstat.exeでなく,a.exeができてしまう。-lmの後に出力ファイル名指定オプションを続けて,-lm -o userstat.exeとしないとうまく行かない。もっとも,cronで実行させる場合にカレント指定を考えるのが面倒なために入力ファイルや出力ファイルの指定をフルパスにしてしまったので,Windows2000のコマンドプロンプトでmakeしても無意味なのだが。

言語選択とはまったく関係ないが,先刻,前の教授が教室にみえて,最新の論文(JNEMに載ったやつ)を誉められて嬉しかった。以前よりは進歩しているということか。もっとも,進歩すればしたで,書いている途中の論文の穴が気になって,埋めずには投稿できなくなってしまうので,行き詰まることも増えてしまうのだ。行き詰まりを打開するには,真剣に突き詰めて考えて打つべき手を打つしかないということは,わかりきっているというのに,時として他のことに逃避してしまう。

たとえば,昨日から今日にかけて,VAIO505故障中に新幹線の中で読みまくった本についての書評を,書評掲示板にアップロードした,なんてのは逃避だろうな。気合いを入れなおそう。帰りは終電1本前21:30発あさま535号。熊谷から座れた。


前【341】(アップルファーム東京とACアダプタ修理代の謎(2000年7月13日) ) ▲次【343】(FREX定期更新(2000年7月17日) ) ●枕草子トップへ