Learning Fortran (2024)

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
(またはそれ以降)にします。

.f90
のサフィックスは「ソースコードが自由形式」であることを示すだけで、Fortran 90 標準に従っているという意味ではありません。
.f90
を使ったコードは任意の Fortran 標準から機能を利用できます。ほとんどの Fortran コンパイラは
.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

Fortran 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 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 も使えます。

同じ日のほかのニュース

一覧に戻る →

2025/12/18 1:42

Gemini 3 Flash: Frontier intelligence built for speed

## Japanese Translation: > **概要:** > Google は、低コストで高速な AI モデル Gemini 3 Flash をリリースしました。これは Flash レベルのレイテンシーでプロ級の推論性能を提供します。Gemini アプリと Search の AI Mode では既にデフォルトエンジンとなり、Gemini 2.5 Flash は世界中で追加料金なしで即座に置き換えられます(Gemini 3 Pro が公開された直後)。ベンチマーク結果では、GPQA Diamond で 90.4 %、Humanity’s Last Exam(ツール無し)で 33.7 %、MMMU Pro で 81.2 %、SWE‑bench Verified で 78 % を獲得し、より大きなフロンティアモデルを上回ります。Gemini 3 Flash は Gemini 2.5 Pro より約30 %少ないトークン数で同等以上の性能を発揮します。価格は入力トークンあたり 0.50 USD、出力トークンあたり 3 USD(音声入力は 1 USD/百万トークン)です。JetBrains、Bridgewater Associates、Figma など多くの企業がこのモデルを活用し、コーディング、データ分析、設計ワークフローの高速化に役立てています。開発者は Gemini API(Google AI Studio)、Antigravity、Gemini CLI、Android Studio、Vertex AI、および Gemini Enterprise を通じて Gemini 3 Flash にアクセスできます。このモデルは Gemini アプリと Search 経由で全ユーザーへ展開されるほか、プレビュー API でも利用可能です。

2025/12/18 6:13

I got hacked: My Hetzner server started mining Monero

## Japanese Translation: ヘツナー VPS 上で Coolify をホストし、Next.js ベースの Umami アナリティクスを含む複数コンテナを実行していた。12 月 7 日に、Umami コンテナ内に Monero マイニングボット(`javae`/`xmrig`)が出現し、CPU スパイクが約 15 倍に増大した。著者はマイナーをコンテナに追跡し、CVE‑2025‑66478 ― Next.js の React Server Components “Flight” プロトコルにおける不安全なデシリアライゼーション(Puppeteer を介さずリモートコード実行が可能)を特定した。HTTP リクエストを巧妙に作成することで RCE が発動し、マイナーがインストールされた。ホストファイルシステムのチェック(`/tmp/.XIN-unix/javae`)ではエスケープは確認できず、コンテナは非 root の `nextjs` ユーザーとして実行され、特権モードやボリュームマウントも無いため、すべての悪意あるプロセスは名前空間内に留まった。 著者は侵害されたコンテナを停止・削除し、CPU 負荷を通常状態へ戻した。UFW をデフォルトで受信トラフィックを拒否するよう設定し、SSH、HTTP、および HTTPS のみ許可することで、オープンな PostgreSQL / RabbitMQ ポートを効果的に遮断した。ヘツナーは 2025‑12‑17 にネットワークスキャン検知後、アブズケース警告を送付し、著者が侵害と対策を説明するとともにチケットはクローズされた。 重要な教訓として、十分に隔離されているコンテナでも基盤フレームワークに脆弱性がある場合は突破可能であり、「Next.js を使っていない」状態が第三者ツールの依存関係によって偽りになるケースがあることを指摘した。この事例は、ファイアウォールルール、非 root ユーザー設定、特権モード無し、監視・ fail2ban の導入、およびタイムリーなパッチ適用という防御層の重要性を強調した。 ## 行動計画 - Umami を廃止する - すべてのコンテナに対してユーザー権限とマウントを監査する - SSH アクセスを強化し、アラートを設定する - セキュリティパッチを定期的に適用し、将来のインシデントを防止する ---

2025/12/18 3:15

How SQLite is tested

## Japanese Translation: > **SQLiteのテストインフラは網羅的で、コードベース全体にわたって完全な分岐カバレッジを実現しています。** > プロジェクトには約155.8 KSLOCのCソースがありますが、テストコードは92 M KSLOC以上――約590倍の量――で、すべての行が実行されることを保証しています。4つの独立したハーネスがカバレッジを提供します: > • **TCL**(27.2 KSLOC、1,390個のスクリプトファイル)で51,445件の異なるケースと数百万回の実行があります; > • **TH3**(1,055.4 KSLOC、約76.9 MBのバイナリ)で50,362件の異なるケース、完全カバレッジに必要な2.4 Mインスタンス、および約248.5 Mテストを実行するソークテストがあります; > • **SQL Logic Test (SLT)** はSQLiteとPostgreSQL、MySQL、MS SQL Server、Oracle 10gを比較し、7.2 Mクエリと1.12 GBのデータで検証します; > • **dbsqlfuzz**(libFuzzerベース)はSQLとデータベースファイルの両方を変異させ、約336個のシードファイルから16コアで1日あたり約500 Mテストを提供します。 > 追加の軽量ハーネスには `speedtest1.c`、`mptester.c`、`threadtest3.c`、`fuzzershell.c`、およびJSONBファズラ `jfuzz` が含まれます。 > 異常テストではメモリ不足、I/O障害、クラッシュ/電源損失、およびカスタムmalloc/VFSフックを使用した複合故障をシミュレートし、各障害後に整合性チェックが実行されます。 > ファズリングの歴史はAFL(2014‑2019)からOSS Fuzz(2016年以降)、その後dbsqlfuzz(2018年末)とjfuzz(2024年1月)へ進化しました。`fuzzcheck` スクリプトは毎回ビルド時に興味深いケースを再実行し、新しいバグが自動的にリグレッションテストとして生成されることを保証します。 > リソースリーク検出はTCL/TH3ハーネスに組み込まれており、メモリリーク、ファイルディスクリプタ枯渇、および不要なスレッドが自動的に監視されます。 > カバレッジは `gcov` を使用して100 %の分岐カバレッジと変異テストで達成され、マクロ(`ALWAYS`、`NEVER`、`testcase`)がMC/DCを強制し、コメント(`/*OPTIMIZATION‑IF‑TRUE/FALSE*/`)は偽陽性を防ぎます。 > 結果として、継続的に拡張される高い信頼性のテストスイートが実現し、ユーザーにSQLiteの安定性への確信を提供し、セキュリティ脆弱性から保護し、オープンソースデータベース品質保証のベンチマークとなります。

Learning Fortran (2024) | そっか~ニュース