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

  • 450