게시판 인덱스

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

숙제 4에서 질문 몇개

 
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4541.664A Program Analysis (Spring 2006)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
윤주영
손님





올리기올려짐: 2006년5월5일 21:26    주제: 숙제 4에서 질문 몇개 인용과 함께 답변

우선 readint의 경우에는 어떤값으로 변환해야하나요?
숙제 2의 모범답안에서는 그냥 n으로 변환하고 있는데 val=Z+loc+n 이런식으로 정의해서 처리해야 할지, 아니면 어떻게 처리할지 전혀 감이 오지 않습니다.

그리고 최종 결과를 출력을 할 때 command - memory set 이런 형태로 찍어줘야하나요? 각 명령마다 고유의 id를 부여한다고 할 때 그냥 id - memory set 이렇게만 찍어줘도 될지 궁금합니다.

마지막으로 한 라인을 처리할때마다 메모리 상태를 찍어줄지, 아니면 프로그램을 종료한 후에 최종 결과를 한번만 찍어줘야할지도 궁금합니다. 후자라면 끝나지 않는 프로그램의 경우 전혀 출력이 되지 않겠지요.
위로
진민식



가입: 2006년 3월 21일
올린 글: 67

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

인용:
우선 readint의 경우에는 어떤값으로 변환해야하나요?
숙제 2의 모범답안에서는 그냥 n으로 변환하고 있는데 val=Z+loc+n 이런식으로 정의해서 처리해야 할지, 아니면 어떻게 처리할지 전혀 감이 오지 않습니다.

그리고 최종 결과를 출력을 할 때 command - memory set 이런 형태로 찍어줘야하나요? 각 명령마다 고유의 id를 부여한다고 할 때 그냥 id - memory set 이렇게만 찍어줘도 될지 궁금합니다.

마지막으로 한 라인을 처리할때마다 메모리 상태를 찍어줄지, 아니면 프로그램을 종료한 후에 최종 결과를 한번만 찍어줘야할지도 궁금합니다. 후자라면 끝나지 않는 프로그램의 경우 전혀 출력이 되지 않겠지요.


1. readint 의 경우 사용자에게 직접 입력을 받으면 됩니다. 사용자가 입력하기
전까지는 프로그램의 실행이 멈춰있겠지요.
2. id -memory set으로 찍어줘도 괜찮습니다. 다만 이 때는 각 id에 해당하는
pgm도 따로 출력해주시면 됩니다.
3. 프로그램을 종료한 후에 최종 결과를 찍어 주시면 됩니다. 끝나지 않는 프로그램일
경우 결과도 나오지 않겠지요.
위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기
윤주영
손님





올리기올려짐: 2006년5월6일 7:43    주제: 인용과 함께 답변

id에 해당하는 pgm이라는 것은 라인 하나에 해당하나요?
if와 while의 경우 end까지가 하나의 pgm이지만 저걸 다 출력해주면 오히려 보기에 더 좋지 않을듯합니다.
예를 들면
while i < y do
t2 := 1;
t2 := t2 + 1;
i := i + 1
end;
과 같은 부분이 프로그램안에 있다고 할 때, while에 대한 pgm으로써
while i < y do
만 출력해줄지, 아니면 전체를 다 출력해야할지가 애매하네요.
위로
윤주영
손님





올리기올려짐: 2006년5월6일 9:24    주제: 인용과 함께 답변

위에 쓴 질문에 조금 더하여, 결과 양식에 대하여 질문드립니다. 부디 마지막 질문이 되었으면 좋겠군요[...]
우선 숙제 스펙을 보면 eval의 리턴값은 함수입니다. 이를 굳이 함수로 하지 않고 테이블 형태로만 출력해도 괜찮은거겠지요?
그리고 id와 pgm, 그리고 그에 따른 memory set을 출력하라고 하셨는데, 이때의 id가 pgm의 line 수와 같지 않아도 괜찮을까요? 저같은 경우에는 reachable한 command에 대해서만 id를 부여하고 있는데 이경우에는 if나 while을 거치게 되면 실제 line과 id가 차이가 생깁니다.
즉, 제가 선택한 출력방식은 다음과 같습니다.
<pgm>
y := 3;
i := 1;
if y<3 then
y := y+1
else
y := y+-1
end;
k := &y;
while i<y do
*k := *k+-1;
i := i+1
end;
skip
<result>
0 | y := 3 | {}
1 | i := 1 | {y->3}
2 | if (y<3) then | {y->3, i->1}
3 | y := (y+-1) | {y->3, i->1}
4 | k := (&y) | {y->2, i->1}
5 | while (i<y) do | {y->2, i->1, k->y} {y->1, i->2, k->y}
6 | *k := ((*k)+-1) | {y->2, i->1, k->y}
7 | i := (i+1) | {y->1, i->1, k->y}
8 | skip | {y->1, i->2, k->y}
위로
진민식



