第2章:最初の実践


ようこそコンパイル言語へ:C編

コンピュータ言語の教科書の「お作法」として,まず最初の例題は「Hello,World!」という文字列を画面に表示させるプログラムを例示することになっている.

こういう内容のファイルをex1.cの名前で保存しよう

/* Example 1 */

#include <stdio.h>

void main(){

  printf("Hello, World!\n");

}

では,説明.

1行目の/* Example 1 */:「/*」から「*/」の間はコメントとして取り扱われる.何を書いてもよい.「/*」と「*/」は違う行にあってもよい.コメントのつけ方は,プログラマのセンスが問われる部分でもある.なお,大規模プロジェクトにおいてはコメントのつけ方も統一基準が与えられるのが普通.以下は複数行コメントの例

/*
 * ===================================================
 *
 *  gSibc - C version of modified SiB2 (gSiB)
                      by W. Kim and Agatashi
 
 * ===================================================
 *
 */ 

#include <stdio.h>:これは後に説明.ま,おまじないのようなもの.

void main(){から「}」まで:Cでは「{」から「}」の間を一つの「ブロック」と呼ぶ.このブロックはいくらでも入れ子が可能.そして,後ろにカッコがついた名前は関数の名前とみなされる.この行は,これからmainという名前の関数の定義が始まることを意味する.その定義は,main()のすぐ後にある「{」から,対応する「}」まで.

そして,voidというのは関数main()が返す変数の型を意味する.実はvoidとは「何も値を返さない」という意味.このほかに型としてはint(整数型),float(単精度実数型),double(倍精度実数型),char(文字)などがある.

すべてのCプログラムは,かならずmain()という関数が一つだけ必要.プログラムの実行は,この関数から始まる.

printf("Hello, World!\n");このプログラムのハイライト.printf()は,上述のように関数の名前を表す.これは組み込み関数の一つで,カッコ内の内容を(もし指定があれば指定の形式で)書き出す関数である.

FORTRANやPascal出身者の方へ:Cではサブルーチンと関数を区別しない.ちょっと面食らうかもしれない.

fprintf()のカッコの中には,任意個の値を入れられる(関数呼び出しにおいて,カッコの中に入れる値のことを引数(ヒキスウ)ないしParameterという.以後「引数」)が,最初の引数だけは特別な意味をもつ.最初の引数は,表示形式を表す文字列が入るのである.実は文字列を一つだけ表示する場合にはこの最初の引数にそのままその文字列を与えればよい.上記ではそうしている.

文字列の一番最後に\nという文字がついている.これは,エスケープシークエンスというもので,通常の文字では表しにくい特殊な記号を表すためのおまじないである.\nとは「改行」を表す.他に「\t」=水平タブ,「\0」=ヌル文字(後ででてくる)などがある.

Cでは,物理的な行の終わりはプログラムとしての行の終わりを意味しない.行の終わりには,かならず「;」(セミコロン)をつける.これをつけないで,かなり複雑な内容の行を複数行に渡って書くことも当然可能.


コンパイラを動かそう:C編

では,上記のソースコードが完成し,ex1.cという名前で保存されたとしよう.コマンドラインから(あるいはmuleのshellバッファから),次のように入力する

% cc ex1.c

(下線部はユーザの入力.以下同様)

もしエラーがなければ,何も言ってこないで終了(UNIXは伝統的に,こういう無愛想さがある).もし何か言ってくれば,ソースコードのどこかがおかしいか,ex1.cが見つからないかccという文字を打ち間違えている.

さて,無事上記が実行できたところで,ディレクトリの中身を確認しよう.

% dir
total 18
drwxr-xr-x   2 agata    mulabo       512 Dec 10 15:40 ./
drwxr-xr-x   3 agata    mulabo       512 Dec 10 15:15 ../
-rwxr-xr-x   1 agata    mulabo      5328 Dec 10 15:40 a.out*
-rw-r--r--   1 agata    mulabo        84 Dec 10 15:16 ex1.c

こんな感じになっているはず.したから二行目のa.outに注目.これが,コマンドccによってファイルex1.cから生成された機械語が入った「製品」ファイルである.(a.outという名前が不恰好だと思ったら替えることもできる,というか普通は変える.方法は後で.)

