導入
数値計算エンジニアとして古いFortranコードをメンテナンスしていると、見慣れない記号に出会うことがあります。特に、出力処理で使われる「$(ドル記号)」や「\(バックスラッシュ)」は、現代のプログラミングに慣れた方には不可欠な「非改行出力」を実現するためのレガシーな技術です。なぜこれが必要なのか、そして現代の環境でどう扱うべきかについて解説します。
基礎知識
Fortranなどの古いプログラミング言語における書式指定(FORMAT文)では、通常、出力の最後に自動的に改行コードが挿入されます。しかし、「計算の進捗状況を一行にまとめて表示したい」といった場合、この改行が邪魔になります。そこで、一部のコンパイラベンダー(主にDECやIBMなど)が独自に拡張したのが、書式指定子における「$」や「\」です。これらを指定することで、出力後にカーソルを改行させず、同じ行の続きに次の出力を書き込めるようになります。
実装/解決策
古いコードでは、FORMAT文の中にこれらの記号を組み込むことで制御を行っていました。例えば、`100 format(A, $)` と書けば、文字列を出力した後に改行せず、カーソルをその位置に留めます。
ただし、これらは標準規格外の記述であるため、現代のFortranでは、`ADVANCE=’NO’`という書式指定を利用するのが正攻法です。古い資産を移植する際は、これらのレガシーな記号を`ADVANCE=’NO’`に置き換えることが推奨されます。
サンプルプログラム
以下に、レガシーな記法と、現代の標準的な書き方の比較例を示します。
プログラム:
program output_test
! 現代的な書き方(推奨)
! ADVANCE=’NO’を使うことで改行を抑制します
write(, ‘(A)’, advance=’no’) “計算進捗: ”
write(, ‘(I2, A)’) 50, “%”
! レガシーな書き方(古い環境用)
! コンパイラによっては $ や \ が有効ですが、移植性は低いです
! write(, 100) “レガシーな出力: ”
! 100 format(A, $)
! write(, ‘(I2)’) 100
end program output_test
応用・注意点
この技術を使う際に陥りやすい罠が、「バッファリング」の問題です。OSやコンパイラの実装によっては、`ADVANCE=’NO’` を使っても、明示的にフラッシュ(`flush`文)を行わないと、画面に文字が表示されないことがあります。特にリアルタイムで進捗を表示したい場合は、出力後に `flush()` を呼び出すことを忘れないようにしましょう。また、`$` や `\` を含む古いコードを新しい環境(gfortranやifortなど)へ移行する際は、コンパイルオプションで拡張機能を有効にするか、前述の通り標準規格のコードへ書き換えるのが最も安全な解決策となります。

コメント