20数年前の話ですが、情報処理技術者2種試験に合格しました。その時、プログラミング言語は Fortran を選択しました。

が、今では「Fortran の書き方すら忘れた」状態でした。"Fortran" が "Formula translation" の略だった、ということ程度しか記憶していません。

実際には Fortran の前に BASIC や C を学んではいました。ただ少なくとも当時の情報処理技術者試験はプログラミング言語実習でこれらの言語を選択することはできませんでした。苦渋の選択として大学で学んだ Fortran を選んだのでした(ちなみに1種の時は Pascal と CASL です)。

そんな Fortran を20数年ぶりに使ってみました。せっかくなので、単なる "Hello World" だけではなく、(当時はこんな使い方すると思ってなかった)ウェブの CGI 言語として Fortran が使えないか挑戦してみました。環境はいつもの CentOS 6 です。


まずはコンパイラのインストールです(よく考えたら Fortran のインストール自体初めてかも・・)。CentOS の Fortran としてはいくつか選択肢がありますが、個人的な好みの理由で "g77" という GNU のコンパイラを使うことにします。インストールは yum でサクッと:
# yum install gcc* compat-gcc*

これで g77 という Fortran コンパイラが導入されているはずです。"--help" オプションを付けて実行するとオンラインヘルプが表示されます:
# g77 --help
使い方: g77 [オプション] ファイル...
オプション:
  -pass-exit-codes         フェーズからのエラーコードの最大値を exit
                               コードとして返す
  --help                   このヘルプ情報を表示
  --target-help            ターゲット固有のコマンドラインオプションを表示
   :
   :

まずは "Hello World" に(再)挑戦します。ソースはこんな感じの hello.f を用意しました。各行の最初の6文字はラベル用にリザーブされているので使いません(各行の最初の6文字は半角スペースです):
      program hello
      print *, 'Hello World!'
      end program hello

これをコンパイルします(コンパイル結果を hello という名前で出力するように指定しています):
# g77 hello.f -o hello

で、実行するとこんな感じ(青字が出力結果)。期待通りに動いてます:
# ./hello
 Hello World!
#


ここまでは簡単、問題はここから。結論を先に言うと、Fortran で CGI を実現してみようとすると結構ハマります(苦笑)。CGI の実現のため、HTTPD サーバーとして Apache HTTP サーバーをあらかじめ導入しておきます:
# yum install httpd
# /etc/init.d/httpd start

CGI を動かしてみるべく、まずはこんな感じの入力フォームを用意してみました。デフォルト状態であれば /var/www/html/ 以下に(例えば)test1.html という名前で作成します:
<html>
<form method="post" action="./cgi-bin/test1.cgi">
<input name="val1" type="text" maxlength="20"/>
<input name="val2" type="text" maxlength="20"/>
<input type="submit" value="SUBMIT"/>
</form>
</html>

このページを普通にブラウザから開くとこんな感じになります:
2015120501


そして、このページから入力パラメータを受け取って処理する CGI プログラムを用意します。CGI プログラムは /var/www/cgi-bin/ で動くので、このディレクトリに test1.f という名前の以下の様な Fortran プログラムを用意します。内容は文字列変数 a に外部からポストされるデータを格納して、その格納内容を表示する、というものです:
      character*255 a
      write(*,100)
100   format('Content-type: text/html'//)
      read(*,*) a
      write(*,*) '<html>'
      write(*,*) 'test1.cgi が受け取ったパラメータ:<br/>'
      write(*,'(a72)') a
      write(*,*) '</html>'
      stop
      end

このプログラムをコンパイルして、test1.cgi という名前でビルドしておきます(ビルド結果は /var/www/cgi-bin/test1.cgi にある状態):
# g77 test1.f -o test1.cgi


では実際にパラメータを入力して使ってみます。先程の画面に2つのパラメータを入力して、SUBMIT ボタンをクリックしてみます:
2015120502


結果はこのようになります:
2015120503


つまり、2つのフィールドに与えた内容を受け取って val1=(最初の値)&val2=(2番目の値) という一般的な CGI のフォーマットでデータが POST され、それを Fortran のプログラム内の変数 a が受け取れている、ということになります。なんとか Fortran で CGI が実現できました!

でもまだまだ充分とは言えません。例えばパラメータで日本語を入力して SUBMIT した場合・・・
2015120504


(他の言語でも同様ですが)変数 a には当然エンコードされた結果が入ります:
2015120505


ということはこの内容をデコードしないと日本語文字列に戻らないわけです。ただ他の言語と異なり、ウェブで使われることは想定されていないであろう Fortran には、この文字デコードですら結構大変です。

更に、連想配列など持たない Fortran では、このパラメータの解析だけでも結構大変だったりします。"&" で split して、更に split した結果の配列を "=" で split して・・・って、split 関数があるわけではないので、そういう所から自作する必要がありそうです。うわあ、面倒くさそう・・・



というわけで、実用にはまだほど遠い環境ではありますが、とりあえず CGI で Fortran を使う、という所までは実現できました。Fortran でコンパイルした結果だけがあればいいので、理論上は Bluemix でも(Static HTML の Buildpack を使えば)動かせるんじゃないのかな? まあそれはいずれやってみます。