オフサイドルール

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

オフサイドルール(Off-side Rule)とは、一部のプログラミング言語において字下げによって文などのかたまりの範囲(ブロック)を示す規則である。すなわち、そのような言語ではブロックは字下げによって形成され識別される。この用語と考え方は Peter J. Landin によるもので、ここでのoff-sideは「(左端)側から離れる」という意味だが、これはサッカーなどの球技におけるオフサイド規則 (offside law) のもじりと考えられる。

レイアウト・ルールと呼ぶこともある[1]

定義[編集]

前の行の空白以外の最初の左端寄りのトークンより左端寄りにあるトークンが新たな宣言の開始として解釈される。
— Peter J. Landin、"The Next 700 Programming Languages"[2]

(ただし言語によっては似たような見た目になるものの違う規則によっているものもある)

コード例[編集]

以下の例は Python における字下げブロックを示している(コロンは可読性を高める構文上のマーカーでもある)[1]:

def is_even(a):
    if a / 2.0 == a / 2:
        return True
    else:
        return False

他の手法[編集]

前述のように、Landin による提案がオフサイドルールのはじまりと一般に認知されているが、クヌースStructured Programming with go to Statementsで引用している Dewey Val Schorreの Improved Organization for Procedural Languages(Landin の提案と同じく1966年)に、

Since the summer of 1960, I have been writing programs in outline form, using conventions of indentation to indicate the flow of control. (以下略)

とあり、ほぼ同時期に他にも(おそらく複数)独立して同様の試行が存在している。

以下ではオフサイドルール以外のブロックの記法について概観する。

Cで一般化した手法として、余分な空白を無視して波括弧 {} でブロックを表すという方法がある。この方法の利点は、自動的に読みやすく字下げすることが可能で、しかもそれによってコードの意味が変化しない点である。人間が読むとき字下げに目が行ってしまい、括弧で表現されている真の構造を読み違える可能性があるが、真の構造をきちんと反映するように自動で修正するという手がある。

LISP(のS式)は、全ての開始と終了を丸括弧ないし角括弧で明示する(中括弧を使用する言語と同様、余分な空白は無視される)。そもそもS式(S-expression)はプログラムコードのリスト構造による内部表現をそのまま一種のリテラルのようにして表現(express)したものである。

他の手法として、ブロックの開始と終了を記号ではなくキーワードで表現する方法がある。ここで論じている他の構文と同様字下げには意味が無い。

ALGOLで一般化した手法として、"begin" でブロックを開始し、"end" でブロックを終了するという方法がある(これは、具象構文(見た目)は大きく違うが、抽象構文としては波括弧の言語とさほど違うものではない)。

いくつかの言語では、繰り返しや条件分岐を表現するキーワードが暗黙のうちにブロックの開始(や終了)も表現する。構造化BASICなどでは、ブロックはブロックをともなうキーワード自身(例えば "IF")で開始され、前に "END" をつけたキーワード(例えば "ENDIF")で終了する。Bourne Shellの一部の文法などでは、ブロック終了を示すキーワードは開始するキーワードを逆に綴ったものである(例えば、"if" で始まるブロックは "fi" で終了する)。EiffelRubyでは、ブロックをともなうキーワード自身(たとえば"if")で開始され、"end"で終了する。

オフサイドルールを採用している言語[編集]

参考文献[編集]

  1. ^ たとえば http://www.haskell.org/onlinereport/lexemes.html
  2. ^ Landin, Peter J. (3月 1966年). “The next 700 programming languages”. Communications of the ACM 9 (3): 157–166. doi:10.1145/365230.365257. http://www.cs.utah.edu/~wilson/compilers/old/papers/p157-landin.pdf. 
  3. ^ http://srfi.schemers.org/srfi-49/srfi-49.html