[프로그래밍 언어론] 4강 - 구문론과 의미론

2026. 8. 30. 00:39·방송통신대학교/📝프로그래밍 언어론

📌 개요

🎯 학습 목표

┗  구문론과 의미론 정의, 표현 방법

 

🔑 학습 키워드

┗  프로그래밍 언어 형식적 정의

┗  구문론: 문맥 자유 문법(CFG), BNF, EBNF, 구문 도표

┗  의미론: 정적 의미론(속성 문법), 동적 의미론(기능적, 표기적, 공리적 의미론)

 

💡 1. 구문론과 의미론

[ 언어의 형식적 정의 ]

┗  '구문론'과 '의미론'을 통해 언어를 엄밀하게 정의하는 것을 의미

- 구문론(syntax): 문장의 올바른 '형태'를 정의
- 의미론(semantics): 올바른 형태의 문장이 나타내는 '의미'를 정의

┗  예시: 한국어 -> '나는 너를 사랑한다.'

- 구문: 주어 + 목적어 + 서술어
- 의미: 화자가 청자를 몹시 아끼고 귀중히 여김

┗  예시: 영어 -> 'I love you'

- 구문: 주어 + 동사 + 목적어
- 의미: 화자가 청자를 몹시 아끼고 귀중히 여김

 

[ 프로그래밍 언어의 형식적 정의 ]

┗  프로그래밍 언어의 명확한 사용체계를 제공

- '구문론': 프로그램의 표면적인 구조를 정의.
-> 프로그램을 올바른 형태로 작성할 수 있음.
- '의미론': 프로그램의 내용적인 효과를 정의.
-> 해석의 모호함을 제거하고 동작 예측할 수 있음.

┗  프로그래밍 언어의 형식적 정의 예시:

'BASIC' -> PRINT "GCD is "; A
- 구문: PRINT "출력할 내용"; 변수
- 의미: 출력할 내용과 변수의 값을 순차적으로 출력하라.

'C언어' -> printf("GCD is %d\n", a);
- 구문: printf("출력할 내용", 변수);
- 의미: 출력할 내용의 %d 자리에 변수의 값을 대신 넣어 내용을 출력하라.

┗  프로그램의 구조:

- '문자': 영어 알파벳, 아라비아 숫자, 특수 기호 등
- '어휘(토큰)': 문자의 나열. (최소한의 의미를 갖는 단어)
- '구문': 프로그램을 작성하는 규칙. (토큰을 모아 프로그램을 구성)

┗  프로그램의 의미:

- 프로그램을 통해 발생하는 현상

 

💡 2. 구문의 표현

[ 구문론 ]

- 프로그램의 표면적인 구조를 정의
- 정의된 구문을 통해 모든 정상적인 프로그램을 도출할 수 있음
- 작성된 프로그램이 정의된 구문에 맞는 프로그램인지 확인할 수 있음

[ 구문의 표현 ]

- 명확한 표현을 위해 문법을 활용
- 일반적으로 프로그래밍 언어에서는 '문맥 자유 문법'을 이용

[ 문맥 자유 문법: CFG ]

- 구성: '비단말 기호 집합', '단말 기호 집합', '생성 규칙 집합', '시작 비단말 기호'
- '비단말 기호': 정의될 대상
- '단말 기호': 언어에서 직접 사용되는 표현
- '생성 규칙': 어떤 비단말 기호를 어떻게 바꾸어 쓸 수 있는지 규정
- '시작 비단말 기호': 언어에 속한 모든 형태를 만들 수 있는 비단말 기호

- [생성 규칙]은 [하나의 비단말 기호]를 [단말 기호]와 [비단말 기호]의 조합으로 정의
- '문맥 자유 문법'은 다양한 방법으로 표현이 가능함 -> 'BNF', 'EBNF', '구문 도표'
- 세 가지 표현법은 서로 변환이 가능함. ex) BNF <-> EBNF ... 등

 

[ BNF (Backus-Naur Form) ]

┗  'Algol의 구문'을 정의하기 위해 배커스와 나우어가 사용한 표현법임.

┗  메타 기호:

