ホーム > 公共経済のシミュレーション分析 > 第一部 プログラミングの基礎
第一部 プログラミングの基礎
2000年
東洋大学 経済学部 専任講師(執筆当時) 上村敏之
上にフレームが出ない場合はこちらをクリック
【第一部】ではあなたがFortran90(フォートラン)についてほとんど知識がない場合に備えて、Fortran90によるプログラミングの基礎を大まかに解説する。【第二部】と【第三部】はFortran文法の知識を前提として展開されるため、初心者には難しいと思われる。そこで、少なくとも数値解析で経済学を分析するために最低限必要だと考えられるFortran文法と知識について【第一部】でまとめることにする。ただし、Fortran文法の十分知識がある方は【第一部】の内容をとばしてもよい。また、そうでなくとも知識の確認をしたい方は【第一部】の内容を復習することを勧める。
また、Fortran文法の知識を得るよりもすぐに数値解析がどのようなものかを体験できるよう、【第二部】と【第三部】で書かれたFortranプログラムをVisual Basic
for Applications(VBA:ビジュアル・ベーシック)に移植し、【第四部】にてダウンロードできるようになっている。【第四部】のアプリケーションソフトで数値解析の醍醐味を先に味わうことも可能である。ただし、VBAも結局はコンピュータ言語であるから、アプリケーションを自分自身で作成するためにはFortran、Basic、Cなどのコンピュータ言語を最低限一つでもマスターする必要がある。
【第一部】の補足では、Fortranプログラムの作成から実行までの手順について、私自身の方法を提供した。この方法が最適であるとは考えられないが、作業効率の良さからはかなり良い手順であると思っている。参考になれば幸いである。
1.Fortranについて
さて、Fortranについて少しばかりお話をしよう。Fortranは1950年代にプログラミング言語として開発された。規格化されたFortranは1966年にFortran66としてまとめられた。その後、Fortran77そしてFortran90に拡張と標準化が行われ、現在の国際標準はFortran95である(たぶん・・・あまり自信なし)。
ここでは、筆者の知識不足から最新の文法ではなく、Fortran90文法にしたがったプログラミング技術を展開する。ただし、90から95への移行で根本的な文法が変わったわけではない。また、Fortran90文法でも現在のFortranコンパイラを使うことで32ビットアプリケーションを作成できる。
2.上から下へ 右から左へ
以降ではプログラミングについて実際の例を挙げながら解説してゆこう。「上から下へ 右から左へ」という言葉は、プログラムを読むときの基本である。次のプログラムを例にして説明しよう。
(プログラム例1)
DOUBLE PRECISION Y,X,A,B
REAL C,D,E,F,G
INTEGER H
X=1.5
Y=2.3
A=X+Y
B=X-Y
C=X*Y
D=X/Y
E=X**Y
F=A*(B+C)
G=A*B+C
H=2
WRITE(*,*) X,Y
WRITE(*,*) A,B,C
WRITE(*,*) D,E,F
WRITE(*,*) G,H
END
!はコメント文と呼ばれ、!が行の最初につく場合はFortranは命令を無視する。DOUBLE
PRECISION、REAL、INTEGERは変数の型を宣言する命令である。具体的には、DOUBLE
PRECISIONは倍精度実数型、REALは単精度実数型、INTEGERは整数型を意味する。つまり、変数Y、X、A、Bは倍精度実数型、変数C、D、E、F、Gは単精度実数型、変数Hは整数型ということになる。ちなみに倍精度実数型は16桁、単精度実数型は8桁、整数型は文字通り整数の変数を扱うことになる。「上から下へ」であるから、最初にプログラムで用いるすべての変数の型を最初に定義する必要がある。
次に、XとYの変数に具体的な値を与えている。ただし、Hについては整数型なので整数2を与えている。そして、AからGはXとYで算術演算をすることで計算される値である。プログラムでは、代入文が計算に使われる。すなわち、AはX+Yで代入される値である。これが「右から左へ」という意味である。また、算術演算の記号は以下の約束にしたがっている。
+:加法 -:減法 *:乗法 /:除法 **:べき法
通常の計算式と同様に、( )内は先に計算される。つまり、FとGとでは、計算結果が異なることは言うまでもないであろう。そして、WRITE(*,*)は出力命令である。(*,*)は出力方法を制御するためのパラメータである。ここでは(*,*)はモニターに出力するパラメータであることを示すにとどめよう。最後にENDはプログラムの終了を意味している。
このプログラムを実行して得られる結果は以下の通りである。ただし、実行方法については補足で簡単に述べる。
1.500000000000000 2.299999952316284
3.799999952316284 -7.999999523162842E-001
3.450000
6.521739E-01 2.541031 10.070000
4.100000E-01 2
すぐにおわかりだと思うが、X、Y、A、Bは倍精度実数型なので16桁表示である。ただし、E-001は10-1を意味しているので、Bの値は-0.8である。C、D、E、F、Gは単精度実数型なので8桁表示である。最後に、Hは整数型なので小数点以下が表示されない。
このように、プログラムは「上から下へ・右から左へ」という約束で読み書きをする必要がある。倍精度と単精度では倍精度の方が精度が高いため、以下では倍精度実数型を基本としよう。また、Fortranにおいて英文字の大文字と小文字の区別はなく、どちらでプログラムを書いても構わない。
3.DO-END DO文による繰り返し
以下ではプログラミングによる数値解析でもっとも利用価値がある繰り返しと条件判断について述べよう。まず、繰り返しである。これも以下のプログラムを例にして説明しよう。
(プログラム例2)
DOUBLE PRECISION X(1:10),Y(1:10)
INTEGER I
DO I=1,10
X(I)=2+I
Y(I)=2*X(I)
WRITE(*,*) I,X(I),Y(I)
END DO
END
倍精度実数型で定義されるXとYであるが、(1:10)となっているのは次のような意味である。つまり、Xを例にすると、Xという倍精度実数型の変数が10個存在してこれらに添字がついているのである。したがって、X1,X2,X3,・・・,X10ということである。Yについても同様である。これを配列宣言という。
さて、DOとEND DOで一組の命令であり、整数Iが1から10まで変化してDO-END
DOの中で計算式が繰り返されると言う意味である。つまり、最初I=1からスタートするのでX(1)=2+1、Y(1)=2×3=6となる。次にI=2なのでX(2)=2+2=4、Y(2)=2×4=8となる。以下は同じような作業を繰り返す。
このプログラムを実行した結果は以下の通りである。
1 3.000000000000000 6.000000000000000
2 4.000000000000000 8.000000000000000
3 5.000000000000000 10.000000000000000
4 6.000000000000000 12.000000000000000
5 7.000000000000000 14.000000000000000
6 8.000000000000000 16.000000000000000
7 9.000000000000000 18.000000000000000
8 10.000000000000000 20.000000000000000
9 11.000000000000000 22.000000000000000
10 12.000000000000000 24.000000000000000
Iは整数型なので小数点以下は省略、XとYは倍精度実数型であるので16桁表示である。また、DO-END
DOで繰り返す変数はIのように整数型でなければならない。
4.IF-END IF文による条件判断
次に、条件判断について述べよう。以下のプログラム例をもとに解説をしよう。
(プログラム例3)
DOUBLE PRECISION X(1:10)
INTEGER I
DO I=1,10
X(I)=I**I
WRITE(*,*) I,X(I)
IF (X(I).GT.100) THEN
GOTO 100
END IF
END DO
100 END
IFとEND IFで一つの命令である。IF (X(I).GT.100)
THENは「もしX(I)が100を越えれば」という意味である。.GT.は>を意味する。このような関係演算子は以下のようなものがある。
.EQ.:等しい(=) .NE.:等しくない(≠)
.LT.:小さい(<) .LE.:小さいか等しい(≦)
.GT.:大きい(>) .GE.:大きいか等しい(≧)
また、IF-THENで条件を満たした場合に実行したい命令が一行で表示できる場合、上記の場合もそうであるが、IF
(X(I).GT.100) GOTO 100というようにTHENとEND
IFを省略して一行にまとめることもできる。そして、IF
(X(I).GT.100.AND.X(I).LT.50) THENのように.AND.のような論理演算子でつなぐこともある。論理演算子には以下のようなものがある。
.NOT.:否定 .AND.:論理積 .OR.:論理和
さて、話を元に戻そう。IF-THENで条件が合致すれば、GOTO
100という命令を実行することになる。GOTOはジャンプせよという意味で、100というラベルの行へ飛ぶように命令している。
このプログラムを実行した結果は以下の通りである。
1 1.000000000000000
2 4.000000000000000
3 27.000000000000000
4 256.000000000000000
I=1のときはX(1)=11=1、I=2のときはX(2)=22=4、I=3のときはX(3)=33=27、I=4のときはX(4)=44=256である。I=4でX(4)>100の条件を満たすので、GOTO
100となりENDでプログラムが終了する。
5.サブルーチン
サブルーチンという概念は、プログラムを複数個に分解したときに生じるものである。メインルーチンと呼ばれるプログラムがあり、そこからサブルーチンへ変数をとばして計算を行って、再びメインルーチンへ計算結果を返す。つまり、サブルーチンとは計算上の便宜のために分離されたプログラムである。比較的よく利用するプログラムをサブルーチンにすることで、他の多くのプログラムとつなげることができて便利である。いまいちわからない方も、次のプログラムの具体例からイメージをつかんでいただきたい。
(プログラム例4)
DOUBLE PRECISION X,Y
X=0.7
CALL K(X,Y)
WRITE(*,*) X,Y
END
SUBROUTINE K(A,B)
DOUBLE PRECISION A,B
B=A*2
END
上のブロックがメインルーチン、下のブロックがサブルーチンである。メインでもサブでも各ルーチンにおいて利用する変数は定義する必要がある。というのは、各ルーチンは独立したプログラムなのである。また、ここのサブルーチンには、Kという名前が付けられている。この名前は命令語と同じでなければ自由につけても構わない。
さて、プログラムの流れをみてゆこう。X=0.7で変数Xに値を代入する。次に、CALL
K(X,Y)でサブルーチンKに変数Xをとばす。ここで、CALL
K(X,Y)とSUBTOUTINE K(A,B)の(X,Y)と(A,B)は対応しており、メインルーチンのXはサブルーチンのA、メインルーチンのYはサブルーチンのBに対応する。つまり、サブルーチンKでは変数Xを変数Aと見なして計算を行う。
サブルーチン内でB=A×2=0.7×2=1.4が計算され、ENDでサブルーチンが終わる。その後にメインルーチンに戻る。サブルーチンでB=1.4であったが、メインルーチンではB=Yとして扱われる。このプログラムを実行した結果は以下の通りである。
6.999999880790710E-001 1.399999976158142
以上より、サブルーチンの役割がおわかりになったと思う。また、よく似た技術として関数定義がある。これは、よく使う関数を定義してサブルーチンのように定式化しておく方法であるが、【第二部】において具体例が示されるのでここでは省略しよう。
補足 Fortranプログラムの作成から実行まで
ここではFortranプログラムの作成から実行の方法について簡単に補足する。OSがWindowsならば、Fortranをコンピュータにインストールしてすぐにでもアプリケーションを起動できる。この場合、プログラムを書くためのエディタがあらかじめソフトに組み込まれているため、ヘルプを参照すれば誰でも難なくプログラムの記述から実行へ進むことができる。ただし、ここではOSがWindowsであること前提にしている。
しかし、私自身は上記の方法を採用していない。というのは、アプリケーションが重いこと、コンパイル(後述する)するときに実行ファイル以外のファイルを作成してしまうこと、などの理由からである。ただし、デバッグ(バグと呼ばれるプログラム・ミスを発見すること)に関してはアプリケーションに強力なデバッガ機能が付いているため、初級者に対してはこちらを勧めるが、私はデバッガについてもよほどのことがない限り、付属のアプリケーションを使うことがない。
次の方法は私自身が採用しているFortranプログラムの作成から実行方法を箇条書きにした。個々人で好き嫌いがあるので、この方法を強く勧めることはしないが、慣れてくると最も簡潔で作業スピードが速い方法であると確信している。
T.準備作業
1.作業領域はデスクトップとする。つまり、「C:\WINDOWS\デスクトップ>」である。他の作業フォルダでも構わないが、私は作業中のファイルはすべてデスクトップにするというのが癖なのでそのように設定する。
2.「スタート」「プログラム(P)」「MS-DOS
プロンプト」を開き、「ツールバー」の「プロパティ」「プログラム」における「作業ディレクトリ」を「C:\windows」から「C:\windows\デスクトップ」に書き換える。ただし、「デスクトップ」は半角カタカナにすること。
3.いちいち2の手続きをすることは面倒なので、C:\windows内の「Command.com」を選択し、右クリックでデスクトップ領域までドラッグ・アンド・ドロップしよう。「ショートカットの作成」を選択しすれば、「MS-DOS
プロンプトへのショートカット」が作成できる。これで2の手続きでプロパティを書き換えればよい。
U.プログラムの作成
1.プログラムの作成にはテキスト・エディタを用いる。もちろんWindowに付属している「メモ帳」やワープロ・ソフトでも良いが、やはり市販されているエディタがプログラムを書くのには都合がよい。私はMifes
for Windowsを愛用しているが、Mifesはキーボード・マクロを利用することで単純作業をボタン一つの操作で手軽にできるのが大変よい。
2.エディタによって作成されたFortranプログラムは「C:\WINDOWS\デスクトップ>」に保存する。保存の際の拡張子は、Fortran90ならば「F90」、Fortran77ならば「FOR」である(大文字と小文字の区別はない)。ここではファイル名を「UEMURA.F90」として説明する。
V.コンパイルの方法
1.コンパイルとはテキスト・ファイルであるプログラムから実行ファイル(拡張子EXE)を作成することである。
2.MS-DOS プロンプトでいわゆるDOS窓を開き、プロンプトが「C:\WINDOWS\デスクトップ>」であることを確認する。
3.「C:\WINDOWS\デスクトップ>FL32 UEMURA.F90」を入力してENTERし、プログラム・エラーがなければ、デスクトップ領域に「UEMURA.EXE」が作成される。
W.プログラムの実行
「C:\WINDOWS\デスクトップ>UEMURA.EXE」を入力(.EXEは省略できる)してENTERすることでプログラムを実行できる。
X.作業の一層の効率化のために
私の性格はせっかちなので、より速く作業をしたいと思っている。コンパイルする際に「FL32」と入力することさえ面倒くさい。そこで、「F.BAT」というバッチファイルをテキストで作成し、このファイルには「FL32
%1」と1行だけプログラムを書いておく。そして、「F.BAT」をCドライブのルートである「C\」に保存する。同じく「C:\」にあるAUTOEXEC.BATを開き、「PATH=・・・」の行の最後に「;C:\」を追加する。いわゆる「パスを通す」という作業である。「F.BAT」のパスが通っていれば別にCルートでなくても構わない。これらの作業が終わればいったんコンピュータを再起動する。(しかし、AUTOEXEC.BATの書き換えについては、WindowsNT/2000の場合はどうもできないような感じです。どこを書き換えればPATHを通せるのか、知っている人がいれば教えてください・・・・・)
このように設定すれば、コンパイルの時に「C:\WINDOWS\デスクトップ>F
UEMURA.F90」とすることですぐに実行ファイルを作成してくれる。ひょっとすると、「FL32ぐらいちゃんと打てよ」と思いたくなるかも知れないが、プログラムのテストを何回もテストする際にはかなりの作業の効率化が図れる。また、この方法は他のアプリケーションでも使える。例えば、計量経済ソフトTSPをMS-DOSで実行する際に「TSP
ファイル名」と入力することになるが、同様の方法で「T
ファイル名」のように簡略化できる。
以上で基本的なプログラミング技術についての解説は終了した。ここまでの基礎的な知識があれば、【第二部】と【第三部】におけるプログラムを読むことは可能であろう。ただし、出力(ファイル)処理の方法などについては言及しなかった。より高度な技術については、Fortranの参考書などで自ら参照されたい。