게시판 인덱스

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

과제에 대한 질문입니다!!

 
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2006)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
이준



가입: 2006년 9월 7일
올린 글: 30

올리기올려짐: 2006년10월26일 15:41    주제: 과제에 대한 질문입니다!! 인용과 함께 답변

고민을 해보았는데.. 밑에 이미쓰신 어느분처럼 저역시도 이해가 안가는 부분이 있어 이렇게 질문하기로 했습니다;;
내용이 좀 길수도 있고, 글로 정확히 의미를 전달하기 어렵지 않을까 싶어 방금전에 교수님과 조교님 계신곳 두곳을 방문했는데 모두 안계시더라구요..
조교님 두분은 모두 출장을..;;;

그래서! 하는수 없이 글로 여쭐까 합니다. 최대한 잘 정리해 보겠습니다.
일단 제 의문은 밑에 이미 1번에 대한 의문을 적어주신것과 거의 같습니다.
숙제 1번에 대한 의문이 한개가 아니므로 가정을 하면서 정리하겠습니다.

일단 f를 f'로 바꾸는 부분입니다. spec에서 이 부분의 설명이 모호하게 느껴집니다.
f의 정의 부분에서 인자이름이 쓰이는 곳을 적절히 바꾸면 된다고 하셨는데, k- code에서의 정의 인지,
dissolveCbr 내부에서 call f<x>가 들어오면 f를 f'으로 적절히 바꾸어 주라는 뜻인지를 모르겠습니다.
저는 dissolveCbr은 그럴만한 능력이 없다고 판단하여, k- code에서 f를 정의하는 부분을 f'로 변경해 주어야 한다고 이해했습니다.
'송수현'님과 같습니다. 그리고 여기에 가정1을 둡니다.

가정1 : f는 사용자가 f'로 바꾸어 주는 것이다.

가정 1이 맞다고 생각하기로 했으니 dissolveCbr의 역할은 '송수현'님의 말씀과 같이
call f<x>(=CALLR(f,x))를 call f'(&x) (= CALLV(f',AMPER(x)))로 바꾸어주는것 뿐이라고 생각하게 되었습니다.
그런데 생각해 보니 f라는 procedure은 없습니다. 이미 f'로 바뀌었지요.
그러므로 call f<x>가 아니라 call f'<x>가 되었을 것입니다. 즉 call f'<x> 를 call f'(&x)로 바꾸어 주는것 뿐인데요,
여기서 또 하나의 의문입니다. <x>를 왜 써야 하는가 입니다.
지금까지 저의 생각이 진행되어온 과정을 보면 dissolveCbr을 쓰기위해 굉장히 억지스럽게 진행되어 왔다고 여겨 집니다.
dissolveCbr이 무언가 바꾸어 주긴 해야겠고 바꿀 것을 찾다보니 <x> 를 (&x)로 바꾸어 주는 것입니다.
아무리 생각해도 어색하네요.. 굳이 <x>를 써야하는 이유는 어디에 있는것일까요.
이미 설탕은 녹여버렸고, 사용자에게도 그 사실을 알렸을 것입니다. (가정1)
이미 call f(x)가 있고 *x 와 상응하는 &x가 정의되어 있는 상황에서
call f<x>라는 syntax를 추가하는것은 굉장히 어색합니다. 오히려 사용자가 스스로
call f(&x)를 사용하는것이 훨씬 자연스럽지 않을까요? 이미 f라는 procedure가 그 내부에서
(*x) := (*x) + 1 과 같은 일을 한다고 정의되었다면 인자를 줄때 (&x)를 주는 것이 더 자연스럽다고 생각합니다.
물론 <x>로 주면 그 주소를 전달해주는거야~ 라고 설명해 주면 사용자가
그정도는 이해해 줄테지만 이미 &x라는 구문이 존재하는데 굳이 call f<x>라는 새로운 syntax를
사용하게 하는것은 너무 dissolveCbr을 사용하기 위해 억지를 부리는게 아닌가 하는 생각이 듭니다.
다시말해 dissolveCbr은 이미 풀려버린 설탕을 다시한번 풀어보겠다고 call f<x>라는 이상한 구문을 추가시키고는
그것이 들어오면 call f(&X)로 바꿔 줄께~
라고 하고 있는것만 같네요. 결국 그 dissolveCbr이란 이름에 걸맞지 않는것 같습니다.
이름에 걸맞는 행동은 call f<x>를 받아 dissolveCbr내에서 x := x+1 을 (*x) := (*X) + 1 로
바꾸어 주는것이 아닐까 생각합니다. 결국 가정1이 틀렸다고 봐야 하는데요..
그러면 또 다시 dissolveCbr이 그런 역할을 하기에는 인자가 부족한것 아닌가 싶어지는 것이지요...
그래서 이렇게 질문을 드립니다. 제가 생각하는 내용이 정말 맞는건가요?
(가정1도 맞고 그에따라 생각해낸 <x>의 어색한 추가가 맞는것 인가요?)
맞다면야 어렵지 않게 문제를 풀 듯도 합니다만, 위의 생각들 대로 제가 억지를 쓰는건
아닌가 싶어서요. 답변 부탁드립니다.

