2016-06-20 6 views
4

Общепринятая практика в мире C для сравнения двух фрагментов C - это увидеть, какую сборку они создают. Я хотел бы знать, какой код GHC будет генерировать в случае:Сравнение сгенерированного кода в 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 оптимизирует код?

+0

Я бы посмотрел на произведенное ядро. Взгляните [здесь] (http://stackoverflow.com/questions/6121146/reading-ghc-core) – pdexter

+0

Интересные ответы. Для записи, вероятно, ответ на мой вопрос можно найти в [ghc-core] (http://hackage.haskell.org/package/ghc-core). – fakedrake

+0

Это отличный инструмент – pdexter

ответ

4

Сборка, вероятно, слишком низкоуровневая. Вероятно, вы захотите взглянуть на промежуточный язык оптимизации Core, GHC.

По существу, GHC переводит Haskell на Core, выполняет ли на нем широкий спектр оптимизаций и в конечном итоге преобразует Core в STG, а затем в C - и генератор собственного кода (т.е. сборку) или через LLVM (I не знаю много об этом конкретном пути).

В частности, Core по-прежнему достаточно высокоуровневый и несколько похож на Haskell (т. Е. Имеет аналогичные абстракции, такие как сопоставление образцов и ленивая оценка). Если две программы производят один и тот же Core, то, очевидно, они производят один и тот же машинный код.

+0

Это правильно и полезно. Замечание для дальнейшего использования: нужно добавить строку 'module Test (afmap), где' наверху входного файла, чтобы 'ghc' фактически скомпилировал эту функцию. – fakedrake