가입: 2006년 3월 21일
올린 글: 67

올리기올려짐: 2006년5월6일 16:00    주제: 인용과 함께 답변

인용:
id에 해당하는 pgm이라는 것은 라인 하나에 해당하나요?
if와 while의 경우 end까지가 하나의 pgm이지만 저걸 다 출력해주면 오히려 보기에 더 좋지 않을듯합니다.
예를 들면
while i < y do
t2 := 1;
t2 := t2 + 1;
i := i + 1
end;
과 같은 부분이 프로그램안에 있다고 할 때, while에 대한 pgm으로써
while i < y do
만 출력해줄지, 아니면 전체를 다 출력해야할지가 애매하네요.


eval 의 결과에서 나오는 pgm->2^mem 에서 pgm에 대응되는
id는 라인에 해당하는 것이 아니라 id에 해당하는 pgm전체를
말하는 것입니다.
코드:

while i < y do
t2 := 1;
t2 := t2 + 1;
i := i + 1
end;


위의 프로그램에서 while에 해당하는 pgm은 전체 다 입니다.
하지만 "출력"만을 위해서라면 while 의 일부분만 출력해 주셔도
될 것 같습니다.

인용:
위에 쓴 질문에 조금 더하여, 결과 양식에 대하여 질문드립니다. 부디 마지막 질문이 되었으면 좋겠군요[...]
우선 숙제 스펙을 보면 eval의 리턴값은 함수입니다. 이를 굳이 함수로 하지 않고 테이블 형태로만 출력해도 괜찮은거겠지요?
그리고 id와 pgm, 그리고 그에 따른 memory set을 출력하라고 하셨는데, 이때의 id가 pgm의 line 수와 같지 않아도 괜찮을까요? 저같은 경우에는 reachable한 command에 대해서만 id를 부여하고 있는데 이경우에는 if나 while을 거치게 되면 실제 line과 id가 차이가 생깁니다.
즉, 제가 선택한 출력방식은 다음과 같습니다.


eval 의 결과가 table로 나오신다면 상관없습니다.(finite 한 function은
table로 이해할 수 있습니다.) 그래서 eval의 나온 결과를 이용하여
결과를 출력하시면 됩니다.

인용:
<pgm>
y := 3;
i := 1;
if y<3 then
y := y+1
else
y := y+-1
end;
k := &y;
while i<y do
*k := *k+-1;
i := i+1
end;
skip
<result>
0 | y := 3 | {}
1 | i := 1 | {y->3}
2 | if (y<3) then | {y->3, i->1}
3 | y := (y+-1) | {y->3, i->1}
4 | k := (&y) | {y->2, i->1}
5 | while (i<y) do | {y->2, i->1, k->y} {y->1, i->2, k->y}
6 | *k := ((*k)+-1) | {y->2, i->1, k->y}
7 | i := (i+1) | {y->1, i->1, k->y}
8 | skip | {y->1, i->2, k->y}



위의 결과는 pgm의 subcommand중에서 seq command에 대해서는
빠져 있는 것 같습니다. 물론 seq에 대해서 처리하면, 같은 메모리
상태를 가지는 많은 상태가 생기게 되나 seq command도
pgm의 subcommand중 하나이므로 처리해 주어야 할 것 같습니다.
[/code]
위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기
윤주영
손님





올리기올려짐: 2006년5월6일 16:36    주제: 인용과 함께 답변

seq command c1;c2의 실행전 메모리셋은 c1,c2가 무엇이든 상관없이 완벽하게 c1의 실행전과 동일한 메모리 셋을 가집니다.
제가 보기에는 seq에 대한 메모리셋은 너무 의미가 적어보입니다.
거기에다 parser의 seq command에 대한 연산 우선순위가 왼쪽으로 되어있기 때문에 실제로 이렇게 고쳐서 수행해보니 각각의 scope(전체 프로그램이나 또는 {}안의 영역)에서 존재하는 모든 seq command가 먼저 나오게 됩니다.
앞에서 제가 예로 든 프로그램의 경우 다음과같이 나오게 되는데요, 이건 너무 무의미해서 정말 찍어줘야되나 하는 의구심이 사라지질 않는군요-_-;
굳이 찍는것이 맞다고 하시면 찍겠습니다.
0 | seq | {}
1 | seq | {}
2 | seq | {}
3 | seq | {}
4 | seq | {}
5 | y := 3 | {}
6 | i := 1 | {y->3}
7 | if (y<3) then | {y->3, i->1}
8 | y := (y+-1) | {y->3, i->1}
9 | k := (&y) | {y->2, i->1}
10 | while (i<y) do | {y->2, i->1, k->y} {y->1, i->2, k->y}
11 | seq | {y->2, i->1, k->y}
12 | *k := ((*k)+-1) | {y->2, i->1, k->y}
13 | i := (i+1) | {y->1, i->1, k->y}
14 | skip | {y->1, i->2, k->y}
위로
정우성
손님





