프로그래밍 언어에서 구문과 의미의 차이점은 무엇입니까?


120

프로그래밍 언어 (예 : C, C ++)에서 구문의미론 의 차이점은 무엇입니까 ?


2
투표를하고 싶지만 연구 노력이 분명하지 않습니다.
null

답변:


201

구문은 언어 의 구조 또는 문법에 관한 것입니다. 질문에 대한 답입니다. 유효한 문장을 어떻게 구성합니까? 모든 언어, 심지어 영어 및 기타 인간 (일명 "자연") 언어에는 문법, 즉 문장이 제대로 구성되었는지 여부를 정의하는 규칙이 있습니다.

다음은 C 언어 구문 규칙입니다.

  • 세미콜론으로 구분 된 문
  • IF 문의 조건식을 괄호로 묶습니다.
  • 중괄호로 묶어 여러 문을 하나의 문으로 그룹화
  • 데이터 유형 및 변수는 첫 번째 실행 가능 명령문 이전에 선언되어야합니다 (이 기능은 C99에서 삭제되었습니다. C99 및 후자는 혼합 유형 선언을 허용합니다.)

의미론은 문장 의 의미 에 관한 것 입니다. 질문에 답합니다.이 문장이 유효한가요? 그렇다면 그 문장은 무엇을 의미합니까? 예를 들면 :

x++;                  // increment
foo(xyz, --b, &qrs);  // call foo

구문 상 유효한 C 문입니다. 그러나 그들은 무엇을 의미합니까? 이러한 명령문을 실행 가능한 명령 시퀀스로 변환하는 것이 유효합니까? 이러한 질문은 의미론의 핵심입니다.

첫 번째 명령문에서 ++ 연산자를 고려하십시오. 우선, 이것을 시도하는 것이 유효합니까?

  • x가 float 데이터 유형 인 경우이 명령문은 의미가 없으므로 (C 언어 규칙에 따라) 명령문이 구문 상 정확하더라도 오류 입니다.
  • x가 일부 데이터 유형에 대한 포인터 인 경우 명령문의 의미는 " 주소 x의 값에 sizeof ( some data type )을 추가 하고 결과를 주소 x의 위치에 저장"하는 것입니다.
  • x가 스칼라이면 명령문의 의미는 "주소 x의 값에 1을 더하고 결과를 주소 x의 위치에 저장"입니다.

마지막으로, 일부 의미 체계는 컴파일 타임에 결정할 수 없으므로 런타임에 평가해야합니다. ++ 연산자 예제에서 x가 이미 데이터 유형의 최대 값에있는 경우 여기에 1을 더하려고하면 어떻게됩니까? 또 다른 예 : 프로그램이 값이 NULL 인 포인터를 역 참조하려고하면 어떻게됩니까?

요약하면, 구문은 문장이 언어의 문법에 유효한지 여부에만 관련된 개념입니다. 의미론은 문장이 유효한 의미를 가지고 있는지 여부에 관한 것입니다.


확인. 이 x데이터의 최대 값에 있고 1추가되면 이상한 출력 ( 0)이 발생합니다. 의미 오류가 아닌가요?
haccks

차량의 주행 거리계를 생각해보십시오. 각 바퀴에 0부터 9까지의 숫자가 인쇄 된 일련의 상호 관련된 바퀴가 있습니다. 가장 오른쪽 바퀴가 가장 빠르게 회전합니다. 9에서 0으로 돌아 가면 바로 왼쪽에있는 휠이 1 씩 전진합니다. 이 휠이 9에서 0으로 전진하면 왼쪽에있는 휠이 전진하는 식입니다.
Jeff N

