구문론과 의미론
- 언어의 형식적 정의
- 한국어: 주어 + 목적어 + 서술어
- 영어: 주어 + 동사 + 목적어
- 프로그래밍 언어의 형식적 정의
- BASIC: PRINT “출력할 내용”; 변수
- C: printf(”출력할 내용”, 변수);
- 형식적 정의의 필요성
- 프로그래밍 언어의 명확한 사용체계를 알려 줌
- 언어 해석의 모호함을 없애 줌
- 작성된 프로그램의 동작 예측이 가능
- 프로그래밍 언어의 구조
- 문자: 영어 알파벳과 아라비아 숫자를 근간으로 작성
- 어휘(토큰): 프로그래밍 언어 문자로 구성된 단어
- 구문: 프로그래밍 언어로 프로그램을 작성하는 규칙
- 프로그래밍 언어의 의미: 작성된 프로그램을 통해 발생하는 현상
- 프로그래밍 언어의 형식적 정의
- 구문론: 프로그램의 표면적인 구조를 정의
- 의미론: 프로그램의 내용적인 효과를 정의
구문의 표현
- 구문론
- 프로그래밍 언어의 표면적인 구조를 정의
- 정의된 구문을 통해 모든 정상적인 프로그램을 도출할 수 있음
- 작성된 프로그램이 정의된 구문에 맞는 프로그램인지 확인할 수 있음
- 구문의 표현
- 명확한 표현을 위해 문법을 활용
- 일반적으로 프로그래밍 언어는 문맥 자유 문법으로 표현 가능
- 문맥 자유 문법(CFG: Context-Free Grammer)
- 구성: 비단말 기호들, 단말 기호들, 시작 비단말 기호, 규칙들
- 비단말 기호: 정의될 대상
- 단말 기호: 언어에서 직접 사용되는 표현들
- 시작 비단말 기호: 언어에서 독립적으로 사용될 수 있는 단위
- 규칙: 비단말 기호를 구체적으로 정의
- 각 규칙은 하나의 비단말 기호를 단말 기호와 비단말 기호의 조합으로 정의
- 문맥 자유 문법은 다양한 방법으로 표현할 수 있음 → BNF, EBNF, 구문 도표
- 세 가지 표현법은 서로 변환이 가능
- 구성: 비단말 기호들, 단말 기호들, 시작 비단말 기호, 규칙들
BNF(Backus-Naur Form)
- Algol의 구문을 정의하기 위해 배커스와 나우어가 사용한 표현법
- 메타 기호 ::= : 정의를 표현
- 메타 기호 | : 택일(or)을 표현
- 메타 기호 < > : 비단말 기호를 표현
- 문맥 자유 문법의 BNF 표현
- 비단말 기호: 메타 기호 < > 로 묶인 기호
- 단말 기호: 비단말 기호 및 메타 기호가 아닌 기호
- 규칙: 메타 기호 ::= 를 기준으로 왼쪽 부분을 오른쪽 부분으로 정의
EBNF(Extended BNF)
추가적인 메타 기호를 사용하여 보다 간결한 표현이 가능하도록 확장된 BNF
- 메타 기호 [ ] : 생략 가능을 표현
- 메타 기호 { } : 0번 이상 반복을 표현
- 메타 기호 ( ) : 메타 기호 | 와 함께 쓰여 한정된 범위의 택일을 표현
- 메타 기호 ‘ ‘ : 메타 기호를 단말 기호로 사용함을 표현
구문 도표
- 순서도와 유사하게 그림으로 구문을 표현
- 사각형: 비단말 기호를 표현
- 원: 단말 기호를 표현
- 화살표: 비단말 및 단말 기호들을 연결하며 다양한 연결 방법으로 EBNF의 메타 기호를 표현
- 구문 도표의 활용
- 초기 Pascal UserManual에 사용되었음
- 직관적인 표현을 통해 초보자들이 구문을 이해하기 쉬움
의미의 표현
- 의미론
- 프로그램 실행 시 어떤 일이 일어나는지 그 의미를 기술
- 구문으로 표현하기 어려운 제약사항을 기술하기도 함
- 의미의 표현
- 사람이 이해할 수 있는 자연어 문장으로 표현하는 것이 일반적임
- 하지만 자연어는 명확함에 한계가 있기 때문에 엄밀한 표현을 위해 다양한 기법이 개발됨(형식 의미론)
- 대표적으로 사용되는 기법으로는 추상기계 코드를 사용하거나 수학식 등을 사용하는 방식을 들 수 있음
- 두 가지 의미론
- 정적 의미론
- 프로그램을 수행하기 전에 의미가 맞는지 파악하는 방법
- 주로 타입 검사를 수행할 때 정적 의미론을 활용함
- 대표적인 표현 방법: 속성 문법
- 동적 의미론
- 프로그램 수행 시 나타나게 될 프로그램의 의미를 표현함
- 프로그램의 수행 측면은 다양하기 때문에 어느 한 방법이 아니라 여러 방법이 사용되고 있음
- 대표적인 표현 방법: 기능적 의미론, 표기적 의미론, 공리적 의미론 등
- 정적 의미론
속성 문법
- 정적 의미론의 표현 방법
- 각 비단말 기호마다 타입 속성이 있다고 가정하여 이에 대한 규칙을 정의하는 방법
기능적 의미론
- 동적 의미론의 표현 방법 중 한 가지
- 추상기계의 상태를 바꾸는 것으로 프로그램의 의미를 표현하는 방법 → 프로그램 수행은 결국 컴퓨터의 상태를 바꾸는 것이므로
표기적 의미론
- 동적 의미론의 표현 방법 중 한 가지
- 프로그램을 구성하는 각 구문 요소를 수학적 표기에 대응시켜 표현하는 방법 → 대응시키는 함수를 의미함수라고 부름
공리적 의미론
- 동적 의미론의 표현 방법 중 한 가지
- 프로그램의 실행 의미를 프로그램의 효과로 해석하는 방법 → 프로그램의 효과: 프로그램 S가 실행됨으로써 사전조건 P를 사후 조건 Q로 변화시키는 것으로 **{P} S {Q}**로 표기함
- 주변 상황에 대응하는 논리식은 공리 체계로 정확히 구할 수 있음
의미론의 한계 및 효과
- 의미론의 한계
- 동적 의미론에서 추구하는 수학적 체계는 일반인이 이해하기에 너무 복잡함
- 여전히 프로그램의 의미는 자연어로 기술되는 추세임
- 의미론의 효과: 다양한 방법론은 프로그램 구현 및 분석 등에 유용하게 사용됨
- 속성 문법: 인터프리터 및 컴파일러를 구현할 때 트리 생성, 타입 검사, 코드 생성 등에 유용하게 사용
- 수학적 표기: 언어의 특성을 명확하게 정의해야 할 때 언어 설계 방법론의 일부로 사용
- 공리적 의미론: 프로그램의 특정 조건 만족 여부를 기계적으로 확인하고자 할 때 사용
'CS' 카테고리의 다른 글
[프로그래밍 언어론] 프로그래밍 언어의 구현 (1) | 2023.11.30 |
---|---|
[프로그래밍 언어론] 구문 분석 (0) | 2023.11.23 |
[프로그래밍 언어론] 프로그래밍 언어 패러다임 (1) | 2023.11.22 |
[프로그래밍 언어론] 프로그래밍 언어의 발전 및 동작원리 (0) | 2023.11.22 |
[프로그래밍 언어론] 프로그래밍 언어 소개 (1) | 2023.11.22 |