올리기올려짐: 2006년5월6일 16:53    주제: Seq 명령어에 대한 처리 인용과 함께 답변

동일하게 겹쳐서 일부러 제외시켜준다고 오히려 추가 노력을 들여 고생했는데, 다시 되돌려 놓아야 겠군요 --; 끙.
위로
정우성



가입: 2006년 5월 6일
올린 글: 8

올리기올려짐: 2006년5월6일 17:03    주제: Re: Seq 명령어에 대한 처리 인용과 함께 답변

정우성 씀:
동일하게 겹쳐서 일부러 제외시켜준다고 오히려 추가 노력을 들여 고생했는데, 다시 되돌려 놓아야 겠군요 --; 끙.


제가 쓴 글을 인용하게 되는군요.

pgm 자체는 tree 아래쪽으로 가다보면 동일한 코드가 나올 수 있으므로, 어짜피 어떤 key를 이용해서 key -> 2^Mem 이면 되는 걸로 알고 있습니다. 물론, Key 는 특정 pgm 과 매핑이 되겠지요.

내부적으로는 Key 를 주기만 하면 해당 2^Mem 을 불러올 수 있습니다. 내부 구현된 함수 자체가 그렇게 처리되도록 되어 있구요. 다만, 프로그램 실행을 시켜서 그 함수가 제대로 동작하는 것을 확인 시켜주는 과정에서 Seq 부분의 중복되는 부분은 제외를 하였습니다. 그러니까 ";" 이거 하나하나에 대해서는 pgm 의 어떤 위치로 지정하지 않도록 보여주었습니다.

실제 구현은 HW4를 만족하므로, 굳이 화면에 다 출력되도록 Seq 까지 보일 필요는 없겠지요? 방금 제출해서... 아니면 화면에 보여주는 것도 조금 지저분 하긴 하지만 전부 보여주는게 나을까요? 현재는 아래와 같이 보여주고, 해당 위치를 선택하면 프로그램 실행시 그 부분에서의 모든 2^Mem 을 보여주도록 되어 있거든요.

;있는 곳마다 다 Key를 넣게 되면 사실, 보기에 상당히 불편해서요.
예를 들어 (1,1)의 경우는 while 문 덩어리에 대한 실행 직전 위치가 되구요.
(7,65) 같은 경우는 덩어리가 없이 그냥 t1 := x 일텐데요.
실제로 프로그램이 종료할 때 (1,1)->[END] 되는 것이 확인 가능한데, 그래서 (1,1)의 위치까지 올라왔다가 whlie 문 조건 확인하고 내려가는 겁니다.

그냥 함수만 구현하면 되는 것이므로, 실행 프로그램에 대한 UI 출력에 까지 Seq를 찍을 필요는 없는거죠? Seq도 Key를 찍어주면 되는거라 어렵진 않습니다만...

#####################################
Source program & Location key
File name: sample.c--
#####################################
/* (3,0) */ x := 1;
/* (3,1) */ y := readint;
/* (2,1) */ i := 1;
/* (1,1) */ while (i<(y+1)) do
/* (7,64) */ j := 0;
/* (7,65) */ t1 := x;
/* (6,33) */ t2 := 0;
/* (5,17) */ while (j<i) do
/* (7,6Cool */ t2 := (t2+t1);
/* (7,69) */ j := (j+1)
end;
/* (4,9) */ x := t2;
/* (3,5) */ i := (i+1)
end

#### Enter a Location Key (x,y) #####
Input> x: 5
Input> y: 17

