게시판 인덱스

 
 FAQFAQ   검색검색   멤버리스트멤버리스트   사용자 그룹사용자 그룹   사용자 등록하기사용자 등록하기 
 개인 정보개인 정보   비공개 메시지를 확인하려면 로그인하십시오비공개 메시지를 확인하려면 로그인하십시오   로그인로그인 

과제 6-3의 ASSIGN의 type과 관련해서 질문이 있습니다.

 
글 쓰기   답변 달기     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2017)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
정민규



가입: 2017년 9월 11일
올린 글: 2

올리기올려짐: 2017년11월25일 6:22    주제: 과제 6-3의 ASSIGN의 type과 관련해서 질문이 있습니다. 인용과 함께 답변

static semantics의 Assign 항목을 보면
Γㅏe1: τ loc
Γㅏe2: τ
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
Γㅏe1 := e2: τ
라고 되어 있습니다.

이에 따르면 malloc을 사용해 memory 공간을 확보하고 그 곳에 어떤 value를 넣어뒀다면, 나중에는 그 곳에 그와 같은 type의 value만을 Assign할 수 있어야합니다. 즉,
malloc (1) := 2
는 제대로 실행되어야하지만,
malloc (1) := true
는 type error를 내어야합니다. (assign에서 좌변의 type은 (int loc), 우변은 bool)

여기서 발생하는 문제는, 두 type이 같다는 것이 명확하게 정의되어 있지 않다는 것입니다. 정확히 말하자면, int, bool, string, pair, loc type의 경우에는 명확하게 정의할 수 있지만, closure의 경우에는 두 타입이 같은 지에 대해 정의하기가 좀 애매합니다. 예를 들어,
c1: t1 -> t2
c2: t3 -> t4
에서 두 타입이 같은 걸 pair처럼 (t1=t3) and (t2=t4)로 정의할 수도 있지만, 이렇게 할 경우에는
fn x => x+1
같은 경우에는 명확하지만 (int -> int)
fn x => x
같은 경우에는 처리하기가 애매해집니다. (int -> int)일 수도 있고, (bool->bool)일 수도 있기 때문입니다.(또는 선언만 되고 프로그램 중에 아예 안 쓰일 수도 있습니다.)
그래서 위의 정의는 ASSIGN에서 type checking을 하기에는 부적합하다고 생각합니다. 그래서 일단 현재는 단순히 둘 다 closure이기만 하면(t1~t4가 정확히 무엇인지는 무시) assign이 가능하도록 구현해뒀습니다.

주어진 조건만으로는 M language의 assign 문에서 type checking을 하기 힘들다고 생각합니다. 다음 중 어떻게 구현하는 것이 가장 적합한가요?
1. Assign에서는 type checking을 e1이 무언가의 location인지만 확인한다.
(loc t1 := t2에서 t1 =/= t2를 허용하는 경우입니다. 가장 나태한 구현이고 M0에 적혀 있는 static semantics의 정의에 어긋나지만, EQUAL에서 굳이 Closure와 pair의 비교를 제외한 것을 보면 가능성이 있다고 생각해서 적었습니다.
2. 기본타입(int, bool, string)의 경우에는 그대로 비교하고, inductive하게 생성되는 타입(loc, pair, closure)의 경우에는 최종 타입(맨 바깥에 둘러진 타입)이 같다면 같은 걸로 생각.(예를 들어 loc t1과 loc t2는 t1과 t2가 달라도 최종적으로 loc 타입이니 같음)
3. inductive 하게 구현되는 타입의 내부에 나타나는 모든 타입이 같아야함.
loc t1 = loc t2 iff t1 =t2
(t1,t2) = (t3,t4) iff t1 = t3 and t2 = t4
(t1 -> t2) = (t3 -> t4) iff t1 = t3 and t2 = t4[/code]
위로
사용자 정보 보기 비밀 메시지 보내기
신원준



가입: 2017년 9월 12일
올린 글: 23

올리기올려짐: 2017년11월26일 3:43    주제: 인용과 함께 답변

일단 직관적인 부분을 말씀드리자면 함수 타입 두 개를 비교하는 경우 (t1=t3) and (t2=t4) 와 같은 방식으로 비교하는 게 맞습니다.

t1, t2, t3, t4 등이 복합타입이면 또 안으로 들어가서 비교하겠지요.

따라서 3.이 맞을 듯합니다. ('=' 연산자가 동작하는 대로 비교할 것이므로)

fn x => x 같은 경우에는 아주 흥미로운 질문인 것 같습니다. 타입추론 (type inference)와 직결된 문제거든요.

fn x => x 의 경우, e1만을 분석하여 타입을 추론할 수 없죠.

하지만 정작 스펙서에서 Id [VAR]의 경우 정의가 누락되어 있어서, 이게 어떻게 처리되는 지까지는 모르겠습니다.

ps. type checker를 구현하는 것은 숙제의 일부가 아닙니다. 만약 다 구현하셨다면, 수고하셨습니다.
위로
사용자 정보 보기 비밀 메시지 보내기
이전 글 표시:   
글 쓰기   답변 달기     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2017) 시간대: GMT + 9 시간(한국)
페이지 11

 
건너뛰기:  
새로운 주제를 올릴 수 없습니다
답글을 올릴 수 없습니다
주제를 수정할 수 없습니다
올린 글을 삭제할 수 없습니다
투표를 할 수 없습니다


Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group
Translated by kss & drssay