Bluepostech

プログラムとかはこっち

このご時世にfortranを触ってきて思ったこと

注意:かなり個人的な愚痴がメインです。

fortranという言語をめぐる現状

fortranという言語を考えてみる

最初に言っておくが、fortranは決して「どうしようもなく使えない過去の遺物」というわけではない。並列計算ライブラリであるMPIやopenMPはCやfortranでの使用をデフォルトとしているし、理論シミュレーション業界ではfortranはCと並んでデファクトスタンダードであり続けている。Cのポインタ機能は初心者にはあまりに強すぎてしばしばセグフォで学習意欲をそいでしまうのに対して、fortranではそのようなことも少ない*1。コードの見栄えもセミコロンが必要なCより見やすい。

ただし、歴史の古いfortranという言語が情報化社会と呼ばれて久しい現代ではそれだけでは不十分であることも確かだ。何百本もの真空管からなるコンピュータをパンチカードで動かしていた時代からありつづけるfortranという言語が、複数のCPUやGPUを持つコンピュータを誰もが持つようになった現代でそのまま通用するわけがない。

もちろんfortranという言語も、モジュールプログラミングやオブジェクト指向といった新しい機能を取り入れてFORTRAN77からfortran2008へと進化してきた。しかしfortranが指向しているのは、fortranが生まれた時代にコンピュータが期待された唯一の役割である「数値計算」だけだ。

それに対して現代はどうだろうか。ありとあらゆる仕事がコンピュータに任されるようになり、マルチメディア処理のようにコンピュータ自身が生み出した分野もある。はっきり言ってしまうとfortranという言語はそういった処理がほとんどできないかきわめて煩雑な手続きが必要になる。

fortranのみで「プログラミング経験あり」と言うと笑われる

ここからは僕の実経験の話だ。

僕は大学に入ってからプログラミングを始めた。物理系の1回生のときに講義で初めてFORTRAN(全部大文字で固定形式でコメントアウトをcでやるやつ!)に触れたのが初めだった。2回生では違う先生が担当してfortran(幸いなことに小文字になって自由形式になった)を学んだ。

僕の親戚には情報系の職業についている人が複数いる。親戚同士の集まりで大学の講義でプログラミングをやっているという話題になって、言語でfortranをやっていることを言うと、こう言われた。

fortranなんかやってんの?今時COBOLのほうがまだ役に立つぞ。

今でも、全くその通りだと思う。COBOLも歴史が古いが、幸か不幸かいまだにCOBOLが基幹システムに使われたまま更新されていない例もあって、そういう意味では需要がある言語ではある。それに対してfortranは研究にしかほぼ使われない。そもそもCOBOLfortranよりもやるべき言語はたくさんある。

言われたとき、別に衝撃を受けたとかそういうわけではなく、「やっぱりそうか」としか思わなかった。というのも自分でもある程度授業以外でもfortranを触ってみたが、どうもピンとこないのだ。同時期に触っていたVBAでは家計簿をまとめるマクロを実装することができてすごいとなったのに、当時はfortranでは何も成果物ができなった。

非情報系にはモダンなプログラミングを教えれる人がいない

それなのに、現代の大学ではなぜいまだにfortranが教えられているのか。答えは単純だ。教えられる人間がいないのだ

情報系にはプログラミングができる人が集まる。当然だ。物理系には物理ができる人が集まる。それも当然だ。だから、物理系にはプログラミングができる人がいるとは限らない。

物理系の人はプログラミングを「道具だ」と言う。その上「道具」はとりあえず使えればそれでよいと考えている人が多い。たとえその道具や使い方が30年以上前の手法であっても、だ。

先に述べた通り、fortranオブジェクト指向のような新たな手法を取り入れながら進化を続けている。しかしモジュールプログラミングもオブジェクト指向も実行速度が劇的に上がったり何か新たな計算ができるようになるわけではない*2。使えればいい人にとっては性能が上がるわけでもないことをわざわざ勉強しようと思わない。

