プログラム言語探訪 FORTRAN?Fortran?
作者はコの業界の人なのでプログラムというのはなんて言うか、身近にある人、です。そして、どういう因果か、これまでにいろいろなプログラム言語に触れてきていて、世間で「プログラムってこういう感じ?」とか言われているようなことを「確かにその通り」と思ったり、「いやいや、違うだろ」と思ったりもしています。そんなプログラム言語のあれこれを紹介するという、実にどうでもいい、いつも通りの駄文がこれ、です。
なお、言語の選定基準は作者が読み書きできる/できた言語に限定しています。「できた」は最近全然触っていない、触れる環境が無い、というものばかりなので、「最近は違うぜ」というのもあるかもしれないけど、そもそもが独断と偏見だけで書く文章なので、スルー推奨。
また、この駄文にはよくある「ブラック企業のプログラマが異世界に行って、プログラム言語みたいな魔法を解析して……」みたいな作品に対する問いかけもちょっとだけ。本当にその作者はプログラムわかってるのかな?みたいな。まあ……駄文であるので、その辺もスルー推奨。
ということで最初に取り上げる言語はFORTRANにしてみた……ところ、調べてみたら最近はFortranなんだと知って驚きました。
どういうことかというと、FORTRAN77まではFORTRANと書き、Fortran90以降はFortranと書くんだそうです。ややこしいけれど、77までと90以降では別物と言ってもいいほどに変わっているので、そういう風に区別するんだとか。
ちなみに作者が触れていたのはFORTRAN77。この言語、その名の通り1977年に制定されているのでおよそ五十年の歴史があるということになります。そしてFORTRAN自体の歴史は1957年に最初のコンパイラができたんだそうでさらに二十年遡る。もはや歴史が長すぎて何が何だか、という感じですね。
ちなみにFORTRANが世界で最初に作られたプログラム言語とされているのは有名ですけど、一部間違いがある、という意見もあったりします。FORTRANよりも前にプログラム言語を作ろうという取り組みがされていて、実際頑張っていたとか。まあ、よくある話ですね。ただ、キチンと文法、つまり言語としての仕様を確立させてコンパイラとしてリリースされたのはFORTRANが最初で間違いないらしい……です。
注目すべき点としては、この当時既に、現在の手続き型言語として一般的に用意されているようなプログラム構造が一通り備わっていたことでしょう。
IF文による条件分岐、FORなどを使用したループ文、といったところはもちろんのこと、
A=SIN(X)+COS(Y)+TAN(Z)
のような「代入文」という概念が確立されていますし、この例のようにSIN COS TANのような数学的な関数も用意されており、それまでは必要ならばプログラマが三角関数の計算プログラムを作成しなければならなかったという、とんでもなく大きな手間が低減され、純粋に必要な計算を構築することに専念できるようになった。それがFORTRANでした。
もちろん、何らかの理由で特殊な考慮をしたSINの計算が必要、という事であれば、MYSINなどという別名で似たような動作をする関数を独自に作って利用することもできるようになっていましたし、ソースコードを切り貼りしてやればプログラムを簡単に流用できるようになっていたのも広まった要因の一つでしょう。
何しろそれまでは全て機械語で記述していたため、プログラムを流用するのは結構大変だったのです。それがFORTRANの登場で、プログラムのコーディング量がだいたい二十分の一になったそうです。すごい、の一言です。
さて、このFORTRAN、科学技術計算用として開発され、実際にミサイルの弾道計算に使われたりロケットの姿勢制御に使われたりと大活躍だったのですが……一般向け、つまりパソコンに最初から組み込まれたりとかという意味では普及しませんでした。
理由としてはとても単純でした。
何しろ、できることが計算だけで、画面に絵を描いたりすることはできなかったので、面白みに欠けてたんですね。そして、1980年代頃、つまり一般向けのコンピュータが売られるようになった頃にはプログラム言語が現れてきて、FORTRAN77でやれる計算はだいたい他のプログラム言語でもやれる、という状況に。そりゃ使いませんって。
作者も大学で習ったときに思いましたもの。
「これ、FORTRANでないとダメなの?」
そう、その頃、C言語も勉強していた関係で「そっちの方が色々できそう?」と思っていましたし。あと、レポートで積分計算をやるプログラムを作ったら、計算精度のいいアルゴリズムがいまいちな結果を出してしまったりして、提出したら微妙な顔されたとか、どうもいい思い出が無いんですね。ということで、大学卒業後は一切触れる機会もなくなりました。
そんなわけで作者だけでなく、世間的にも廃れていくかと思われたFORTRANですが、Fortran90で息を吹き返しました。
命令は7カラム目から書くというルールの撤廃とか、配列に対する大幅な機能強化とか、色々強化されたそうです。
ソースのフリーフォーマット化はまあ、時代の流れと言えばそれまでですが、配列に対する機能強化はなかなかすさまじく、配列全体に対する演算をまとめて一気に処理してくれるとか。例えば、配列A、B、Cがあって(要素数はすべて同じ)
C=A+B
とやると……AとBの要素ごとに足してCの要素にするという、プログラムをガンガンやりこんでない人だとそのすごさが全く伝わってこない、とんでもない機能です。
汚い記述ですが、C言語で書くとこうなるんですよね、上のプログラムって。
/* 細かいところは気にするな */
for(i=0;i<MAX;i++)
c[i]=a[i]+b[i];
何がすごいって、二次元配列だったとしても同じ要領で、記述が一行に収まるというだけではなく、マルチスレッドで動いて一気に処理するようにしてしまうんだとか。
ということで、でかい配列で大量の計算をするようなプログラムを書くのに向いていて、スーパーコンピュータでは今でも現役……どころか一番使われている言語とも言われているんだそうな。
例が適切かどうか自信が無いのですが、コロナ禍の折、飛沫がこんなふうに飛びます、という計算をした映像を見た方も多いかと思いますが、これ、飛沫の動きを計算するロジックを用意して、パラメータをセットした配列を用意してマルチスレッドで一気に計算、とやったんじゃないかな、と推測。なお、間違っていても謝りません。推測なので。
そしてその後95、2003……と順調に仕様が更新され、C言語との相互運用ができるようになってたりとか、もう「全然違う言語なんじゃないの?」というくらい進化している。それがFortranなのです。
ちなみにPC向けCPUベンダで有名な会社がPC向けのFortranコンパイラを出しているのはコの業界ではそれなりに知られている……はず。当たり前だけど、CPUの命令を知り尽くした会社が作っているだけあって、結構性能はいいらしいです。普通に買うととんでもない金額なので手が出ません。一応、無償で環境が用意できるらしいのですが、面倒臭くて手は出してません。興味のある方は試してみると新しい扉が開けるかもしれませんよ?