言語の構文を参照することは、言語のセマンティクスを参照することと同じであるといつも思っていました。しかし、明らかにそうではないことを私は知らされました。違いは何ですか?
セマンティクス〜意味
構文〜記号表現
したがって、異なる言語で書かれた2つのプログラムは同じこと(セマンティクス)を実行できますが、プログラムの作成に使用されるシンボルは異なります(構文)。
コンパイラーは構文をチェックし(コンパイル時エラー)、言語規則からセマンティクスを導出します(構文をマシンインストラクションにマッピングするなど)が、すべてのセマンティクスエラー(ランタイムエラー、計算など)を検出しませんコードがadd 2)ではなくadd 1と言っているため、間違った結果。
実際には2つのレベルではなく3つあります。
i
およびf
はif
を生成します)if
、(
、42
、==
、answer
および)
は条件付きステートメントを生成します)ENGLISH
言語の簡単な例を使って説明します。
The glass drank Ben
構文的に正しいステートメントです。名詞や動詞などがあります。
しかし、このステートメントには考えられる意味や正しい意味がないため、意味的には間違っています。
Semanticsプログラミング言語の論理エンティティとその相互作用を記述します。 構文は、これらが文字でどのように表現されるかを定義します。
たとえば、ポインタ演算の概念はCのセマンティクスの一部です。方法+
および-
演算子は、その構文の一部であるポインタ操作を表すために使用できます。
2つの言語がセマンティクスの一部を共有することがありますが、構文は大きく異なります(例:C#とVB.NET-どちらも値型と参照型を使用しますが、それらを定義するために入力する文字は異なります)。他の場合では、2つの言語は構文的に類似していますが、セマンティクスが一致していません(JavaとJavaScriptを比較してください。類似点が初心者を混乱させることがよくあります)。
構文は、言語のトークンを配置する方法です。セマンティクスとは、これらのトークンが意味することです(通常、トークンの特定の配置が意味すること)。
プログラミング言語のみを参照するのか、プログラミングで使用される一般言語を参照するのかを指定しなかったため、私の答えはデータ言語についてです(XML、RDF、データ型システムなど):
ブライアン・L・ミークは、言語に依存しない標準を作成するための7つの黄金律(1995)に次のように書いています "1つの言語の構文は別のセマンティクスにすることができます "。彼はデータの説明で使用されている「構文」と「セマンティック」という単語を参照しています。そのため、いくつかのデータ形式の仕様でこれらの単語に出くわした場合は、両方の単語をに置き換えることをお勧めします "Potrzebie 「自分自身の意味を理解しなければならないことを明確にします。
構文と意味の間の関係は、少なくとも正確に指定されたデータでは、用語 "encoding"でより適切に説明できます。セマンティックは構文でエンコードされます。録音はネストできるため、1つの言語の構文は別の言語のセマンティクスです。 Umberto Ecoによって「無制限の記号論」として説明されているように、データの領域を超えた場合、このネストは事実上無限になる可能性があります。
例を挙げましょう:
人々は通常、あるレベルで立ち止まり、それを意味論として解釈しますが、最終的には、人間が彼の心のデータを解釈しない限り、最終的な意味論はありません。データの形式で意味論を表現しようとするとすぐに、構文になります。
BNF(Backus-Naur Form) で記述できる場合、またはこれに類似したものは、構文です。できない場合は、そうではありません。
一方、セマンティクスは、プログラム(またはソースコードの他のチャンク)の意味についてです。
また、2つの間の線がぼやけている場合もあります。
違いを理解する1つの方法は、プログラムの構文またはセマンティクスが正しくないときに発生するエラーの種類を調べることです。
構文エラーとは、ソースコードが言語の文法と一致しないことです。たとえば、セミコロンが必要な場所にセミコロンがありません。
セマンティックエラーとは、他の言語要件(たとえば、Cが「制約」と呼ぶもの)を満たさないことです。例として、x + y
を書き込む場合があります。ここで、x
とy
は互換性のない型です。言語の文法では、加算はsomething + something
のように見えますが、左と右のオペランドの型に関する要件を表現するのに十分強力ではありません。
(2が正しい場合に1を使用するなどの論理エラーは、通常、コンパイラーでは検出できません。ただし、問題のあるコードについてコンパイラーが警告する場合があります。)
構文は、(字句)記号が言うことです。セマンティクスとは、その意味です。
考慮してください:
C#:_condition ? true_value : false_value
_
VB.NET:If(condition, true_value, false_value)
-異なる構文、同じセマンティクス。
C#:_left_value / right_value
_
VB.NET:_left_value / right_value
_
-同じ構文、異なるセマンティクス(整数の場合)。
構文は、文中の単語の文法的な配置、つまり単語の順序です。
(英語) 'cat dog boy'および(programming) 'hi.5 'はnot構文的に正しいです。
(英語) ‘cat hugs boy’および(プログラミング) ‘* 3.2 * 5 *’は構文的に有効です。
Static Semanticsは、構文的に有効なステートメントに意味があるかどうかです。
(英語) 'I are big'(programming)(python) '3 +' hi ' 'は構文的には正しいですが、静的な意味上のエラーがあります。
Semanticsは、静的な意味エラーのない、構文的に正しい記号の文字列に関連付けられた意味です。つまり、文は構文的にも意味的にも正しいですが、その意味は意図したものとは異なる場合があります。
(英語)「飛行中の飛行機は危険な場合があります」には2つの意味があります。つまり、飛行機の飛行は危険な場合と、飛行中の飛行機は危険な場合があります。
(プログラミング)「コンピュータはエラーメッセージを生成しませんが、ユーザーが指示したとおりには実行しません。それは別のことをします。」
ソース:MIT 6.00.1