구문과 의미의 차이점은 무엇입니까?


87

나는 항상 언어의 구문을 언급하는 것이 언어의 의미를 언급하는 것과 같다고 생각했습니다. 그러나 나는 분명히 그렇지 않다는 정보를 받았다. 차이점이 뭐야?



6
"무색의 녹색 아이디어가 격렬하게 잠들다"는 구문 상으로는 괜찮지 만 의미 상 의미가 없습니다. en.wikipedia.org/wiki/Colorless_green_ideas_sleep_furiously
CesarGon

이 질문을하면 +1이됩니다. 나는 똑같은 것을 궁금해하고 인터넷을 검색하기에는 너무 게으 르며 분명히 묻지 않았습니다.
KK.

다소, 나는 말할 것입니다 ... 의미론은 인스턴스의 유형, 다른 인스턴스와의 관계 및 그들 사이에 존재하는 보장입니다. 구문은 문자열을 통해 이러한 것들을 선언하는 방법입니다. 다소간.
Dehbop

답변:


106

의미론 ~ 의미

구문 ~ 기호 표현

따라서 다른 언어로 작성된 두 개의 프로그램은 동일한 의미 (의미론)를 수행 할 수 있지만 프로그램을 작성하는 데 사용되는 기호는 다릅니다 (구문).

컴파일러는 구문을 검사하고 (컴파일 타임 오류) 언어 규칙에서 구문을 파생 시키며 (구문을 기계 명령어로 매핑), 모든 의미 오류 (런타임 오류, 계산 등)를 찾지 못합니다. 코드에 add 2 대신 add 1이라고 표시되어 있기 때문에 잘못된 결과).


2
오류 검사는 구문과 의미를 구별하기위한 기준이 아닙니다. 컴파일러는 구문 오류 (세미콜론 누락과 같은)와 의미 오류 ( 피연산자에 대한 x + y적절한 +연산자 가없는 경우 )를 모두 진단 할 수 있으며 반드시 진단해야합니다 . 2 대신 1을 추가하는 것이 논리적 오류 라고 부릅니다 .
Keith Thompson

3
@Keith-그러나 논리 ( "논리적 오류"에서와 같이)는 의미 론적입니다. 일부 의미 검사는 컴파일러, 특히 형식 검사를 통해 수행 할 수 있으므로 컴파일러는 구문 오류를 찾을뿐만 아니라 " 모든 의미 오류를 찾을 수는 없습니다 "라는 말만 동의합니다. "를 찾으 십시오 .
Steve314

1
@ Steve314 : 동의합니다. 그러나 컴파일러가 감지해야하는 오류와 감지 할 수없는 오류를 명확하게 구분하려면 "의미"대 "논리"가 그 차이를 표현하는 좋은 방법이라고 생각합니다.
Keith Thompson

4
@KeithThompson 실제로 이론적으로 충분히 강력하고 강력한 (즉, 종속 된 ) 유형 시스템 의 언어에 대한 컴파일러 또는 해석기는 코드의 임의의 속성 (해당되는 경우 중단 문제 모듈로)을 검사하여 의미 적 오류를 "확인 가능"및 "확인 불가능"은 일반적으로 의미가 없습니다.
Ptharien 's Flame

@ Ptharien'sFlame 나는 당신의 진술의 '이론적'부분을 강조함으로써이 토론을 잠시 구름 밖으로 끌어 내려고합니다. 실제로 코드에서 의미를 적용하려면 컴파일러에 기능에 대한 힌트를 제공하기 위해 추가 구문이 필요합니다. 추가 의미 검사는 비용으로 제공됩니다 (예 : 복잡성 / 가독성). 언어가 모든 의미 오류를 검사 할만큼 강력 할 수 있다고 말하는 것은 법률 시스템이 모든 범죄를 예방할 수있을 정도로 완벽 할 수 있다고 말하는 것과 같습니다. 개인적으로, 나는 안전보다 자유를 선호하지만 이것이 '종교적인'주제가됩니다.
Evan Plaice

35

