나는 항상 언어의 구문을 언급하는 것이 언어의 의미를 언급하는 것과 같다고 생각했습니다. 그러나 나는 분명히 그렇지 않다는 정보를 받았다. 차이점이 뭐야?
나는 항상 언어의 구문을 언급하는 것이 언어의 의미를 언급하는 것과 같다고 생각했습니다. 그러나 나는 분명히 그렇지 않다는 정보를 받았다. 차이점이 뭐야?
답변:
의미론 ~ 의미
구문 ~ 기호 표현
따라서 다른 언어로 작성된 두 개의 프로그램은 동일한 의미 (의미론)를 수행 할 수 있지만 프로그램을 작성하는 데 사용되는 기호는 다릅니다 (구문).
컴파일러는 구문을 검사하고 (컴파일 타임 오류) 언어 규칙에서 구문을 파생 시키며 (구문을 기계 명령어로 매핑), 모든 의미 오류 (런타임 오류, 계산 등)를 찾지 못합니다. 코드에 add 2 대신 add 1이라고 표시되어 있기 때문에 잘못된 결과).
x + y
적절한 +
연산자 가없는 경우 )를 모두 진단 할 수 있으며 반드시 진단해야합니다 . 2 대신 1을 추가하는 것이 논리적 오류 라고 부릅니다 .
실제로 두 가지 수준이 아니라 세 가지가 있습니다.
i
및 f
생산 if
)if
, (
, 42
, ==
,을 answer
및 )
조건문을 생산)ValidIdentifier
터미널과 같이 정의 될 수 있습니다 ![AnyKeyword] [Identifier]
(여기서는 PEG와 같은 표기법을 사용하고 있습니다). 그러한 언어에 대해 별도의 렉싱 패스가 필요하지 않습니다. 예를 들어 GLR 기반 C ++ 파서를 참조하십시오.
의미론 은 프로그래밍 언어의 논리적 실체와 그 상호 작용을 설명합니다. 구문 은 문자로 표현되는 방법을 정의합니다.
예를 들어, 포인터 산술의 개념은 C의 의미론의 일부입니다. +
및 -
연산자를 사용하여 포인터 연산을 표현 하는 방법은 구문의 일부입니다.
때로는 두 언어가 의미의 일부를 공유하지만 구문이 크게 다릅니다 (예 : C # 및 VB.NET-값 유형과 참조 유형을 사용하지만 입력하기 위해 입력하는 문자가 다름). 다른 경우에는 두 언어가 구문 상 유사하지만 의미가 일치하지 않습니다 (자바가 초보자를 혼동하는 Java와 JavaScript를 고려하십시오).
구문은 언어 토큰을 정렬하는 방법입니다. 시맨틱은 이러한 토큰의 의미 (일반적으로 특정 토큰 배열의 의미)입니다.
프로그래밍 언어 또는 프로그래밍에 사용되는 일반 언어 만 참조하도록 지정하지 않았으므로 내 대답은 데이터 언어 (예 : XML, RDF, 데이터 유형 시스템 등)에 관한 것입니다.
Brian L. Meek는 언어 독립 표준 (1995) 을 만들기위한 7 가지 황금 규칙에서 "한 언어의 구문이 다른 언어의 의미 일 수 있습니다"라고 말합니다 . 그는 데이터 설명에 사용 된 "구문"및 "의미"라는 단어를 참조합니다. 따라서 일부 데이터 형식의 스펙에서이 단어를 우연히 발견하면 두 단어를 "Potrzebie" 로 바꾸어야 해결해야합니다. 자신에 대한 의미.
적어도 정확히 지정된 데이터에서 구문과 의미의 관계는 "encoding" 이라는 용어로 더 잘 설명 될 수 있습니다 . 시맨틱은 구문으로 인코딩됩니다. 레코딩이 중첩 될 수 있으므로 한 언어의 구문이 다른 언어의 의미입니다. 데이터 영역을 넘어 서면 Umberto Eco에서 "무제한 반증"으로 설명한 것처럼이 중첩은 사실상 무한 할 수 있습니다.
예를 들자면 :
사람들은 보통 어떤 수준에서 멈추고 의미 론적으로 받아들이지 만, 결국 어떤 인간이 자신의 마음에있는 데이터를 해석하지 않는 한 최종 의미론은 없습니다. 데이터 형식으로 의미를 표현하려고하면 구문이됩니다.
BNF (Backus-Naur Form) 또는 이와 유사한 것으로 설명 할 수 있으면 구문입니다. 할 수 없다면 그렇지 않습니다.
반면 시맨틱 은 프로그램 (또는 다른 소스 코드 덩어리)의 의미 에 관한 것 입니다.
때로는 둘 사이의 선이 흐릿해질 수 있습니다.
차이점을 이해하는 한 가지 방법은 프로그램의 구문이나 의미가 올바르지 않을 때 발생하는 오류의 종류를 보는 것입니다.
구문 오류는 소스 문법이 언어 문법과 일치하지 않는 것입니다 (예 : 필요한 경우 세미콜론이 없음).
시맨틱 오류는 다른 언어 요구 사항 (예 : C가 "제약"이라고 함)을 충족시키지 못하는 것입니다. 예를 들어 호환되지 않는 유형 과 x + y
위치를 쓰는 것이 있습니다. 언어 문법은 덧셈 이처럼 보이지만 왼쪽 및 오른쪽 피연산자 유형에 대한 요구 사항을 표현할만큼 강력하지는 않습니다.x
y
something + something
(1을 사용하는 2와 같은 논리 오류는 일반적으로 컴파일러에서 감지 할 수 없지만 일부 경우 컴파일러는 문제가있는 코드에 대해 경고 할 수 있습니다.)
구문 은 문장 즉 단어 순서로 단어를 문법적으로 배열 한 것입니다.
(영어) ' cat dog boy '및 (programming) ' hi.5 '는 구문 상 정확 하지 않습니다 .
(영어) ' cat hugs boy '및 (프로그래밍) '* 3.2 * 5 *'는 구문 상 유효합니다.
정적 의미론 은 구문 적으로 유효한 명령문이 의미 를 갖는지 여부입니다.
(영어) ' I big '(프로그래밍) (python) ' 3 +'hi ' '는 구문 상 정확하지만 정적 의미 오류가 있습니다.
의미론 은 정적 의미 론적 오류가없는 구문 상으로 올바른 기호 문자열과 관련된 의미 입니다. 즉, 문장이 의미 상으로 의미 론적으로 정확하지만 그 의미가 의도 한 것이 아닐 수도 있습니다.
(영어) ' 비행기가 위험 할 수 있습니다 '는 두 가지 의미를 가질 수 있습니다. 즉, 비행기의 비행이 위험하거나 비행중인 비행기가 위험 할 수 있습니다.
(프로그래밍) '컴퓨터는 오류 메시지를 생성하지 않지만 사용자가 지시 한 작업을 수행하지 않습니다. 다른 일을 할 것입니다. '
출처 : MIT 6.00.1
구문은 언어로 유효한 문장을 구성하는 공식적인 규칙을 나타냅니다. 의미론은 명령문의 의미를 제공하는 규칙 세트를 나타냅니다.
프로그래밍 언어의 규칙이 위반되거나 오용 될 때 프로그램에서 구문으로 인한 오류가 발생합니다. 의미론으로 인한 오류는 명령문이 의미가 없을 때 프로그램에서 발생합니다.
단어 순서는 구문의 기본 원칙이며, 작성된 내용을 이해하려는 사람들은 단어 구조의 구문 신호를 사용하여 문장 구조와 의미를 부여합니다. 의미론은 개인이 자신의 사전 지식을 바탕으로 "문장"의 의미를 해석하는 것입니다. 따라서 구문 상 의미가없는 것처럼 보이는 문장은 의미 적 신호를 사용할 때 의미를 가질 수 있습니다.
구문은 언어 적으로나 문법적으로 올바른 것에 만 관심이 있습니다. 의미론에는 모든 언어에 대한 사전 지식이 필요하며 언어에 국한되지 않는 모든 지식이 필요합니다.
"아기 우유 음료"라는 문장은 구문상의 의미는 없지만 의미론을 통해 대부분의 사람들은 아기가 우유를 마신다는 것을 알기 때문에 대부분의 사람들은이를 "아기 음료 우유"로 해석합니다. 핵심 단어.
구문과 의미 는 전략 및 전술 과 같 거나 왼쪽과 오른쪽 입니다.
그것들은 실제로 독립적 인 보편적 개념은 아니지만, 특정 상황에있을 때 반대 방향을 나타내는 관련 단어 쌍입니다. 그러나 한 규모의 전략과 동일한 것은 다른 전략입니다.
따라서 언어로 코드를 작성하는 경우 구문은 사용중인 언어이며 원하는 동작은 의미 체계입니다. 그러나 해당 언어의 컴파일러를 구현하거나 논의하는 경우 구문은 문법 및 유형 시스템과 그 위에 작성된 모든 의미입니다. 등등.
구문은 컴퓨터가 이해하는 것이고, 의미론은 인간이 이해하는 것입니다.
컴파일러 / 인터프리터는 디자인에 대해 신경 쓰지 않고 기계 수준으로 컴파일 된 코드에서 디자인을 추론하는 데 어려움을 겪습니다. 좋은 디자인은 복잡한 행동과 상호 작용을 추상화하여 복잡성을 줄이는 것이기 때문에 개발자는 디자인에 관심을 갖기 때문에 다양한 종류의 문제가 다른 의미에 적합합니다. 언어의 선택은 주로 사용하려는 시맨틱이 구문으로 얼마나 쉽고 효율적으로 표현 될 수 있는지에 관한 것입니다.
"plain 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 표준 참조).