1. Dynamic Semantics
Static semantics는 프로그램을 돌리지 않아도 알 수 있는 semantics를 검사했다. (타입이나 statement의 순서, id의 스코프 등)
Dynamic semantics는 런타임에만 알 수 있는 프로그램의 뜻 (루프, if-else, 함수 호출 등)을 검사한다. 즉 Line의 의미를 묘사한다.
Dynamic Semantics에는 Operational, Denotational, Axiomatic 방식이 있다.
둘다 프로그램의 상태 변화를 설명함으로써 프로그램의 의미를 나타내지만
operational은 state의 변화를 code의 동작으로 나타내고.
denotianal은 state가 변하는 동작을 mathmatical functions로 나타낸다.
프로그램의 state는 뭘까? 결국은 선언된 변수들의 값이 state가 된다.
그래서 가상 머신을 상정하고 코드가 실행하고 난 후 상태들이 변하는 것을 본다고 생각하면 된다. (시뮬레이션)
2. Operational Semantics
프로그램이 실행될 때마다 state들이 변화할 것이다. 이 상태를 변화시키는 동작을 중심으로 프로그램을 설명한다.
Intermediate language를 생성할 때 활용될 수 있는데, 기존 언어에 informal한 정보를 더 추가해서 프로그램의 흐름을 나타낸다.
3. Denotational Semantics
rigorous한 널리 알려진 방식이다. 수학적인 추상화 개념과 recursive를 활용한다.
현재 state s는 선언된 모든 변수의 상태로 나타낼 수 있다.
state는 <i 변수이름, v value>로 나타낸다. 여러 변수가 선언될 수 있으므로 여러 element가 있다.
denotational은 프로그램의 상태 변화를 mathmatical 함수로 나타낸다고 했다.
VARMAP은 {변수이름, 상태s}를 받아서 그 변수의 새 state를 반환한다.
십진수 정수의 변환을 denotational semantic으로 나타낸 것이다.
'1201'이라는 숫자가 있다고 하자 M(<120>'1')은 '120'을 숫자로바꾼 다음 10을 곱해서 int를 내보내고 맨 끝자리 1을 더함으로써 decimal number를 만들어낸다.
재귀를 활용해서 단순한 string character들로부터 10진수 decimal의 의미를 나타내고 있다.
조금 더 엄밀하게 수식이 변수의 state를 변화시키는 과정을 나타내면 위와 같다.
Ma(x=E, s) = s' 이라는 denotational expression을 해석하는 과정을 나타낸 것이다.
x라는 변수의 값을 변화시킨다는 뜻이다. x라는 변수가 없으면 새롭게 VARMAP<i, v>를 만들고 이미 있다면 Me(E,s)로 vj를 변화시킨다.
이건 loop를 더한 denotational expression이다.
이런 문법이 있다고 해보자. denotational semantics에 의하면 cab의 값을 도출해보자.
'ComputerScience > Principle of programing language' 카테고리의 다른 글
PL6. Syntax Analysis - top down parsing (0) | 2023.10.06 |
---|---|
PL5. Dynamic semantics : Axiomatic (0) | 2023.10.04 |
PL3. Static semantic (0) | 2023.09.15 |
PL2. Syntax (0) | 2023.09.14 |
PL1. Programming Languages? (0) | 2023.09.14 |