次のページ 前のページ 目次へ

5. プログラミング

Linux はプログラムを作るには良い環境だと思います。プログラムを簡単 に素早く作成するための多くのツールが揃っています。例えば、編集 - 保存 - コンパイル - 再編集といった単調な作業にあくせくしなくても、 前述の emacsjed などのエディターを使えば迅速に作業できます。

5.1 Fortran

あまり大差ないのですが、この文書を書いている時点で利用できる(フリー)コン パイラーと VMS とでは完全互換ではありません - 幾つかのマイナーな警告の発生が予想されます( VMS のコンパイラは非標準の拡張を行なっているのです)。 詳細は /usr/doc/g77/DOC/usr/doc/f2c/f2c.ps を御覧ください。

システム管理者は、g77 ネイティブコンパイラ(すぐれものですが、0.5.21 版ではまだ DEC Fortran と互換性はありません)か、Fortran から C へのトラ ンスレータである f2c (疑似ネイティブコンパイラのフロントエンド) の どちらかをインストールしているはずです。私の経験では、yaf77 が最も 優れた結果を出すパッケージの一つだと思います。

g77 で Fortran プログラムをコンパイルするには、ソースを編集して、 .f 拡張子をつけて保存した後、

$ g77 myprog.f

を実行します。

デフォルトでは、a.out の名で実行ファイルが生成されます(他に何もリ ンクしなければ)。異なった実行ファイル名にして、最適化オプションをつけるに は、

$ g77 -O2 -o myprog myprog.f
とします。

最適化には注意! システム管理者にコンパイラについてのドキュメントを一読してもらい、問題がないかどうか確認してください。

サブルーチンをコンパイルするには、

$ g77 -c mysub.f

とすれば、mysub.o が生成されます。このサブルーチンをリンクするには、

$ g77 -o myprog myprog.f mysub.o

としてください。

たくさんのサブルーチンがあって、ライブラリにまとめたいなら、

$ cd subroutines/
$ cat *f >mylib.f ; g77 -c mylib.f

のようにします。

これであなたのプログラムにリンク可能な mylib.o が生成されます。 最後に、外部ライブラリ libdummy.so をリンクするには、

$ g77 -o myprog myprog.f -ldummy

とします。

f2c をお持ちなら、g77 の替わりに f77fort77 のみを使うことでしょう。

以下では、さらに使いやすいプログラミングツール make を紹介します。

5.2 make の使いかた

ユーティリティ make は、複数のソースファイルに分かれたプログラムの コンパイルに使うツールです。VMS での MMSMMK に相当しますが、構文は異なっています。

ソースファイル file_1.f , file_2.f , file_3.f と メインプログラムのソー ス myprog.f があるとしましょう。これらのプログラムを手作業でコンパ イルするとなると、ソースファイルのどれか一つを変更した場合、それと依存関 係にあるファイルがどれかを考えて、一つ一つ再コンパイルしなければなりません。

頭が変になる前に「 makefile 」を作るべきです。これはソースファイル相互の 依存関係を記述したテキストファイルです - ソースが変更されたら、変更されたファ イルに依存するファイルだけを再コンパイルしてくれます。

我々の例では、こんな風に makefile を作ります。



# makefile の例です。
# <TAB> と書いてあるところでは <TAB> キーを押してください!
# 大切なことです:スペースはダメですよ。

myprog: myprog.o file_1.o file_2.o file_3.o
<TAB>g77 -o myprog myprog.o file_1.o file_2.o file_3.o

# myprog は四つのオブジェクトファイルに依存します。

myprog.o: myprog.f
<TAB>g77 -c myprog.f
# myprog.o はそれ自身のソースファイルに依存します。

file_1.o: file_1.f
<TAB>g77 -c file_1.f
# file_1.o はそれ自身のソースファイルに依存します。

file_2.o: file_2.f file_1.o
<TAB>g77 -c file_2.f file_1.o
# file_2.o はそれ自身のソースファイルとオブジェクトファイルに依存します。

file_3.o: file_3.f file_2.o
<TAB>g77 -c file_3.f file_2.o
# file_3.o はそれ自身のソースファイルとオブジェクトファイルに依存します。


# end of makefile.

これを Makefile の名で保存し、make とタイプすればコンパイルできます。 代わりに、ファイル名を myprog.mak として保存したなら、make -f myprog.mak でコンパイルできます。もちろん RMP(訳注:man ページを参照の 意)。

5.3 シェルスクリプト

シェルスクリプトは VMS コマンドファイルと同じものですが、より強力な構文を備えています。

スクリプトを書くには、しなければならないこと全てをコマンドで記述して、標準 の ASCII ファイルに保存します。実行できるようにするために、chmod +x <スクリプトファイル名> コマンドを実行しておいてください。 スクリプトファイル名をタイプすれば実行できます。

bash でスクリプトを書くには、広範な機能を網羅した解説本が必要になる ので、あまり深くは言及しません。ここでは多少包括的で、(望むらくは)役に立つサンプルから幾つかの基本的なルールを読みとってください。

サンプル:sample.sh


#!/bin/sh
# sample.sh
# コメント行です。
# 最初の行は消さないで、必ずそこになければなりせん。
echo "This system is: `uname -a`" # use the output of the commad
echo "My name is $0" # built-in variables
echo "You gave me the following $# parameters: "$*
echo "First parameter is: "$1
echo -n "What's your name? " ; read your_name
echo notice the difference: "hi $your_name" # quoting with "
echo notice the difference: 'hi $your_name' # quoting with '
DIRS=0 ; FILES=0
for file in `ls .` ; do
  if [ -d ${file} ] ; then # if file is a directory
    DIRS=`expr $DIRS + 1`  # this means DIRS = DIRS + 1
  elif [ -f ${file} ] ; then
    FILES=`expr $FILES + 1`
  fi
  case ${file} in
    *.gif|*jpg) echo "${file}: graphic file" ;;
    *.txt|*.tex) echo "${file}: text file" ;;
    *.c|*.f|*.for) echo "${file}: source file" ;;
    *) echo "${file}: generic file" ;;
  esac
done
echo "there are ${DIRS} directories and ${FILES} files"
ls | grep "ZxY--!!!WKW"
if [ $? != 0 ] ; then # exit code of last command
  echo "ZxY--!!!WKW not found"
fi
echo "enough... type 'man bash' if you want more info."

5.4 C

Linux は、C でプログラムを開発するにはすばらしい環境です。C につ いてはご存知だと思いますので、ここではガイドラインについて述べましょう。 定番の hello.c を Linux の一部とも言える gcc でコンパイルするには、 g77 と同じ構文を使います。

$ gcc -O2 -o hello hello.c

プログラムにライブラリをリンクするには、スイッチ -l<libname> を加えます。例えば、数学ライブラリと最適 化オプションを付けてリンクするには、

$ gcc -O2 -o mathprog mathprog.c -lm

のようにします。

( -l<libname> スイッチは、 /usr/lib/lib<libname>.a を一緒にリンクしろということで、 従って -lm/usr/lib/libm.a と同じ意味になります)。

プログラムが複数のファイルから構成される場合は、前述したように make ユーティリティが必要となるでしょう。当然、makefile に記述されたソー スファイルと gcc を使います。

man ページのセクション 3 に記載されている C の関数についてのヘルプを呼び 出すことができます。例えば次のようにします。

$ man 3 printf

使用可能なライブラリは山ほどありますが、中でも、テキストモードで各種の効 果を出すための ncurses と、グラフィックス描画用の svgalib など を最初に使いたいのではないですか。


次のページ 前のページ 目次へ