유인물.lips-like->함수언어
언어가 어케 만들어지고 어케 확장되는가 그리고 이것을 어떻게 bnf로 표현하나.
함수언어
함수(fuction) -> 정의역-함수-치역 매핑
toy란 언어는 term으로 구성되어있다.
연산의 대상은 여기서는 integer만 있음.
FUN은 언어의 함수의 집합임. minus,if 2가지 함수가 존재함
Z 노테이션은 integer의 집합을 의미한다.ZxZ to Z
term의 종류 3가지가 있다.
t1: variable
t2: constant
t3: (minus t1 t2) (IF t1 t2)
M((If 1 2)(M 3 4)) -> 3
2- (-1)
언어의 문법에 대해 생각을 해보자.syntax
start symbol: TOY
<TOY> -> <term>
<term>-><var>|<term>
| (minus <term><term>)
| (IF <term> <term>)
<var>-> <char>{<char>|<digits>}
<char>->a|b|c...
<digits>-> 0|1|2|3...
<const>->[-]<digits>{digits}
%3,%sum,%(if 1 2) 등등은 sematics(의미)이다.
imperative language(명령형 언어), 주류언어는 폰노이만 구조에 기반을 둔다.memory에 instruction,data가 올라가 cpu에 fetch되어 연산된다.
변수에 대한 이야기를 하겠다.
그 프로그램에서 특수한 의미를 가진 이름을 keyword라 한다.
변수명,함수명으로 이름이 쓰인다.
case sensitive-> 대소문자를 구분하느냐.
reserved word-> keyword 특별한 의미를 갖는 문자열
기계어에서는 변수를 주소로 했지만, 하이레벨에서는 이름으로 변수를 가리킬 수 있다.
225p
name
address // l-value
value // r-value
type//6장
lifetime//변수가 메모리를 할당받은 시간
scope //변수를 프로그램의 어디에서 접근할 수 있나
5장에서는 lifetime,scope에 집중한다.
변수의 주소를 l-value라 한다. 변수의 값을 r-value라 한다.
(left-right)
aliases(별명)-> 주소에 여러 이름으로 접근
3가지 경우 -226p
bing이란? entity,변수에 어떤 속성이 결합되는 것.
sum이란 변수에 int타입을 정하는 것, sum에 100이란 값을 정하는 것.
이 속성이 결합되는 시점이 binding time이다
2가지
static binding vs dynamic binding
컴파일타임 binding - 런타임 binding
int sum;
대부분의 언어는 static binding을 사용함.
-> 세살 버릇 여든까지 간다.
-dynamic type binding
type이 실행 시에 계속 바뀔 수 있다.
이를 위해선 결국 변수가 포인터의 역할을 해야 한다.
사이즈를 알 수 가없음-> 그때그때 달라져서
주로 함수언어에서 사용했음.
원래 주로 static binding이 사용되었으나
90년대 중반이후 python,luby,javascript,PHP등에서 dynamic binding사용
230,231p
dynamic binding문제
-type checking이 안됨.
-포인터 변수로 구현->runtime cost큼, 실행시간 늦음
주로 pure interpreter방식을 사용함.
메모리의 공간
코드공간// static공간 // dynamic 공간
static variables //전역변수
stack-dynamic //지역변수-stack영역
explicit heap dynamic //동적 자료구조-heap영역
implicit heap dynamic //dynamic type binding에서 사용
메모리에 변수를 할당하는 것
메모리에 instruction들이 올라오고, data영역이 할당됨.
변수들 중 일부는 static,dynamic하게 할당됨.
이 때 전역변수는 static하게 할당됨.->메모리에 고정적으로 할당
반면 지역변수는 dynamic하게 함수의 실행 중에 할당됨.
dynamic할당 크게 2가지.
232p
지역변수이면서 history sensitive해야 할 일이 있다.
함수의 호출마다 변수가 축적되어야 하면 지역변수도 static으로 선언하면 된다.
자바의 static은 조금 다르다. 클래스에 하나 있는 클래스 변수를 의미한다.
main-> A함수->
스택에 A의 지역변수 할당, 그 위에 B의 지역변수 할당
리턴하면 위에서부터 사라진다 -> stack
malloc 메모리에 필요한 공간이 동적으로 할당됨.
234p
자바의 기본형 외의 모든 자료구조는 object이므로 동적으로 할당된다.
이것은 포인터 변수가 사용되는데 -> 2가지 문제
자바에서는 dangling pointer를 없애기 위해 프로그래머가 인스턴스를 지울 수 있는 방법이 없고 garbage collector 가 주기적으로 돌며 필요없어진 인스턴스를 자동으로 지운다.
변수가 프로그램의 어느 부분에서 visible(접근가능)하냐.
global: 프로그램의 전부분에서
local:함수 안에서
함수의 목적: 재사용의 단위
처리에 대한abstraction
information hidity(은닉)
전역변수는 scope가 아무데서나 다 보이고 static 할당됨.
지역변수 함수 안에서만 visible하고 dynmic하게 할당됨.
static 식별자 이용해 변수를 선언하면 함수내에서 vicible하지만
lifetime은 프로그램 전체로 확장됨.
dynamic scope방법에서는
구조에 따라서가 아니라 active되있냐에 따라 변수에 접근 가능하다.