###### Sequence of Execution ########
[START]->(3,0)->(3,1)->[Halt for Readint]:3
(2,1)->(1,1)->(7,64)->(7,65)->(6,33)->(5,17)->(7,6Cool->(7,69)->(5,17)->(4,9)->(3,5)->(1,1)->(7,64)->(7,65)->(6,33)->(5,17)->(7,6Cool->(7,69)->(5,17)->(7,6Cool->(7,69)->(5,17)->(4,9)->(3,5)->(1,1)->(7,64)->(7,65)->(6,33)->(5,17)->(7,6Cool->(7,69)->(5,17)->(7,6Cool->(7,69)->(5,17)->(7,6Cool->(7,69)->(5,17)->(4,9)->(3,5)->(1,1)->[END]

########## Set of Memories ##########
Location Key = (5,17)
The Set =
{
{i=1;j=0;t1=1;t2=0;x=1;y=3;};
{i=1;j=1;t1=1;t2=1;x=1;y=3;};
{i=2;j=0;t1=1;t2=0;x=1;y=3;};
{i=2;j=1;t1=1;t2=1;x=1;y=3;};
{i=2;j=2;t1=1;t2=2;x=1;y=3;};
{i=3;j=0;t1=2;t2=0;x=2;y=3;};
{i=3;j=1;t1=2;t2=2;x=2;y=3;};
{i=3;j=2;t1=2;t2=4;x=2;y=3;};
{i=3;j=3;t1=2;t2=6;x=2;y=3;};
}

Input> Try Again? (0:Exit): 0
위로
사용자 정보 보기 비밀 메시지 보내기
정우성



가입: 2006년 5월 6일
올린 글: 8

올리기올려짐: 2006년5월6일 17:40    주제: 인용과 함께 답변

..

정우성 가 2006년5월6일 17:58에 수정함, 총 1 번 수정됨
위로
사용자 정보 보기 비밀 메시지 보내기
진민식



가입: 2006년 3월 21일
올린 글: 67

올리기올려짐: 2006년5월6일 17:42    주제: 인용과 함께 답변

인용:
<pgm>
y := 3;
i := 1;
if y<3 then
y := y+1
else
y := y+-1
end;
k := &y;
while i<y do
*k := *k+-1;
i := i+1
end;
skip
<result>
0 | y := 3 | {}
1 | i := 1 | {y->3}
2 | if (y<3) then | {y->3, i->1}
3 | y := (y+-1) | {y->3, i->1}
4 | k := (&y) | {y->2, i->1}
5 | while (i<y) do | {y->2, i->1, k->y} {y->1, i->2, k->y}
6 | *k := ((*k)+-1) | {y->2, i->1, k->y}
7 | i := (i+1) | {y->1, i->1, k->y}
8 | skip | {y->1, i->2, k->y}



위의 결과는 pgm의 subcommand중에서 seq command에 대해서는
빠져 있는 것 같습니다. 물론 seq에 대해서 처리하면, 같은 메모리
상태를 가지는 많은 상태가 생기게 되나 seq command도
pgm의 subcommand중 하나이므로 처리해 주어야 할 것 같습니다.


오해를 불러 일으켜서 죄송합니다.
위의 얘기는 구현시 모든 subcommand에 대한 memory set을 모아야 한다는
얘기 였습니다.
결과를 출력하실 때는 sequence가 계속 되어서 의미 없다고 생각되는 부분은
출력을 하지 않으셔도 상관없습니다.
위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기
정우성



가입: 2006년 5월 6일
올린 글: 8

올리기올려짐: 2006년5월6일 19:09    주제: 인용과 함께 답변

진민식 씀:
인용:
<pgm>
y := 3;
i := 1;
if y<3 then
y := y+1
else
y := y+-1
end;
k := &y;
while i<y do
*k := *k+-1;
i := i+1
end;
skip
<result>
0 | y := 3 | {}
1 | i := 1 | {y->3}
2 | if (y<3) then | {y->3, i->1}
3 | y := (y+-1) | {y->3, i->1}
4 | k := (&y) | {y->2, i->1}
5 | while (i<y) do | {y->2, i->1, k->y} {y->1, i->2, k->y}
6 | *k := ((*k)+-1) | {y->2, i->1, k->y}
7 | i := (i+1) | {y->1, i->1, k->y}
8 | skip | {y->1, i->2, k->y}



위의 결과는 pgm의 subcommand중에서 seq command에 대해서는
빠져 있는 것 같습니다. 물론 seq에 대해서 처리하면, 같은 메모리
상태를 가지는 많은 상태가 생기게 되나 seq command도
pgm의 subcommand중 하나이므로 처리해 주어야 할 것 같습니다.


오해를 불러 일으켜서 죄송합니다.
위의 얘기는 구현시 모든 subcommand에 대한 memory set을 모아야 한다는
얘기 였습니다.
결과를 출력하실 때는 sequence가 계속 되어서 의미 없다고 생각되는 부분은
출력을 하지 않으셔도 상관없습니다.


"구현시 모든 subcommand에 대한 memory set을 모아야 한다"는 조건때문에 숙제를 다시 제출하였습니다. 실행 자체는 큰 차이가 없습니다.
마지막에 3rd 라고 찍힌 첨부화일이 최종본입니다.
메일 확인하시고 답메일 부탁드리겠습니다.( 앞에 보냈던 메일과 2nd 는 모두 무시 바랍니다. )
위로
사용자 정보 보기 비밀 메시지 보내기
이전 글 표시:   
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4541.664A Program Analysis (Spring 2006) 시간대: GMT + 9 시간(한국)
페이지 11

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


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