답변:
구문은 언어 의 구조 또는 문법에 관한 것입니다. 질문에 대한 답입니다. 유효한 문장을 어떻게 구성합니까? 모든 언어, 심지어 영어 및 기타 인간 (일명 "자연") 언어에는 문법, 즉 문장이 제대로 구성되었는지 여부를 정의하는 규칙이 있습니다.
다음은 C 언어 구문 규칙입니다.
의미론은 문장 의 의미 에 관한 것 입니다. 질문에 답합니다.이 문장이 유효한가요? 그렇다면 그 문장은 무엇을 의미합니까? 예를 들면 :
x++; // increment
foo(xyz, --b, &qrs); // call foo
구문 상 유효한 C 문입니다. 그러나 그들은 무엇을 의미합니까? 이러한 명령문을 실행 가능한 명령 시퀀스로 변환하는 것이 유효합니까? 이러한 질문은 의미론의 핵심입니다.
첫 번째 명령문에서 ++ 연산자를 고려하십시오. 우선, 이것을 시도하는 것이 유효합니까?
마지막으로, 일부 의미 체계는 컴파일 타임에 결정할 수 없으므로 런타임에 평가해야합니다. ++ 연산자 예제에서 x가 이미 데이터 유형의 최대 값에있는 경우 여기에 1을 더하려고하면 어떻게됩니까? 또 다른 예 : 프로그램이 값이 NULL 인 포인터를 역 참조하려고하면 어떻게됩니까?
요약하면, 구문은 문장이 언어의 문법에 유효한지 여부에만 관련된 개념입니다. 의미론은 문장이 유효한 의미를 가지고 있는지 여부에 관한 것입니다.
x
데이터의 최대 값에 있고 1
추가되면 이상한 출력 ( 0
)이 발생합니다. 의미 오류가 아닌가요?
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) { ... }
N
INT_MAX
구문은 언어의 구조를 나타내며 사물이 어떻게 결합되는지에 대한 어원 을 추적 합니다.
예를 들어 구문이 정확하도록 유형, 이름, 세미콜론을 차례로 선언하여 코드를 조합해야 할 수 있습니다.
Type token;
반면에 의미는 의미에 관한 것입니다. 컴파일러 나 인터프리터가 구문 오류에 대해 불평 할 수 있습니다. 동료들은 의미론에 대해 불평 할 것입니다.
Wikipedia에 답이 있습니다. 구문 (프로그래밍 언어) 및 의미론 (컴퓨터 과학) 위키 페이지를 읽습니다 .
또는 컴파일러 나 인터프리터 의 작업에 대해 생각해보십시오 . 첫 번째 단계는 문자열을 lexemes로 나누고 구문 분석을 수행 하여 토큰을 생성하는 어휘 분석으로 , 일부 추상 구문 트리 (구문 표현)를 구축합니다. 다음 단계는 이러한 AST (의미론)를 변환하거나 평가하는 것입니다.
또한, 모든 키워드는 프랑스어 동등한로 변환 된 C의 변형을 정의하는 경우 (그래서 관찰 if
되고 si
, do
되고 faire
, else
되고 sinon
당신은 분명히 언어의 구문을 바꿀 것 ... 등 등),하지만 당신은 많이 변경되지 않습니다 의미론 : French-C로 프로그래밍하는 것은 쉽지 않을 것입니다!
프로그래밍 언어 의 구문 은 표현식, 명령문 및 프로그램 단위의 형식입니다. 그 의미 는 해당 표현식, 명령문 및 프로그램 단위의 의미입니다. 예를 들어 Java while 문의 구문은 다음과 같습니다.
while (boolean_expr) statement
이 명령문 형식의 의미는 Boolean 표현식의 현재 값이 참이면 포함 된 명령문이 실행된다는 것입니다. 그런 다음 제어는 암시 적으로 부울 표현식으로 돌아가 프로세스를 반복합니다. 부울 표현식이 거짓이면 제어가 while 구문 다음에 나오는 문으로 전송됩니다.
구문 : 언어의 문법적 구조를 나타냅니다 .. c 언어를 작성하는 경우. 데이터 유형, 토큰을 사용하는 데 매우주의해야합니다 [ "printf ()"와 같은 리터럴 또는 기호 일 수 있습니다. 3 개의 토크, "printf, (,)"]가 있습니다. 같은 방식으로 함수, 함수 구문, 함수 선언, 정의, 초기화 및 호출을 사용하는 방법에 대해 매우주의해야합니다.
의미 론적이지만 문장이나 문장의 논리 또는 개념과 관련이 있습니다. 개념이나 논리에서 벗어나 무언가를 말하거나 쓰는 경우 의미 상 잘못되었습니다.
일반적으로 코드의 구문 및 의미 분석은 컴파일러의 '프런트 엔드'부분에서 수행됩니다.
구문 : 컴파일러는 각 키워드 및 기호에 대한 토큰을 생성합니다. 토큰에는 정보 유형의 키워드와 코드에서의 위치가 포함됩니다. 이러한 토큰을 사용하여 AST (추상 구문 트리의 약자)가 생성되고 분석됩니다. 여기서 컴파일러가 실제로 확인하는 것은 코드가 어휘 적으로 의미가 있는지 여부입니다. 즉, '키워드 시퀀스'가 언어 규칙을 준수하는지 여부입니다. 이전 답변에서 제안했듯이 언어의 문법으로 볼 수 있습니다 (코드의 의미 / 의미가 아닙니다). 참고 :이 단계에서 구문 오류가보고됩니다 (오류 유형이있는 토큰을 시스템에 반환).
의미론 : 이제 컴파일러는 코드 작업이 '이치에 맞는지'여부를 확인합니다. 예를 들어 언어가 유형 추론을 지원하는 경우 문자열을 부동 소수점에 할당하려고하면 의미 오류가보고됩니다. 또는 동일한 변수를 두 번 선언합니다. 이러한 오류는 '문법적으로'/ 구문 적으로 정확하지만 작업 중에는 의미가 없습니다. 참고 : 동일한 변수가 두 번 선언되었는지 확인하기 위해 컴파일러는 심볼 테이블을 관리 합니다.
따라서이 두 프런트 엔드 단계의 출력은 주석이 달린 AST (데이터 유형 포함) 및 기호 테이블입니다.
우리가 사용하는 일반적인 언어를 고려하십시오. 여기, 영어 :
예를 들어 그는 학교에갑니다. -정확한 의미 / 의미를 전달하고 싶었지만 문법 / 구문이 잘못되었습니다.
예를 들어 그는 추위에 간다. -감기는 형용사입니다. 영어에서는 이것이 문법에 맞지 않는다고 말할 수 있지만 실제로는 내가 생각할 수있는 올바른 구문을 가진 잘못된 의미론에 가장 가까운 예입니다.