19
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FortranAdvent Calendar 2018

Day 6

Fortranのキーワードは予約語ではない

Last updated at Posted at 2018-12-05

Fortranにはキーワードがいくつか存在します。ifとかdoとかそういうやつです。これらはキーワードですが、予約語ではありません。

予約語かどうかで違いがあるのか、という話ですが、以下のコードが合法になります。

program main
    integer :: do, end=0
    do do=1, 10
        end = end + do
    end do
    write(*,*) end
end program main

もちろん、ifも予約語ではないので、以下のコードも合法です。

program main
    logical::if, then
    if = .true.
    then = .false.
    if (if) if = then
    write(*,*) if
end program main

変数名でなく関数名に使っても構わないので、ifという関数を定義して受け取ったlogical.not.を取って返すようにすることもできます。

program main
    if(if(.true.)) then
        write(*, *) 'ok'
    else
        write(*, *) 'not ok'
    end if
contains
    logical function if(x)
        logical::x
        if = .not. x
    end function if
end program main

このコードはnot okを出力します。もちろん、このようなコードは良くないからですね。

さて、これは本当に正しいコードなのでしょうか。コンパイラのバグではなくて?

Fortranには国際規格があり、そこでFortranの振る舞いが決められています。Fortranとして正しいコードかどうかは、コンパイラが決めるのではなく、国際規格が決めます。

以下のURLで規格書を見ることができます。
https://wg5-fortran.org/

さて、Fortran90 規格 § 2.5.2 "Keyword"で、以下のような記述がされています。

A word that is part of the syntax of a statement is a statement keyword. These keywords are not reserved words; that is, names with the same spellings are allowed. Examples of statement keywords are: IF, READ, UNIT, KIND, and INTEGER.

キーワードと同じ名前を使うことが明示的に許されているようですね。

というわけで、それがコードとして良いか悪いかは別として、上記のコードは正しいようです。コンパイラはキーワードと同じ名前の変数なり何なりが出てきても、ちゃんとコンパイルできなければなりません。そうでなければFortran規格準拠コンパイラではなくなってしまいます。コンパイラ開発者大変そうだな

もちろん、このようなコードは可読性を圧倒的に損なうので、やってはいけません。やってはいけませんが、面白いので誰かのSAN値を削るための精神攻撃としてはとても有効に使えるのではないでしょうか。

19
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?