데이터 유형은 주행 거리계의 바퀴와 같습니다. 특정 값까지만 저장할 수 있습니다. 최대 값에 도달하면 다음 전진으로 휠이 0으로 돌아갑니다. 이것이 의미 오류인지 여부는 언어 규칙에 따라 다릅니다. 이 경우 C 언어 표준을 다시 참조해야합니다. C 언어 표준이 정확히 무엇을 말하는지 모르겠지만 여기에 몇 가지 옵션이 있습니다. 오버플로 :-오류가 아닙니다. 결과는 0입니다. -오류 컴파일러는 반드시 오버플로 예외를 생성해야합니다. -UNDEFINED; 컴파일러는 원하는 것을 자유롭게 할 수 있습니다.
Jeff N

2
누군가 특정 예제에 관심이있는 경우 부호없는 오버플로는 모듈 식 산술 (so 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) { ... }NINT_MAX
Daniel H

"일부 의미론은 컴파일 타임에 결정될 수 없으므로 런타임에 평가되어야합니다."-이것이 자연어와 유사하다는 점이 마음에 듭니다. 문맥 없이는 일부 구절의 의미를 알 수 없습니다. 예를 들어, "He likes bananas"라는 문구에서 "he"의 의미는 컨텍스트에 따라 다릅니다.
ymln

21

구문은 언어의 구조를 나타내며 사물이 어떻게 결합되는지에 대한 어원 을 추적 합니다.
예를 들어 구문이 정확하도록 유형, 이름, 세미콜론을 차례로 선언하여 코드를 조합해야 할 수 있습니다.

Type token;

반면에 의미는 의미에 관한 것입니다. 컴파일러 나 인터프리터가 구문 오류에 대해 불평 할 수 있습니다. 동료들은 의미론에 대해 불평 할 것입니다.


@Talespin_Kit은 구조 라기보다는 추상적 인 의미입니다. 예를 들어 P => Q 등 또는 !! P = P,하지만 의미론을 추가 할 때 P가 "행복"하면 !! P는 "I 'm not un-happy "! ="I 'm happy "
doctorlove nov.

5
+1 "컴파일러 나 인터프리터가 구문 오류에 대해 불평 할 수 있습니다. 동료가 의미론에 대해 불평 할 것입니다."
GeekyJ

11

Wikipedia에 답이 있습니다. 구문 (프로그래밍 언어)의미론 (컴퓨터 과학) 위키 페이지를 읽습니다 .

또는 컴파일러인터프리터 의 작업에 대해 생각해보십시오 . 첫 번째 단계는 문자열을 lexemes로 나누고 구문 분석을 수행 하여 토큰을 생성하는 어휘 분석으로 , 일부 추상 구문 트리 (구문 표현)를 구축합니다. 다음 단계는 이러한 AST (의미론)를 변환하거나 평가하는 것입니다.

또한, 모든 키워드는 프랑스어 동등한로 변환 된 C의 변형을 정의하는 경우 (그래서 관찰 if되고 si, do되고 faire, else되고 sinon당신은 분명히 언어의 구문을 바꿀 것 ... 등 등),하지만 당신은 많이 변경되지 않습니다 의미론 : French-C로 프로그래밍하는 것은 쉽지 않을 것입니다!


8

의미론은 코드가 의미하는 바, 의사 코드로 설명 할 수있는 것입니다. 구문은 변수 이름에서 세미콜론에 이르기까지 모든 것이 실제 구조입니다.


다른 사람들 간의 대화입니까? 아니면 하나의 게시물입니까? 이해가 안 돼요. 예 : "다음이 의미하는 바가 무엇인지 모르겠습니다. 더 이상 잘못 될 수는 없습니다."
doubleOrt

5

구문 은 표현식, 명령문 및 프로그램 단위의 구조 또는 형식이지만 시맨틱 은 해당 표현식, 명령문 및 프로그램 단위의 의미입니다. 의미구문 에서 직접 따릅니다 . 구문 은 특정 프로그래밍 언어가 지정하는 코드의 구조 / 형식을 의미 하지만 의미론 은 기호, 문자 및 단어에 할당 된 의미를 처리합니다.


