Fortran Compiler Frontend の話 (WIP)
@giantneco
Who am I?
- 中規模 SI で働いてる人
- 仕事
- 最近は golang
- 今年 3 月まで Fortran コンパイラ作ってた
- twitter @giantneco
Fortran
世界最初の高級言語
-
まだ現役
- 京とかのスパコンの上で動いてたりする
- C より古い
- 最近オブジェクト指向にも対応した
Fortran コード
PROGRAM main
CALL SUBROUTINE sub()
CONTAINS
SUBROUTINE sub()
PRINT *, "HELLO WORLD"
END SUBROUTINE sub
END PROGRAM main
Fortranフロントエンド
つらい
- つらい言語仕様
- モダンでない言語仕様
- 非常に読みづらい・分かりづらい仕様
- 過去の仕様に継ぎ足し継ぎ足ししてる
- 最近オブジェクト指向がたされた
- つらい実装
- C で実装
- 元々ワンパスコンパイラ
モダンでない言語仕様
- 予約語がない
-
分かち書き必須でない
- lexer は手書き
- 5,000 行近くある
- 暗黙的な型宣言
ワンパスコンパイラ
昔々のコンパイラはワンパスだった
- パンチカードで入力
- 後戻りはない
- メモリがない
- 構文木とか持ってられない
ワンパスコンパイラ
- Fortran77
- 後方参照はなく識別子が出現した時点で型が決定できていた
- これだけなら「昔の人は大変だった」で済むが
- Fortran90
- 後方参照が追加
- 識別子が出現した時点で型が決定できない
- が、実装はワンパスのまま
ワンパスコンパイラ
- Fortran77
- 後方参照はなく識別子が出現した時点で型が決定できていた
- これだけなら「昔の人は大変だった」で済むが
- Fortran90
- 後方参照が追加
- 識別子が出現した時点で型が決定できない
- が、実装はワンパスのまま
Fortran のクラス
TYPE :: t
INTEGER ;; x
END TYPE t
TYPE, EXTENDS(t) :: tt
INTEGER :: y
END TYPE
Fortran の構造体 TYPE
- EXTENDS というキーワードが追加された
- TYPE がクラス扱いかな?
Fortran のクラス
TYPE :: t
INTEGER ;; x
CONTAINS
PROCEDURE :: p
END TYPE t
TYPE, EXTENDS(t) :: tt
INTEGER :: y
END TYPE
CLASS(t), POINTER :: p
TYPE(tt) :: v
p => v
CLASS キーワード
- TYPE 同士
コンパイラフロントエンド開発の辛さ
- 後方互換
- 予期しないコード
- 言語仕様の大きな変更
テスト大事
- なんてことない変更で大きな違いができたりする
- CI 使おう
- 一番痛いのはコンパイルできたけど結果が期待と違う
- CI で流すテストではコードを実行した結果も含もう
おわり
Fortran
By Shingo Suzuki
Fortran
- 679