ループ変数にi,j,kをよく使うのはFortranの暗黙の型宣言のため?とN88-BASICのときに何かで書いてあったような記憶があるが、AIチャットに聞いてみた。
Fortranの暗黙の型宣言
Fortran の古いバージョンでは、変数が明示的に型宣言されていない場合、その名前の最初の文字に基づいてデフォルトの型が割り当てられます。この規則は、暗黙の型宣言 (Implicit Typing) と呼ばれます。
デフォルトの規則
デフォルトの規則は以下の通りです。
- I, J, K, L, M, N のいずれかで始まる変数名:INTEGER 型(整数型)
- 上記以外の文字(A〜H, O〜Z)で始まる変数名:REAL 型(浮動小数点数型)
例:
- I_count や N_items は、デフォルトで INTEGER 型になります。
- Average や Total は、デフォルトで REAL 型になります。
現代的な Fortran の推奨事項
現代の Fortran プログラミングでは、暗黙の型宣言の使用は強く非推奨とされています。なぜなら、変数名のタイポ(打ち間違い)などが原因で意図しない型が割り当てられ、発見が困難なバグにつながる可能性があるからです。
このデフォルトの規則を無効化し、すべての変数の明示的な型宣言を強制するために、IMPLICIT NONE ステートメントをプログラムユニット(メインプログラム、サブルーチン、関数、モジュール)の先頭に記述することが標準的な習慣となっています。
PROGRAM Example
IMPLICIT NONE
! これ以降、すべての変数は型宣言が必要です
INTEGER :: i_count
REAL :: average
! CHARACTER, LOGICAL, DOUBLE PRECISION などの他の型も同様
i_count = 10
average = 3.14
END PROGRAM Example
すべての Fortran プログラムに IMPLICIT NONE を含めることを強くお勧めします。
N88-BASICのデフォルトの型宣言
N88 BASICでは、型宣言文字を省略した場合のデフォルトの変数型は**単精度実数型 (Single-Precision Real)**です。
デフォルトの変数型と型宣言文字BASICでは、変数名の末尾に特定の記号(型宣言文字)を付けることで、その変数の型を明示的に指定できます。この型宣言文字を省略した場合に、自動的に割り当てられるのがデフォルトの型です。
| 型宣言文字 | 変数の型 | 説明 | デフォルトの型か |
|---|---|---|---|
| (なし) | 単精度実数型 | 浮動小数点数(約7桁の精度) | ✔ |
| $ | 文字型 (STRING) | 文字列データを格納 | |
| % | 整数型 (INTEGER) | 整数(-32768 ~ 32767 の範囲) | |
| ! | 単精度実数型 (SINGLE) | 浮動小数点数(約7桁の精度) | |
| # | 倍精度実数型 (DOUBLE) | 浮動小数点数(約15桁の精度) |
例:
A や TOTAL は、デフォルトで単精度実数型として扱われます。
NAME$ は文字型です。
COUNT% は整数型です。
AVERAGE! は単精度実数型です。
PI# は倍精度実数型です。
型宣言命令による変更
N88 BASICには、特定の文字で始まるすべての変数のデフォルトの型をプログラム内で一括して変更する型宣言命令が存在します。例えば、次の命令を使うと、I〜Nで始まる変数(伝統的なFortranの規則とは異なり、BASICではデフォルトで単精度実数型になる)を整数型として扱うように変更できます。
| 命令 | 宣言する型 | 適用される変数名 |
|---|---|---|
| DEFINT | 整数型 (INTEGER) | 指定した範囲の文字で始まる変数 |
| DEFSNG | 単精度実数型 (SINGLE) | 指定した範囲の文字で始まる変数 |
| DEFDBL | 倍精度実数型 (DOUBLE) | 指定した範囲の文字で始まる変数 |
| DEFSTR | 文字型 (STRING) | 指定した範囲の文字で始まる変数 |
10 DEFINT I-N ' I, J, K, L, M, N で始まる変数を整数型とする
20 DEFSNG A-H ' A-H で始まる変数を単精度実数型とする
30 I=10 ' I は整数型
40 A=3.14 ' A は単精度実数型
50 B#=1.23456789# ' B# は型宣言文字で倍精度実数型に上書きされる
この型宣言命令がプログラム中に存在しない限り、型宣言文字のない変数は単精度実数型として扱われます。
あとがき
しれっと「BASICではデフォルトで単精度実数型になる」と書いてあるが、Z80に浮動小数点なんて扱いがないので、インタプリターが自前で浮動小数点演算を実装をしているとか・・・。まあ遅いので冒頭にDEFINT A-Zと書くのが常だった。
追加の疑問:有効な変数名の長さ
NAME$とかCOUNT%とか変数名の例に挙げているけど、2文字までしか区別しなかったような・・・。
N-BASICの変数名規則
PC-8801のN-BASIC(初期バージョン)では、変数の識別に使用されるのは先頭の2文字だけです。
- 有効な長さ: 最初の2文字
- 最大長: N-BASICの仕様では、変数名自体は40文字まで記述できますが、3文字目以降は無視されます。
- 区別されない例:
- COUNT と COWBELL(先頭2文字が CO)
- LOOP_I と LO_TEST(先頭2文字が LO)
- TOTAL1 と TOTAL2(先頭2文字が TO)
N88-BASICとの違い
PC-8801のROM BASICは、後にN88-BASIC(拡張されたBASIC)へと進化しました。
| BASICバージョン | 有効な変数名の長さ | 備考 |
|---|---|---|
| N-BASIC (初期) | 先頭2文字のみ | 古いBASICの制約が残っている。 |
| N88-BASIC | 40文字すべて | 後のPC-88やPC-98で主流となった。 |
したがって、もしお使いのPC-8801がN88-BASIC(DISK BASICや、後期モデルのROM BASIC)を搭載している場合は、40文字すべてが有効な長さとなります。しかし、初期のモデルに搭載されていたN-BASICについて聞かれている場合は、「先頭2文字のみ」が正しい回答です。
あとがき2
なるほど、ループにi,j,kから使うのに、大昔の慣習の影響を受けていたのですな。変数の長さが40文字までOKといいつつ、一文字づつ解析して動作するインタプリターにとって、長い変数名は遅いだけなので、1文字、2文字だったよなと。
これがC言語でも3文字、4文字にするクセが付くと、なかなかcountとか書かずにcntのままだったり・・・。