ブロック()とは、プログラミング言語におけるコードのまとまり(コードブロック)のことである。
ブロック状のパーツを組み合わせてプログラミングを行うScratchなどの「ブロック」とは異なる。
概要 文()から成る言語では、ブロックによって複数個(0/2個以上・言語により異なる)の文がまとまってひとつの文になっているものを複文()または複合文と呼ぶ。JIS BASICでは「区」と呼ばれる『JIS X 3003:1993 電子計算機プログラム言語Full BASIC』§4.2.1より「BASICプログラム中で,ある種の行の論理的な集まりを区 (block) という。」。
ブロックは入れ子にすることができる。すなわち、ブロック内にブロックを作成することができる。
C言語などでは、ブロックは変数のスコープの区切りでもある。すなわち、あるブロック内で定義された変数には、ポインタ等によりエスケープされない限り、ブロック外からはアクセスできない。ECMAScriptでは、以前はブロックは変数のスコープに影響しないという仕様だったが、ECMAScript 6th Edition(ECMAScript 2015)では新たに ブロックの最後までがスコープとなる宣言が導入された。
ローカル変数の場合、ブロックによって変数の寿命が決まる生存期間あるいはエクステント()とも。スコープとエクステントの違いに注意。。一方、グローバル変数の寿命は、ブロックによって左右されない。
SmalltalkやRubyにある似たようなものは、ブロックと呼んではいるが、複文ではない別のもので、メソッド呼び出しに付加する特別な引数のようなものである(クロージャに最も近い)。Rubyではそれ自体はオブジェクトではないが、Smalltalkではオブジェクトである。なお、Rubyにおける複文に相当するものとしては、if-endなどにおいて、ifそれ自体がコードのかたまりの開始のキーワードとして機能するというEiffel風のスタイルを採っている。
ブロックの構文 ブロックの記述については、言語によって構文が異なる。
括弧で囲む - C言語、Java等 キーワードで囲む - Pascal、Visual Basic、Ruby、Ada等 インデントで区別する(オフサイドルール) - Python等
F#のように、軽量構文()と冗語構文()を選択できる言語も存在するVerbose Syntax - F# | Microsoft Docs。
例 入れ子になったブロックの例。 #include <stdio.h>
int main(void) { int x = 0;
while (1)
if (x < 10)
printf("%d\n", x); x++;
else
printf("Finished.\n"); break;
return 0; }
ブロッキング処理 動作が完了するまで呼び出し元が待たされる(ブロックされる)処理のことをブロッキング処理()と呼ぶ。ブロックされる状況にある場合は即座にエラーを返して呼び出し元を待たせない方式をノンブロッキング処理()と呼ぶ。代表的な例として、ネットワーク通信におけるブロッキングとノンブロッキングが挙げられる。
また、呼び出しが完了すると同時に処理結果を通知する方式を同期処理()と呼ぶ。いったん処理を開始してから、後で(イベントやコールバック関数を使って)結果を通知する方式を非同期処理()と呼ぶ。通例ファイルなどのストレージ入出力処理()には非同期I/Oを用いる。
脚注
注釈
出典
関連項目 構造化プログラミング スコープ (プログラミング) クロージャ 基本ブロック