실제로 두 가지 수준이 아니라 세 가지가 있습니다.

  • 어휘 수준 : 문자 언어 요소를 생산하는 결합 (방법 if생산 if)
  • 구문 수준 : 언어 요소는 언어 표현 생산하기 위해 결합 (방법 if, (, 42, ==,을 answer)조건문을 생산)
  • 시맨틱 레벨 : 의미를 형성하기 위해 언어 표현식이 CPU 명령어로 변환되는 방법 (조건문은 부울 표현식의 결과에 따라 하나의 분기 또는 다른 분기를 실행할 수 있음)

10
렉싱 단계와 파싱 단계 사이의 분리는 전적으로 인공적인 것이며 최적화에 지나지 않습니다. 그리고 유한 플랫 룩스 집합이 정의되지 않은 일부 언어가 있지만 여전히 명확하게 정의 된 구문이 있습니다. 그래서, 나는 구문의 일부로 lexemes를 정의하고 싶습니다. 별도의 엔티티는 아닙니다.
SK-logic

@ SK-logic : 많은 언어에서 변수 이름을 형성하는 허가 된 또는 금지 된 렉스의 목록이 지정됩니다. 따라서 분리가 의미가 있습니다.
mouviciel

5
@mouviciel, 그것은 최적화로만 의미가 있습니다. 그렇지 않으면 ValidIdentifier터미널과 같이 정의 될 수 있습니다 ![AnyKeyword] [Identifier](여기서는 PEG와 같은 표기법을 사용하고 있습니다). 그러한 언어에 대해 별도의 렉싱 패스가 필요하지 않습니다. 예를 들어 GLR 기반 C ++ 파서를 참조하십시오.
SK-logic

2
@EvanPlaice, 무슨 소리 야? 내 요점은이다 렉싱이 없는, (실제로 언어를 제한) 필요하지 않습니다 분석 .
SK-logic

1
@ SK-logic 나는 당신이 의도 한 것과 반대의 의미로 귀하의 의견을 읽은 것 같아요. 순전히 '정규'또는 '문맥이없는'언어와 같이 어휘 분석기 만 필요한 경우에 대해 이야기한다고 생각했습니다. 고급 언어에서는 어휘 분석기가 필요하지 않지만 단일 패스 구문 유효성 검증을 빠르게 실행할 수 있습니다. 나는 렉서 단계를 끄거나 완전히 제거하는 것이 유리한 경우가 많다는 것에 전적으로 동의한다.
Evan Plaice

18

언어로 간단한 예를 들어 설명해 드리겠습니다 ENGLISH.

The glass drank Ben

구문 상 올바른 문장입니다. 명사, 동사 등이 있습니다.

그러나이 문장에는 상상할 수 있거나 올바른 의미가 없기 때문에 의미 상으로는 잘못되었습니다.


15

의미론 은 프로그래밍 언어의 논리적 실체와 그 상호 작용을 설명합니다. 구문 은 문자로 표현되는 방법을 정의합니다.

예를 들어, 포인터 산술의 개념은 C의 의미론의 일부입니다. +-연산자를 사용하여 포인터 연산을 표현 하는 방법은 구문의 일부입니다.

