コンピュータプログラミングにおいて、ステートメントは、実行される何らかの動作を表す命令型プログラミング言語の構文単位です。 [ 1 ]このような言語で書かれたプログラムは、1つ以上のステートメントのシーケンスで構成されます。ステートメントには、内部コンポーネント(式など)が含まれる場合があります。
多くのプログラミング言語(Ada、Algol 60、C、Java、Pascalなど)[ 2 ] : 15では、ステートメントと定義/宣言を区別しています。定義または宣言は、プログラムが操作するデータを指定するのに対し、ステートメントはそのデータに対して実行されるアクションを指定します。
他の文を包含できない文は単純文であり、他の文を包含できる文は複合文である。[ 3 ]
単純なステートメントはそれ自体で完結しています。これには、代入、サブルーチン呼び出し、およびプログラムの制御フローに大きな影響を与える可能性のあるいくつかのステートメント(goto、return、stop/haltなど)が含まれます。一部の言語では、入出力、アサーション、および終了は特別なステートメントによって処理されますが、他の言語では、定義済みのサブルーチン呼び出しが使用されます。
variable = expressionvariable := expression;variable = expression;CALL subroutine name(parameters)subroutine name(parameters);assert(relational expression);assert relational expression;GOTO numbered-labelgotolabel;goto label;RETURN valuereturn value;STOP numberexit(expression)exit number;複合ステートメントは、任意の妥当な深さまで入れ子にできるステートメント(またはステートメントのシーケンス)を含むことができ、一般的に、これらの含まれるステートメントに従うか、または繰り返すかを決定するためのテストを伴います。
begin <sequence> endbegin <sequence> end{ <sequence> }iftestthen<sequence>endif;多くの複合文は、ループ命令または選択命令です。理論上は、これらの種類の命令はそれぞれ1つずつあれば十分です。しかし実際には、頻繁に発生するさまざまな特殊なケースがあり、これらによってプログラムの理解が容易になり、プログラミングが簡単になり、多くの場合、より効率的に実装できます。ここでは触れていない多くの微妙な点がありますので、詳細はリンク先の記事を参照してください。
for index := 1 step 1 until limit do <statement> ;forindex:=1tolimitdo<statement>;for(index=1;index<=limit;index+=1)<statement>;forindexin1..limitloop<sequence>endloopDO index = 1 、limit <シーケンス> END DOfor index := expression while test do <statement> ;whiletestdo<statement>;while(test)<statement>;whiletestloop<sequence>endloopDO WHILE ( test ) <シーケンス> END DOrepeat<sequence>untiltest;{ note reversed test }do{<sequence>}while(test);loop<sequence>exitwhentest;endloop;do{<sequence>if(test)break;<sequence>}while(true);loop<sequence>exitwhentest;<sequence>endloop;if test then <unconditional statement> ;iftestthen<statement>;if(test)<statement>;iftestthen<sequence>endif;IF (テスト) THEN <シーケンス> END IFif test then <unconditional statement> else <statement> ;iftestthen<statement>else<statement>;if(test)<statement>else<statement>;iftestthen<sequence>else<sequence>endif;IF (テスト) THEN <シーケンス> ELSE <シーケンス> END IFcasecof'a':alert();'q':quit();end;caseciswhen'a'=>alert();when'q'=>quit();endcase;switch(c){case'a':alert();break;case'q':quit();break;}begin protected code except when exception specification => exception handlertry { protected code } catch (exception specification) { exception handler } finally { cleanup } try: protected code except exception specification: exception handler else: no exceptions finally: cleanup代入とサブルーチン呼び出しを除き、ほとんどの言語では、上記の例に示すように、各ステートメントを特別な単語(goto、if、whileなど)で始めます。さまざまな言語でステートメントの形式を記述するために、さまざまな方法が用いられてきました。より形式的な方法ほど、より正確になる傾向があります。
BNFは反復を表現するために再帰を使用するため、反復を直接示すことを可能にするための様々な拡張機能が提案されている。
プログラミング言語の文法の中には、キーワードを予約したり、特別なマークを付けたりして、識別子として使用できないようにしているものがあります。これは多くの場合、構文解析が容易になり、先読みの必要性が少なくなるという結果につながります。
FortranとPL/1には予約語がないため、次のような文が記述できます。
IF IF = THEN THEN ... (2番目IFと1番目THENは変数です。)IF (A) X = 10... 条件文(その他のバリエーションを含む)IF (A) = 2 添え字付き変数への代入IFDO 10 I = 1,5 Iが1から5まで実行されるループの開始DO 10 I = 1.5 変数に値1.5を割り当てるDO10IAlgol 60 と Algol 68 では、特別なトークンが明示的に区別されていました。出版用には太字で、beginプログラミング用には特別なマーク、例えばフラグ ( 'begin)、引用符 ( 'begin')、または下線 ( Elliott 503beginでは) が付けられていました。これは「ストロッピング」と呼ばれています。
言語構文の一部であるトークンは、プログラマーが定義した名前と競合しない。
特定の名前はプログラミング言語の一部として予約されており、プログラマが定義する名前として使用することはできません。最も普及しているプログラミング言語の大部分は予約語を使用しています。初期の例としては、FLOW-MATIC(1953年)とCOBOL(1959年)が挙げられます。1970年以降では、Ada、C、C++、Java、Pascalなどがその例です。予約語の数は言語によって異なり、C言語は約30語、COBOLは約400語です。
意味論はプログラムの意味に関係します。多くのプログラミング言語の標準文書では、構文/文法をかなり形式的かつ正確に表現するために BNF またはそれに相当するものを使用していますが、プログラムの意味論/意味は一般的に例と英語の散文を使用して説明されます。これにより曖昧さが生じる可能性があります。[ 9 ]一部の言語の説明では、複合文の意味は「より単純な」構造の使用によって定義されます。たとえば、while ループは、テスト、ジャンプ、ラベル の組み合わせを使用して定義できます。ifgoto
意味論に関する記事では、意味論を正確に記述するために用いられてきたいくつかの数学的/論理的形式体系について説明しています。これらは一般的にBNFよりも複雑であり、単一のアプローチが標準的な方法として広く受け入れられているわけではありません。いくつかのアプローチでは、言語のインタプリタを効果的に定義し、いくつかのアプローチでは形式論理を用いてプログラムについて推論し、いくつかのアプローチでは構文要素に接辞を付けて一貫性を確保するなど、様々な方法が用いられています。
実行される文と、評価される式は、しばしば区別されます。式は常に値に評価されますが、文はそうではありません。ただし、式はより大きな文の一部として使用されることがよくあります。
ほとんどのプログラミング言語では、文は式だけで構成でき、通常は式の後に文の終端記号(セミコロン)が続きます。このような場合、式は値に評価されますが、文全体は評価されません(式の値は破棄されます)。たとえば、C、C++、C#、および多くの類似言語では、x = y + 1は、x を y + 1 の値に設定する式であり、式全体は x に設定される値と同じ値に評価されます。しかし、x = y + 1;(末尾のセミコロンに注意)は、文内の式は評価されますが、式の結果は破棄され、文自体は値に評価されないため、x を y + 1 の値に設定する文です。[ 10 ]
式は他の式の中に含めることができます。たとえば、式 にはx = y + 1式 が含まれておりy + 1、式 には値yと が含まれています1。これらも厳密には式です。
前述の例では代入式を示しましたが、一部の言語では代入を式ではなく文として実装しています。その顕著な例がPythonで、=は演算子ではなく、代入文の区切り文字です。Pythonでは各代入が式であるため、複数の代入が可能ですが、これは真の式ではなく、言語文法に組み込まれた代入文の特殊なケースにすぎません。[ 11 ]
ほとんどのプログラミング言語には、言語によって定義された固定のステートメントセットがありますが、プログラマが新しいステートメントを定義できる拡張可能な言語の実験も行われています。