کامپایلر گلاسکو هسکل

**کامپایلر گلاسکو هسکل** (**GHC**) یک کامپایلر کد منبع باز برای زبان برنامه‌نویسی کاربردی هسکل است. این یک محیط بین پلتفرمی برای نوشتن و آزمایش کد Haskell فراهم می‌کند و از پسوندها، کتابخانه‌ها و بهینه‌سازی‌های متعددی که روند تولید و اجرای کد را ساده می‌کند پشتیبانی می‌کند. GHC متداول‌ترین کامپایلر Haskell است. توسعه دهندگان اصلی Simon Peyton Jones و Simon Marlow هستند.

## تاریخچه
GHC در اصل در سال ۱۹۸۹ به عنوان نمونه اولیه، که توسط کوین هاموند در دانشگاه گلاسگو به زبان (LML (Lazy ML نوشته شده‌است، شروع به کار کرد. در اواخر همان سال، نمونه اولیه به‌طور کامل--به جز تجزیه کننده آن--توسط کوردلیا هال، ویل پارتین و سیمون پیتون جونز در Haskell بازنویسی شد. اولین نسخه آزمایشی آن در تاریخ ۱ آوریل ۱۹۹۱ بود و نسخه‌های بعدی یک تجزیه و تحلیل سختگیری و همچنین برنامه‌های افزودنی زبانی مانند ورودی و خروجی monadic، آرایه‌های قابل تغییر، انواع داده‌های واضح و مشخص، مدل‌های برنامه‌نویسی همزمان و موازی (مانند حافظه معاملاتی نرم‌افزار و موازی سازی داده‌ها) و یک پروفایل را به آن اضافه کردند.

پیتون جونز و همچنین مارلو بعداً به مایکروسافت در کمبریج انگلستان نقل مکان کردند و در آنجا همچنان مسئول اصلی تولید GHC بودند. GHC همچنین حاوی کدی از بیش از سیصد نفر دیگر از مشارکت کنندگان است. از سال ۲۰۰۹، کمک‌های شخص ثالث به GHC توسط گروه صنعتی هاسکل تأمین می‌شود.

## معماری
GHC خود به زبان Haskell نوشته شده‌است، اما سیستم زمان اجرا برای Haskell که برای اجرای برنامه‌ها ضروری است، با C و C++نوشته شده‌است.

ظاهرGHC -incorporating lexer، تجزیه کننده و typechecker طراحی شده‌است تا حد ممکن اطلاعات زیادی در مورد زبان مبدأ را تا بعد کامل شدن استنتاج نوع حفظ کند، تا به هدف ارائه پیام‌های خطا روشن به کاربران دست یابد. پس از بررسی نوع، کد Haskell به یک زبان typed :نمایش میانیمعروف به "Core" (براساس سیستم F، با عبارت `let` و `case`) تقلیل داده می‌شود. اخیراً Core برای پشتیبانی از انواع داده‌های جبری تعمیم یافته در سیستم نوع خود توسعه یافته‌است و اکنون براساس پسوند سیستم F معروف به System F C است.

در سنت کامپایل کردن بر حسب نوع، ساده‌ساز GHC یا "انتهای میانی"، که بیشتر بهینه‌سازی‌های پیاده‌سازی شده در GHC آنجا انجام می‌شود، به عنوان یک سری از تبدیلات منبع به منبع در کد هسته تشکیل شده‌است. تجزیه و تحلیل و تحولات انجام شده در این مرحله کامپایلر شامل تجزیه و تحلیل تقاضا (کلی سازی تجزیه و تحلیل سختگیری)، استفاده از قوانین بازنویسی تعریف شده توسط کاربر (شامل مجموعه ای از قوانین موجود در کتابخانه‌های استاندارد GHC که ترکیب فولدر / ساخت را انجام می‌دهد)، باز کردن (موسوم به " inlining "در کامپایلرهای سنتی تر)، let-floating، تحلیلی که تعیین می‌کند کدام استدلال‌های عملکرد را می‌توان واضح ساخت، تجزیه و تحلیل نتیجه محصول ساخته شده، تخصصی کردن توابع overloaded، و همچنین مجموعه ای از تحولات محلی ساده‌تر مانند ثابت مقدار دادن و کاهش بتا.

ابک اند کامپایلر از طریق یک زبان میانی STG (یعنی "Spineless Tagless G-machine") کد هسته را به نمایش داخلی C++ تبدیل می‌کند. سپس کد C++ می‌تواند یکی از سه مسیر را طی کند: یا به عنوان کد C برای تدوین با GCC چاپ می‌شود، مستقیماً به کد ماشین اصلی (مرحله سنتی " تولید کد ") تبدیل می‌شود، یا با LLVM برای تدوین به کد ماشین مجازی LLVM تبدیل می‌شود. در هر سه حالت، کد زبان اصلی حاصل در نهایت با سیستم زمان اجرا GHC پیوند داده می‌شود تا یک سیستم اجرایی تولید کند.

## زبان
GHC با استانداردهای زبان، هم *Haskell 98* و هم *Haskell 2010* مطابقت دارد. این برنامه همچنین از بسیاری از برنامه‌های افزودنی اختیاری با استاندارد Haskell پشتیبانی می‌کند: برای مثال، کتابخانه حافظه تراکنش نرم‌افزاری (STM)، که امکان انجام معاملات حافظه ترکیبی را فراهم می‌کند.

### برنامه‌های افزودنی به Haskell
تعدادی از الحاقات به هاسکل پیشنهاد شده‌است. این پسوندها ویژگی‌هایی را ارائه می‌دهند که در مشخصات زبان توصیف نشده‌اند، یا ساختارهای موجود را دوباره تعریف می‌کنند. به همین ترتیب، هر برنامه افزودنی ممکن است توسط همه پیاده‌سازی‌های Haskell پشتیبانی نشود. تلاش مستمر برای توصیف برنامهٔ افزودنی و انتخاب مواردی که در نسخه‌های بعدی مشخصات زبان گنجانده شود در حال انجام است.

پسوندهای پشتیبانی شده توسط Glasgow Haskell Compiler شامل موارد زیر است:
* انواع و عملیات مشخص: اینها نوع داده‌های ابتدایی سخت‌افزارهای زیربنایی را نشان می‌دهند، بدون اینکه یک اشاره گر به پشته یا احتمال ارزیابی به تعویق انداخته شود. کدهای عددی پیچیده با استفاده از این نوع کد می‌تواند به‌طور قابل توجهی سریعتر باشد.
* توانایی تعیین دقیق ارزیابی برای یک مقدار، الگوی الزام‌آور یا نوع داده.
* نحو راحت تر برای کار با ماژول‌ها، الگوها، لیست‌ها، اپراتورها، سوابق و tuples.
* سینتکس آسان برای محاسبه با فلش و تعریف ارزش‌های یکه تعریف شده به صورت بازگشتی. هر دوی این مفاهیم مفهوم do قدیمی در Haskell استاندارد ارائه شده گسترش می‌دهند.
* یک سیستم کاملاً قدرتمندتر از انواع و کلاسهای تایپ، که در زیر شرح داده شده‌است.
**
**
* ث

## جستارهای وابسته
## منابع

رده:نرم‌افزارهایی که از پروانه بی‌اس‌دی استفاده می‌کنند
رده:تاریخ رایانش در بریتانیا
رده:کامپایلرها و مفسرهای آزاد
رده:نرم‌افزارهای آزاد چندسکویی
رده:دانشگاه گلاسگو