2014-07-15 2 views
3

우리는 깊은 함수 호출 종속성 그래프를 사용하는 F #의 응용 프로그램을 사용합니다. 계층 적 방식으로 재무 계산을 수행합니다.F # 함수 호출 종속성 그래프

종속성 호출 그래프를 어떻게 추출 할 수 있습니까? 우리는 완전한 AST, 모듈/함수 간의 의존성에만 관심이 없습니다.

목적은 도메인 전문가와의 대화에서 사용할 수있는 간단한 코드 버전을 사용하는 것입니다.

+0

예. 그렇습니다. 그러나 현재의 사양은 매우 어색하고 복잡합니다. 일부 POC에서 프로토 타입을 작성한 것처럼 도메인을 더 간단하게 설명 할 수 있습니다. 그래서 계획은 도메인 전문가 (모델 설계 전문가가 아닌)와 더 나은 모델을 고안하는 것입니다. – jruizaranguren

+1

소스를 제어 할 수 있고 리팩토링에 신경 쓸 필요가없는 경우 프리즘이 한 일을 수행하고 함수를 감싸는 래퍼를 작성하여 그래프를 추출 할 수 있습니다 (http://www.infoq.com/presentations/Graph- Clojure-Prismatic). F #에서는이 표현식 (또는 단순히 "장식"함수)에 대한 계산식을 사용할 수 있다고 생각합니다. – Grundoon

+0

Prismatic/Schema에 대한 비슷한 접근법이 꼭 필요한 것입니다. (이 특정 질문은 좁혀졌지만 그 범위 내에서 정확하게 응답되었습니다). 나는 그것을하는 가장 fsharpest 방법 일 것 인 (더 이상의 질문) 확실한 I 'm. 기본적으로 Prismatic/Schema는 함수의 입력 - 출력에 대한 선언적 지정을 정의하고 특수 키워드를 통해 구현과 관련시킵니다. 그리고 간단한지도를 사용하여 그래프를 5 개의 LOC에 만들 수 있고 정말 흥미로운 것을 쉽게 만들 수 있습니다 (조롱, 부분 그래프 작성, 테스트 등). – jruizaranguren

답변

6

Scott Wlaschin은 그의 'Cycles and modularity in the wild' 기사에서 유사한 작업을 수행했습니다. His approach은 Mono.Cecil을 메타 데이터 리더로 사용하고 SVG에서 종속성 그래프를 추출합니다. 최근 기사 인 'Analysis of Roslyn vs. the F# compiler'the same method을 사용합니다.

귀하의 목적에 맞게이 스크립트를 수정할 수 있습니다. 단점은 접근 방식이 정확하지 않다는 것입니다. 코드가 일리노이로 컴파일 될 때 일부 F # 관련 정보가 손실 될 수 있습니다.

또 다른 접근법은 FSharp.Compiler.Service을 메타 데이터 판독기로 사용하는 것입니다. 장점은 유연성이지만, FSharp.Compiler.Service API에 익숙해 지려면 약간의 시간이 걸릴 수 있습니다. 어셈블리 서명에서 시작하여 전체 계층 구조를 탐색하여 시작할 수 있습니다. 다음은 relevant exampledocumentation입니다.

동일한 정신으로, 함수에 ReflectedDefinitionAttribute를 사용하여 주석을 추가하면 Reflection, Quotations 및 Pattern 모듈을 사용하여 종속성 그래프를 검색 할 수 있습니다. 이 접근법은 FSharp Journal에 설명되어 있습니다.