'::=' -> 정의를 표현
'|' -> 택일(or)을 표헌
'< >' -> 비단말 기호를 표현

┗  문맥 자유 문법의 BNF 표현:

- '비단말 기호': 메타 기호 < > 로 묶인 기호
- '단말 기호': 비단말 기호 및 메타 기호가 아닌 기호
- '규칙': 메타 기호 ::= 를 기준으로 왼쪽 부분을 오른쪽 부분으로 정의

┗  BNF 예제: if 문 정의

<if문> ::= if <논리식> then <문장> else <문장>
        | if <논리식> then <문장>

 

[ EBNF (Extended BNF) ]

┗  추가적인 메타 기호를 사용하여 더 간결한 표현이 가능하도록 확장된 BNF

- '메타 기호 [ ]': 생략 가능을 표현
- '메타 기호 { }': 0번 이상 반복을 표현
- '메타 기호 ( )': 묶음 -> 메타 기호 |(택일)과 함꼐 쓰이며, 한정된 범위의 택일을 표현
- "메타 기호 ' '": 단말 기호 묶음 -> 메타 기호를 단말 기호로 사용 가능하도록 표현
- '메타 기호 ;': 규칙 묶음을 구별하기 위해 각 규칙의 마지막에 사용

┗  EBNF 예제: if 문 정의

<if문> ::= if <논리식> then <문장> [ else <문장> ]
        ;

 

[ 구문 도표 (syntax diagram) ]

┗  초기 'Pascal'의 사용자 설명서에 사용된 표현법

┗  순서도와 유사하게 그림으로 구문을 표현

- '사각형': 비단말 기호 표현
- '원': 단말 기호 표현
- '화살표': 비단말, 단말 기호들을 연결 -> 규칙을 표현하는 데 사용

┗  구문도표 예제: if 문 정의

 

💡 3. 의미의 표현

[ 의미론 ]

- '프로그램의 내용'적인 효과를 정의
- '프로그램 실행 시 어떤 일이 일어나는지' 그 의미를 기술
- '구문으로 표현하기 어려운 제약사항'을 기술하기도 함

 

[ 의미의 표현 ]

- (1) 일반적으로 자연어 문장으로 표현하나 명확성이 부족
- (2) 의미를 엄밀히 표현하기 위해 다양한 기법이 개발됨 (형식 의미론, formal semantics)
- (3) 대표적으로 사용되는 기법: '추상기계 코드를 사용하는 방식', '수학식등을 사용하는 방식'
'** 1~3번 순: 자연어 명확성 부족 -> 형식 의미론 개발 ** '

 

[ 두 가지 의미론 ]

[ '정적 의미론' ]
- '프로그램을 수행하기 전'에 프로그램의 의미가 맞는지 파악하는 방법
- 주로 타입 검사를 수행할 때 활용함
- 대표적인 표현 방법: 속성 문법

[ '동적 의미론' ]
- '프로그램을 수행 시' 나타나게 될 프로그램의 의미를 표현하는 방법
- 프로그램의 수행 측면은 다양하기 때문에 다양한 방법이 사용되고 있음
- 대표적인 표현 방법: '기능적 의미론', '표기적 의미론', '공리적 의미론'

 

[ 속성 문법 ]

- '정적 의미론'의 표현 방법
- 즉, 프로그램을 실행하기 전에 의미적으로 올바른지 검사
- 각 비단말 기호마다 타입 속성이 있다고 가정하여 이에 대한 규칙을 정의하는 방법
'예시': '속성 문법 = 문법 구조 타입' 등의 정보를 붙여서 프로그램이 의미적으로 올바른지 검사하는 방법
'결론': 타입 검사와 같이 정적으로 표현이 가능한 방법을 나타냄.

 

[ 기능적 의미론 ]

- '동적 의미론'의 표현 방법 중 한 가지
- 추상기계의 '상태'를 바꾸는 것으로 프로그램의 수행 의미를 표현하는 방법
-> 프로그램 수행은 결국 컴퓨터의 상태를 바꾸는 것

 

[ 표기적 의미론 ]

