見出し画像

いろいろな言語での書式指定子たち#1 - FORTRAN

大抵のプログラミング言語には「型」という仕組みがあり、これを使って適切な計算であるとか判定を行うのですが、こと入出力に関しては「型」とは独立した書式を設定する機能があります。言語によって「型」と書式の間のチェックであるとか変換の仕組みは異なっていて、どんな型のどんな値がどのように入出力されるのかは、実は高度な知識だったりします。

この書式を比べるためにも、まず古の言語であるFORTRANから思い出してみます。FORTRANの入出力であるREAD文とWRITE文には引き数として「装置番号」と「書式」を持ち、文に続いて入出力する変数またはリテラルを並べます。

WRITE(6,*) ‘Hello World!

書式が’*’であれば、与えられた値に相応しい形式が自動的に選ばれ、ここに文字列を書けば指定した形式に変換されます。また整数であれば行番号であると解釈され、その行番号のついたFORMAT文の書式が使われます。

    WRITE(6,100) X,Y
100 FORMAT(F4.2, ‘ ‘, F4.2)

この書式指定文字列はFORTRANの歴史とともに進化していて、大昔は必ず先頭に’1H’などの謎の文字列を出力する必要があったのですが、今は他の言語の人も類推しやすいような形に整理されています。基本的には型をアルファベット1文字で示し、続いて全体の長さとオプション的な指示が続きます。

I        整数
F       実数(小数)
E       実数(指数形式)
A       文字(列)
Z,O,B 16進、8進、2進数

FORTRANの基本的な入出力書式指定子

具体的には”I4”とすれば全体で4桁の整数に変換され、桁が余れば先頭に空白が補われ(右詰め)不足した場合には全体が”****”と表示できないことを示す文字列になります。”I5.4”であれば全体は5桁で、数値の部分は4桁が指定され(結果的に先頭は空白になる)数値部分の桁数が不足すれば先頭に’0’が補われます。

I4     123     “ 123”
I4     -12     “ -12”
I4     12345 “****”
I5.4   123    “ 0123”

整数の書式指定の例

同様に小数表現は”F4.2”などと指定し、最初の数字は全体の桁数、ピリオドに続く数字は小数点以下の桁数です(全体の桁数には小数点と負の数はマイナス記号を含むことに注意)。

F4.1  12.3   “12.3”
F5.1  -12.3 “ -12.3”

小数の書式指定の例

計算結果を出力するのによく使う指数表示は”E”を使い、こちらは指数部の桁数も指定できます。

E10.3     12.34 “ 0.123E+02”
E11.3E3 12.34 “ 0.123E+002”

浮動小数点数の書式指定の例

ちなみに工学表記と科学表記を指定することも出来て、Eの代わりにEN(工学表記)、ES(科学表記)と書きます。※工学表記とは指数部が必ず3の倍数になる

文字については簡単で全体の長さを指定します。こちらも長さが不足すれば先頭に空白を補い、溢れれば捨てられます。

A3 “ABCDEFG” “ABC”
A7 “ABCDEFG” “ABCDEFG”
A8 “ABCDEFG” “ ABCDEFG”

文字列の書式指定の例

FORTANの凄い(恐ろしい)ところは入出力でループを書けることで、書式をカッコで括って先頭に数字をつければ、その回数だけ繰り返せます。

WRITE(*,3(I5.2)) X,Y,Z

配列であれば

WRITE(*,3(I5.2)) (X(I), I=1,3)

で添字の数を変えながら一発で出力可能です。確かにこうすれば一気に出力すべきデータを予め作ってから一度に出力できるので効率は良さそうです。

コンパイル言語であるFORTRANにしては珍しく入出力の書式の解釈はその場でインタプリトしているのだそうです。この為、指定を動的に変更することも可能なのですが、多くの入出力を行う処理をすると「遅い」と文句を言う人もいるのだとか。普通は入出力は遅いので、そこで時間がかかっても気にならないようにも思いますが、CPU時間で課金される環境だと、そうも言っていられないのかもしれません。

FORMAT 芸 リフレクション?

なお、どの言語でもそうなのですが、書式指定の話はさらに奥が深くてマニアックな話はたくさんあるのですが、大体は思い出せたので、このくらいにしておきましょう。しかし、わかりやすくて参照しやすいドキュメントの見つからないこと。この時代の情報はやっぱり書籍のほうが良いのかもしれません。

ヘッダ画像はCopilotに作ってもらいました。


この記事が気に入ったらサポートをしてみませんか?