본문 바로가기

Programming Languages [PL]

[PL] 02. Describing Syntax and Semantics

기본 개념

Syntax : Expression, Statement, Program unit의 형태 또는 구조 (어떻게 표현하는지)

Semantics : Expression, Statement, Program unit의 뜻 (어떤 의미를 가지는지)

 

Syntax와 Semantics는 언어 정의를 제공

언어 정의의 사용자 : 언어 디지이너, 구현자(언어를 컴퓨터 프로그램으로), 개발자 등

 

Syntax(문법)을 기술하는 것이 Semantics(의미론)을 기술하는 것보다 쉬움 -> 보편적인 표기법이 존재하기 때문

  • A sentence : Sentential Form의 하위 분류 / Non-terminal이 아닌 Terminal로만 이루어진 String의 묶음
  • A language : Sentence들의 집합
  • A lexeme : 언어의 최소한의 구문 단위
  • A token : lexeme들의 카테고리

Recognizers : 알파벳으로 이루어진 input string을 읽고 언어에 속하는지 결정한다. 컴파일러의 Syntax 분석 파트
Generators : 언어의 문장을 생성하는 장치. 특정 문장의 Syntax가 구문적으로 올바른지 Generator의 구조와 비교해 결정


Formal Methods of Describing Syntax

Context-Free Grammars : 자연어의 구문을 설명하기 위한 언어 생성기. CFG라고 하는 언어의 클래스를 정의


Backus-Naur Form : Backus가 Algol58의 구문을 설명하기 위해 고안. BNF와 동등

  • 추상화는 구문 구조의 클래스를 나타내는 데 사용.
  • syntactic variable처럼 행동
  • Terminals은 lexeme/token이다. (보통 nonterminal symbols라고 부른다.)

<assign> -> <var> = <expr>

  • 화살표 왼쪽은 left-hand side(LHS)이고 Nonterminal(주로 <>로 표현)이다.
  • 화살표 오른쪽은 right-hand side(RHS)이고 Terminal과 Nonterminal의 조합 문자열이다.

Grammar : 비어있지 않은 규칙의 유한한 집합

시작 심볼은 Grammar의 Nonterminal 중 특별한 요소이다.

 

Derivation : 규칙을 반복해서 시작 심볼에서 모두 터미널인 문장으로 끝내는 것.

  • 유도에서 심볼의 모든 문자열은 Sentential Form이다.
  • Terminal 심볼은 그 언어의 Token이다.

Direct derivation(직접 유도) : 생성 규칙을 한 번 적용(=>)

직접 유도가 아니면(여러 번 적용하면) (=>*)을 사용

 

Leftmost derivation(왼쪽 유도) : 왼쪽부터 Nonterminal을 Terminal로 바꾸는 것

 

Ambiguity in Grammars : 두 개 이상의 다른 파스 트리를 가지는 a sentential form. -> 우선순위가 먼저인 것을 낮게

 

Associativity(결합성) : 같은 우선순위의 연산자의 순위를 지정하는 의미론적 규칙

  • LHS가 RHS의 시작 부분에 나타나는 경우 왼쪽 재귀(left recursive)로 표현
  • 거듭제곱은 right associativity를 가짐
  • right recursive로 표현 <factor> -> <exp> ** <factor> | <exp>


Attribute Grammars (속성 문법)

CFG로 표현하기 어려운 언어의 구조를 더 자세히 설명하기 위한 CFG의 확장 버전

 

Static Sementics

  • 정적으로 판단을 해야하는데 문법만으로 판단이 안됨
  • Syntax로 설명이 어렵고 부가적인 속성을 주고 싶음

Attribute Grammar

  • 파스 트리 노드에 몇 의미론적 정보(semantic info)를 전달하는 기능이 있는 확장된 CFG
  • 주요 가치 : Static semantics specification(명세), Compiler design (static semantics checking)
  • Attribute : 문법 기호(Terminal, Nonterminal 포함)와 연관. 값을 할당할 수 있는 변수와 유사
  • 속성 계산 함수 : Semantic function이라고도 함. 속성 값이 어떻게 계산되는지 지정
  • Predicate function(술어 함수) : 언어의 정적인 의미론 규칙을 명시. 문법 규칙과 연관
  • 문법 기호 x 마다 속성의 집합인 A(x)가 있다.
  • 각 규칙마다 그 규칙의 Nonterminal에 대한 특징을 정의하는 함수의 집합이 있다.
  • 각 규칙마다 속성의 일관성을 체크하는 술어(predicate)의 집합이 있다. (비어있을 수도 있다.)



