|
|
이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
김현식
가입: 2017년 9월 5일 올린 글: 24
|
올려짐: 2017년11월13일 13:58 주제: 5-1 질문 |
|
|
sm5에서 id의 location은 (a,o)라고 표시되는데 o가 id가 갖는 value값 아닌가요??
sm5의 semantics에서 plus (즉, add)에 관한 내용을 보면 <a,z1>이라고 표시되어 있고 덧셈을 해도 <a,z1+z2>로 표기되는거 보면 value값이 맞는거 같은데
sm5.ml 파일을 보면 무조건 location은 (a,0) 이런식으로 되고 offset의 값을 바꾸는 코드는 보이지 않네요 ㅜㅜ
debug 해봐도 x+2하면 x가 <a,0>이 돼서 x의 assign 된 값과 상관없이 2가 나오는데 어떤게 잘못된걸까요? |
|
위로 |
|
|
송우성
가입: 2017년 9월 7일 올린 글: 4
|
올려짐: 2017년11월13일 14:29 주제: Base X Offset |
|
|
k--에서 번역하는 과정에서는 쓰이지 않는 것 같은데, Sm5 상에서 의도적으로 바꿔서 저장할 수는 있습니다.
애초에 주소 자체가 (int * int) list 로 저장되어 있어서, 값을 저장할 수 없는 것 같아요. 값을 저장한다면 (int * value) list 가 되어야 할 것 같습니다.
자료대로 Base와 Offset을 가리키고 있는 것으로 이해했습니다. 주소 자체를 int 두 개의 튜플로 정의되었고, MALLOC을 실행하면 (n, 0) 값 형태로 기본 주소가 나오고요.
결국 숙제 3과 거의 비슷한 방식으로 정의된 것 같습니다.
2015년도 최재승 조교님께서 올려주신 Sm5 테스트케이스에 이런게 있어요.
코드: |
(* GC must not miss a location with different offset *)
let cmds6 =
(* Location to be collected *)
let cmds = [PUSH (Val (Z 1)); MALLOC; STORE] in
(* Allocate, bind and store 126 times *)
let cmds = append 126 (fun i ->
let v = Printf.sprintf "x%d" i in [
MALLOC;
BIND v;
PUSH (Val (Z 1));
PUSH (Id v);
STORE;
]) cmds
in
(* Another location with same base, different offset *)
let cmds = cmds @
[PUSH (Val (Z 500));
PUSH (Id "x0");
PUSH (Val (Z 10));
ADD;
STORE; (* Env : "x0" ==> (a, 0) / Mem : (a, 10) ==> 500 *)
]
in
(* Trigger GC *)
let cmds = cmds @ [
MALLOC;
BIND "foo";
PUSH (Val (Z 1));
PUSH (Id "foo");
STORE
]
in
cmds @ [PUSH (Id "x0"); PUSH (Val (Z 10)); ADD; LOAD; PUT]
|
주소 (2,0)에 대해 10을 더한 후 STORE하는 예제입니다.
이 예제를 실행하면 주소 (2, 10)에 새로운 값이 저장이 됩니다.
아마 가비지 콜렉터를 구현할 때도 조심해야할 것 같네요. |
|
위로 |
|
|
|
|
새로운 주제를 올릴 수 없습니다 답글을 올릴 수 없습니다 주제를 수정할 수 없습니다 올린 글을 삭제할 수 없습니다 투표를 할 수 없습니다
|
Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group Translated by kss & drssay
|