web-dev-qa-db-ja.com

プログラミング言語の構文とセマンティクスの違いは何ですか?

プログラミング言語(C、C++など)の構文セマンティクスの違いは何ですか?

88
haccks

構文は、構造または言語の文法に関するものです。それは質問に答えます:どうすれば有効な文を構築できますか?すべての言語には、英語やその他の「自然」言語も含めて、文法、つまり文が適切に構築されるかどうかを定義するルールがあります。

C言語の構文規則は次のとおりです。

  • セミコロンで区切られたステートメント
  • iFステートメントの条件式を括弧で囲みます
  • 中括弧で囲むことにより、複数のステートメントを単一のステートメントにグループ化します
  • データ型と変数は、最初の実行可能ステートメントの前に宣言する必要があります(この機能はC99で削除されました。C99以降では、混合型の宣言が可能です)。

セマンティクスは、文の意味についてです。それは質問に答えます:この文は有効ですか?もしそうなら、その文はどういう意味ですか?例えば:

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

構文的に有効なCステートメントです。しかし、それらはどういう意味ですか?これらのステートメントを命令の実行可能なシーケンスに変換しようと試みることは有効ですか?これらの質問はセマンティクスの中心にあります。

最初のステートメントの++演算子を検討してください。まず第一に、これを試みることは有効ですか?

  • Xがfloatデータ型である場合、このステートメントは(C言語の規則に従って)意味を持たないため、ステートメントが構文的に正しい場合でもエラーです。
  • Xがsome data typeへのポインターである場合、ステートメントの意味は、「sizeof(some data type)をアドレスxの値に追加し、結果をアドレスx "の場所。
  • Xがスカラーの場合、ステートメントの意味は「アドレスxの値に1を加算し、結果をアドレスxの位置に格納する」です。

最後に、一部のセマンティクスはコンパイル時に決定できないため、実行時に評価する必要があることに注意してください。 ++演算子の例で、xが既にそのデータ型の最大値にある場合、それに1を追加しようとするとどうなりますか?別の例:プログラムが値がNULLのポインターを逆参照しようとするとどうなりますか?

要約すると、構文は、文が言語の文法に対して有効であるかどうかのみに関係する概念です。セマンティクスは、文に有効な意味があるかどうかに関するものです。

164
Jeff N

構文とは、言語の構造を指し、その 語源 を追跡して物事をまとめる方法を示します。
たとえば、構文を正しくするために、型、名前、セミコロンの順に宣言して、コードをまとめる必要がある場合があります。

Type token;

一方、セマンティクスは意味に関するものです。コンパイラーまたはインタープリターが構文エラーについて文句を言う可能性があります。あなたの同僚はセマンティクスについて不平を言うでしょう。

17
doctorlove

ウィキペディアには答えがあります。 構文(プログラミング言語)セマンティクス(コンピューターサイエンス) wikipagesを読んでください。

または、 compiler または interpreter の動作について考えてください。最初のステップは 字句解析 です。文字列を語彙素に分割してトークンを生成し、次に 解析 で構築します 抽象構文ツリー (これは表現です)構文の)。次の手順では、これらのAST(セマンティクス)を変換または評価します。

また、すべてのキーワードがフランス語に相当するCのバリアントを定義した場合(ifsiになる、dofaireになる、elsesinonになるなど)、間違いなく言語の構文を変更することに注意してくださいセマンティクスをあまり変更しません。フランス語Cでのプログラミングは簡単ではありません。

セマンティクスとは、コードが意味するものであり、擬似コードで説明するものです。構文は、変数名からセミコロンに至るまでの実際の構造です。

6
thumbtackthief

構文は式、ステートメント、およびプログラム単位の構造または形式ですが、セマンティクスはこれらの式、ステートメント、およびプログラム単位の意味です。 セマンティクス構文から直接続きます。 構文は、特定のプログラミング言語が指定するコードの構造/形式を指しますが、セマンティクスは、記号、文字、単語に割り当てられた意味を処理します。

2
Kobina Ebo

構文:文法的に言語の構造を指します。c言語を書いている場合。データ型、トークンの使用には細心の注意を払う必要があります[トークンは、リテラルまたは「printf()」のようなシンボルにすることができます。 「printf、(、)」]という3つのトークがあります。同様に、関数の使用方法、関数の構文、関数の宣言、定義、初期化、呼び出しなど、非常に注意する必要があります。

セマンティクスではありますが、文または文の論理または概念に関係します。コンセプトやロジックから何かを言ったり書いたりする場合。次に、意味的に間違っています。

1