ブロック (プログラミング)

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

プログラミング言語におけるブロックblock)は、コードのまとまり(コードブロック)のことで、「文 (プログラミング) 」(statement)から成る言語では複数個(0個以上~2個以上。言語により異なる)の文がまとまってひとつの文になっているブロックを複文(compound statement)と呼ぶものもある。「区」という訳語を使っている仕様もある。雰囲気としては自然言語における段落にも似ているが、現代言語学を知っていれば、プログラミング言語における「」と「ブロック」の関係は、言語学でいう「」と「」の関係に近い。

なおプログラミング関係で、これと全く違うものに、他にも「ブロック」という語を使うものがいくつかあるので注意。入出力について「待たされる(ブロックされる)」という意味や、一種のクロージャの実装であるC言語の拡張のブロックなどである。

ブロックには、C言語に代表される、{}で囲まれるスタイル、ALGOLにはじまり、その影響を受けたPascalAdaなど、beginendのようなキーワードで囲むスタイル、Pythonなどのオフサイドルールによるスタイルなどがある。

自然言語の段落と異なり、ブロックは入れ子にすることができる(つまり、言語学でいう「語」と「句」のほうに近い、とはそういうことである)。すなわち、ブロック内にブロックを作成することができる(正確な理解としては、ブロックは文の一種であり、ブロックの中身は文の並びであるから、ブロックの中身にまたブロックが現れることもできる、ということになる。プログラミング言語の学習においては、絶対的に不正確な理解に直結する自然言語からの類推ではなく、プログラミング言語は形式言語なのであるから、BNFなど形式的な(フォーマルな)仕様などを理解できるように努めたほうが、結果として早道である)。

C言語などでは、ブロックは変数スコープ(可視範囲。生存期間(エクステント)とは違うので注意)の区切りである。すなわち、あるブロック内で定義された変数には((前置単項 & 演算子と)ポインタ等により、エスケープされない限り(エスケープ解析を参照))ブロック外からはアクセスできない。JavaScriptは、以前はブロックは変数のスコープに影響しないという仕様だったが、ECMAScript 6th Edition(ECMAScript 2015)で導入された let declaration (let宣言) による変数は、それが宣言されたブロックの最後までが可視範囲となる。

SmalltalkRubyにある似たようなものは、ブロックと呼んではいるが、複文ではない別のもので、メソッド呼び出しに付加する特別な引数のようなもの、である。Rubyではそれ自体はオブジェクトではないが、Smalltalkではオブジェクトである。なお、Rubyにおける複文に相当するものとしては、if~endなどにおいて、ifそれ自体がコードのかたまりの開始のキーワードとして機能するというEiffel風のスタイルを採っている。

[編集]

入れ子になったブロックの例。

int main()
{
  int x = 1;

  if (x == 1)
  {
     x++;
  }
  return 0;
}

関連項目[編集]