私は常に、言語の構文を参照することは、言語のセマンティクスを参照することと同じだと考えてきました。しかし、どうやらそうではないことを知らされました。違いは何ですか?
私は常に、言語の構文を参照することは、言語のセマンティクスを参照することと同じだと考えてきました。しかし、どうやらそうではないことを知らされました。違いは何ですか?
回答:
セマンティクス〜意味
構文〜シンボリック表現
したがって、異なる言語で記述された2つのプログラムは同じことを行うことができますが(セマンティクス)、プログラムの記述に使用されるシンボルは異なります(構文)。
コンパイラーは構文をチェックし(コンパイル時エラー)、言語規則からセマンティクスを導き出します(構文を機械語命令にマッピングします)が、すべてのセマンティクスエラーを見つけません(実行時エラー、計算など)コードにはadd 2ではなくadd 1と表示されるため、間違った結果になります。
x + y
適切な+
演算子がない場合など)の両方を診断できます。2ではなく1を追加することを論理エラーと呼びます。
実際には、2つのレベルではなく、3つのレベルがあります。
i
およびをf
生成するif
)if
、(
、42
、==
、answer
および)
条件文を生成します)ValidIdentifier
ようなものとして定義できる端末を持っているでしょう![AnyKeyword] [Identifier]
(私はここでPEGのような表記法を使用しています)。そのような言語に別の字句解析パスは必要ありません。たとえば、GLRベースのC ++パーサーを参照してください。
セマンティクスは、プログラミング言語の論理エンティティとその相互作用を記述します。構文は、これらが文字で表現される方法を定義します。
たとえば、ポインター演算の概念はCのセマンティクスの一部です。+
and -
演算子を使用してポインター操作を表現する方法は、その構文の一部です。
2つの言語のセマンティクスの一部を共有する場合もありますが、構文は大きく異なります(たとえば、C#とVB.NET-両方とも値型と参照型を使用しますが、それらを定義するために入力する文字は異なります)。それ以外の場合、2つの言語は構文的には似ていますが、セマンティクスは一致しません(JavaとJavaScriptを検討してください。類似性は初心者を混乱させることがよくあります)。
構文は、言語のトークンを配置する方法です。セマンティクスは、それらのトークンが意味するものです(通常、トークンの特定の配置が意味するもの)。
プログラミング言語のみを参照するのか、プログラミングで使用される一般言語を参照するのかを指定しなかったため、私の答えはデータ言語(XML、RDF、データ型システムなど)についてです。
ブライアンL.ミークは、言語に依存しない標準(1995年)を作成するための7つのゴールデンルールの中で、「ある言語の構文は別の言語のセマンティクスになり得る」と書いています。彼は、データの説明で使用されている「構文」と「意味」という言葉に言及しています。したがって、何らかのデータ形式の仕様でこれらの言葉に出くわした場合は、両方の単語を「Potrzebie」に置き換えて、解決する必要があることを明確にする必要があります自分にとっての意味。
少なくとも正確に指定されたデータでは、構文とセマンティクスの関係は、「エンコード」という用語で説明できます。セマンティックは構文でエンコードされます。録音はネストできるため、ある言語の構文は別の言語のセマンティクスです。データの領域を超えると、Umberto Ecoによって「無制限の記号化」と呼ばれるように、このネストは事実上無限になります。
例を挙げると:
人々は通常、あるレベルで停止し、それをセマンティックと見なしますが、最終的には、人間が心の中でデータを解釈しない限り、最終的なセマンティックはありません。データの形式でセマンティックを表現しようとするとすぐに、構文になります。
BNF(Backus-Naur Form)または同様のもので記述できる場合、それは構文です。それができない場合、そうではありません。
一方、セマンティクスは、プログラム(またはソースコードの他のチャンク)の意味に関するものです。
また、2つの間の線がぼやけることもあります。
区別を理解する1つの方法は、プログラムの構文またはセマンティクスが正しくない場合に発生するエラーの種類を調べることです。
構文エラーとは、ソースコードが言語の文法に一致しないことです。たとえば、必要な場所にセミコロンがありません。
セマンティックエラーは、他の言語要件(たとえば、Cが「制約」と呼ぶもの)を満たさないことです。例では、書き込みをされる可能性がありますx + y
どこx
とy
互換性のないタイプがあります。言語の文法では、加算はのようsomething + something
に見えますが、左右のオペランドの型に関する要件を表現するには十分ではありません。
(2が正しい場合に1を使用するなどの論理エラーは一般にコンパイラーによって検出されませんが、場合によってはコンパイラーが疑わしいコードについて警告することができます。)
構文は、文中の単語の文法的な配列、つまり単語の順序です。
(英語) ' cat dog boy 'および(プログラミング) ' hi.5 'は構文的に正しくありません。
(英語) ' cat hugs boy 'および(プログラミング) '* 3.2 * 5 *'は構文的に有効です。
静的セマンティクスは、構文的に有効なステートメントに意味があるかどうかです。
(英語) ' I are big '(プログラミング)(python) ' 3 +' hi ' 'は構文的には正しいが、静的なセマンティックエラーがあります。
セマンティクスは、静的なセマンティックエラーのない、構文的に正しいシンボルの文字列に関連付けられた意味です。つまり、文は構文的にも意味的にも正しいですが、その意味は意図したものではない場合があります。
(英語)「飛行する飛行機は危険である可能性があります」には2つの意味があります。つまり、飛行機の飛行は危険であり、飛行している飛行機は危険です。
(プログラミング) 'コンピューターはエラーメッセージを生成しませんが、ユーザーが指示したことを実行しません。それは何か他のことをするでしょう。」
ソース:MIT 6.00.1
構文は、言語の有効なステートメントの構築を管理する正式な規則を指します。セマンティクスは、ステートメントの意味を与える一連のルールを指します。
プログラミング言語のルールが違反または誤用されると、プログラムに構文によるエラーが発生します。文に意味がない場合、プログラムでセマンティクスによるエラーが発生します。
語順は構文の基本原則であり、書かれていることを理解しようとする人は、語順の構文上の手がかりを使用して、文の構造と意味を提供します。セマンティクスは、事前の知識に基づいた「文」の意味の個人自身の解釈です。したがって、構文的に意味をなさないように見える文は、セマンティックキューを使用するときに意味を持つことができます。
構文は、言語的および文法的に正しいものにのみ関係します。セマンティクスには、言語固有のものをはるかに超える事前知識がすべて必要です。
「Baby milk drinks」という文には構文的な意味はありませんが、セマンティクスを通じて、ほとんどの人は「Baby drinks milk」を意味すると解釈します。キーワード。
構文とセマンティクスは、戦略と戦術、または左右に似ています。
それらは本当に独立した普遍的な概念ではなく、特定の文脈にいるときに反対の方向を示す関連する単語のペアです。しかし、ある規模での戦略と同じことは、別の規模での戦術です。
したがって、言語でコードを記述している場合、構文は使用している言語であり、望ましい動作はセマンティクスです。しかし、その言語のコンパイラを実装または議論している場合、構文は文法であり、おそらく型システムとそれに基づいて構築されたセマンティクスです。等々。
構文はコンピューターが理解するものであり、意味論は人間が理解するものです。
コンパイラー/インタープリターは設計について気にしません。また、マシンレベルにコンパイルされたコードでは、設計を推測するのに苦労します。優れた設計とは、複雑な動作や相互作用を抽象化することで複雑さを軽減することであり、さまざまな種類の問題がさまざまなセマンティクスに役立つため、開発者は設計を重視します。言語の選択は、主に、使用するセマンティクスをその構文でどれだけ簡単かつ効率的に表現できるかに関するものです。
「プレーンc」を使用した非常に短い例:
void main()
{
int a = 10;
int x = a - 1;
int y = - 1;
printf("x = %i", x);
printf("y = %i", y);
getch();
}
この例では、「-」トークンの構文は同じですが、使用場所に応じて異なる意味(「意味」)を持ちます。
「x」割り当てでは、「-」は「減算」演算を意味します。「y」割り当てでは、「-」は「負符号」演算を意味します。
-
事業者は同じですトークンが、彼らはしている構文的に、彼らは別のコンテキストで使用しているため、異なります。 0 - 1
構文規則additive-expression: additive-expression - multiplicative-expression
に一致しますが、構文規則に- 1
一致しますunary-expression: unary-operator cast-expression
(参照:C99標準)。
-
演算子の違いは、意味だけではなく構文です(ただし、意味は異なります)。構文は言語文法によって定義され、2つの演算子は文法の異なるセクションで指定されます。N1570ドラフトの単項演算子についてはセクション6.5.3、加算演算子については6.5.6を参照してください。;あなたがCの例を使用するつもりなら(ところで、それはおそらく正しいはずvoid main()
であるべきint main(void)
、とあなたは行方不明だ#include <stdio.h>
とどんなヘッダで宣言getch