1. ホーム
  2. syntax

[解決済み] プログラミング言語における文法と意味の違いは何ですか?

2022-05-10 14:57:08

質問

とはどのような違いがあるのでしょうか? 構文 セマンティクス のようなプログラミング言語(C、C++)の?

どのように解決するのですか?

TL; DR

要約すると , 構文は、その文が言語の文法として妥当かどうかだけに関わる概念である。意味論は、その文が有効な意味を持つかどうかということです。

長い回答です。

シンタックスとは 構造 または言語の文法に関するものです。有効な文章を作るにはどうしたらいいかという問いに答えるものです。すべての言語、たとえ英語やその他の人間(自然言語)であっても、文法、つまり、文が適切に構築されているかどうかを定義する規則を持っています。

ここではC言語の構文ルールを紹介します。

  • ステートメントをセミコロンで区切る
  • IF文の条件式を括弧で囲む。
  • 中括弧で囲んで複数の文を1つの文にまとめる。
  • データ型と変数は、最初の実行文の前に宣言する必要があります (この機能は C99 では廃止されました。C99 以降では型が混在した宣言が可能です)。

セマンティクスとは の意味です。 についてです。この文は有効か?もしそうなら、この文は何を意味するのか?例えば

x++;                  // increment
foo(xyz, --b, &qrs);  // call foo

は構文的に有効なC言語文です。しかし、それらは何を意味するのでしょうか?これらの文を実行可能な命令列に変換しようとすることさえ有効なのでしょうか?これらの疑問は意味論の核心にあります。

最初の文の ++ 演算子を考えてみましょう。まず第一に、これを試みることは妥当なのでしょうか?

  • x が float データ型の場合、この文は(C 言語の規則によれば)意味を持たないので、エラーになります。 であり、構文的に正しいステートメントであるにもかかわらず、エラーとなります。
  • もしxがポインタで あるデータ型 である場合、この文の意味は、 "サイズオブ値を追加する( あるデータ型 ) をアドレス x の値に追加し、その結果をアドレス x の場所に格納することです" 。
  • x がスカラーである場合、ステートメントの意味は "アドレス x の値に 1 を追加し、その結果をアドレス x の場所に格納します" となります。

最後に、いくつかのセマンティクスはコンパイル時に決定できないため、実行時に評価されなければならないことに注意してください。++演算子の例では、x がすでにそのデータ型の最大値である場合、それに 1 を加えようとするとどうなるでしょうか。別の例では、値が NULL のポインタをプログラムがデリファレンスしようとしたらどうなるでしょうか。