그리고 3번에서요 이정도로 힌트는 마친다고 하셨는데, 그렇다면 우리는 그 힌트가 말해주는 부분만
수정하면 되는 것일까요, 아니면 추가적으로 더욱 높은 performance를 위해 고민해야 하는 것일까요.
직접적으로 말해도 될지 불안하기는 한데...음... 아무래도 모호하니..
직접적으로 여쭈겠습니다.
tail-recursive call만 잡아주면 되는 건가요? 아님 그 이상도 찾아봐야 하나요..
(실제로 가능한지조차도 모르겠기는 합니다만.. Embarassed )
후자쪽이라면.. ㄷㄷㄷ

답변 기다리겠습니다~ 혹시 학우분들 중에서도 제 고민의 해답을 알고 계시는 분이 계시다면
부디 그 해답을 공유해 주시면 감사하겠습니다Smile

혹, 저의 질문이 숙제의 답을 요구한다거나 혹은 숙제의 답을 퍼뜨리고 있다거나 하는 것은 아니겠지요?
행여라도 그렇다고 하신다면 바로 삭제하겠습니다.;;
위로
사용자 정보 보기 비밀 메시지 보내기
장민석



가입: 2006년 9월 5일
올린 글: 165

올리기올려짐: 2006년10월27일 14:14    주제: Re: 과제에 대한 질문입니다!! 인용과 함께 답변

인용:
일단 f를 f'로 바꾸는 부분입니다. spec에서 이 부분의 설명이 모호하게 느껴집니다.
f의 정의 부분에서 인자이름이 쓰이는 곳을 적절히 바꾸면 된다고 하셨는데, k- code에서의 정의 인지, dissolveCbr 내부에서 call f<x>가 들어오면 f를 f'으로 적절히 바꾸어 주라는 뜻인지를 모르겠습니다.
저는 dissolveCbr은 그럴만한 능력이 없다고 판단하여, k- code에서 f를 정의하는 부분을 f'로 변경해 주어야 한다고 이해했습니다.


1. 제출하는 파일은 dissolveCbr 정의 코드 뿐이니, dissoveCbr이 알아서 f를 f'으로 바꾸어야 한다고 생각합니다.


인용:
지금까지 저의 생각이 진행되어온 과정을 보면 dissolveCbr을 쓰기위해 굉장히 억지스럽게 진행되어 왔다고 여겨 집니다.
dissolveCbr이 무언가 바꾸어 주긴 해야겠고 바꿀 것을 찾다보니 <x> 를 (&x)로 바꾸어 주는 것입니다.
아무리 생각해도 어색하네요.. 굳이 <x>를 써야하는 이유는 어디에 있는것일까요.


2. 일반적으로, call f(&x)와 call f<x>는 같은 값을 가지지 않습니다. &x는 단순히 x의 주소값이죠. 그러니까 call f(&x)는 x의 주소값을 인자로 받아 f를 실행하는 것이고, call f<x>는 x에 저장된 값을 인자로 받아 f를 실행하되 함수 실행 시 x에 저장된 값이 바뀔 수 있는 것이죠(call by ref).

그래서 f를 f'으로 바꾸어야 하는 것이지요.


아...그래픽스 숙제 때문에 PL숙제는 아직 시작도 못하고 있네요 ㅠ.ㅠ
위로
사용자 정보 보기 비밀 메시지 보내기
박대준



가입: 2005년 10월 7일
올린 글: 245

올리기올려짐: 2006년10월27일 15:32    주제: 인용과 함께 답변

어제는 프로젝트 발표때문에 외부에 나가게 되어 없었습니다.
질문하러 찾아오셨는데, 안타깝군요.

가정 1에 따른 긴 글을 적어주셨는데요, 안타깝게도 가정 1은 맞지 않습니다.

여러분이 1번 숙제(함수 녹이기)에서 하셔야 할 것은
f<x>같은 call-by-reference semantics가 허용되는 언어로 짠 프로그램을,
call-by-reference semantics가 없는 언어로 짠 프로그램으로 변환하는 것입니다.
(사용자는 어떠한 행동도 하지 않습니다.)
이 때, 변환된 프로그램은 변환전 프로그램과 동일해야 합니다.
이 때, 동일하다는 것의 정의는 실행 후의 결과 값이 같은 것을 의미합니다.
결과 값만 같으면 된다는 것에 주목하시길 바랍니다.
결과 메모리나 환경 등은 같지 않아도 된다는 의미입니다.

문제 설명에서, f를 f'으로 바꾸면 될 것 같다는 이야기는,
원래 f라는 함수를 call-by-value로 호출하는 부분도 있을 것이기 때문에,
f<x>라고 호출하는 부분을 위해서 새로운 f'을 정의하겠다는 것입니다.


이런 상황을 생각해 봅시다.
다른 사람이 A라는 언어로 짠 코드를 사용하고 싶은데, 전 B라는 언어를 사용합니다.
그런데, A라는 언어와 B라는 언어는 모두 동일한데, A라는 언어가 추가적으로 call-by-reference semantics를 지원한다고 합시다.
그래서 결국, A라는 언어로 짠 코드에서 call-by-reference로 호출한 f<x>같은 것을 모두 B라는 언어로 바꾸고 싶은 것입니다.
결국 여러분은 그러한 일을 하는 dissolveCbr을 구현하시는 것입니다.



3번 문제에서는 말씀하신대로, tail-recursive-call만 잡아주시면 됩니다.
tail-recurtive-call이 아닌 것까지 하시면 더 좋겠지요.
만약 더 많은 경우까지 잡아서 줄일 수 있다면, 구현하시고, 코멘트로 명시해 주시기 바랍니다.
추가점수를 충분히 드리도록 하겠습니다.
위로
사용자 정보 보기 비밀 메시지 보내기
이준



가입: 2006년 9월 7일
올린 글: 30

올리기올려짐: 2006년10월27일 22:03    주제: 인용과 함께 답변

한번에 이해 못하고 자꾸 물어봐서 죄송합니다만;;;

그렇다면 dissolveCbr내에서 새로운 f'를 정의하는것이 불가피하다고
이해하였습니다. ( 이 이해가 또 틀린걸까요? -_-;;;; )

맞다면! 우리가 임의의 이름 f'를 만들어야 하는데요..
이때 사용자가 f'이란 동일 이름의 함수를 직접 (다른 목적으로) 만드는 일은
없다고 가정해도 좋은건가요?

이렇게 하는거 아닌가요?;; 아웅.. 이해력이 딸리나..+_+;;;;;민망민망;;
위로
사용자 정보 보기 비밀 메시지 보내기
장민석



가입: 2006년 9월 5일
올린 글: 165

올리기올려짐: 2006년10월27일 23:04    주제: 인용과 함께 답변

음...이준님 말씀대로, 제 생각에도 f'이란 이름이 다른 곳에서 쓰이지 않는다는 것이 보장되어야 할 것 같아요.
위로
사용자 정보 보기 비밀 메시지 보내기
김주성



가입: 2006년 9월 15일
올린 글: 5

올리기올려짐: 2006년10월27일 23:06    주제: f'가 상관없는 이유 인용과 함께 답변

k-의 렉서를 보시면 f'라는 함수는 사용자가 사용할 수 없는 이름이라는 것을 알 수 있습니다.
위로
사용자 정보 보기 비밀 메시지 보내기
이준



가입: 2006년 9월 7일
올린 글: 30

올리기올려짐: 2006년10월27일 23:27    주제: 인용과 함께 답변

대..대단하십니다..+_+;
렉서를 분석하시는군요..쿠오올;;
위로
사용자 정보 보기 비밀 메시지 보내기
이준희



가입: 2006년 9월 18일
올린 글: 43

올리기올려짐: 2006년10월28일 0:05    주제: 인용과 함께 답변

