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

ブロック（）とは、プログラミング言語におけるコードのまとまり（コードブロック）のことである。

ブロック状のパーツを組み合わせてプログラミングを行うScratchなどの「ブロック」とは異なる。

 概要 
文（）から成る言語では、ブロックによって複数個（0/2個以上・言語により異なる）の文がまとまってひとつの文になっているものを複文（）または複合文と呼ぶ。「区」という訳語を使っている仕様もある『JIS X 3003:1993 電子計算機プログラム言語Full BASIC』§4.2.1より「BASICプログラム中で，ある種の行の論理的な集まりを区 (block) という。」。。

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

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

自動変数（ローカル変数）の場合、ブロックによって変数の記憶域期間（）が決まる生存期間、寿命（）あるいはエクステント（）とも。。一方、静的変数の記憶域期間は、ブロックによって左右されない。

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を用いる。

 脚注 

 注釈 

 出典 

関連項目
構造化プログラミング
スコープ (プログラミング)
クロージャ
基本ブロック

ふろつく