8

Kompilatory całego programu, takie jak MLton, tworzą zoptymalizowane pliki binarne, częściowo ze względu na możliwość korzystania z całkowitego źródła binarnego do częściowej oceny: agresywne wpisywanie stałych i ocenianie ich aż do utknięcia - wszystko podczas kompilacji!Częściowa ocena i oddzielna kompilacja GHC

To zostało zbadane publicznego sojusznika trochę w przestrzeni Haskella przez Gabriel Gonzalez's Morte.

Teraz rozumiem, że Haskell nie robi zbyt wiele z tego - jeśli w ogóle. Cytowany rozum, który rozumiem, jest sprzeczny z oddzielną kompilacją. To ma sens, aby zabronić częściowej oceny między granicami plików źródłowych, ale wygląda na to, że nadal możliwa jest ocena cząstkowa w pliku.

O ile mi wiadomo, częściowa ocena w pliku nadal nie jest wykonywana.

Moje pytanie brzmi: czy to prawda? Jeśli tak, jakie są kompromisy w zakresie częściowej oceny w tekście? Jeśli nie, jaki jest przykładowy plik, w którym można poprawić wydajność kompilacji, umieszczając więcej funkcji w tym samym pliku?

(Edytuj: Aby wyjaśnić powyższe, wiem, że jest wiele pytań dotyczących tego, jaki najlepszy zestaw redukcji należy wykonać - wiele z nich jest nierozstrzygalnych! Chciałbym poznać kompromisy dokonane w "sile przemysłowej" "kompilator z osobną kompilacją, która żyje na poziomie powyżej, wybierając odpowiednią teorię równania, jeśli są tam jakieś ciekawe rzeczy do omówienia. Rzeczy takie jak prędkość kompilacji lub nadpisywanie plików są bardziej zbliżone do zakresu, który mnie interesuje. Kolejne pytanie w tym samym przestrzeń może być następująca: "Dlaczego MLton nie może uzyskać osobnej kompilacji tylko przez kompilowanie każdego modułu osobno, pozostawiając interfejs API odsłonięty, a następnie łącząc je wszystkie razem?")

+1

Rzecz o częściowej oceny jest to, że cierpi z powodu problemu stopu. Kiedy decydujesz się przestać częściowo oceniać wyrażenie? Na przykład, weź wyrażenie 'enumFrom 0 :: [Integer]'. Jeśli spróbujesz częściowo ocenić, to twój kompilator nigdy się nie zakończy, co jest bardzo złe. Jednym rozwiązaniem byłoby nie oceniać wyrażeń w słabej normalnej formie głowy. Oznaczałoby to jednak, że niektórych wyrażeń nie można zoptymalizować. Przepisywanie to szybki i brudny sposób na pozbycie się wylesiania pośrednich struktur danych. Plus to się kończy. Problem to poprawność. –

+1

Kompilator Glasgow Haskell wykonuje inlining, chociaż nie agresywnie: http://stackoverflow.com/q/26996110/783743. Wygląda na to, że wiele osób interesuje się agresywnym inliningiem: http://stackoverflow.com/questions/26827663/rewriting-as-a-practical-optimization-technique-in-ghc-is-it-really-ededed . Mój ostatni projekt Bachelor's dotyczy redagowania i częściowej oceny w językach programowania funkcjonalnego. –

+1

Powinienem dodać do pytania, aby było bardziej zrozumiałe.Jestem świadomy, że wiele równości tutaj jest nierozstrzygalnych (i może być gorsze w Haskell niż w ML), ale MLton jest (częściowym) dowodem istnienia, że ​​istnieje pewna redukcja równości, która jest zarówno korzystna, jak i kończąca. Bez zbytniego zbadania, jakie są właściwe redukcje do wykonania, chciałabym zapoznać się z uzasadnieniem ich implementacji w kompilatorze "industrial strength" z osobną kompilacją. –

Odpowiedz

5

Jest to zdecydowanie optymalizacja, że ​​niewielka grupa ludzi jest zainteresowany i dążą. Wyszukiwarka Google, aby znaleźć informacje na jej temat, to "superkompilacja". Sądzę, że w tej chwili są co najmniej dwa podejścia.

Wygląda na to, że jedną z wielkich kompilacji są zasoby czasu kompilacji (czas i pamięć), a obecnie wydajność wygrywania tych kosztów wydaje się być nieco nieprzewidywalna. Zostało jeszcze trochę pracy. Kilka linków: