게시판 인덱스

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

4-2 loop와 call 질문입니다.

 
글 쓰기   답변 달기     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2013)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
박준호



가입: 2012년 9월 15일
올린 글: 71

올리기올려짐: 2013년10월19일 3:04    주제: 4-2 loop와 call 질문입니다. 인용과 함께 답변

0. loop
Looping (WHILE, FOR) 함수에서 예를 들어
K.WHILE(e1,e2) : while e1 do e2 잖아요,
그렇다면, e1을 계산한 후 true/false에 따라서 다음에 할 일이 정해지는데,
true일 경우 do e2; while e1 do e2를 다시 실행하게 되는데,
이 경우 JTR(C_true,C_false)에서 C_true에 trans(pgm)이 다시 들어가야하는 문제가 생깁니다. 그렇게 되면 무한루프에 빠져들게 될 것 같은데, 이 방법이 맞는지, 다른 방법을 찾아야 하는지 궁금합니다.
다른 방법중 하나는 전체를 다시 부르는 것을 이용해서 call이 있을 것 같은데, 이 또한 메모리 관점에서 보면 semantics에 어긋나기때문에 사용하기가 애매한 것 같습니다.

1. call
CALLV(f,e)에서, k-- semantics에 정의된 실행 순서는
env,Mㅏf(e) => v',M''를 실행하기 위해서는
env,Mㅏe => v,M' (env(f)=<x,e',env'>
env'{x->l}{f-><x,e',env'>},M'{l->v}ㅏe' => v',M'' 를 실행해야 합니다.

그런데, Sm5.CALL은 다음의 기능을 수행합니다.
(l::v:: (x,C0,E0) :: S, M, E, call::C, K) =>
(S, M{l->v},(x,l)::E0,C0,(C,E)::K)
여기서 보면, env'{x->l}과 M'{l->v}를 자동적으로 매핑해주는걸 알 수 있는데,
그 뒤에 해줘야할 env'{f->env(f)}를 해줄 수 있는 방법이 없는 것 같습니다.
call을 하기 전에 뭔가 해준다고 하면 그건 call이 불리기 전인 E에 적용되게 되고,
call을 부르는 순간 Command set이 바뀌어버려서 해당 함수에서 env(f)를 다시 바인딩해주길 기대하는수밖에 없는 것 같습니다.
다른 기대할 만한 방법은 LETF을 할 때, 현재 환경을 넣는 것이 아니라, 현재환경에서 f에 매핑되는 <x,C,E> 쌍까지 포함된 환경을 넣어주는 방법이 있을 것 같은데, semantics 상에서는 이걸 허용하지 않기 때문에 다른 방법이 있는지 알고 싶습니다.
위로
사용자 정보 보기 비밀 메시지 보내기
최준원



가입: 2007년 3월 30일
올린 글: 149

올리기올려짐: 2013년10월19일 13:58    주제: 인용과 함께 답변

질문해주신 점에 대해서 제가 `이 방법은 틀렸다', 혹은 `이 방법이 정답이다' 라고 말씀드리기는 어렵습니다.
주어진 환경에서 번역하는 방법이 여러 가지가 될 수 있으니까요.

숙제 4-2 에서 어느 정도 생각을 해 봐야 하는 부분이 while, for, function call 정도인 것 같은데요.
이 부분 테스트 케이스에서 점수가 많이 갈릴 것이라 생각합니다.

결론적으로 질문에 모두 답변을 하자면 `번역할 수 있는 방법이 있다' 가 되겠습니다.
조금 더 힌트를 드리기 위해 각 질문에 답변을 드리자면,

0번 질문의 경우 말씀하신 두 가지 방법 중에서 하나를 사용하시면 번역이 가능하고요,
1번 질문의 경우... 네, f 를 호출할 때마다 환경을 보장받을 수 있는 방법이 있습니다.

... 결국 `방법이 있다' 가 된 것 같네요.

제 경험상으론, 이번 숙제를 실행의 관점이 아닌 번역의 관점으로 보면 생각이 좀 더 수월해 졌던 것 같습니다.
도움을 별로 못 드려 죄송합니다 Sad
위로
사용자 정보 보기 비밀 메시지 보내기
박준호



가입: 2012년 9월 15일
올린 글: 71

올리기올려짐: 2013년10월19일 17:32    주제: 추가질문입니다. 인용과 함께 답변

질문의 의도가 조금 빗나간 것 같아서 재질문드립니다.

