Как работи компилаторът на Haskell?

Къде мога да намеря хартия/документация/каквото и да е, което описва как всъщност работи компилатор на Haskell? Прочетох доста от документите на GHC, но спрях, след като получих главоболие. Така че би било за предпочитане нещо, което не изисква докторска степен, за да го разберете и не е написано в стила, който трябва да сте-вече-запознат-с-това. Не е проблем, ако е наистина дълго и отнема известно време, за да го разберете.

PS: Най-интересно би било нещо за GHC, но всичко е ок.


person fuz    schedule 08.12.2010    source източник
comment
Страхотен въпрос. Бих искал да знам по-специално дали се използва CPS трансформация по схема или не. Силно вярвам, че това е начинът за прилагане на функционални езици, но може да пренебрегвам трудностите.   -  person Alexandre C.    schedule 08.12.2010
comment
Ако искате да разберете какво е CPS, отличната lambda the ultimate goto paper от автора на схемата е чудесно четиво.   -  person Alexandre C.    schedule 08.12.2010
comment
Не е точно това, което питате, но бих препоръчал да разгледате компилатори, различни от GHC, за да започнете. Източникът на JHC е изключително четим и UHC кодът има много добра теоретична документация; всяко от тях би било по-лесно от GHC.   -  person John L    schedule 08.12.2010
comment
@John: Добра точка, вече опитах, но открих, че си напълно изгубен, щом не разбираш наистина какво се опитва да направи програмистът.   -  person fuz    schedule 08.12.2010
comment
@Alexandre C. Къде мога да го взема?   -  person fuz    schedule 08.12.2010
comment
@FUZxxi: дори не опитахте с Google, нали?   -  person Alexandre C.    schedule 08.12.2010
comment
@Alexandre C: Що се отнася до самия въпрос, аз го направих. Но не и за твоя коментар. Вероятно трябва да го направя.   -  person fuz    schedule 09.12.2010
comment
На въпроса беше отговорено, но не и коментари. За да изясня истината: не, @AlexandreC, CPS трансформация не е включена, вместо това се използва ламбда повдигане за трансформиране на програмата в набор от суперкомбинатори, за да стане възможно намаляването на компилираната графика. Възможно е да се твърди, че има еквивалентност между CPS и STG. А Scheme днес се счита за императивен език. Не е необходима предварителна докторска степен, но пълният отговор на въпроса е повече работа, отколкото докторска степен (но не оригинална).   -  person migle    schedule 27.11.2015
comment
Една от най-добрите статии по тази тема, които съм чел, е: The Glasgow Haskell Compiler от Simon Marlow и Simon Peyton-Jones. Архитектурата на приложенията с отворен код. aosabook.org/en/ghc.html   -  person The_Ghost    schedule 13.06.2019


Отговори (6)


Можете да получите отговор от устата на коня! Саймън Пейтън Джоунс (магьосник на GHC) написа книга, обясняваща как да внедрим функционални езици за програмиране. Предлага се безплатно онлайн, тъй като вече е изчерпано: http://research.microsoft.com/en-us/um/people/simonpj/papers/pj-lester-book/

Разбира се, GHC се е развил след написването на книгата, но все още е много актуален.

person Max Bolingbroke    schedule 08.12.2010
comment
И не забравяйте документа за stg - внедряване на мързеливи функционални езици на стоков хардуер: research.microsoft.com/apps/pubs/default.aspx?id=67083 - person sclv; 09.12.2010
comment
И видеоклиповете, свързани в уикито на разработчиците на GHC. - person Simon Michael; 09.12.2010

Търсите ли подробности особено за компилирането на мързелива оценка? Има книгата на Саймън Пейтън-Джоунс, спомената от Макс Болингброк, също и книгата, описваща изпълнението на Clean, е онлайн:

http://wiki.clean.cs.ru.nl/Functional_Programming_and_Parallel_Graph_Rewriting

Ако сте член на университет и искате нещо по-малко, можете да опитате да вземете тези книги (Henderson & Diller със сигурност са изчерпани):

Антони Дилер „Компилиране на функционални езици“ ISBN 0 471 92027 4

Питър Хендерсън „Приложение и внедряване на функционално програмиране“ ISBN 0-13-331579-7

AJT Davie „Въведение в системите за функционално програмиране, използващи Haskell“ ISBN 0 521 27724 8

Diller има пълен компилатор за мързелив език (имплементиран в Pascal) чрез намаляване на комбинатора. Това беше техниката за внедряване, изобретена от Дейвид Търнър за SASL. Хендерсън има много части от компилатор за LISPkit, миниатюрен, мързелив вариант на Lisp. Дейви описва доста детайли от машината за компилиране на мързелив език, например има описание на STG, което е много по-кратко от книгата на Саймън Пейтън-Джоунс (STG е абстрактната машина SPJ, използвана за Haskell).

Разработчиците на Clean имат доста информация за прилагането на SAPL (прост приложен език), ако прегледате списъка им с публикации:

https://clean.cs.ru.nl/Publications

И накрая, има доста документи, документиращи аспекти на Utrecht Haskell Compiler UHC (и EHC). Мисля, че по-голямата част от информацията е как е организиран компилаторът (с граматики на атрибути и „разбъркване“) и как се изпълняват системите от типове (има различни нива на система от типове в EHC), а не как „компилацията“ в задния край върши работа.

person stephen tetley    schedule 08.12.2010

Компилаторите са огромна тема и би било невъзможно да ги обясним изцяло тук. Но ето общ преглед за общ компилатор. Надяваме се, че това ще ви даде известно разбиране, което може да направи четенето на неща конкретно за GHC малко по-лесно за разбиране.

Компилаторите обикновено работят чрез поредица от трансформации в 2 части, предната и задната част.

Първата трансформация е превръщането на обикновен текст в нещо малко по-лесно за преминаване. Самото това обикновено се разделя на 2 части:

Лексикален анализ или токенизация - Актът на трансформиране на обикновен текст в малки части (обикновено оператори, идентификатори, литерали и т.н.).

Синтактичен анализ или синтактичен анализ - Превръщане на тези малки парчета в дървовидна структура. (обикновено AST, абстрактно синтактично дърво)

Следващият етап е семантичен анализ. На този етап компилаторът обикновено добавя информация към AST (като информация за типа) и изгражда таблица със символи. Това завършва предния край.

Следващата трансформация трансформира AST в IR, междинно представяне. В днешно време това обикновено е формуляр на SSA, единично статично присвояване.

След това това се оптимизира чрез постоянно разпространение, анализ на мъртъв код, векторизация и т.н.

Последната трансформация е генериране на код. Трансформиране на IR в машинен код. Това може да бъде много сложно. Понякога се нарича и понижаване.

За повече информация препоръчвам тази страница в wikipedia.

person dan_waterworth    schedule 08.12.2010
comment

как да се уверя, че при дадена заявка получавам резултати само като уеб страници (т.е. .html, .htm), а не други формати (т.е. pdf, ppt, doc)

- person fuz; 08.12.2010

За съжаление, подозирам, че това, което търсите, не съществува. Теорията на компилатора и теорията на формалния език са разумно сложни теми в компютърните науки и Haskell в никакъв случай не е отправна точка.

Първо, вероятно трябва да получите добра основа в:

Подозирам, че всичко, което обяснява каквото и да било за вътрешността на Haskell, ще изисква значително по-добро разбиране на горните теми, отколкото, да кажем, C.

Досега съм преминал само един курс по темата, така че нямам официална литература, която да препоръчам, но съм сигурен, че има много добри източници.

person Jamie Wong    schedule 08.12.2010
comment
Предполагам, че си прав. Просто искам да разбера какво става там. IMHO е по-лесно да разберете какво прави вашата програма, ако всъщност знаете как се компилира. - person fuz; 08.12.2010
comment
Вашият отговор не е много полезен. Haskell е толкова различен от основните езици. - person Wei Hu; 08.12.2010
comment
@FUZxxl, съчувствам на твоята гледна точка; с процедурните езици това е до голяма степен случаят и особено нещо като C. Въпреки това с Haskell разстоянието от език до машина е много по-голямо, така че прекарвате много повече време в мислене от гледна точка на езиковия модел. Единственият път, когато това не е вярно, е когато мислим за ефективност. Разбирането на целия компилатор обаче не е от голяма полза. Научете за thunks, анализа на строгост и междинния код, излъчван от GHC. - person Paul Johnson; 09.12.2010
comment
@Paul Johnson Не са ли thunks, анализът на строгост и междинният код една от основните части на компилатора? Вероятно трябва да поискам това, вместо за самия звяр. - person fuz; 09.12.2010
comment
Имам предвид, че трябва да научите концепциите, а не алгоритмите. Нещо като начинът да разбереш квадратните корени е да разбереш, че sqrt(x)^2=x, а не като четеш за Нютон-Рафсън - person Paul Johnson; 20.12.2010

Wikipedia има добър - четим - преглед на вътрешността на GHC (подобно на обяснението на @dan_waterworth, но специфично за Haskell и GHC):

http://en.wikipedia.org/wiki/Glasgow_Haskell_Compiler#Architecture

person amindfv    schedule 18.05.2011

Една от най-добрите статии по тази тема, които съм чел, е:

person The_Ghost    schedule 13.06.2019
comment
На този сайт не се препоръчват отговори само с връзка. Ако просто искате да посочите ресурс, моля, направете коментар вместо това. - person fuz; 13.06.2019
comment
Добре, извинявай! Просто исках да помогна с добра статия по този въпрос. Току-що добавих коментар със съдържанието на този отговор. - person The_Ghost; 13.06.2019
comment
Готино! Благодаря Ви за съдействието. - person fuz; 13.06.2019