コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「ブロック (プログラミング)」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
Cewbot (会話 | 投稿記録)
m Bot作業依頼: sourceタグをsyntaxhighlightタグに置換 (Category:非推奨のsourceタグを使用しているページ) - log
30行目: 30行目:
== 例 ==
== 例 ==
入れ子になったブロックの例。
入れ子になったブロックの例。
<source lang="c">
<syntaxhighlight lang="c">
#include <stdio.h>
#include <stdio.h>


52行目: 52行目:
return 0;
return 0;
}
}
</syntaxhighlight>
</source>


== ブロッキング処理 ==
== ブロッキング処理 ==

2020年7月5日 (日) 22:48時点における版

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

概要

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

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

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

自動変数(ローカル変数)の場合、ブロックによって変数の記憶域期間 (storage duration) が決まる[1]。一方、静的変数の記憶域期間は、ブロックによって左右されない。

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

ブロックの構文

ブロックの記述については、言語によって構文が異なる。

F#のように、軽量構文 (lightweight syntax) と冗語構文 (verbose syntax) を選択できる言語も存在する[2]

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

#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;
}

ブロッキング処理

動作が完了するまで呼び出し元が待たされる(ブロックされる)処理のことをブロッキング処理 (blocking processing) と呼ぶ。ブロックされる状況にある場合は即座にエラーを返して呼び出し元を待たせない方式をノンブロッキング処理 (non-blocking processing) と呼ぶ。代表的な例として、ネットワーク通信におけるブロッキングとノンブロッキングが挙げられる。

また、呼び出しが完了すると同時に処理結果を通知する方式を同期処理 (synchronous processing) と呼ぶ。いったん処理を開始してから、後で(イベントコールバック関数を使って)結果を通知する方式を非同期処理 (asynchronous processing) と呼ぶ。通例ファイルなどのストレージ入出力処理 (Input/Output, I/O) には非同期I/Oを用いる。

脚注

  1. ^ 生存期間、寿命 (lifetime) あるいはエクステント (extent) とも。
  2. ^ Verbose Syntax - F# | Microsoft Docs

関連項目