렉서에서 사용 불가능함과는 별개의 문제인것 같은데요...

f에서 f'을 새로 만든다는 것이 '을 붙이는게 아니라, call by reference를 구현하기 위한 새로운 프로시저를 만든다는 의미로 생각하고 있으니까요. 이름이 어떻게 쓰인다와는 큰 관련이 없을것 같네요.

저역시 윗분들과 마찬가지로 뒤에서 같은 함수 이름이 다시 나오지 않는다는 보장이 필요할 것 같습니다.
_________________
...
위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기
김주성



가입: 2006년 9월 15일
올린 글: 5

올리기올려짐: 2006년10월28일 3:59    주제: 이준희님이 무슨 말씀이신지 잘 모르겠습니다. 인용과 함께 답변

이준희님이 하시는 말씀이 무슨 말인지 잘 모르겠습니다;;
f'라는 함수를 새로 만드는데 사용자가 아미 f'라는 함수를 사용하고 있을때 문제인것 아닌가요??

program은 lexer와 parser가 만들어주는 것이니깐, 최소한 k-코드로부터 나오는 program에는 f'라는 함수가 없다고 봐도 될거 같아요..
위로
사용자 정보 보기 비밀 메시지 보내기
장민석



가입: 2006년 9월 5일
올린 글: 165

올리기올려짐: 2006년10월28일 4:26    주제: 인용과 함께 답변

준희님 말씀은 f'이란 단지 f가 아닌 임의의 함수명을 의미하는 것이지 꼭 f에 '을 붙여 만든 새로운 이름을 의미하는 것은 아니라는 거죠. 스펙의 원래 의도를 생각해 본다면 맞는 말씀이죠. 그러므로, 만약 우리가 dissolveCbr를 짤 때 임의의 함수명을 사용한다면 이름 중복 문제가 생길 수 있다는 말씀인 것 같아요.

그런데 주성님 말씀대로 우리가 dissolveCbr 짤 때 그냥 함수명에다 '을 붙여서 사용하면 이름 중복 문제는 없겠죠. 이렇게 하면, f'이 될 수 있는 이름의 범위를 스펙의 의도보다 제한하게 되는 셈이지만, 뭐 결과적으론 아무런 상관이 없지요.
위로
사용자 정보 보기 비밀 메시지 보내기
박대준



가입: 2005년 10월 7일
올린 글: 245

올리기올려짐: 2006년10월28일 20:46    주제: 인용과 함께 답변

김주성 씀:
k-의 렉서를 보시면 f'라는 함수는 사용자가 사용할 수 없는 이름이라는 것을 알 수 있습니다.
lexer에서 '을 허용하지 않는다는 것은 어떤 것을 보고 말씀하시는 것인지요?
숙제 4에서 제공된 lexer를 보면, id로써 사용될 수 있는 문자열의 맨 마지막에는 ' 이 올 수 있도록 정의되어 있습니다.
이것은 K- 의미 정의 문서에서도 마찬가지입니다.


단, 이번 숙제4의 1번 문제에서는, 구현의 편의를 위하여,
변환되기 전 프로그램에 정의되는 함수의 이름에 ' 가 없다고 가정합시다.
즉, 여러분은 ' 를 붙이실 때, 기존 함수와의 중복될 염려를 하지 않으셔도 됩니다.
위로
사용자 정보 보기 비밀 메시지 보내기
조은상



가입: 2006년 9월 8일
올린 글: 17

올리기올려짐: 2006년10월28일 21:45    주제: 인용과 함께 답변

박대준 씀:
단, 이번 숙제4의 1번 문제에서는, 구현의 편의를 위하여,
변환되기 전 프로그램에 정의되는 함수의 이름에 ' 가 없다고 가정합시다.
즉, 여러분은 ' 를 붙이실 때, 기존 함수와의 중복될 염려를 하지 않으셔도 됩니다.

감사합니다. Very Happy
위로
사용자 정보 보기 비밀 메시지 보내기
김주성



가입: 2006년 9월 15일
올린 글: 5

올리기올려짐: 2006년10월29일 2:05    주제: 인용과 함께 답변

아 놔;;
'\''이게 '였군요;; 잘못봤어요;; 죄송합니다;
위로
사용자 정보 보기 비밀 메시지 보내기
이전 글 표시:   
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2006) 시간대: GMT + 9 시간(한국)
페이지 11

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


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