5
  • 컴파일 하려면 올바른 구문 이 필요합니다 .
  • 작동 하려면 올바른 의미 체계 가 필요합니다 .

1

프로그래밍 언어 의 구문 은 표현식, 명령문 및 프로그램 단위의 형식입니다. 그 의미 는 해당 표현식, 명령문 및 프로그램 단위의 의미입니다. 예를 들어 Java while 문의 구문은 다음과 같습니다.

while (boolean_expr) statement

이 명령문 형식의 의미는 Boolean 표현식의 현재 값이 참이면 포함 된 명령문이 실행된다는 것입니다. 그런 다음 제어는 암시 적으로 부울 표현식으로 돌아가 프로세스를 반복합니다. 부울 표현식이 거짓이면 제어가 while 구문 다음에 나오는 문으로 전송됩니다.


1

구문 : 언어의 문법적 구조를 나타냅니다 .. c 언어를 작성하는 경우. 데이터 유형, 토큰을 사용하는 데 매우주의해야합니다 [ "printf ()"와 같은 리터럴 또는 기호 일 수 있습니다. 3 개의 토크, "printf, (,)"]가 있습니다. 같은 방식으로 함수, 함수 구문, 함수 선언, 정의, 초기화 및 호출을 사용하는 방법에 대해 매우주의해야합니다.

의미 론적이지만 문장이나 문장의 논리 또는 개념과 관련이 있습니다. 개념이나 논리에서 벗어나 무언가를 말하거나 쓰는 경우 의미 상 잘못되었습니다.


1

컴파일러가 코드를 보는 방법 이해

일반적으로 코드의 구문 및 의미 분석은 컴파일러의 '프런트 엔드'부분에서 수행됩니다.

  • 구문 : 컴파일러는 각 키워드 및 기호에 대한 토큰을 생성합니다. 토큰에는 정보 유형의 키워드와 코드에서의 위치가 포함됩니다. 이러한 토큰을 사용하여 AST (추상 구문 트리의 약자)가 생성되고 분석됩니다. 여기서 컴파일러가 실제로 확인하는 것은 코드가 어휘 적으로 의미가 있는지 여부입니다. 즉, '키워드 시퀀스'가 언어 규칙을 준수하는지 여부입니다. 이전 답변에서 제안했듯이 언어의 문법으로 볼 수 있습니다 (코드의 의미 / 의미가 아닙니다). 참고 :이 단계에서 구문 오류가보고됩니다 (오류 유형이있는 토큰을 시스템에 반환).

  • 의미론 : 이제 컴파일러는 코드 작업이 '이치에 맞는지'여부를 확인합니다. 예를 들어 언어가 유형 추론을 지원하는 경우 문자열을 부동 소수점에 할당하려고하면 의미 오류가보고됩니다. 또는 동일한 변수를 두 번 선언합니다. 이러한 오류는 '문법적으로'/ 구문 적으로 정확하지만 작업 중에는 의미가 없습니다. 참고 : 동일한 변수가 두 번 선언되었는지 확인하기 위해 컴파일러는 심볼 테이블을 관리 합니다.

따라서이 두 프런트 엔드 단계의 출력은 주석이 달린 AST (데이터 유형 포함) 및 기호 테이블입니다.

덜 기술적 인 방식으로 이해

우리가 사용하는 일반적인 언어를 고려하십시오. 여기, 영어 :

예를 들어 그는 학교에갑니다. -정확한 의미 / 의미를 전달하고 싶었지만 문법 / 구문이 잘못되었습니다.

예를 들어 그는 추위에 간다. -감기는 형용사입니다. 영어에서는 이것이 문법에 맞지 않는다고 말할 수 있지만 실제로는 내가 생각할 수있는 올바른 구문을 가진 잘못된 의미론에 가장 가까운 예입니다.


컴파일러 이 링크는 더 배울 도움이 될 수 있습니다
Vedant Panchal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.