때로는 두 언어가 의미의 일부를 공유하지만 구문이 크게 다릅니다 (예 : C # 및 VB.NET-값 유형과 참조 유형을 사용하지만 입력하기 위해 입력하는 문자가 다름). 다른 경우에는 두 언어가 구문 상 유사하지만 의미가 일치하지 않습니다 (자바가 초보자를 혼동하는 Java와 JavaScript를 고려하십시오).


그렇다면 "패러다임"은 의미와 관련이 있습니까? 패러다임은 상호 관련된 의미의 집합이라는 것을 의미합니까?
Gulshan

1
@Gulshan, 패러다임 은 의미론과 같은 공식화 된 것보다 훨씬 광범위한 개념입니다. 패러다임은 의미론을 포함 할 수 있지만, 이는 방법론, 또는 더 넓은 철학이다.
SK-logic


5

프로그래밍 언어 또는 프로그래밍에 사용되는 일반 언어 만 참조하도록 지정하지 않았으므로 내 대답은 데이터 언어 (예 : XML, RDF, 데이터 유형 시스템 등)에 관한 것입니다.

Brian L. Meek는 언어 독립 표준 (1995) 을 만들기위한 7 가지 황금 규칙에서 "한 언어의 구문이 다른 언어의 의미 일 수 있습니다"라고 말합니다 . 그는 데이터 설명에 사용 된 "구문"및 "의미"라는 단어를 참조합니다. 따라서 일부 데이터 형식의 스펙에서이 단어를 우연히 발견하면 두 단어를 "Potrzebie"바꾸어야 해결해야합니다. 자신에 대한 의미.

적어도 정확히 지정된 데이터에서 구문과 의미의 관계는 "encoding" 이라는 용어로 더 잘 설명 될 수 있습니다 . 시맨틱은 구문으로 인코딩됩니다. 레코딩이 중첩 될 수 있으므로 한 언어의 구문이 다른 언어의 의미입니다. 데이터 영역을 넘어 서면 Umberto Eco에서 "무제한 반증"으로 설명한 것처럼이 중첩은 사실상 무한 할 수 있습니다.

예를 들자면 :

  • XML 구문 (이러한 괄호가 포함 된 항목)은 의미 체계로 XML Infoset (추상 트리)을 사용하는 구문입니다.
  • 구문으로 XML Infoset은 일부 XML 데이터 형식으로 의미를 나타내는 레코드를 표현할 수 있습니다 (예 : RDF 그래프를 인코딩하는 RDF / XML 문서).
  • 구문으로서의 RDF 그래프 (URI 참조가있는 것)는 추상 자원의 그래프를 시맨틱으로 인코딩합니다.
  • 구문으로서의 추상 자원의 그래프는 개념적 모델을 의미 론적으로 인코딩합니다.

사람들은 보통 어떤 수준에서 멈추고 의미 론적으로 받아들이지 만, 결국 어떤 인간이 자신의 마음에있는 데이터를 해석하지 않는 한 최종 의미론은 없습니다. 데이터 형식으로 의미를 표현하려고하면 구문이됩니다.


4

BNF (Backus-Naur Form) 또는 이와 유사한 것으로 설명 할 수 있으면 구문입니다. 할 수 없다면 그렇지 않습니다.

반면 시맨틱 은 프로그램 (또는 다른 소스 코드 덩어리)의 의미 에 관한 것 입니다.

때로는 둘 사이의 선이 흐릿해질 수 있습니다.

차이점을 이해하는 한 가지 방법은 프로그램의 구문이나 의미가 올바르지 않을 때 발생하는 오류의 종류를 보는 것입니다.

구문 오류는 소스 문법이 언어 문법과 일치하지 않는 것입니다 (예 : 필요한 경우 세미콜론이 없음).

시맨틱 오류는 다른 언어 요구 사항 (예 : C가 "제약"이라고 함)을 충족시키지 못하는 것입니다. 예를 들어 호환되지 않는 유형 과 x + y위치를 쓰는 것이 있습니다. 언어 문법은 덧셈 이처럼 보이지만 왼쪽 및 오른쪽 피연산자 유형에 대한 요구 사항을 표현할만큼 강력하지는 않습니다.xysomething + something

(1을 사용하는 2와 같은 논리 오류는 일반적으로 컴파일러에서 감지 할 수 없지만 일부 경우 컴파일러는 문제가있는 코드에 대해 경고 할 수 있습니다.)


0

구문은 (어휘) 기호가 말하는 것입니다. 의미론이 의미합니다.

치다:

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
-동일한 구문, 다른 의미 체계 (정수).


0

구문 은 문장 즉 단어 순서로 단어를 문법적으로 배열 한 것입니다.

(영어) ' cat dog boy '및 (programming) ' hi.5 '는 구문 상 정확 하지 않습니다 .

(영어) ' cat hugs boy '및 (프로그래밍) '* 3.2 * 5 *'는 구문 상 유효합니다.

정적 의미론 은 구문 적으로 유효한 명령문이 의미 를 갖는지 여부입니다.

(영어) ' I big '(프로그래밍) (python) ' 3 +'hi ' '는 구문 상 정확하지만 정적 의미 오류가 있습니다.

의미론 은 정적 의미 론적 오류가없는 구문 상으로 올바른 기호 문자열과 관련된 의미 입니다. 즉, 문장이 의미 상으로 의미 론적으로 정확하지만 그 의미가 의도 한 것이 아닐 수도 있습니다.

(영어) ' 비행기가 위험 할 수 있습니다 '는 두 가지 의미를 가질 수 있습니다. 즉, 비행기의 비행이 위험하거나 비행중인 비행기가 위험 할 수 있습니다.

(프로그래밍) '컴퓨터는 오류 메시지를 생성하지 않지만 사용자가 지시 한 작업을 수행하지 않습니다. 다른 일을 할 것입니다. '

출처 : MIT 6.00.1


-2
  1. 구문은 언어로 유효한 문장을 구성하는 공식적인 규칙을 나타냅니다. 의미론은 명령문의 의미를 제공하는 규칙 세트를 나타냅니다.

  2. 프로그래밍 언어의 규칙이 위반되거나 오용 될 때 프로그램에서 구문으로 인한 오류가 발생합니다. 의미론으로 인한 오류는 명령문이 의미가 없을 때 프로그램에서 발생합니다.

  3. 단어 순서는 구문의 기본 원칙이며, 작성된 내용을 이해하려는 사람들은 단어 구조의 구문 신호를 사용하여 문장 구조와 의미를 부여합니다. 의미론은 개인이 자신의 사전 지식을 바탕으로 "문장"의 의미를 해석하는 것입니다. 따라서 구문 상 의미가없는 것처럼 보이는 문장은 의미 적 신호를 사용할 때 의미를 가질 수 있습니다.

  4. 구문은 언어 적으로나 문법적으로 올바른 것에 만 관심이 있습니다. 의미론에는 모든 언어에 대한 사전 지식이 필요하며 언어에 국한되지 않는 모든 지식이 필요합니다.

  5. "아기 우유 음료"라는 문장은 구문상의 의미는 없지만 의미론을 통해 대부분의 사람들은 아기가 우유를 마신다는 것을 알기 때문에 대부분의 사람들은이를 "아기 음료 우유"로 해석합니다. 핵심 단어.


1
마지막 것 (포인트 5)을 제외한 모든 것에 대한
찬성

-2

구문과 의미전략 및 전술 과 같 거나 왼쪽과 오른쪽 입니다.

그것들은 실제로 독립적 인 보편적 개념은 아니지만, 특정 상황에있을 때 반대 방향을 나타내는 관련 단어 쌍입니다. 그러나 한 규모의 전략과 동일한 것은 다른 전략입니다.

따라서 언어로 코드를 작성하는 경우 구문은 사용중인 언어이며 원하는 동작은 의미 체계입니다. 그러나 해당 언어의 컴파일러를 구현하거나 논의하는 경우 구문은 문법 및 유형 시스템과 그 위에 작성된 모든 의미입니다. 등등.


4
무슨 난해한 BS입니까? 왼쪽과 오른쪽처럼? 전략과 전술처럼? 아마도 음과 양, 신과 악마, 해리와 볼드 모트 같은 것일까 요?
JensG

-3

구문은 컴퓨터가 이해하는 것이고, 의미론은 인간이 이해하는 것입니다.

컴파일러 / 인터프리터는 디자인에 대해 신경 쓰지 않고 기계 수준으로 컴파일 된 코드에서 디자인을 추론하는 데 어려움을 겪습니다. 좋은 디자인은 복잡한 행동과 상호 작용을 추상화하여 복잡성을 줄이는 것이기 때문에 개발자는 디자인에 관심을 갖기 때문에 다양한 종류의 문제가 다른 의미에 적합합니다. 언어의 선택은 주로 사용하려는 시맨틱이 구문으로 얼마나 쉽고 효율적으로 표현 될 수 있는지에 관한 것입니다.


"구문은 컴퓨터가 이해하는 것, 의미론은 인간이 이해하는 것"은 대단한 단순화이다. 인간은 구문도 이해하고 컴퓨터는 어떤 종류의 의미를 이해합니다.
CesarGon

4
명백히 틀렸다. 구문이 동일하고 의미가 완전히 다른 언어 (예 : 동일한 언어의 간결하고 게으른 버전)가있는 언어가 있으며 구문이 거의없고 언어가 풍부하고 가변적 인 의미가있는 언어 (예 : Forth 및 Lisp)가 있습니다. 의미론은 컴파일러가 언어를 해석하는 방법입니다. 인간은 그것에 대해 전혀 알지 못하고 여전히 언어를 사용할 수 있습니다.
SK-logic

@ SK-logic, 당신은 자신을 모순합니다. 서로 다른 의미론이 동일한 구문으로 표현 될 수 있다면, 의미론이 구문에 포함되지 않고 오히려 어떻게 사용되는지에 명확하게 포함됩니다. 그러나 컴파일러에는 작업 할 구문 만 있습니다. 의미를 해석하지 않고 구문을 해석합니다. 개발자가 말하려는 내용에 따라 동일한 구문을 다르게 컴파일하지 않고 입력 한 내용 만 컴파일합니다. 시맨틱은 개발자가 제공하며 그에게만 의미가 있습니다.
kylben

3
@ kylben, 나는 구문과 의미가 연결되어 있다고 말한 적이 없기 때문에 모순되지 않습니다. 그리고 컴파일러는 구문 분석 단계 컴파일러가 의미를 구현 한 직후에 구문으로 아무것도하지 않습니다 . 분명히 당신의 용어 해석이 잘못되었습니다. 초보자를 위해 이것을 읽으십시오 : en.wikipedia.org/wiki/Denotational_semantics
SK-logic

3
당신은 프로그램 의 의미에 대해 이야기하고 있는데 , 그것은 언어 학자에 의해 정의 된 "의미"입니다. 그러나 컴퓨터 과학에서 의미론은 특정 프로그램이 아니라 언어 의 의미입니다 .
SK-logic

-3

"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"대입에서 "-"는 "음수 부호"연산을 의미합니다.


3
잘못되었습니다. 두 -연산자는 같은 토큰 이지만 서로 다른 컨텍스트에서 사용되므로 구문 적으로 다릅니다. 0 - 1문법 규칙과 일치 additive-expression: additive-expression - multiplicative-expression하면서, - 1구문 규칙 일치 unary-expression: unary-operator cast-expression(: C99 표준 참조).
Keith Thompson

@ Keith Thompson : 당신은 요점을 놓쳤다. C 표준 질문이 아닌 의미 또는 구문 질문입니다. 표준은 맞지만, 제 대답은 문자 그대로 표준을 따르지 않고 개념을 설명하도록 지시되었습니다. "커크 선장"대 "Dr Spock"질문과 같습니다. 건배 ;-)
umlcat

동의하지 않습니다. 두 -발 파기 의 구별은 의미론뿐만 아니라 구문 론적입니다 (심지어 다른 의미론을 가지고 있음). 구문은 언어 문법으로 정의되며 두 연산자는 문법의 다른 섹션에 지정됩니다. 참고 항목 N1570 초안 , 단항 연산자 및 첨가제 사업자 6.5.6 섹션 6.5.3을. , 당신은 C의 예제를 사용하는 거라면 (BTW, 아마 정확해야 void main()해야합니다 int main(void), 당신은이 누락 #include <stdio.h>과 어떤 헤더 선언getch
키이스 톰슨

요점을 명확히하기 위해 구문 은 토큰의 순서에 관한 것이 아니라 토큰이 더 큰 구조를 만드는 방법에 관한 것입니다. 컴파일러는 일반적으로 어휘 분석기 (토큰 라이저)와 파서를 별개의 구성 요소로 사용합니다. 둘 다 구문을 처리합니다.
Keith Thompson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.