1.副プログラムはプログラムを2つに分ける副プログラムの話しに入る前に、プログラム単位について説明しておきたいと思います。プログラム単位というのは、ファイルの中身全体をプログラムの全体としたときに、その中身をいくつかに固まりに分割したものを言います。分割するといっても、好きなところで線引きできるというわけではなくて、ある決まりに沿って分割することになります。簡単にいってしまえば、プログラムの初めから(今までは書いてきませんでしたが、大抵はプログラムの始まりを表す言葉が示されています)、終わりを示すEND文までが一つのプログラム単位となります。今まではEND文は一つしかありませんでしたよね。それはつまり,プログラム単位が一つしかなかった、言い換えれば、いくつかのプログラム単位に分割せず、そのプログラムが全体のプログラムに等しいものであったことになります。これからは、今まで一つしか書かなかったプログラム単位を、2個や3個に分割してプログラムを作成していきたいと思います。その一つが、副プログラムという概念の導入です。いろいろしゃべって入れも分かりづらいので、下の例を見てください。意味は分からなくて当然です。見るだけ見てください。内容は高校の物理で習う、速度と距離を求めるプログラムです。一応確認しておくと、「v=v0+at」「x=v0t+(at^2)÷2」です(v=t秒後の速度、v0=動き始めの速度、a=加速度)。 program main real v0,a,t,v,x,kyori,sokudo print *,'初速度と加速度と経過秒を入力。' read *,v0,a,t v=sokudo(v0,a,t) x=kyori(v0,a,t) print *,v,x end program real function sokudo(v0,a,t) real v0,a,t sokudo=v0+a*t return end function real function kyori(v0,a,t) real v0,a,t kyori=v0*t+(a*t**2)/2.0 return end function どうでしょうか。見慣れない文が沢山ありますね。それになんだか複雑そうです。しかし、ここで参らないでください。じっくり文を理解しようとすれば、これが以下に単純な構造であるかを理解することができます。では、説明に入ります。 このプログラムは、空白行をはさんで、3つのプログラム単位に分かれています。確かにわかれているのは3つなのですが、プログラム単位の種類としては2種類です。一種類目のプログラム単位は最初の出、2種類目が2つ目と3つ目です。1つ目のは、「主プログラム」と呼ばれ、後2つは「副プログラム」と呼ばれます。主プログラムというのは、今まで私たちが前章までのプログラムを組むときに使っていたプログラム単位です。このプログラムでは今まで使っていなかった「PROGRAM」文が先頭に使用されているので少しぴんと来なかった人もいるかもしれませんが、その部分以外では今まで書いてきた内容と同じだと思います(STOP文は省略可能です)。 なぜPROGRAM文を挿入したかというと、このプログラムでは副プログラムが登場し、プログラム単位が並列するので、「このプログラム単位は何のプログラム単位なのか」をはっきりと明示するために、今回使用しました。この文は主プログラムであることを明示するものなので、これ以降は全ての主プログラムにおいてこの文を使用して以降と思います。使用しなくてもコンパイル・実行は可能なのですが、使用したほうが見返したときに分かりやすいと思うので、皆さんもぜひ使用してください。またIF文の時と同じように「字下げ」しているのもこの文を使用したからで、どこからそのプログラム単位の内容が始まるのかを見やすくするために行なっています。 2,3個目の「副プログラム」は、メインとなる主プログラムとは独立した存在に当たり、主・副プログラムでの変数の宣言や値の入力は、お互いに影響しあいません。つまり、副プログラムで主プログラムと同じ名前の変数を使用しても、それは単に同じ名前であるだけで、主プログラムでの同じ名前の変数とは「別物」になります(こういう性質を持つものを局所要素といいます)。ですから、副プログラムで変数を使用するときに主プログラムと同じ名前の場合であっても、型宣言が必要になるのです(11,17行目)。 副プログラムの概念図は下のようになっています。主プログラムから呼び出されると、呼び出された副プログラムは自分が行なう処理を行い、その結果を主プログラムに伝えます。再び主プログラムは自分の処理の続きに入り、再び副プログラムを呼び出す必要があると、その副プログラムを呼び出します。同じ副プログラムは何度でも呼び出すことができ、副プログラムから別の副プログラムを呼び出すことも可能です。 ![]() 副プログラムが使用されるわけは2つあります。一つ目は処理の分担による負担の減少です。大規模なプログラムを一つのプログラム単位にまとめて書いてしまうと、コンピュータが理解するのに時間がかかり、処理時間が大きくなってしまうからです。沢山ごちゃごちゃ書かれると処理していくのに苦労するというのは、人間と同じですね。もう一つは可読性や保守性を高めるためで、処理の内容とデータの扱いが別々の場所に書かれているほうが、そうでない場合よりも何をしているのかが分かりやすくなります。主プログラムにどういうデータを扱っているのか、ということと、そのデータに対してどういう処理の仕方をしているのか、ということをごちゃ混ぜにしていると、どこからが処理でどこからがデータの扱いなのかが分かりにくくなってしまいます。主プログラムにはデータ、副プログラムには処理の流れをというように、両者を区分してプログラムを書いていったほうが、非常に読み取りやすいプログラムとなるのです。また区分したほうが、うっかり間違ったないように書き換えてしまうことも少なくなり、プログラムの保守性が高まるのです。GOTO論争のダイクストラの、「データと処理は区分すべき。お互いの文脈にはなるべく干渉すべきではない」という考えにも沿っています。
|