오규혁 Site Admin
가입: 2022년 3월 15일 올린 글: 88
|
올려짐: 2025년5월16일 14:02 주제: [숙제 7] 공지사항 및 보충 세부사항 안내드립니다. |
|
|
안녕하세요 수강생 여러분,
숙제 7에 대한 공지사항 및 보충 세부사항을 안내해드리겠습니다.
내용 : http://kwangkeunyi.snu.ac.kr/4190.310/25/hw7.pdf
제출 : http://ropas.snu.ac.kr/~ta/4190.310/25/submit/index.pl
기한 : 5/30 밤 11시 59분 59초
# 과제 관련 주의 사항
과제를 제출하기 전에 꼭 주의사항(https://ropas.snu.ac.kr/phpbb/viewtopic.php?t=7434)을 확인해 주세요.
# 보충 세부사항
(이 글에 답글로 질문하지 말아 주세요. 별도의 게시글로 질문해 주시기 바랍니다!)
## Exercise 1 "마저 할 일 드러내기"
* 뼈대코드: http://ropas.snu.ac.kr/~ta/4190.310/25/show/cps_translate.tar.gz
* 뼈대코드에는 nexp (M0로 칭하겠습니다) 언어의 파서와 실행기 일부가 제공되어 있습니다.
* 뼈대코드 디렉토리에서 `dune build --release` 명령을 실행하시면 숙제 전체가 컴파일됩니다.
`run` 파일(혹은 `./_build/default/bin/main.exe`)을 다음과 같이 실행하시면 입력으로 받은 M0 프로그램을 실행하고, CPS로 번역한 다음 실행합니다. 이 때 두 실행 결과는 같아야 합니다.
코드: | $ dune build --release
$ ./run examples/test1.m |
* 뼈대코드 중 cps.ml 파일을 제출합니다. 꼭 주의해 주세요, 엉뚱한 ml 파일을 잘못 제출하시면 조교팀이 해결해 드릴 방법이 없습니다.
* TODO로 표시한 CPS.cps 함수를 구현하셔서 제출하면 됩니다.
* 올바른 CPS 변환에 대한 기준은 아래와 같습니다. 작성하신 코드는 반드시 다음 조건을 만족해야 합니다.
1. 어떤 nexp에 나타난 부분식(sub-expression)들은 모두 cps 변환되어야 합니다. 예를 들어 cps(e1+e2)의 경우, e1, e2는 각각 cps로 변환된 (cps e1), (cps e2) 형태로 나타나야 합니다.
2. e가 상수(Num, Var, Fn, Rec) 일때만 cps(e) = \k.k(…) 형태를 허용합니다. 상수의 경우 e자체가 이미 계산된 결과이므로 바로 k에 전달하는 것입니다.
3. e가 상수가 아니면 항상 cps(e) = \k….(\v….k… ) 형태로 변형되어야 합니다. 상수가 아닌 복합식의 경우, 하나의 부분식을 먼저 변환하고 남은 부분식의 할 일을 k와 함께 묶어 구성하는 것입니다.
* 숙제 문서에서 예시로 제시된 Add의 경우를 보면, 복합식 e1 + e2 에서 일부인 e1을 변환한 다음, 앞으로 할 일을 인자로 전해주고 있습니다. 이 '앞으로 할 일'을 정의하는 데 k가 사용되고요. 따라서 위의 세 조건을 모두 만족합니다.
인용: | cps(e1 + e2) = \k. (cps e1) (\v1. (cps e2) (\v2. k (v1 + v2) ) ) |
## Exercise 2 "예외처리(하던 일 관두고 복귀하기)는 설탕"
* 뼈대코드: http://ropas.snu.ac.kr/~ta/4190.310/25/show/exn.tar.gz
* 뼈대코드 중 cps.ml 파일을 제출합니다. 꼭 주의해 주세요, 엉뚱한 ml 파일을 잘못 제출하시면 조교팀이 해결해 드릴 방법이 없습니다.
* 뼈대코드에는 xexp 언어의 파서와 실행기 일부가 제공되어 있습니다.
* 뼈대코드 디렉토리에서 `dune build --release` 명령을 실행하시면 숙제 전체가 컴파일됩니다.
run 파일(혹은 `./_build/default/bin/main.exe`)을 다음과 같이 실행하시면 입력으로 받은 xexp 프로그램을 실행하고, CPS로 번역한 다음 실행합니다. 이 때 두 실행 결과는 같아야 합니다.
코드: | $ dune build --release
$ ./run examples/test1.xexp |
* xrun 실행기는 handle 없이 raise를 하는 경우 2025를 출력합니다.
숙제 문서의 다음 내용을
인용: | xrun(e) = xrun(e(fn v => v, fn v => print "uncaught exn")) |
아래와 같이 수정해서 이해하시면 되겠습니다.
인용: | xrun(e) = xrun(e(fn v => v, fn v => 2025)) |
## Exercise 3 "M 실행기"
* M 언어의 스펙 문서 : http://ropas.snu.ac.kr/~kwang/4190.310/25/M.pdf
* 뼈대코드: http://ropas.snu.ac.kr/~ta/4190.310/25/show/m_interp.tar.gz
* 뼈대코드에는 M 언어의 파서와 실행기 일부가 제공되어 있습니다.
* 뼈대코드 디렉토리에서 `dune build --release` 명령을 실행하시면 숙제 전체가 컴파일됩니다.
run 파일을 다음과 같이 실행하시면 입력으로 받은 M 프로그램을 실행합니다.
코드: | $ dune build --release
$ ./run examples/test1.m |
* 뼈대코드 중 m.ml 파일을 제출합니다. 꼭 주의해 주세요, 엉뚱한 ml 파일을 잘못 제출하시면 조교팀이 해결해 드릴 방법이 없습니다. 특히, 1번 문제의 m0.ml을 제출하지 않도록 주의하세요.
* M.run 함수에 TODO로 표시한 빈 부분들을 완성하셔서 제출하면 됩니다.
* 언어의 스펙은 http://ropas.snu.ac.kr/~kwang/4190.310/25/M.pdf 를 따라갑니다.
1. 알맞은 타입이 오지 않을 경우 (예 : 정수에 스트링을 더한 경우) TypeError 예외를 발생시킵니다. 예외 인자는 자유롭게 정하면 됩니다.
2. EQUAL Semantics에 대해 : 3장 "Static Semantics: Type System"의 스펙을 따라 다음과 같이 정합니다.
서로 다른 타입을 비교하거나, Pair끼리의 비교, Closure끼리의 비교는 타입 에러입니다. 과제 3, 4의 K 언어와 다른 스펙이니 주의해주세요.
3. M 언어에서 사용하는 변수 이름에는 #, @, _와 같은 특수문자가 등장하지 않는다고 가정하겠습니다.
## Exercise 4 "저지방 M"
* M 언어의 스펙 문서 : http://ropas.snu.ac.kr/~kwang/4190.310/25/M.pdf
* 뼈대코드: http://ropas.snu.ac.kr/~ta/4190.310/25/show/lowfat.tar.gz
* 뼈대코드의 simple_checker.ml 파일의 check 함수를 완성하여 제출합니다. check 함수는 입력으로 들어온 프로그램의 타입을 유추하여, m.ml 파일에 정의된 M.types 타입으로 리턴해야 합니다.
* 타입 추론에 실패할 경우, m.ml 파일에 정의된 M.TypeError 예외를 발생시켜 주세요. (예외의 인자로 쓸 문자열은 자유롭게 정하시면 됩니다.)
* 뼈대코드에 몇몇 타입 정의를 제공합니다. 입맛에 따라 자유롭게 수정하여 활용하시기 바랍니다.
* M 언어의 스펙 문서에 나와 있듯이, 입력으로는 "non-function type expression"만 들어옵니다.
* 프로그램을 실행해 보고 결과를 관찰하여 답을 내놓는다거나 하는 방법은 금지입니다.
* 프로그램의 최종 타입을 m.ml 파일에 선언된 types 타입으로 표현하였을때 함수타입이 남아있는 경우는 입력으로 테스트하지 않을 것입니다. 이는 non-function type expression만 입력으로 들어오는 것의 연장사항으로, 예를 들자면 다음과 같은 프로그램은 입력으로 넣지 않겠습니다.
코드: | let val f = fn x => x + 1 in
(1, f)
end |
* 뼈대코드 디렉토리의 m.ml은 7-3문제의 뼈대코드 m.ml과 동일한 파일입니다. 7-3에서 완성한 파일로 대체하셔도 되고, 그대로 두셔도 무관합니다. 타입체킹은 M실행기와 독립적으로 테스트될 예정입니다.
감사합니다.
조교 드림 _________________ TA 오규혁
e-mail: ghoh@ropas.snu.ac.kr
오규혁 가 2025년6월10일 3:09에 수정함, 총 1 번 수정됨 |
|