コンピュータプログラミングにおいて、文は命令型プログラミング言語の構文単位であり、実行すべき何らかのアクションを表現します。[1]このような言語で書かれたプログラムは、1つ以上の文のシーケンスによって形成されます。文には内部コンポーネント(式など)が含まれる場合があります。
多くのプログラミング言語 (例: Ada、Algol 60、C、Java、Pascal ) では、文と定義/宣言を区別しています。定義または宣言はプログラムが操作するデータを指定するのに対し、文はそのデータに対して実行されるアクションを指定します。
他の文を含むことができない文は単純文であり、他の文を含むことができる文は複合文である。[2]
ステートメント(そして実際にはプログラム)の外観は、その構文または文法によって決まります。ステートメントの意味は、そのセマンティクスによって決まります。
シンプルな文
単純なステートメントはそれ自体で完結しています。これには、代入、サブルーチン呼び出し、およびプログラムの制御フローに大きく影響する可能性のあるいくつかのステートメント (例: goto、return、 stop/halt) が含まれます。一部の言語では、入力と出力、アサーション、および終了は特別なステートメントによって処理されますが、他の言語では定義済みのサブルーチンへの呼び出しが使用されます。
- 割り当て
- フォートラン:
variable = expression - パスカル、アルゴル 60、エイダ:
variable := expression; - C、C#、C++、PHP、Java:
variable = expression;
- フォートラン:
- 電話
- フォートラン:
CALL subroutine name(parameters) - C、C++、Java、PHP、Pascal、Ada:
subroutine name(parameters);
- フォートラン:
- 主張
- C、C++、PHP:
assert(relational expression); - ジャワ:
assert relational expression;
- C、C++、PHP:
- 行く
- フォートラン:
GOTO numbered-label - アルゴル60:
goto label; - C、C++、PHP、パスカル:
goto label;
- フォートラン:
- 戻る
- フォートラン:
RETURN value - C、C++、Java、PHP:
return value;
- フォートラン:
- 停止/停止/終了
- フォートラン:
STOP number - C、C++:
exit(expression) - PHP:
exit number;
- フォートラン:
複合文
複合ステートメントには、任意の適切な深さにネスト可能なステートメント(のシーケンス)が含まれる場合があり、通常、含まれるステートメントに従うか繰り返すかを決定するテストが含まれます。
- 次の例の表記:
- <statement> は任意の単一のステートメントです (単純または複合の可能性があります)。
- <シーケンス>は、0個以上の<ステートメント>のシーケンスです。
- 一部のプログラミング言語では、ステートメントをグループ化する一般的な方法が提供されており、単一の<statement> をグループに置き換えることができます。
- 次の例の表記:
- アルゴル60:
begin <sequence> end - パスカル:
begin <sequence> end - C、PHP、Java:
{ <sequence> }
- アルゴル60:
- 他のプログラミング言語では、複合ステートメントの種類ごとに異なる特殊な終了文字があり、1 つ以上のステートメントが自動的にグループとして扱われます。
- エイダ:
if test then <sequence> end if;
- エイダ:
- 他のプログラミング言語では、複合ステートメントの種類ごとに異なる特殊な終了文字があり、1 つ以上のステートメントが自動的にグループとして扱われます。
多くの複合ステートメントは、ループ コマンドまたは選択コマンドです。理論上は、これらの各タイプのコマンドのうち 1 つだけが必要です。実際には、さまざまな特殊なケースが頻繁に発生します。これらの特殊なケースにより、プログラムが理解しやすくなり、プログラミングが容易になり、多くの場合、はるかに効率的に実装できます。ここでは説明されていない微妙な点が多数あります。詳細については、リンクされた記事を参照してください。
- カウント制御ループ:
- アルゴル60:
for index := 1 step 1 until limit do <statement> ; - パスカル:
for index := 1 to limit do <statement> ; - C、Java:
for ( index = 1; index <= limit; index += 1) <statement> ; - エイダ:
for index in 1..limit loop <sequence> end loop - Fortran 90:
DOインデックス= 1 、制限<シーケンス> END DO
- アルゴル60:
- ループの開始時にテストを行う
条件制御ループ:
- アルゴル60:
for index := expression while test do <statement> ; - パスカル:
while test do <statement> ; - C、Java:
while (test) <statement> ; - エイダ:
while test loop <sequence> end loop - Fortran 90:
DO WHILE (テスト) <シーケンス> END DO
- アルゴル60:
- ループの最後にテストを
実行する条件制御ループ:
- パスカル:
repeat <sequence> until test; { note reversed test } - C、Java:
do { <sequence> } while (test) ; - エイダ:
loop <sequence> exit when test; end loop;
- パスカル:
- ループの途中でテストが行われる条件制御ループ:
- C:
do { <sequence> if (test) break; <sequence> } while (true) ; - エイダ:
loop <sequence> exit when test; <sequence> end loop;
- C:
- if文の単純な状況:
- アルゴル60:
if test then <unconditional statement> ; - パスカル:
if test then <statement> ; - C、Java:
if (test) <statement> ; - エイダ:
if test then <sequence> end if; - Fortran 77+:
IF (テスト) THEN <シーケンス> END IF
- アルゴル60:
- if文の2方向選択:
- アルゴル60:
if test then <unconditional statement> else <statement> ; - パスカル:
if test then <statement> else <statement> ; - C、Java:
if (test) <statement> else <statement> ; - エイダ:
if test then <sequence> else <sequence> end if; - Fortran 77+:
IF (テスト) THEN <シーケンス> ELSE <シーケンス> END IF
- アルゴル60:
- case/switch ステートメントの複数の選択肢:
- パスカル:
case c of 'a': alert(); 'q': quit(); end; - エイダ:
case c is when 'a' => alert(); when 'q' => quit(); end case; - C、Java:
switch (c) { case 'a': alert(); break; case 'q': quit(); break; }
- パスカル:
- 例外処理:
- エイダ:
begin protected code except when exception specification => exception handler - ジャワ:
try { 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 など) で始まります。さまざまな言語で文の形式を記述するためにさまざまな方法が使用されてきましたが、より形式的な方法の方が正確になる傾向があります。
- Algol 60は、言語文法仕様の新しいレベルを確立したバッカス・ナウア記法(BNF)を使用しました。 [3]
- Fortran 77までは、言語は例文付きの英語の散文で記述されていましたが、[4] Fortran 90以降は、BNFの変種を使用して言語が記述されました。[5]
- Cobolは2次元メタ言語を使用していました。[6]
- Pascalは構文図と同等のBNFの両方を使用していました。[7]
BNF は繰り返しを表現するために再帰を使用するため、繰り返しを直接示すことができるように さまざまな拡張が提案されてきました。
ステートメントとキーワード
一部のプログラミング言語の文法では、キーワードを予約したり、特別にマークしたりして、識別子として使用できないようにしています。これにより、先読みが少なくなり、解析が容易な文法になることがよくあります。
区別できるキーワードはありません
Fortran と PL/1 には予約キーワードがないため、次のような文が許可されます。
- PL/1の場合:
IF IF = THEN THEN ...(2番目IFと1番目THENは変数です)。
- Fortranの場合:
IF (A) X = 10...条件文(他のバリエーションを含む)IF (A) = 2添字付き変数への代入IF
- Fortran 95 まではスペースはオプションであったため、タイプミスによって文の意味が完全に変わる可能性がありました。
DO 10 I = 1,5Iが1から5まで実行されるループの開始DO 10 I = 1.5変数に値1.5を割り当てるDO10I
フラグが付けられた単語
Algol 60 および Algol 68 では、特別なトークンが明示的に区別されていました。出版用には太字でbegin、プログラミング用にはフラグ ( 'begin)、引用符 ( 'begin')、または下線 ( Elliott 503beginの場合) などの特別なマークが付きます。これは「ストロッピング」と呼ばれます。
したがって、言語構文の一部であるトークンは、プログラマが定義した名前と競合しません。
予約キーワード
特定の名前はプログラミング言語の一部として予約されており、プログラマー定義の名前として使用することはできません。最も人気のあるプログラミング言語の大半は予約キーワードを使用しています。初期の例としては、FLOW-MATIC (1953) やCOBOL (1959) などがあります。1970 年以降の他の例としては、Ada、C、C++、Java、Pascal などがあります。予約語の数は言語によって異なります。C では約 30 語ですが、COBOL では約 400 語あります。
セマンティクス
セマンティクスはプログラムの意味に関係しています。多くのプログラミング言語の標準文書では、構文/文法をかなり形式的かつ正確に表現するために BNF またはそれに相当するものが使用されていますが、プログラムの意味/セマンティクスは一般に例と英語の散文を使用して記述されます。これにより、あいまいさが生じる可能性があります。[8]一部の言語記述では、複合文の意味は「より単純な」構造を使用して定義されます。たとえば、while ループは、およびを使用して、 テスト、ジャンプ、ラベルの組み合わせで定義できます。
ifgoto
セマンティクスの記事では、セマンティクスを正確に指定するために使用されてきたいくつかの数学的/論理的形式主義について説明します。これらは通常、BNF よりも複雑であり、一般的に受け入れられている単一のアプローチはありません。アプローチの中には、言語のインタープリターを効果的に定義するもの、形式論理を使用してプログラムを推論するもの、一貫性を確保するために構文エンティティに接尾辞を付けるものなどがあります。
表現
実行される文と評価される式は区別されることがよくあります。式は常に値に評価されますが、文はそうではありません。ただし、式は多くの場合、より大きな文の一部として使用されます。
ほとんどのプログラミング言語では、文は式だけで構成できます。通常は、式の後に文の終端子 (セミコロン) が続きます。このような場合、式は値に評価されますが、文全体は値に評価されません (式の値は破棄されます)。たとえば、C、C++、C#、および多くの類似言語では、x = y + 1は x を y に 1 を加えた値に設定する式であり、式全体自体は x に設定されている値と同じ値に評価されます。ただし、x = y + 1;(末尾のセミコロンに注意) は、文内の式は評価されるものの式の結果は破棄されるため、x を y に 1 を加えた値に設定する文ですが、文自体は値に評価されません。[9]
式は他の式内に含めることもできます。たとえば、式にはx = y + 1式 が含まれy + 1、式には値 と が含まれますyが1、これらも技術的には式です。
前の例では代入式を示しましたが、言語によっては代入を式ではなく文として実装しているものもあります。その顕著な例はPythonで、=は演算子ではなく代入文の区切り文字にすぎません。Pythonでは各代入が式であるため複数の代入が可能ですが、これは真の式ではなく、言語文法に組み込まれた代入文の特殊なケースにすぎません。[10]
拡張性
ほとんどの言語には、言語によって定義された固定のステートメント セットがありますが、プログラマーが新しいステートメントを定義できる 拡張可能な言語の実験が行われてきました。
参照
参考文献
- ^ 「声明」。Webopedia。1996年9月。 2015年3月3日閲覧。
- ^ バッカス、JW;フロリダ州バウアー。グリーン、J.カッツ、C.マッカーシー、J.ナウル、P.ペルリス、AJ。ルティシャウザー、H.サミュエルソン、K.ボーコワ、B.ウェグスタイン、JH;ファン・ワインガルデン、A.ウッジャー、M. ナウル、ピーター (編)。 「アルゴリズム言語 Algol 60 に関する改訂レポート」。質量: ワーク。セクション「4.1」。2021 年1 月 23 日に取得。
- ^ バッカス、JW;フロリダ州バウアー。グリーン、J.カッツ、C.マッカーシー、J.ナウル、P.ペルリス、AJ。ルティシャウザー、H.サミュエルソン、K.ボーコワ、B.ウェグスタイン、JH;ファン・ワインガルデン、A.ウッジャー、M. ナウル、ピーター (編)。 「アルゴリズム言語 Algol 60 に関する改訂レポート」。質量: ワーク。セクション「1.1」。2021 年1 月 23 日に取得。
- ^ 「FORTRAN」(PDF)。米国規格協会。1966年。 2021年2月19日閲覧– WG5 Fortran Standards経由。
- ^ 「ワーキングドラフト J3/04-007」(PDF)。J3 Fortran。2004年5月10日。 2021年2月19日閲覧。
- ^ 「ASCII COBOLプログラミングリファレンスマニュアル」(PDF)。unisys。2010年6月。 2021年1月23日閲覧。
- ^ Jensen, Kathleen; Wirth, Niklaus (1974). Goos, G.; Hartmanis, J. (編). 「PASCAL ユーザーマニュアルとレポート」(PDF) .コンピュータサイエンスの講義ノート. 付録 D . 2021 年2 月 19 日に閲覧。
- ^ Knuth, DE (1967 年 7 月). 「Algol 60 に残る問題点」(PDF) . ALGOL ファミリー. 2021 年2 月 24 日閲覧。
- ^ 「ISO/IEC 9899:1999 (E)」(PDF) 。ISO/IEC。2024年2月7日時点のオリジナルよりアーカイブ(PDF) 。
- ^ 「7. 単純なステートメント」。Python 3.10.8 ドキュメント。
外部リンク
- PC 百科事典: プログラム ステートメントの定義