0.loop 에서
우선, 전체를 다시 부르는 것을 이용해서 call을 하면, call의 구조상 malloc을 강제적으로 하게 됩니다.(ex - semantics의 l that is not element of domain of M') 그렇게 되면 메모리 관점에서 보면 semantics를 지키지 못하는 해결법이 됩니다. 동작만 제대로 수행한다면 memory semantics가 일부 바뀌어도 상관없는지 알고싶습니다.

1. call 에서
마찬가지로, 동일한 동작을 내도록 하는 해결법은 몇가지 있을 수 있으나, LETF를 할 때 수정을 가해주는것 같은 경우는 각각의 semantics를 만족시킬 수 없게 되는 것 같습니다.

2. 추가질문
trans의 함수에서 접근가능한것은 trans 자신과 Sm5와 K의 인터페이스가 전부인것으로 이해하면 되나요? 즉, Sm5 혹은 K의 저 아래 내부구조(module sig에서 지정한 type의 strut까지)까지 알고있다고 가정하지는 않는거죠?
위로
사용자 정보 보기 비밀 메시지 보내기
서석준



가입: 2012년 9월 13일
올린 글: 59

올리기올려짐: 2013년10월19일 18:17    주제: 비슷한 내용의 질문입니다. 인용과 함께 답변

조교님의 답변을 봤는데 여전히 이해가 되지 않아 다시 올립니다.

4-2를 짤 때 모두 같은 문제 하나 때문에 막히는데 어떤 연산의 결과를 임시적으로 저장할 방법이 없다는 것입니다.

FORT에서 생기는 문제를 보면

우선 e1이 연산되어 스택에 n1이 들어가고 e2가 연산되어 n2가 들어가게 됩니다.

이제 FORT인지 FORF인지 알기위해서 n1과 n2의 비교연산이 수행되어야 하는데

이 때 SM5의 시멘틱스를 보면 스텍에서 n1과 n2가 빠져나오고 이 값들은 어디에도 저장되지 않습니다.

이제 다시 FORT의 나머지 부분을 수행해야 되는데 x가 n1 + 0부터 n2까지 바뀌는 연산부를 수행하기 위해서는 SM5 머신이 n1과 n2값을 알고있어야 하는데 문제는 이 값이 스택에 더이상 존재하지 않는다는 것입니다.

만약에 이 n1과 n2를 메모리 어딘가에 저장한다든지, 환경 어딘가에 binding해 놓는다면, 이는 K의 시멘틱스에 어긋나게 됩니다.

스택에 있는 어떤 값을 복사해 둔다던가, 저장하는 연산이 없는 현 상태에서 값을 여러번 사용하는게 불가능한데, FORT의 시멘틱스를 어떻게 실행해야 될지 막막합니다...

아무리 생각해도 메모리와 환경은 전혀 건들이지 않은채 임시 값을 가져다닐 방법이 없습니다.

사실 어셈블리어로 for을 구현할때도 인덱스를 레지스터든 메모리든 어딘가에 저장해야 합니다.

SM5는 여러번 접근할 수 있는 임시 저장소(스택은 한 번 접근해버리면 사라집니다)도 없고 메모리를 건드리는 것은 시멘틱스에 어긋나기에, 제가 아는 방법안에선 fort를 구현하는게 매우 힘듭니다.

어떻게 해야할까요..
위로
사용자 정보 보기 비밀 메시지 보내기
최준원



가입: 2007년 3월 30일
올린 글: 149

올리기올려짐: 2013년10월19일 18:44    주제: 인용과 함께 답변

저도 이제야 질문하신 의도를 이해한 것 같습니다.
이상한 답변을 드린 것 같아 죄송하네요 Sad

아래 정의가 박준호님과 서석준님의 글에 대해 모두 답변이 되길 기대합니다.

숙제 4-2 에서 "같은 일을 하는" 을 다음과 같이 정의합니다.

"같은 일을 한다" = "같은 조건에서 실행했을 때 모든 side-effect 의 결과가 같다"

- "같은 조건" : K-- 에서의 빈 메모리, 빈 환경 / SM5 에서의 "C 만 가지고 있는 빈 기계상태"
- "모든 side-effect" : K-- 에서의 read/write, SM5 에서의 get/put

간단한 예를 들면,
K-- 에서 read 로 3을 받아 write 로 4 를 내놓았다면,
SM5 에서도 get 으로 3 을 받아 put 으로 4 를 내놓아야 한다는 것입니다.
그 도중에 일어나는 환경, 메모리 등의 변화는 "같은 일을 한다" 와 무관합니다.

더 궁금하신 점이 있으시면 언제든지 질문해 주세요 Smile
위로
사용자 정보 보기 비밀 메시지 보내기
이전 글 표시:   
글 쓰기   답변 달기     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2013) 시간대: GMT + 9 시간(한국)
페이지 11

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


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