- '동적 의미론'의 표현 방법 중 한 가지
- 프로그램을 구성하는 '각 구문 요소'를 '수학적 표기'에 대응시켜 수행 의미를 표현하는 방법
- 대응시키는 함수를 '의미함수'라고 함.

 

[ 공리적 의미론 ]

- '동적 의미론'의 표현 방법 중 한 가지
- 프로그램의 효과로 수행 의미를 표현하는 방법
- '프로그램의 효과': 프로그램 S가 실행됨으로써 사전조건 P를 사후조건 Q로 변환시키는 것을 의미
-> {P} S {Q}
- 공리 체계를 이용함으로써 주변 상황에 대응하는 논리식을 정확히 구할 수 있음.

 

[ 의미론의 한계 및 효과 ]

'의미론의 한계': 프로그래밍 언어 전체에 대한 의미 표현은 너무 복잡함.
- '동적 의미론'에서 추구하는 '수학적 체계'는 일반인이 이해하기에 너무 복잡함.
-> 여전히 프로그램의 의미는 자연어로 기술되는 추세임.

'의미론의 효과': 다양한 방법론은 프로그램 구현 및 분석 등에 유용하게 사용됨.
- '속성 문법': 인터프리터 및 컴파일러 구현 시 트리 생성, 타입 검사, 코드 생성 등에 유용하게 사용됨.
- '수학적 표기': 언어의 특성을 명확하게 정의해야 할 때 언어 설계 방법론의 일부로 사용
- '공리적 의미론': 프로그램의 특정 조건 만족 여부를 기계적으로 확인하고자 할 때 사용

'방송통신대학교 > 📝프로그래밍 언어론' 카테고리의 다른 글

[프로그래밍 언어론] 6강 - 프로그래밍 언어의 구현  (0) 2026.09.02
[프로그래밍 언어론] 5강 - 구문 분석  (0) 2026.09.02
[프로그래밍 언어론] 3강 - 프로그래밍 언어 패러다임  (0) 2026.08.29
[프로그래밍 언어론] 2강 - 프로그래밍 언어의 발전 및 동작 원리  (0) 2026.08.21
[프로그래밍 언어론] 1강 - 프로그래밍 언어 소개  (0) 2026.08.21
'방송통신대학교/📝프로그래밍 언어론' 카테고리의 다른 글
  • [프로그래밍 언어론] 6강 - 프로그래밍 언어의 구현
  • [프로그래밍 언어론] 5강 - 구문 분석
  • [프로그래밍 언어론] 3강 - 프로그래밍 언어 패러다임
  • [프로그래밍 언어론] 2강 - 프로그래밍 언어의 발전 및 동작 원리
junbin2
junbin2
java.lang.NullPointerException
  • junbin2
    bin's Development Diary
    junbin2
  • 전체
    오늘
    어제
    • 전체보기 (240)
      • 방송통신대학교 (94)
        • ⚙️컴퓨터의 이해 (11)
        • 💻컴퓨터과학 개론 (15)
        • 🔢자료구조 (14)
        • 🧬알고리즘 (10)
        • ⚙️운영체제 (14)
        • 📝프로그래밍 언어론 (7)
        • 🕸️이산수학 (11)
        • 🌍유비쿼터스 컴퓨팅 (11)
        • 🖥️컴퓨터과학과 (1)
      • 공부 (72)
        • 📚백엔드 공부 (6)
        • ☕Java (23)
        • 🌳Spring (13)
        • ⚙️C (12)
        • ⚡Python (15)
        • JavaScript (1)
        • 🛢️Database (0)
        • Algorithm Problem Solving (2)
      • 네트워크 (7)
        • 📜HTTP (7)
      • 스파르타코딩클럽 (64)
      • 정보 (2)
      • 정리가 필요한 글 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    Java
    spring
    함수
    유비쿼터스
    방송대
    운영체제
    그래프
    Python
    자료구조
    알고리즘
    방통대
    방송통신대학교
    파이썬
    컴퓨터과학 개론
    배열
    이산수학
    컴퓨터과학과
    자바
    C언어
    컴퓨터의 이해
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
junbin2
[프로그래밍 언어론] 4강 - 구문론과 의미론
상단으로

티스토리툴바