
2025/12/17 22:25
Learning Fortran (2024)
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
(欠落している詳細を補完し、推測的な言語を除去したもの):**
Fortranは長い歴史とFortran 2018などの新しい標準による継続的な進化のおかげで、科学・数値プログラミングにおいて実用的な選択肢として残っています。gfortran(無料でオープンソースの実装)のようなモダンコンパイラを使えば、開発者はmacOSをHomebrewや他のパッケージマネージャー経由で含む現代のオペレーティングシステム上で、レガシー制約なしにFortranコードを書き、コンパイルし、実行できます。
言語の構文はより扱いやすくなっています。free‑form codeをサポートし、snake_caseで明確な識別子を奨励し、
による明示的な型宣言が必須となり、微妙なバグの防止に寄与します。典型的な文は出力用のimplicit none、入力用のprint *, 'text'、および制御フローとしてread *, varや分岐用のif (cond) then … end ifなどです。select case (choice)
一般的なワークフローはシンプルです:
拡張子を持つファイルを書き、.f90でコンパイルし、gfortran -o prog program.f90で実行します。./progフラグが指定されない場合、デフォルトの実行ファイル名は-oです。a.out
記事では「ThePrimagen」のようなユーザーからの再興味を指摘し、最近のリリースがFortranをさらに洗練させる可能性があると強調しています。これらの更新は、モダンな科学計算におけるFortranのより広い採用を促進し、開発者がレガシーシステムと互換性を保ちながら明確でポータブルなコードを書けるようにします。
本文
01/31/2024 (最終編集 05/07/2024)
簡単な歴史
どのバージョンのFortran?
構文を理解する
実際にどうやって動かすの?
いくつか改善点
C、Go、またはPrimeagenがTwitterで紹介している新しいトレンド言語(OCaml?)などを学ぶべきだと私は思うが、今回はFortran[1] を学んでみようと思います。
簡単な歴史
FORmula TRANslator(フォーマット・トランスレーター)の略称である Fortran は、1957 年に IBM のジョン・バックラスによって科学計算向けに開発されました。近年では高性能コンピューティングやスーパーコンピュータのベンチマークにも広く採用されています。これまでに FORTRAN 77、Fortran 90、Fortran 95、Fortran 2003、Fortran 2008、そして最新の Fortran 2018 などがリリースされてきました。
どのバージョンを学ぶか?
まずは fixed form(固定形式)と free form(自由形式)の違いを把握する必要があります。
- 固定形式は、パンチカード時代から継承されたレイアウトで、コメントや文が配置できる列に奇妙な制限があります。
- 自由形式は Fortran 90 で初めて導入され、特別な列を排除し、どこでもコメントを書けるようになりました。今回学習するのは自由形式です。
使用するコンパイラは GNU Fortran (gfortran) です。macOS の場合 Homebrew から
gcc フォーミュラでインストールできます。その他 OS では対応するパッケージマネージャーを利用してください。コードが自由形式であることを gfortran に知らせるには、ファイル拡張子を .f90(またはそれ以降)にします。
のサフィックスは「ソースコードが自由形式」であることを示すだけで、Fortran 90 標準に従っているという意味ではありません。.f90を使ったコードは任意の Fortran 標準から機能を利用できます。ほとんどの Fortran コンパイラは.f90を自由形式のサフィックスとして認識しますが、.f90・.f95・.f03・.f08など他のサフィックスは必ずしも認識されません。.f18
GitHub 上で Fortran 90 より新しい標準を使っているソースコードでもが多く使用されています。.f90
構文を理解する
TypeScript(それ以前は Python)から来た私は、モダンで「美的」な構文に慣れています。Fortran の構文が完全にモダンというわけではありませんが、他の言語で初心者を悩ませるシンタックスシュガーの混乱は避けられるようです[3]。
program helloworld print *, 'Hello, world!' end program helloworld
古い Fortran プログラムではすべてのキーワードが
SCREAMING_CASE(大文字)で書かれていました。現代 Fortran では snake_case を使うことも推奨されます(もちろん大文字でも構いません)。
Fortran のプログラムは必ず
program <name> で始まり、end program <name> で終わります。ターミナルにテキストを表示するには
print *, '<message>' を使います。アスタリスクは デフォルト 出力チャネル(STDOUT)を示します。
実際に開始/終了文を書かなくても構いませんが、以下のように書くこともできます:
print *, 'Hello, world!'
ただし、これは一般的な慣例ではありません。
もう少し複雑な例を見てみましょう:
program calculator implicit none real :: x, y, answer character(1) :: choice print *, 'x:' read *, x print *, 'y:' read *, y print *, '+, -, *, /:' read *, choice if (choice == '+') then answer = x + y end if if (choice == '-') then answer = x - y end if if (choice == '*') then answer = x * y end if if (choice == '/') then answer = x / y end if print *, 'Answer:', answer end program calculator
implicit none
implicit noneFortran 90 で追加されたこの指示は、暗黙の型付けを無効にします。すべての変数は明示的に宣言する必要があります。暗黙型付けは変数名の最初の文字(
I–N → INTEGER、それ以外 → REAL)でデフォルト型を決定します。「過去から残ったレガシー」であり、使用しないほうが強く推奨されます。
変数宣言
real :: x, y, answer character(1) :: choice
REAL は浮動小数点数を格納します。CHARACTER は文字列(ここでは単一文字)を格納します。
入力 / 出力
print *, 'x:' read *, x
read * のアスタリスクはデフォルト入力チャネル(STDIN)から読むことを意味します。
制御フロー
答えを計算し表示するために一連の基本的な
if 文を使っています:
if (choice == '+') then answer = x + y end if ... print *, 'Answer:', answer
実際にどう動かすか?
コンパイルは次のように行います:
gfortran -o calculator calculator.f90
実行は:
./calculator
ソースファイルだけを指定した場合(
gfortran calculator.f90)、デフォルトで a.out という名前の実行ファイルが生成されます。
実行例:
$ gfortran -o calculator calculator.f90 $ ./calculator x: 10 y: 2 +,-,*,/: * Answer: 20.0000000
いくつかの改善点
ゼロ除算を処理する
if (choice == '/') then if (y /= 0.0) then answer = x / y else print *, 'Error: Division by zero is not allowed.' stop end if end if
select case
を使ってコードを整理する
select caseselect case (choice) case ('+') answer = x + y case ('-') answer = x - y case ('*') answer = x * y case ('/') if (y /= 0.0) then answer = x / y else print *, 'Error: Division by zero is not allowed.' stop end if case default print *, 'Invalid choice. Please choose +, -, *, or /.' stop end select
これにより、ユーザーに無効な選択を通知できます。
以上は、変数宣言、ターミナルへの出力・入力、
if と select case、そして stop の使い方など、モダン Fortran の基本的な機能についての簡単な紹介です。次回は Fortran が実際にどこで使用されているか、何が作れるか、言語とコミュニティがどのように急速に現代化しているかを掘り下げます!
皮肉なことに、この記事を書き始めて約 3 ヶ月ほど経った現在、Primeagen は「FORTRAN に関する私の発言はすべて取り消した」と最近述べました――言語に興味を持ち始めたようです!
[1] …
[2] Wikipedia の情報によれば、名称は Formula Translating System や単に Formula Translation を意味していた可能性もあります。
[3] The Rust programming language absolutely positively sucks : r/rust と「Java から来た人には Rust は学びがたい」などのコミュニティ投稿を参照。
[4] “GOD is REAL, unless declared INTEGER” – 暗黙型付けのためです!
[5] より大きい(より高精度な)浮動小数点数には double precision も使えます。