هاسكل (لغة برمجة)

تاريخ اللغة

عقب إصدار لغة البرمجة ميريندا في عام 1985 بواسطة شركة برمجيات البحوث المحدودة (Research Software Ltd، زاد الاهتمام بلغات البرمجة الوظيفية الكسولة: بحلول عام 1987 زاد عدد لغات البرمجة الوظيفية الصرفة بشكل كبير. من بين هذه اللغات كانت ميراندا الأكثر استخداماً ولكنها لم تكن خاضعة للملكية العامة. لذلك في مؤتمر اللغات البرمجية الوظيفية وعمارة الحاسوب (FPCA 87) والذي تم عقده في بورتلاند اوريجون، تم عقد اجتماع أعرب فيه المشاركون بالإجماع على ضرورة تشكيل لجنة لتعمل على تحديد معايير مفتوحة لهذه اللغات. وكانت اللجنة تهدف إلى دمج اللغات الوظيفية الموجودة في ذلك الوقت في لغة واحدة عامة لتكون أساس للأبحاث المستقبلية في تصميمات اللغات الوظيفية.

هاسكل 1.0

ظهر الإصدار الأول من هاسكل ("هاسكل 1.0") في عام 1990. ونتج عن مجهودات اللجنة مجموعة من التعريفات اللغوية.

هاسكل 98

في أواخر عام 1997، توجت سلسلة هاسكل بـ هاسكل98، وكان يهدف الي تحديد إصدار ثابت، وبسيط، ومحمول ومزود بمكتبة قياسية للتدريس، وليكون قاعدة للتوسعات المستقبلية.
وقد رحبت اللجنة بإنشاء الإضافات والبدائل لهاسكل 98 عن طريق إضافة ودمج الخصائص التجريبية.
في فبراير من عام 1999 أعلنت النسخة القياسية من لغة هاسكل 98 في أول الأمر تحت اسم " تقرير هاسكل 98 ""The Haskell 98 Report. وفي يناير من عام 2003 تم إصدار نسخة مُعدلة تحت اسم " هاسكل98 لغة ومكتبات: التقرير المُعدَل""Haskell 98 Language and Libraries: The Revised Report. وواصلت لغة هاسكل تطورها بشكل سريع، وذلك مع تنفيذ المترجم غلاسكو هاسكل (GHC) الذي يعتبر القياسي حاليا.

هاسكل برايم

في مطلع عام 2006 بدأت عملية إنشاء نسخة تخلُف الإصدار "هاسكل98 الأساسي" الدارج باسم "هاسكل" وأطلق على هذه النسخة اسم ("هاسكل برايم"). وهي تعتبر عملية متطورة ومستمرة لتعديل تعريفات اللغة وذلك لإنتاج نسخة معدلة جديدة سنوياً. وتم الإعلان عن أول نسخة مُعدلة في نوفمبر من عام 2009 وسميت بـ "هاسكل 2010".

هاسكل 2010

تضيف هاسكل 2010 الواجهة البينية الوظيفية الخارجية (FFI) إلى لغة هاسكل، مما يسمح بربطها بلغات برمجة أخرى، وتثبيت بعض القواعد اللغوية (تغييرات في القواعد الشكلية)، وحظر ما يسمى بنماذج 
" n-plus-k"، أي تعريفات للصيغة " fak (n+1) = (n+1) * fak n " لم تعد مسموحة. 
ويقدم هذا الإصدار إمكانية تمديد الجمل في اللغة والتي تسمح بتعيين مصدر لهاسكل مثل هاسكل2010 أو تتطلب امتدادات محددة للغة هاسكل. وأسماء الامتدادات المقدمة في هاسكل2010 هي:
DoAndIfThenElse، HierarchicalModules، EmptyDataDeclarations، FixityResolution، ForeignFunctionInterface، LineCommentSyntax، PatternGuards، RelaxDependencyAnalysis، LanguagePragma، NoNPlusKPatterns

أمثلة للأكواد

البرنامج التالي هو " هاللو ورلد " وهو مكتوب بلغة هاسكل (لاحظ أنه يمكن حذف جميع الخطوط ماعدا الخط الأخير).
module Main wheremain :: IO ()main = putStrLn "Hello, World!"
هاهو العاملي الرياضي مشروحا بستة طرق مختلفة:
-- typefactorial :: Integer -> Integer-- using recursionfactorial 0 = 1factorial n = n * factorial (n - 1)-- using listsfactorial n = product [1..n]-- using recursion but written without pattern matchingfactorial n = if n> 0 then n * factorial (n-1) else 1-- using foldfactorial n = foldl (*) 1 [1..n]-- using only prefix notation and n+k-patterns (no longer allowed in Haskell 2010)factorial 0 = 1factorial (n+1) = (*) (n+1) (factorial n)-- Point-free stylefactorial = foldr (*) 1. enumFromTo 1
وهذا تطبيق فعال لأرقام فيبوتاتشي، كقائمة لا نهائية:
-- Point-free stylefib :: Int -> Integerfib = (fibs !!)
       where fibs = 0 : scanl (+) 1 fibs-- Explicitfib :: Int -> Integerfib n = fibs !! n
        where fibs = 0 : scanl (+) 1 fibs-- with a similar idea, using zipWithfib :: Int -> Integerfib n = fibs !! n
        where fibs = 0 : 1 : zipWith (+) fibs (tail fibs)-- Using an extra parameterfib :: Int -> Integerfib n = (fibs 0 1) !! n
        where fibs a b = a : fibs b (a+b)
تشير الكتابة "Int" إلى عدد صحيح (machine-sized) (تستخدم كقائمة رموز سفلية مع المُعامل !!)، بينما "عدد صحيح" هو عدد صحيح ذو دقة تامة. وعلي سبيل المثال، فالكود الموجود بالأعلي يحسب سريعا "fib10000" كعدد من 2090-رقم.

تطبيقات

يتزايد استخدام هاسكل في الاستخدامات التجارية. قامت المُبرمجة أودري تانج بعمل تطبيق من أجل بيرل 6 المنتظر طويلا يسمى Pugsوهو عبارة عن مترجم ومفسر أثبت أهميته بعد أشهر قليلة فقط من كتابته؛ وبالمثل المترجم جلاسجو الذي دائما ما يستخدم كمُختبِر لخصائص وتحسينات البرمجة الوظيفية المتقدمة. داركس Darcs هو نظام مراجعة وتحكم تمت كتابته بلغة هاسكل، ويتميز بخصائص مبتكرة عديدة. كما اختارت لينسبير جنو/ لينكس Linspire GNU/Linux هاسكل لتطوير أدوات النظام. وكذلك اكس موناد Xmonad وهو نظام مدير النوافذ لنظام النوافذ إكس، مكتوبة بلغة هاسكل بالكامل.
نظام بلوسبك فيرلوج عبارة عن لغة لتصميم شبه موصل وهي امتداد للغة هاسكل.
كما ان أداوت شركة بلوسبك تم تطبيقها في لغة هاسكل. كريبتول Cryptol هي عبارة عن لغة وسلسلة من الأدوات المستخدمة لتطوير وتدقيق الأكواد الحسابية، ويتم تطبيقه في لغة هاسكل. والنوية (microkernel) أول موثق رسميا وسيل4 الذي تم تدقيقه باستخدام هاسكل.

النقد

في عامي 2002 و2003 ناقش كلاً من جان ويليام مايسن وسيمون بيتون جونز المشكلات المرتبطة بالتقييم الكسول مع إقرار الدافع النظري له، بالإضافة إلى اعتبارات الممارسة الصرفية مثل الأداء المُحسن. كما لاحظوا انه عند إضافة بعض التحسينات لرفع الأداء، فإن الكسل يزيد الأمر صعوبة علي المبرمجين لتقييم أداء أكوادهم (وخاصة استخدام مساحاتها).
في عام 2003 لاحظ كل من: باستيات هيران ودان ليين وأريان فان إيزيندورن وجود بعض العوائق أمام دارسي لغة هاسكل، فقد لوحظ أن نظام الكتابة المعقد والقواعد اللغوية الدقيقة لهاسكل هي سلاح ذو حدين، فهو محل تقدير كبير من قِبل المبرمجين ذوي الخبرة بينما هو مصدر إحباط للمبتدئين، نظرا لأن عمومية تطبيقات هاسكل تؤدي إلى رسائل خطأ مُبهمة. ولمعالجة تلك المسائل، قام باحثون من جامعة اُوتريخت بتطوير مترجم متقدم يسمي هيليوم والذي يقوم بتحسين استقبال المستخدمين لرسائل الخطأ عن طريق الحد من عمومية بعض خصائص هاسكل، وبالتحديد إزالة دعمها لفئات الكتابة.
قام بِن ليبميير بتصميم التابع كقيمة فرضية دقيقة (تطبيق كسول من خلال ملحقات واضحة) وهو من لهجات هاسكل التي تدعم نظام الكتابة والتأثير، وقد صُمم لمعالجة صعوبات هاسكل في التفكير بشأن التقييم الكسول وفي استخدام بنيات البيانات التقليدية مثل المصفوفات المتغيرة. لقد حاول ليبميير (ص: 20) أن يبرهن علي أن "التحديث المُدمر يُزود المبرمجين بإثنتين من الأدوات الهامة والقوية... الأولى هي مجموعة بنيات البيانات الفعالة مثل المصفوفات من أجل إدارة مجموعة من الكائنات... والثانية هي إمكانية بث قيمة جديدة لجميع أجزاء برنامج ما مع أدني عبء علي المبرمج."