2016-06-20 4 views
4

C에서 두 개의 플래그먼트를 비교하는 일반적인 방법은 생성되는 어셈블리를 확인하는 것입니다. 그래서 시도ghc에서 생성 된 코드를 비교하십시오.

afmap :: Functor f => (a -> b -> c) -> f b -> a -> f c 
afmap fn fb a' = (fn a') <$> fb 

afmap = flip . (((.).(.)) fmap ($)) 

:

$ ghc -S test.hs -o test.S 

어떤이 (당연히) 더 많거나 적은 읽을 수없는 코드를 산출 나는 GHC이의 경우에 발생 될지 코드를 알고 싶어 .

ghc가 코드를 최적화하는 방법을 평가하는 올바른 방법 (있는 경우)은 무엇입니까?

+0

나는 제작 된 코어를 볼 것입니다. 보세요 [여기] (http://stackoverflow.com/questions/6121146/reading-ghc-core) – pdexter

+0

흥미로운 답변. 기록을 위해 아마도 내 질문에 대한 대답은 [ghc-core] (http://hackage.haskell.org/package/ghc-core)에서 찾을 수 있습니다. – fakedrake

+0

그건 훌륭한 도구입니다. – pdexter

답변

4

어셈블리가 너무 낮을 수 있습니다. GHC의 중급 최적화 언어 인 Core를 살펴보고 싶을 것입니다.

기본적으로 GHC는 하스켈을 코어로 변환하고, 다양한 최적화를 수행하며 결국에는 코어를 STG로 변환 한 다음 C로 변환합니다. 그리고 네이티브 코드 생성기 (즉 어셈블리) 또는 LLVM (I 특정 경로에 대해 많이 알지 못한다.)

특히 코어는 상당히 높은 수준이며 하스켈과 다소 유사합니다 (즉, 패턴 일치 및 지연 평가와 같은 추상화를 가짐). 두 개의 프로그램이 동일한 코어를 생성하면 분명히 동일한 기계 코드를 생성합니다.

+0

정확하고 도움이됩니다. 나중에 참조 할 수있는 참고 사항 :'ghc'가 실제로 함수를 컴파일하게하려면 입력 파일 맨 위에'module Test (afmap) where' 행을 추가해야합니다. – fakedrake