しかも物理系にいる人は物理がやりたい人で、プログラミングがやりたい人ではない。中には機械音痴で仕方なくプログラミングをやってる人もいる。そんな人が手続き型プログラミングをやっとこさ覚えて、それがちゃんと動くのに、大して性能が上がるわけでもない機能をわざわざ覚えようとするわけがない。無論そのような人間は情報系では淘汰される。しかしここは物理系だ。物理で功績を上げれば地位につける。それ自体は当たり前すぎることだ。

結果、物理系では教員でも、たとえばオブジェクト指向が何なのかよくわかっていない人が多い。そのような人が片手間でプログラミングの講義を持つのだから、内容も半期かけてやっと手続き型言語をやって、余った時間は重箱の隅をつつくような、自分で書いていくうちに調べればいいようなことに終始する。そんな人が、もし「プログラミングできます」と言って本当のプロの前に出て行ったらどうなるか、想像に難くない。

もちろん、手続き型プログラミングの経験も重要だ。オブジェクト指向型プログラムも結局手続き型で書いたメソッドやら関数の寄せ集めだから、手続き型プログラミングはその基礎となる。ただし基礎練ばかりしていても試合には勝てない。

fortranを学んだ学生がやるべきこと

ここまで、fortranをやっても不十分だということをつらつらと書いてきた。それで「ここまでfortranをやってきたんだけど、どうすればいいんだ」という人もいるかもしれない。

答えは簡単だ。「fortran以外もやってみる」だけだ。

「文法が簡単だから」というのも講義でfortranが使われる建前の一つになっている。しかし、世の中fortranと同じくらいかそれより簡単な言語もたくさんある。それにループや条件分岐といった基本的な構造はほとんどのプログラミング言語に共通だ*3。プログラミングをやるために入れた仮想端末やターミナルも、Emacsvimも他の言語でも多くの場合そのまま使える。

fortranでは思っていた成果物が作れずがっかりした」という人もいるかもしれない。fortranは味気ない数値計算しかできないのだからそれも当然だ。windowsで別ウィンドウでなんかかっこいいのを出したいならC#だし、Androidアプリを作りたいならJavaだ。プログラミング言語にはこんな風に用途に応じた使い分けがある。そういう意味でも、いろいろできるようになりたいならいろいろ手を出さないといけない。Pythonなんていうやろうと思ったら何でもできるくらいライブラリがある言語もある。

それでもインストールするのが面倒くさいというのもあるかもしれない。どれだけ経験を積んでも環境構築は面倒なものだ。そういう人でもLinuxを立ち上げればシェルスクリプトはすぐに使えるし、ExcelでAlt + F11でVBAがすぐ使えるようになる。そういう入口から入っても構わない。

大事なのは、「比べる」ということだ。基本的な事項という意味でfortranで学んだものが他の言語に生きるだろうし、逆に他の言語で学んだものがfortranで生きることもあるかもしれない。実際、オブジェクト指向の概念はfortranにもあるがPythonのほうが分かりやすい。そうすることでfortranでは気づかなかったプログラミングの面白さや、fortranの他の言語と比べてもよいところにも気づけるかもしれない。

まとめ

結論として、「プログラミングをやるならfortranだけじゃダメだ」ということだ。

「俺はプログラミングに関わるつもりがないんだ」というなら別にそれでもいい。でもわざわざこのページにアクセスして、しかもおっさんの愚痴みたいな駄文をここまで読んだ人は、そうではないだろうと思う。この先fortranしかいじる予定がないとしても、別の言語もやってみるべきだ。その経験はきっと役に立つ。

*1:ただしfortranでもセグフォが出ることはあるが、fortranでポインタを使うことは少ないのでポインタ由来のセグフォは意図して起こそうとしない限りほぼ起こらない。

*2:僕は試していないのだが、実は実行速度も上がるのかもしれない。ただし革命的によくなるわけでもない。

*3:ただし関数型言語は構造が大きく違う

fortranの静的ライブラリと問題点

qiita.com

namelistをなかなか読み込まないときの裏技

qiita.com