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


120

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


2
私は賛成票を投じたいのですが、調査の努力は明白ではありません。
null

回答:


201

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

次に、C言語の構文規則をいくつか示します。

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

意味論は文の意味についてです。それは質問に答えます:この文章は有効ですか?もしそうなら、文はどういう意味ですか?例えば:

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

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

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

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

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

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


OK。Ifはxそのデータの最大値であり1、それに追加され、それは(いくつかの奇妙な出力になり0)、それは意味的なエラーではありませんか?
2013

車両の走行距離計について考えてみましょう。0から9までの数字が印刷された一連の相互に関連するホイールがあります。右端のホイールが最も速く回転します。9から0に戻ると、すぐ左のホイールが1つ進みます。このホイールが9から0に進むと、そのホイールは左に進みます。
ジェフN

データ型は走行距離計のホイールに似ています。特定の値までしか保持できません。最大値に達すると、次の前進によりホイールがゼロに戻ります。これがセマンティックエラーであるかどうかは、言語規則によって異なります。この場合、C言語標準を参照する必要があります。C言語標準が何を言っているのか正確にはわかりませんが、ここにいくつかのオプションがあります。オーバーフローは次のとおりです。-エラーではありません。結果はゼロです。-エラー; コンパイラはオーバーフロー例外を生成する必要があります。-UNDEFINED;コンパイラは自由に何でもできます。
ジェフN

2
誰かが特定の例を気にする場合、符号なしオーバーフローはモジュラー算術(so UINT_MAX + 1 == 0)として定義されます。符号付きオーバーフローは未定義です。現代のコンパイラは通常持ってINT_MAX + 1 == INT_MINいますが、これに数えることができない場合(たとえば、あるされ、最適化によっては無限ではないが、見blog.llvm.org/2011/05/what-every-c-programmer-should-know。 html)。for (i = 0; i <= N; ++i) { ... }NINT_MAX
ダニエルH

「一部のセマンティクスはコンパイル時に決定できないため、実行時に評価する必要があることに注意してください」-これが自然言語とどのように類似しているかが好きです。あなたは文脈なしでいくつかのフレーズの意味を知ることができません。たとえば、「彼はバナナが好き」というフレーズでは、「彼」の意味は文脈に依存します。
ymln 2018

21

構文とは、言語の構造を指し、語源をたどってどのように組み立てられるかをたどります。
たとえば、構文的に正しいものにするために、型、名前、セミコロンの順に宣言してコードをまとめる必要がある場合があります。

Type token;

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


@Talespin_Kitの意味は構造ではなく:ロジックはより抽象化されている(例:P => Qなど、または!! P = P)。 「幸せじゃない」!=「幸せだ」
doctorlove 14年

5
+1「コンパイラまたはインタープリタは構文エラーについて文句を言う可能性があります。同僚はセマンティクスについて文句を言うでしょう。」
GeekyJ 2015

11

ウィキペディアに答えがあります。リード構文(プログラミング言語)セマンティクス(コンピュータサイエンス) wikipages。

または、コンパイラインタプリタの作業について考えてください。最初のステップは字句解析です。 ここでは、文字列を語彙素に分割してから構文解析を行うことでトークンが生成され、抽象構文ツリー(構文の表現)が構築されます。次のステップには、これらのAST(セマンティクス)の変換または評価が含まれます。

また、Cのバリアントを定義し、すべてのキーワードをフランス語の同等物に変換した場合(にifなるsi、にdoなるfaire、にelseなるsinonなど)は、言語の構文を確実に変更しますが、あまり変更しないことにも注意してください。セマンティクス:そのFrench-Cでのプログラミングは簡単ではありません!


8

セマンティクスとは、コードが意味すること、つまり、疑似コードで説明することです。構文は実際の構造で、変数名からセミコロンまですべてです。


異人同士の会話?それともそれはただ一つの投稿ですか?わかりません。例:「以下の意味がわからない。これ以上間違いではない」
doubleOrt 2018年

5

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


5
  • コンパイルするには正しい構文が必要です。
  • それを機能させるには、正しいセマンティクスが必要です。

1

プログラミング言語の構文は、式、ステートメント、およびプログラム単位の形式です。そのセマンティクスは、それらの式、ステートメント、およびプログラム単位の意味です。たとえば、Java whileステートメントの構文は次のとおりです。

while (boolean_expr) statement

このステートメント形式のセマンティクスは、ブール式の現在の値がtrueの場合、埋め込みステートメントが実行されることです。次に、制御は暗黙的にブール式に戻り、プロセスを繰り返します。ブール式がfalseの場合、制御はwhile構文に続くステートメントに移ります。


1

構文:言語の文法的な構造を参照しています。c言語を記述している場合。データ型、トークンの使用には細心の注意を払う必要があります。「printf、(、)」の3つのトークがあります]。同様に、関数の使い方、関数の構文、関数の宣言、定義、初期化、および呼び出しについても、非常に注意する必要があります。

意味論ではありますが、それは文やステートメントの論理や概念に関係しています。概念または論理から何かを言ったり書いたりする場合、意味的に間違っています。


1

コンパイラがコードをどのように認識するかを理解する

通常、コードの構文およびセマンティクスの分析は、コンパイラーの「フロントエンド」部分で行われます。

  • 構文:コンパイラーは、キーワードとシンボルごとにトークンを生成します。トークンには、キーワードの情報タイプとコード内の位置が含まれています。これらのトークンを使用して、AST(抽象構文ツリーの略)が作成され、分析されます。ここで実際にチェックするコンパイラは、コードが語彙的に意味があるかどうか、つまり「キーワードのシーケンス」が言語規則に準拠しているかどうかです。以前の回答で示唆されているように、それは言語の文法として見ることができます(コードの意味/意味ではありません)。補足:このフェーズでは構文エラーが報告されます(エラータイプのトークンがシステムに返されます)

  • セマンティクス:コンパイラーは、コード操作が「理にかなっている」かどうかをチェックします。たとえば、言語が型推論をサポートしている場合、フロートに文字列を割り当てようとすると、セマティックエラーが報告されます。または同じ変数を2回宣言します。これらは「文法的に」/構文的に正しいエラーですが、操作中は意味がありません。補足:同じ変数が2回宣言されているかどうかをチェックするために、コンパイラはシンボルテーブルを管理します

したがって、これらの2つのフロントエンドフェーズの出力は、注釈付きのAST(データ型付き)とシンボルテーブルです。

技術的ではない方法で理解する

私たちが使用する通常の言語を考えると、ここ、英語:

例えば、彼は学校に行きます。-不適切な文法/構文、ただし彼は正しい意味/意味を伝えたかった。

例えば、彼は風邪をひきます。-風邪は形容詞です。英語では、これは文法に準拠していないと言えるかもしれませんが、実際には、私が考えることができる正しい構文を使用した誤ったセマンティックに最も近い例です。


コンパイラ このリンクは詳細を知るのに役立つかもしれません
Vedant Panchal
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.