ブロック (プログラミング)
この記事には複数の問題があります。 |
ブロック(英: block)とは、プログラミング言語におけるコードのまとまり(コードブロック)のことである。
ブロック状のパーツを組み合わせてプログラミングを行うScratchなどの「ブロック」とは異なる。
概要
[編集]文(英: statement)から成る言語では、ブロックによって複数個(0/2個以上・言語により異なる)の文がまとまってひとつの文になっているものを複文(英: compound statement)または複合文と呼ぶ。「区」という訳語を使っている仕様もある[1]。雰囲気としては自然言語における段落にも似ているが、現代言語学を知っていれば、プログラミング言語における「文」と「ブロック」の関係は、言語学でいう「語」と「句」の関係に近い[独自研究?]。
自然言語の段落と異なり、ブロックは入れ子にすることができる(つまり、言語学でいう「語」と「句」のほうに近い、とはそういうことである[独自研究?])。すなわち、ブロック内にブロックを作成することができる(正確な理解としては、ブロックは文の一種であり、ブロックの中身は文の並びであるから、ブロックの中身にまたブロックが現れることもできる、ということになる。プログラミング言語の学習においては、絶対的に不正確な理解に直結する自然言語からの類推ではなく、プログラミング言語は形式言語なのであるから、BNFなど形式的な(フォーマルな)仕様などを理解できるように努めたほうが、結果として早道である)。
C言語などでは、ブロックは変数のスコープ(可視範囲)の区切りである。すなわち、あるブロック内で定義された変数には、ポインタ等によりエスケープされない限り(エスケープ解析を参照)、ブロック外からはアクセスできない。JavaScript(ECMAScript)は、以前はブロックは変数のスコープに影響しないという仕様だったが、ECMAScript 6th Edition(ECMAScript 2015)で導入されたlet宣言(英: let declaration)による変数は、それが宣言されたブロックの最後までが可視範囲となる。
自動変数(ローカル変数)の場合、ブロックによって変数の記憶域期間(英: storage duration)が決まる[注釈 1]。一方、静的変数の記憶域期間は、ブロックによって左右されない。
SmalltalkやRubyにある似たようなものは、ブロックと呼んではいるが、複文ではない別のもので、メソッド呼び出しに付加する特別な引数のようなものである(クロージャに最も近い)。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を用いる。
脚注
[編集]注釈
[編集]- ^ 生存期間、寿命(英: lifetime)あるいはエクステント(英: extent)とも。
出典
[編集]- ^ 『JIS X 3003:1993 電子計算機プログラム言語Full BASIC』§4.2.1より「BASICプログラム中で,ある種の行の論理的な集まりを区 (block) という。」
- ^ Verbose Syntax - F# | Microsoft Docs