回答:
構文は、言語の構造または文法に関するものです。それは質問に答えます:どうすれば有効な文を構成できますか?英語や他の人間(別名「自然」)言語でさえ、すべての言語には文法があります。つまり、文が適切に構成されているかどうかを定義するルールがあります。
次に、C言語の構文規則をいくつか示します。
意味論は文の意味についてです。それは質問に答えます:この文章は有効ですか?もしそうなら、文はどういう意味ですか?例えば:
x++; // increment
foo(xyz, --b, &qrs); // call foo
構文的に有効なCステートメントです。しかし、それらはどういう意味ですか?これらのステートメントを実行可能な一連の命令に変換しようとすることは有効ですか?これらの質問は、意味論の中心にあります。
最初のステートメントの++演算子を検討してください。まず第一に、これを試みることさえ有効ですか?
最後に、一部のセマンティクスはコンパイル時に決定できないため、実行時に評価する必要があることに注意してください。++演算子の例で、xが既にそのデータ型の最大値になっている場合、1を追加しようとするとどうなりますか?別の例:プログラムが値がNULLのポインターを逆参照しようとするとどうなりますか?
要約すると、構文は、文が言語の文法に対して有効であるかどうかにのみ関係する概念です。セマンティクスとは、文に有効な意味があるかどうかです。
x
そのデータの最大値であり1
、それに追加され、それは(いくつかの奇妙な出力になり0
)、それは意味的なエラーではありませんか?
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) { ... }
N
INT_MAX
構文とは、言語の構造を指し、語源をたどってどのように組み立てられるかをたどります。
たとえば、構文的に正しいものにするために、型、名前、セミコロンの順に宣言してコードをまとめる必要がある場合があります。
Type token;
一方、セマンティクスは意味に関するものです。コンパイラーまたはインタープリターが構文エラーについて不満を言う可能性があります。あなたの同僚はセマンティクスについて不満を言うでしょう。
ウィキペディアに答えがあります。リード構文(プログラミング言語)&セマンティクス(コンピュータサイエンス) wikipages。
または、コンパイラやインタプリタの作業について考えてください。最初のステップは字句解析です。 ここでは、文字列を語彙素に分割してから構文解析を行うことでトークンが生成され、抽象構文ツリー(構文の表現)が構築されます。次のステップには、これらのAST(セマンティクス)の変換または評価が含まれます。
また、Cのバリアントを定義し、すべてのキーワードをフランス語の同等物に変換した場合(にif
なるsi
、にdo
なるfaire
、にelse
なるsinon
など)は、言語の構文を確実に変更しますが、あまり変更しないことにも注意してください。セマンティクス:そのFrench-Cでのプログラミングは簡単ではありません!
セマンティクスとは、コードが意味すること、つまり、疑似コードで説明することです。構文は実際の構造で、変数名からセミコロンまですべてです。
構文:言語の文法的な構造を参照しています。c言語を記述している場合。データ型、トークンの使用には細心の注意を払う必要があります。「printf、(、)」の3つのトークがあります]。同様に、関数の使い方、関数の構文、関数の宣言、定義、初期化、および呼び出しについても、非常に注意する必要があります。
意味論ではありますが、それは文やステートメントの論理や概念に関係しています。概念または論理から何かを言ったり書いたりする場合、意味的に間違っています。
通常、コードの構文およびセマンティクスの分析は、コンパイラーの「フロントエンド」部分で行われます。
構文:コンパイラーは、キーワードとシンボルごとにトークンを生成します。トークンには、キーワードの情報タイプとコード内の位置が含まれています。これらのトークンを使用して、AST(抽象構文ツリーの略)が作成され、分析されます。ここで実際にチェックするコンパイラは、コードが語彙的に意味があるかどうか、つまり「キーワードのシーケンス」が言語規則に準拠しているかどうかです。以前の回答で示唆されているように、それは言語の文法として見ることができます(コードの意味/意味ではありません)。補足:このフェーズでは構文エラーが報告されます(エラータイプのトークンがシステムに返されます)
セマンティクス:コンパイラーは、コード操作が「理にかなっている」かどうかをチェックします。たとえば、言語が型推論をサポートしている場合、フロートに文字列を割り当てようとすると、セマティックエラーが報告されます。または同じ変数を2回宣言します。これらは「文法的に」/構文的に正しいエラーですが、操作中は意味がありません。補足:同じ変数が2回宣言されているかどうかをチェックするために、コンパイラはシンボルテーブルを管理します
したがって、これらの2つのフロントエンドフェーズの出力は、注釈付きのAST(データ型付き)とシンボルテーブルです。
私たちが使用する通常の言語を考えると、ここ、英語:
例えば、彼は学校に行きます。-不適切な文法/構文、ただし彼は正しい意味/意味を伝えたかった。
例えば、彼は風邪をひきます。-風邪は形容詞です。英語では、これは文法に準拠していないと言えるかもしれませんが、実際には、私が考えることができる正しい構文を使用した誤ったセマンティックに最も近い例です。