Кіріспе
Haskell бағдарламалау тілі үшін компилятор
Глазгоу Haskell компиляторы (GHC) – функционалдық бағдарламалау тілі Haskell үшін түпнұсқа немесе машиналық кодты компилятор. Ол Haskell кодын жазу және тестілеу үшін көп платформалы бағдарламалық ортаны ұсынады және кодты жасау мен орындау процесін оңайлату үшін көптеген кеңейтімдерді, кітапханаларды және оптимизацияларды қолдайды. GHC – ең көп қолданылатын Haskell компиляторы. Бұл BSD лицензиясымен таратылатын тегін және ашық кодты бағдарламалық қамтамасыз ету. Бас дамытушылары – Саймон Пейтон Джонс және Саймон Марлоу.
Тарих
GHC 1989 жылы Глазго университетінде Кевин Хаммондтың Lazy ML (LML) бағдарламасында жазылған прототип ретінде бастама алды. Сол жылы Корделия Холл, Уилл Партен және Саймон Пейтон Джонс оның талдаушысынан басқа, прототипті Haskell тілінде толыққанды қайта жазды. Оның алғашқы бета нұсқасы 1991 жылдың 1 сәуірінде жарық көрді. Келесі нұсқаларға қатаңдық талдаушысы және monadic I/O, өзгертілетін массивтер, қаптамасыз дерек түрлері, бірмезгілді және параллель бағдарламалау үлгілері (мысалы, бағдарламалық транзакциялық жад және деректердің параллельдігі) сияқты тілге қосымша мүмкіндіктер енгізілді, сондай-ақ профильдеу құралы да қосылды. Пейтон Джонс және Марлоу кейін Кембридждегі Microsoft Research-ке көшіп, GHC-ті дамытуға жауапкершілікті жалғастырды. GHC құрамына 300-ден астам басқа да үлес қосушылардың коды кіреді. 2009 жылдан бері GHC-ге үшінші тараптан түсетін үлес Industrial Haskell Group тарапынан қаржыландырылуда.
GHC атаулары
Алғашқы нұсқаларынан бері ресми веб-сайт GHC-ні The Glasgow Haskell Compiler деп көрсетіп келді, ал орындалатын нұсқасының командалық жолында ол The Glorious Glasgow Haskell Compilation System деп танылады. Бұл деректер құжаттамада да көрсетілген. Алғашқыда оның ішкі атауы The Glamorous Glasgow Haskell Compiler болған.
Сәулет
GHC Haskell тілінде жазылған, бірақ бағдарламаларды іске қосу үшін қажетті Haskell-дің орындалу уақыты жүйесі C және C тілдерінде жазылған. GHC-нің алдыңғы бөлігі, лексикалық анализаторды, синтаксистік анализаторды және типтік тексеруді біріктіреді, типтік қорытынды аяқталғанға дейін бастапқы тіл туралы мүмкіндігінше көп ақпаратты сақтауға арналған, соның нәтижесінде пайдаланушыларға нақты қате хабарламаларын беру мақсатында. Типке бағытталған компиляция дәстүрінде GHC-нің оңайластырғышы немесе "ортаңғы бөлігі", GHC-де жүзеге асырылған көптеген оптимизациялар орындалатын жер, Core кодындағы бастапқы кодтың өзара түрлендірулерінің тізбегі ретінде құрылған. Бұл компилятор сатысында жүргізілетін талдаулар мен түрлендірулерге сұраныс талдауы (қатаңдық талдауының жалпыламасы), пайдаланушы анықтаған қайта жазу ережелерін қолдану (GHC стандартты кітапханаларына енгізілген және foldr/build біріктіруін орындайтын ережелер жиынтығы), ашылу (дәстүрлі компиляторларда "инлайнинг" деп аталады), let-айналым, қай функция аргументтерін қораптан шығаруға болатынын анықтайтын талдау, құрастырылған өнім нәтижелерін талдау, жүктемеленген функцияларды мамандандыру және тұрақты есептеу және бета-қысқарту сияқты қарапайым жергілікті түрлендірулер жиынтығы кіреді. Компилятордың артқы бөлігі Core кодын аралық STG тілі ("Spineless Tagless G машинасының қысқартылған атауы") арқылы C-нің ішкі өрнегіне түрлендіреді. C коды үш жолдың біреуін таңдай алады: GCC-мен компиляциялау үшін C коды ретінде басылады, тікелей машиналық кодқа (дәстүрлі "кодты жасау" фазасы) түрлендіріледі немесе LLVM-мен компиляциялау үшін LLVM IR-ге түрлендіріледі. Барлық үш жағдайда да, нәтижедегі машиналық код орындалатын файлды жасау үшін GHC орындалу уақыты жүйесімен байланыстырылады.
GHC's front end, incorporating the lexer, parser and typechecker, is designed to preserve as much information about the source language as possible until after type inference is complete, toward the goal of providing clear error messages to users. In the tradition of type directed compiling, GHC's simplifier, or "middle end", where most of the optimizations implemented in GHC are performed, is structured as a series of source to source transformations on Core code. The analyses and transformations performed in this compiler stage include demand analysis (a generalization of strictness analysis), application of user defined rewrite rules (including a set of rules included in GHC's standard libraries that performs foldr/build fusion), unfolding (called "inlining" in more traditional compilers), let floating, an analysis that determines which function arguments can be unboxed, constructed product result analysis, specialization of overloaded functions, and a set of simpler local transformations such as constant folding and beta reduction. The back end of the compiler transforms Core code into an internal representation of C , via an intermediate language STG (short for "Spineless Tagless G machine"). The C code can then take one of three routes: it is either printed as C code for compilation with GCC, converted directly into native machine code (the traditional "code generation" phase), or converted to LLVM IR for compilation with LLVM. In all three cases, the resultant native code is finally linked against the GHC runtime system to produce an executable.
Тіл
GHC Haskell 98 және Haskell 2010 тілдерінің стандарттарына сай келеді. Ол сонымен қатар Haskell стандартына көптеген қосымша кеңейтімдерді қолдайды: мысалы, бағдарламалық транзакциялық жад (STM) кітапханасы, ол құрастырылатын жад транзакцияларын (Composable Memory Transactions) жүзеге асыруға мүмкіндік береді.
Типтік жүйелер кеңейтулері
Экспрессивті статикалық типтік жүйе – Хаскелдің маңызды ерекшеліктерінің бірі. Сәйкесінше, тілді кеңейту жұмысының көп бөлігі дерек түрлері мен типтік кластарға бағытталған. Глазго Хаскелл компиляторы теориялық System FC негізіндегі кеңейтілген типтік жүйені қолдайды. GHC бірнеше әртүрлі процессор архитектураларына да көшірілді.