Dynamic Semantics

의미론을 설명하기 위한 표준화된 방법은 많다. 의미론에 대한 방법론과 표기법이 필요한 이유는 다음과 같다.

  • 프로그래머들이 문장이 무엇을 의미하는지 알아야 함
  • 컴파일러 작성자들은 언어의 구조가 정확히 무엇을 하는지 알아야 함
  • 올바른 증명이 가능해야 함
  • 컴파일러 생성기가 가능해야 함
  • 디자이너들은 모호성과 일관되지 않음을 감지해야 함

Operational Semantics

  • 프로그램의 의미를 그것의 문장을 [기계, 시뮬레이션, 실제]에 실행시킴으로써 설명한다.
  • 기계의 변화(메모리, 레지스터) 상태가 문장의 의미를 정의한다. 메모리가 어떻게 바뀌는지 살펴본다.
  • 모든 변화를 측정하는 것은 현실적으로 만들기가 어려움 -> 가상 머신으로 대체
  • 고수준 언어를 위한 Operational semantics를 쓰기 위해선 가상 머신이 필요하다.
  • 하드웨어 순수 인터프리터는 비싸다. / 소프트웨어 순수 인터프리터는 문제가 있다. (정확도가 떨어짐)
  • 특정 컴퓨터의 상세한 특성은 작업을 이해하기 어렵게 만든다.
  • 의미 정의가 기계에 따라 다르다. -> 더 좋은 대안 : 완전한 컴퓨터 시뮬레이션
  • 번역기를 구축(소스 코드를 이상적인 컴퓨터의 기계어로 번역), 이상적인 컴퓨터를 위한 시뮬레이터 구축
  • 비공식적인 사용에 좋음 / 형식적으로 쓰면 굉장히 복잡해짐. PL/I의 의미를 설명하는데 사용됨
  • Operational Semantics는 언어 매뉴얼, 교재, PL교육에 쓰임
  • 두 개의 다른 활용 : Natural Oper.. (소프트웨어에 가까워지는 것), Structural Oper..(하드웨어에 가까워지는 것)

Denotational Semantics (함수로 표현하는) (입력이 정의역, 결과값(출력)이 치역)

  • 정의역 : 프로그래밍 언어의 문장 하나 하나
  • 치역 : (컴퓨터 속)데이터, 힙, 스택 =>즉 변수(추척하고자 하는 것)
  • 재귀 함수 이론에 바탕. 가장 추상적인 의미론 표현 방식. (1970년 Scott and Strachey)
  • 각 언어 Entity마다 수학적 object를 정의 -> 언어 Entity의 instance를 수학적 object의 instance로 매핑하는 함수를 작성
  • 언어 구조의 의미는 프로그램 변수의 값으로만 정의된다.



Denotational Semantics 평가

  • 프로그램의 정확성 증명에 사용될 수 있습니다.
  • 프로그램을 생각하는 데 엄격한 방법을 제공합니다.
  • 언어 설계에 도움이 될 수 있습니다.
  • 컴파일러 생성 시스템에서 사용될 수 있습니다.
  • 복잡성 때문에 일반적인 언어 사용자에게는 적합하지 않습니다

Axiomatic Semantics

  • 논리식을 기반으로 한다.
  • 형식적인 프로그램의 검증이 원래 목적
  • 언어의 각 문장 유형마다 공리(axiom)나 추론 규칙이 정의됨.
  • 논리식을 좀 더 형식적인 논리식으로 변환 가능

논리식은 Assertion이라고 함. (풀어서 쓰는 말, Predicate이랑 같은 뜻) (Ex. x > 20 등)

문장 하나하나가 어떤 의미를 가지는 지를 논리식을 가지고 표현

 

대표적인 Form {P} S {Q} => P라는 precondition이 사실일 때, Statement를 수행을 하고 Q라고 하는 주장이 사실이 된다면 이것이 모두가 사실이라고 생각하는 하나의 문장, Axiom이 되는 것이다.


 

'Programming Languages [PL]' 카테고리의 다른 글

[PL] 06. Expressions and Assignment Statements  (0) 2024.01.10
[PL] 05. Data Types  (1) 2024.01.10
[PL] 04. Names, Bindings, and Scopes  (1) 2024.01.09
[PL] 03. Lexical and Syntax Analysis  (1) 2024.01.09
[PL] 01. Preliminaries  (1) 2024.01.09