a.outのパーミッションが「-rwxr-xr-x」つまり実行可能になっていること(それに応じて,dirの実行結果でa.outの後ろに「*」がついている)ことに注意しよう.このファイルはそのまま実行可能である.というわけで,実行!

% ./a.out
Hello, World!

無事,表示されただろうか?

例題1c:自己紹介を表示させてみよう.


ようこそコンパイル言語へ:Fortran90編

こちらもHello,Worldで行こう.ただしその前にFortranのバージョンについて説明しておく必要がある.現在,Fortranには大まかに行って二つのバージョンが流通している.Fortan77Fortran90である.

Fortran77は,コンピュータ普及の黎明期のころから使われてきたバージョンで,特に科学技術計算に膨大な実績を持つ.ただし,文字数制約やコード規則があまりに厳しすぎてその点は不評だった(Fortan77が出来た当時はハードウェア性能が高くなく,またプログラマ人口が少なく,このほうが都合が良かったのだが).また,メモリを効率的に操作するためのポインタやメモリ動的割り当て等の機能がないなどユーザに対して優しくなく,「maxのパワーはものすごいがとてつもなく頑固で意地悪」という定評ができてしまった.

Fortran90は,Fortran77の改良版であるが,その中身はほとんど違う言語といってもいいくらい異なっている.ただし,Fortran90用のコンパイラは,実はFortran77のソースコードもコンパイルできる.文字数制約,コーディング規則などはFortran77に比べてかなり自由になった.また,モジュール・オーバーライド・ポインタ・動的メモリ割り当てなど,Cなどの他言語から取り込んだ新機能がユーザの利便性を格段に向上させた.

本講座では,主にFortran90を取り扱う.

こういう内容のファイルをex1.f90の名前で保存しよう

!
! Example 1
!

program ex1
      implicit none

      print *, 'Hello, World!'

end program ex1

では,説明.

1〜3行目はコメント行.「!」が現れると,その後行末までコメントとみなされる.複数行にわたるコメントを書きたければ,各行に「!」を書く必要がある.

program ex1:このプログラムの名前を決め,その開始を宣言する.宣言は,対応する「end」文まで続く.

プログラムには必ず一つprogramブロックが必要,と最初は覚えてください(省略可能ではあるが…).

implicit none:これはオマジナイ,というか実はこの例では必要ないのだけど,いつもつける習慣をつけよう.意味は後述.

print *, 'Hello, World!'このプログラムではこちらがハイライト.printは,任意個の引数を取るコマンドで,Cのprintf()と同様に,最初の引数は表示フォーマットを決める.今回は特に指定しないので「*」が入っている.二番目の引数から後の値が順次表示される

Cとの違い:文字列はシングルクォートで囲むことが多い(じつはどちらでもよいのだが,古くからの習慣でシングルで書くほうが多い).

end program ex1:program文で始まったブロックの終わりを宣言する.実はprogram ex1の部分は省略してもよいのだけど,ここではつけるように習慣づけよう.邪魔にはならないし.

Fortranでは,物理的な行の終わりはプログラムとしての行の終わりを意味する.行の終わりに何か特別な記号をつける必要はない.ただし逆に,複数行にわたる行を書きたいときには,行の最後に「&」をつける.


コンパイラを動かそう:Fortran編

ex1.f90が完成したとしよう.コマンドラインから,次のように入力する

% f90 ex1.f90

ディレクトリの中身を確認しよう.

% dir
drwxr-xr-x   2 agata    mulabo       512 Dec 10 16:12 ./
drwxr-xr-x   4 agata    mulabo       512 Dec 10 16:10 ../
-rwxr-xr-x   1 agata    mulabo    312320 Dec 10 16:12 a.out*
-rw-r--r--   1 agata    mulabo        98 Dec 10 16:12 ex1.f90
-rw-r--r--   1 agata    mulabo        53 Dec 10 16:11 ex1.f90~

ここでも,a.outはコマンドf90によってファイルex1.f90から生成されたファイルである.

a.outを実行してみよう.

% ./a.out
 Hello, World!

例題1f:自己紹介を表示させてみよう.


AGATASHI