|
|
이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
최재승
가입: 2012년 9월 10일 올린 글: 211
|
올려짐: 2016년6월3일 23:05 주제: 프로젝트 공지 및 뼈대코드 (6/13 마지막 업데이트) |
|
|
안녕하세요, 프로그램 분석 조교입니다.
프로젝트 뼈대코드를 공개합니다.
프로젝트 내용 : http://ropas.snu.ac.kr/~kwang/4541.664A/16/project.pdf
프로젝트 기한 : 6/14 (화) 밤 12시
뼈대코드 : http://ropas.snu.ac.kr/~ta/4541.664A/16/project.zip
질문은 본 게시물에 답글로 달지 마시고, 새로운 글로 써 주시면 감사하겠습니다.
-----------------
* 변경 내역
6/4 : 환경 세팅 설명 보강, 테스트케이스 오타 수정
6/5 : TODO 항목 설명 보강, 채점기준에 대한 설명 추가, 테스트케이스 추가
6/7 : 뼈대코드에서 프로그램 그래프 관련 인터페이스를 업데이트했습니다. (수정된 파일 : graphPgm.mli, graphPgm.ml)
노드에 매달린 명령을 가져오는 함수, 노드 아이디를 가져오는 함수가 가려져 있어서 이를 드러냈습니다.
6/9 : 뼈대코드에서 도메인 functor를 업데이트했습니다. (수정된 파일 : domFunctor.ml)
함수 도메인(FunDomain)의 fold/map 함수에서 문제를 발견하여 수정하였습니다.
또, PrimtiveSet의 인터페이스를 수정하여 편의성을 높였습니다.
그리고 List를 사용하여 코딩하는데 익숙하신 분들을 위해, 멱집합 도메인(PowerSetDomain)과 함수 도메인(FunDomain)에 to_list 함수를 추가하였습니다.
6/10 : 테스트케이스의 주석 오타 수정(eo_test5.k), TODO 항목에 주의사항을 추가
6/13 : 테스트케이스의 사소한 수정(eo_test5.k)
https://ropas.snu.ac.kr/phpbb/viewtopic.php?t=5248 글 참조
--------------
* 프로젝트 제출 양식
제출은 이메일 jschoi@ropas.snu.ac.kr로 보내주시면 됩니다. 이메일 제목은 "[PA]학번" 와 같은 형식으로 해주세요. (예: "[PA]2016_12345").
작업하신 프로젝트 디렉토리 전체를 zip으로 압축하여 첨부하시면 되고, 첨부파일의 이름도 이메일 제목과 같게 해주시기 바랍니다.
조교의 채점이 수월해지므로 양식을 꼭 지켜주시면 감사하겠습니다.
* 주의 사항
- make 명령으로 정상적으로 컴파일되는 상태에서 압축한 다음 제출해 주시기 바랍니다.
컴파일에 실패할 경우 큰 폭으로 감점될 수 있으므로 주의해 주시기 바랍니다.
- evenOdd.ml 파일의 result 타입 정의, davinci.ml 파일의 result 타입 정의는 수정하시면 안 됩니다.
* 환경 세팅 및 컴파일
- Ubuntu 환경을 기준으로, 아래의 명령들을 통해 ocaml 개발 환경을 세팅할 수 있습니다.
코드: |
$ sudo apt-get install opam
$ sudo apt-get install graphviz
$ sudo apt-get install m4
$ opam init
$ eval `opam config env`
$ opam update
$ opam install ocamlgraph
|
- make 명령으로 프로젝트를 컴파일하고, 아래과 같이 실행해볼 수 있습니다.
코드: |
$ make
$ ./main.native -eo ./example/eo_test1.k
$ ./main.native -davinci ./example/dav_test2.k
$ ./main.native -print ./example/eo_test1.k
|
* TODO
-여러분은 evenOdd.ml 파일의 eoAnalyzer 함수와 davinci.ml 파일의 daVinciAnalyzer 함수를 구현하시면 됩니다.
이 과정에서 새로운 타입이나 함수를 자유롭게 정의하셔도 되고, 새로운 파일을 추가하셔도 좋습니다. 다만, 컴파일이 정상적으로 되도록 신경써 주시기 바랍니다.
-분석은 프그램의 각 지점마다 요약된 메모리 상태가 매달리는 스타일로 디자인하고 구현하시기 바랍니다. (수업자료 10-1b.pdf 참조)
이를 위해 프로그램을 그래프 형태로 녹여서 제공합니다.
- eoAnalyzer 함수가 내놓는 값은, 프로그램의 마지막 지점에서 변수가 가지는 정수가 짝수일지 홀수일지, 주소라면 어떤 주소일지입니다. (evenOdd.ml 파일의 result 타입 정의 참조)
(주의 : 마지막 지점에 매달려 있는 명령도 실행한 다음의 값들을 의미합니다.)
- daVinciAnalyzer 함수가 내놓는 값은, 주어진 프로그램이 다빈치 코드인지 여부입니다. (davinci.ml 파일의 result 타입 정의 참조)
(주의 : 스펙문서의 설명에 "소프트웨어의 실행중에" 라는 말이 나오는데, 마지막 지점에 매달려 있는 명령도 실행한 직후의 상황도 '실행중'에 포함됩니다.)
* 프로그램 그래프
project.pdf 문서에 주어진 언어를 그래프 형태로 녹여서 제공합니다.
그래프의 각 노드에는 이제 다음과 같은 명령들 중 하나가 매달려 있게 됩니다.
코드: |
type command =
| Assign of var * exp (* x := E *)
| PtrAssign of var * exp (* *x := E *)
| Assume of exp (* Continue execution if exp is true, stop otherwise *)
| AssumeNot of exp (* Continue execution if exp is false, stop otherwise *)
| Skip (* No operation *)
|
- ./main.native -print <filename> 을 실행하시면, 입력으로 받은 프로그램을 그래프로
표현한 결과를 graph.png 파일에 그려 줍니다.
- 'graphPgm.mli' 파일을 살펴보시면, 여러분이 유용하게 사용하실 수 있는 인터페이스 함수들이 제공됩니다.
예를 들어, 프로그램 그래프의 모든 노드를 가져오는 함수, 프로그램의 마치막 노드를 가져오는 함수, 주어진 노드의 다음 노드(successor)들을 가져 오는 함수 등이 있습니다.
* 참고 : repeat C E 의 의미
퀴즈 답안을 보니 repeat 명령의 의미를 제각각 다르게 이해하고 계셨는데, 저는 교수님 수업 슬라이드 3장을 기준으로 해석하였습니다.
"C를 실행한 다음, E가 true이면 다시 repeat C E 를 반복, false이면 끝"
프로그램을 그래프로 변환할 때에도 이 semantics를 기준으로 하였으니 참고하세요.
* 도메인 functor
domFunctor.ml에 유용한 여러 functor들이 제공됩니다.
domExample.ml에 이 functor들을 어떻게 활용할 수 있는지 예시들이 있으니 참조하시기 바랍니다.
제공되는 functor의 기능을 수정하거나, 이를 사용하지 않고 필요한 도메인들을 직접 새로 구현하셔도 무방합니다.
*예제
example 디렉토리 아래에 몇몇 예제 프로그램들을 제공하며, 간단한 설명이 주석으로 제공됩니다.
채점도 이 예제들과 비슷한 수준의 테스트케이스를 가지고 진행될 것입니다.
*채점기준
- 우선, 여러분이 구현한 분석기는 안전(sound)해야 합니다. 짝수값이 될 수 있는 변수를 홀수값만 가진다고 해서는 안 되며, 다빈치 코드가 될 수 있는 코드를 다빈치 코드가 될 수 없다고 결론내려서는 안 됩니다.
- 안전성을 해치지 않는 범위 내에서, 분석기는 정확할수록 좋습니다. 짝수만 갖는 변수에 대해 짝수/홀수 모두 될 수 있다고 답하면 부분점수만 받을 것입니다.
얼마나 정확한 분석기를 만들어야 하는지에 대한 기준은, 제공해 드린 테스트케이스들입니다. 이 예제들을 정확하게 분석할 수 있는 정도면 충분합니다.
- 충실히 구현되지 않은 코드의 경우 감점받을 수 있습니다.
예를 들어, 다빈치 코드 분석에서 무조건 Yes라고 찍어서 답하는 코드를 제출하면 맞을 확률이 1/3이나 되는데, 이러한 답안에 온전히 점수를 드리지는 않을 것입니다.
(조교가 코드를 직접 열어보고 0점을 부여한다거나, 틀린 테스트케이스는 감점을 하는 채점방식을 택하도록 할 것입니다)
이는 열심히 구현하다 실수로 틀린 학생들이 억울해지는 상황을 방지하기 위함입니다.
------------
뼈대 코드 및 예제에 이상한 점이 있거나, 그래프와 관련하여 분석기 구현에 꼭 필요한데 빠져있는 기능이 있다거나 하면 알려주시기 바랍니다.
조교 드림
최재승 가 2016년6월14일 9:27에 수정함, 총 21 번 수정됨 |
|
위로 |
|
|
강동현
가입: 2011년 9월 26일 올린 글: 19
|
올려짐: 2016년6월6일 23:25 주제: opam 설치 관련해서 |
|
|
1.
Ubuntu 14.04 LTS 사용중인데요
sudo apt-get upgrade / update 등을 다 해도 opam 버전이 1.1.1로 깔리네요.
더 이상 opam 1.1.1 버전에서의 opam init이 지원되지 않는 듯 해요 (failure으로 끝납니다)
그래서
https://opam.ocaml.org/doc/Install.html#Binarydistribution 부분대로 따라 하여 설치했습니다.
2. opam eval `opam config env` -> eval `opam config env` 인 듯 합니다.
강동현 가 2016년6월7일 11:39에 수정함, 총 1 번 수정됨 |
|
위로 |
|
|
최재승
가입: 2012년 9월 10일 올린 글: 211
|
올려짐: 2016년6월7일 11:32 주제: |
|
|
1.
opam 1.1.x 버전에서도 opam init은 작동합니다만, 제가 직접 세팅해 보니, opam init에서 "Too many open files" 에러로 인해 Failure가 발생하네요. (새로 설치한 Ubuntu 14.04.4 기준입니다)
이 경우 https://easyengine.io/tutorials/linux/increase-open-files-limit/ 글을 참조하여 파일 개수 제한을 올려 주시면 정상적으로 진행이 가능합니다.
2.
제보 감사합니다, 반영하여 수정하였습니다.
그 외에도 환경 세팅에서 문제가 있으면 알려주시기 바랍니다. |
|
위로 |
|
|
유재민
가입: 2013년 10월 2일 올린 글: 11
|
올려짐: 2016년6월9일 17:56 주제: PrimitiveSet 질문 |
|
|
안녕하세요.
module SS = PrimitiveSet(Var)
module ASD = Set.Make(Var)
이렇게 정의를 한 다음에 SS.elt와 ASD.elt가 같은 타입인지 코드를 실행시켜보면
Error: This expression has type ASD.elt = string
but an expression was expected of type
SS.elt = DomFunctor.PrimitiveSet(Program.Var).elt
와 같은 에러가 납니다. 제 생각에는 두 타입이 같아야 할 것 같은데요. 이와 같은 구현이 의도된 것인가요? |
|
위로 |
|
|
최재승
가입: 2012년 9월 10일 올린 글: 211
|
올려짐: 2016년6월9일 18:26 주제: |
|
|
네, 조교팀도 해당 문제를 인지하고 뼈대코드를 수정하였습니다. (모듈 타입에 의해 elt 타입의 정의가 가려져 있어서 발생한 문제입니다.)
업데이트된 뼈대코드를 다시 받아주시기 바랍니다.
PS. 앞으로 질문은 별개의 새로운 글로 써 주시면 감사하겠습니다. 주제 마다 별개의 글로 운영되는 것이 좋기 때문입니다.
감사합니다.
조교 드림 |
|
위로 |
|
|
|
|
새로운 주제를 올릴 수 없습니다 답글을 올릴 수 없습니다 주제를 수정할 수 없습니다 올린 글을 삭제할 수 없습니다 투표를 할 수 없습니다
|
Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group Translated by kss & drssay
|