Odczytywanie rdzenia GHC

193

Rdzeń jest językiem pośrednim GHC. Czytanie rdzenia może pomóc ci lepiej zrozumieć wydajność twojego programu. Ktoś poprosił mnie o dokumentację lub samouczki na temat czytania rdzenia, ale nie mogłem wiele znaleźć.

Jaka dokumentacja jest dostępna do odczytu GHC Core?

Oto, co znalazłem do tej pory:

Tibbe
źródło
Zobacz także stackoverflow.com/questions/6048194/…
Don Stewart
przydatne mogą być również umiejętnościmatter.com/skillscasts/… .
Erik Kaplun,

Odpowiedzi:

272

GHC Core to język System FC , na który przetłumaczono wszystkie Haskell. (Przybliżona) gramatyka rdzenia jest podawana przez:

wprowadź opis zdjęcia tutaj

Rdzeń jest ściśle związana z prostszą i bardziej znanego systemu F . Wszystkie transformacje, które GHC wykonuje na poziomie podstawowym są refaktoryzacjami typu tej reprezentacji rdzenia, aby poprawić wydajność. I, nie tak dobrze znane, możesz pisać bezpośrednio w Core do programu GHC.

GHC Core pasuje do potoku kompilatora (tak jak w 2002 r., Sans-LLVM i CMM):

wprowadź opis zdjęcia tutaj

Podstawowymi dokumentami do poznania GHC Core są:

Powiązany materiał, który może pomóc w zrozumieniu:

  • Wyjście GHC -fext rdzeń
  • Dużo czasu poświęciłem na naukę rdzenia, czytając źródło GHC. Niektóre są opisane w mojej pracy licencjackiej z 2002 roku, od strony 16.
  • Od używania narzędzia ghc-core do generowania rdzenia w formacie, który mi się podoba.

Rdzeń z kolei jest tłumaczony na kod STG, który wygląda mniej więcej tak:

wprowadź opis zdjęcia tutaj

Śmieszne imiona w Core są zakodowane w „kodowaniu Z”:

wprowadź opis zdjęcia tutaj

Rodzaje i rodzaje GHC Core (z pracy Tolmacha):

wprowadź opis zdjęcia tutaj

Wreszcie, startery GHC pojawiają się regularnie w wynikach GHC Core, gdy zoptymalizujesz swój Haskell do podstawowych instrukcji, o których wie GHC. Zestaw pierwotny jest podany jako zestaw podstawowych funkcji we wstępnie przetworzonym pliku.

Don Stewart
źródło
61
Każda udzielona odpowiedź jest zawsze absurdalnie kompletna. Oddaj kolejne głosowanie i utrzymaj je; Opieram się o kupę.
Robert Massaioli
3
Ilość dokumentacji CC-wiki wydanej przez Dona i ogólną społeczność Haskell za pośrednictwem SO jest oszałamiająca. Trzymajcie dobre Q i A, wszyscy!
Dan Burton
4
Wiem, że o tym wspomniano, ale myślę, że w odpowiedzi należy podkreślić użyteczność rdzenia ghc .
Nikita Volkov
24

Wskazówka: jeśli nie zależy Ci na adnotacjach i koercjach, korzystaj -ddump-simplz -dsuppress-allopcji. Wyjście rdzenia powinno być znacznie bardziej czytelne.

nominolo
źródło
5
-dsuppress-alljest naprawdę przydatne. Możesz także użyć, -dsuppress-coercionsjeśli chcesz pozbyć się rzutów (przydatne, gdy jest wiele nowych typów).
tibbe
8

Chociaż nie jest to dokładnie język GHC Core, jak wspomina Don, język STG jest dość podobny. Niedawno przeszedłem ćwiczenie sprawdzania bezpieczeństwa typu języka STG + maszyny, a potem odkryłem, że mogę łatwo zrozumieć Core.

Tekst, którego nauczyłem się STG, jest dość dostępny: Implementacja leniwych języków funkcjonalnych na standardowym sprzęcie: Bezobrotowa maszyna Tagless G autorstwa Simona Peytona-Jonesa. Znaczna część artykułu dotyczy szczegółów implementacji, ale zalecam sekcję 4, w szczególności jako ogólne wyjaśnienie języka STG, które daje motywację do niektórych sprzecznych z intuicją decyzji projektowych i dostarcza tłumaczenia podobnych przykładów map.

acfoltzer
źródło
STG jest znacznie niższym poziomem niż Core. Rurociąg kompilacji to: Haskell -> Rdzeń -> STG -> C-- -> Kod maszynowy
Akangka
3

„Zewnętrzna reprezentacja języka podstawowego GHC” to dokument, który można znaleźć w instalacji ghc ( share/doc/ghc/core.pdf) lub w Internecie .

Roman Cheplyaka
źródło