2016-06-20 11 views
4

Eine allgemeine Praxis in der C-Welt, zwei Fragmets von C zu vergleichen, ist zu sehen, welche Assembly sie erzeugen. Ich wollte wissen, welcher Code GHC im Fall erzeugen würde:Vergleichen Sie generierten Code in ghc

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

und

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

Also habe ich versucht:

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

Welche (wenig überraschend) ergab mehr oder weniger unlesbaren Code .

Was ist der richtige Weg (wenn überhaupt) zu bewerten, wie ghc Code optimiert?

+0

Ich würde den produzierten Kern betrachten. Werfen Sie einen Blick [hier] (http://stackoverflow.com/questions/6121146/reading-ghc-core) – pdexter

+0

Interessante Antworten. Für die Aufzeichnung, wahrscheinlich ist die Antwort auf meine Frage in [ghc-core] (http://hackage.haskell.org/package/ghc-core) zu finden. – fakedrake

+0

Das ist ein großartiges Werkzeug – pdexter

Antwort

4

Die Baugruppe ist wahrscheinlich ein bisschen zu niedrig. Wahrscheinlich möchten Sie sich Core, die GHC-Optimierungssprache, ansehen.

Im Wesentlichen übersetzt GHC Haskell zu Core, führt eine Vielzahl von Optimierungen durch und verwandelt schließlich Core in STG und dann in C-- und den nativen Codegenerator (dh Assembly) oder über LLVM (I weiß nicht viel über diesen bestimmten Weg).

Insbesondere Core ist immer noch ziemlich hoch und etwas ähnlich wie Haskell (d. H. Es hat ähnliche Abstraktionen wie Muster-Matching und Lazy-Evaluierung). Wenn zwei Programme denselben Core erzeugen, erzeugen sie offensichtlich den gleichen Maschinencode.

+0

Das ist richtig und hilfreich. Eine Randnotiz für zukünftige Referenz: man muss die Zeile 'modul Test (afmap) wo 'oben in der Eingabedatei hinzufügen, damit' ghc' die Funktion tatsächlich kompiliert. – fakedrake