هسکل (زبان برنامه‌نویسی)

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو

هسکل (به انگلیسی: Haskell) یک زبان برنامه نویسی تابعی خالص و کارآمد با معانی ساده می‌باشد که به نام منطق دانی به نام هسکل کاری نام گذاری شده است.

اهداف این زبان به شرح زیر می‌باشد:

  • هسکل یک زبان برنامه نویسی پیشرفتهٔ کاملاً کارآمد و یک محصول متن باز است که حاصل بیش از بیست سال پیشرفت و تحقیق می‌باشد که اجازهٔ توسعه سریع و پیاپی سالم و مختصر و صحیح نرم‌افزار را می‌دهد با پشتیبانی قوی از یکپارچه سازی با سایر زبان‌ها، همزمانی داخلی ساختمانی و موازی کار کردن و پیدا کردن باگ‌ها در سورس برنامه و پروفایلر و کتابخانهٔ غنی و ساخت نرم‌افزار قابل انعطاف و قابل نگهداری با کیفیت بالا را ساده می‌کند.

تاریخچه[ویرایش]

پس از عرضهٔ زبان برنامه نویسی میراندا توسط شرکت انگلیسی Research Software Ltd در سال ۱۹۸۵ علاقه به زبان‌های اصلی کند افزایش پیدا کرد. در سال ۱۹۸۵ بیش از دو زبان برنامه نویسی خالص و کارآمد با معانی ساده وجود داشت. بین این زبان نشستی بر‌گزار شد که در طی آن شرکت کننده‌ها به توافق قطعی رسیدند که یک کمیته باید شکل بگیرد که وظیفهٔ آن تعریف استانداردهای بازی برای زبان‌های این چنینی باشد این کار با هدف صریح یکی کردن زبان‌های موجود به یک زبان مشترک به کار می‌رود، به منظور ایجاد پایه‌ای تحقیقات آیندگان در طراحی زبان انجام شد اولین نسخهٔ زبان در سال ۱۹۹۰ نتیجهٔ تلاش‌های کمیته در سری تعاریف زبان در اواخر ۱۹۹۸ به حد اعلی رسید، که بر آن بود که یک نسخهٔ زبان پایدار، کوچک و قابل حمل که یک کتابخانه استاندارد برای تدریس ضمیمه آن بود و همچنین پایه‌ای برای تکامل‌ها در آینده باشد، را تعیین کند کمیته صریحاً از به وجود آمدن تکامل‌های اضافی و مغایر با از راه اضافه کردن و بهم پیوستن طرح‌های تجربی استقبال کرد.

در ژانویهٔ ۱۹۹۹ استانداردهای زبان به صورت نسخهٔ معتبر و اصلی با نام Haskell 98 Language and Libraries: The Revised Report منتشر شد یک نسخهٔ اصلاح شده با نام منتشر شد به خاطر پیاده‌سازی استاندارد حال حاضر را به نمایش می‌گذارد، این زبان به نمو پیاپی خود ادامه می‌دهد در اوایل سال فرایند تعریف کردن جانشین برای نسخهٔ استاندارد که به طور غیر رسمی نام گرفته است، شروع شده است این فرایند اقدام به ساخت نسخهٔ فرعی کرده است تکامل‌ها و خصیصه‌ها خصیصهٔ بارز زبان هسکل شامل تطبیق الگو، قوهٔ ادراک به صورت لیست، حائل‌ها، عملگرهای قابل تعریف و تک گماری است زبان همچنین قابلیت پشتیبانی از تابع‌های بازگشت پذیر و انواع داده‌های جبری را به خوبی ارزیابی کند را دارد فکرهای بی همتا شامل یکه‌ها و کلاس‌های الگو می‌باشد ترکیب این خصیصه‌ها می‌تواند توابعی بسازد که نوشتن آن بوسیلهٔ زبان‌های برنامه نویسی روندی دشوار است اما انجام آن در زبان جزئی و آسان می‌باشد چندین گونهٔ مغایر توسعه پیدا کرده، از جمله نسخهٔ موازات شده از ام ای تی وگلس گو بیشتر نسخه‌های موازی و توزیع شده نامیده می‌شدند نسخهٔ ارزیابی مبتکرانه ادن نامیده شد و چندین نسخهٔ شیئ گرا نامیده می‌شوند. خویشاوند نزدیکی به کنکورنت کلین می‌باشد که بزرگترین انحراف از در استفاده از گونه‌های یکتایی برای ورودی به جای یکه‌ها می‌باشد.

کاربردها[ویرایش]

قدرت هسکل به خوبی برای بعضی از پروژه‌ها به کار بسته شده است این زبان به طور زیاد شونده درموقعیت‌های ارتباطی به کار برده می‌شود. Audrey Tang's Pugs پیاده‌ساز برای آیندهٔ دور زبان پرل شش که دارای مفسر و کامپایلر می‌باشد که کارامد بودن آن را بعد از چند ماه بیرون آمدن آن اثبات کرده است؛ به طور مشابه، جی اچ سی معمولاً برای خصیصهٔ برنامه نویسی پیشرفتهٔ تابعی و بهینه‌سازی آزمایش می‌شود دارس یک سیستم کنترل تجدید نظرهمراه چندین خصیصهٔ ابتکاری است. لینوکس زبان هسکل را برای توسعهٔ ابزار سیستم انتخاب کرده است. ایکس مناد که یک مدیریت پنجره برای سیستم پنجره ایکس می‌باشد، به طور کلی با هسکل نوشته شده است. بلو اسپیس سیستم وریلوگ یک زبان برای طراحی نیمه هادی می‌باشد که تکاملی از می‌باشد به علاوه. بلو اسپیس ای ان سی ابزار در زبان انجام شده است.

مثال‌ها[ویرایش]

یک مثال ساده که معمولاً برای اثبات دستور زبان تابعی به کار می‌رود، تابع فاکتوریل برای اعداد صحیح نا منفی می‌باشد که درهسکل به صورت زیر نوشته می‌شود

 factorial :: Integer -> Integer
 factorial 0 = 1
 factorial n | n> 0 = n * factorial (n-1)

یا در یک خط:

 factorial n = if n> 0 then n * factorial (n-1) else 1

این مثال بالا فاکتوریل را به عنوان تابع بازگشتی شرح می‌دهد با یک مبنای پایان بخش. این شبیه توصیفات موجود فاکتوریل‌ها در کتب درسی است. بیشتر کدهای هسکل شبیه یاددهشتهای ریاضی استاندارد در نحو است. خط اول تابع فاکتوریل نوع تابع را شرح می‌دهد زمانی که اختیاری است یک نوع خوب برای شامل شدن ان مطرح است.

 as the function factorial (factorial) has type (::) from integer to integer (Integer -> Integer)

این یک عدد صحیح به عنوان ارگومان می‌گیرد ویک عدد صحیح دیگر بازمی‌گرداند. اگر برنامه نویس نوع یادداشت را ذخیره نکرده باشد این نوع تعریف به طور اتوماتیک استنباط شده است. خط دوم اشاره به تطبیق الگو دارد یک خصوصیت مهم هسکل. یادداشتی که پارامترهای تابع ان در پرانتز نیستند به وسیله فاصله از دوم جدا شده است. وقتی که ارگومانهای تابع صفر می‌شوند عدد صحیح به صورت یک برگردانده می‌شود. برای همهٔ موارد ذیگر خط سوم ازموده شده. یک حایل خط سوم را از اعداد منفی که فاکتوریل انها تعریف نشده حفظ می‌کند بدون حایل این تابع بدون رسیدن به مورد اصلی از طریق همهٔ اعداد منفی تکرار می‌شود. همانطور که هست تطبیق الگو کامل نیست. اگر عدد صحیح منفی به عنوان ارگومان عبور کند برنامه با یک خطای زمان اجرا شکست می‌خورد. مورد اخر می‌تواند برای این خطای وضعیت چک شود و در عوض یک خطای مناسب چاپ می‌کند. مقدمه یک تعدادی از توابع کوچک مشابه کتابخانه استاندارد است با استفاده از مقدمه‌ها می‌توانیم توابع فاکتوریل را مانند زیر شرح دهیم.

 fac n = product (enumFromTo 1 n)

همانطور که نام نمی‌تواند به وضوح تابع شرکت کند این تابع ممکن است بیان بهتری باشد در نوع هدف خاص ارگومانهای نا معین. استفاده از عملگر تابع ترکیب اپراتور برای هدف تولید تابع.

 fac = product. enumFromTo 1

در مفسر محکم شمتا معمولاً نیاز به تعریف تابع و استفاده از ان در همان خط جدا شده به وسیلهٔ کجا یا در یا... دارید. به این منظور که شما احتیاج به داخل کردن ان برای تست مثالهای بالا و دیدن خروجی دارید. مترجم جی اچ سی این محدودیت را ندارد و تعریف توابع می‌تواند داخل یک خط شود و بعداً فراخوانی کند. مثالهای پیچیدهٔ بیشتر یک ماشین حساب نشانه گذاری لهستانی معکوس ساده با تابع اردر بالا –تابع فلد 1-ارگومان اف در جائیکه عبارت از الگوی تطبیق استفاده می‌کند.

 calc :: String -> [Float]
 calc = foldl f []. words
   where
     f (x:y:zs) "+" = y+x:zs
     f (x:y:zs) "-" = y-x:zs
     f (x:y:zs) "*" = y*x:zs
     f (x:y:zs) "/" = y/x:zs
     f xs y = read y: xs

لیست خالی به عنوان مرحله اغازین است و حرف اف یک کلمه را در یک لحظه ترجمه می‌کند. هر دو عدد تطبیق شده از بالای لیست و قرار داده شده در نتایجه یا تجزیهٔ کلمه به عنوان عدد با ممیز شناور به ابتدای لیست اضافه می‌شود.

 fibs = 0: 1: zipWith (+) fibs (tail fibs)

یک لیست نا متناهی که به وسیلهٔ هم بازگشت ساخته می‌شود اخرین یا دومین مقدار لیست به محض تقاضای شروع از دو ایتم صفر و یک استفاده می‌کند. این نوع از تعریف به ارزیابی لیست بستگی دارد که یک ویژگی مهم از هسکل است. به عنوان مثال چگونگی ارزیابی رشد مقدار فیبوناچیی که شش مقدار محاسبه و نشان داده شده که مقدار بعدی به مقدار قبلی وابسته است. تابع مشابه نوشته شده بوسیلهٔ ترکیب لیست موازی ادراکی جی اچ سی. برای اطلاعات بیشتر

 fibs = 0: 1: [ a+b | a <- fibs | b <- tail fibs ]

تابع فاکتوریل نیز می‌تواندبا یک تابع مشابه پیاده‌سازی شود.

 fac n = (foldl (.) id [\x -> x*k | k <- [[1..n]]) 1

به طور قابل ملاحظه تابع مختصر شده‌ای که مقدار یک لیست را بر می‌گرداند به عبارت دیگر

 hamming = 1: map (2*) hamming `merge` map (3*) hamming `merge` map (5*) hamming
     where merge (x:xs) (y:ys)
            | x <y = x: xs `merge` (y:ys)
           | x> y = y: (x:xs) `merge` ys
            | otherwise = x: xs `merge` ys

مانند راه حل‌های گوناگون سری فیبوناچی که در بالا نشان داده شد از یک هم بازگشت برای ساخت یک لیست از اعداد به محض درخواست استفاده می‌کند. شروع از پایه یعنی 1 و ساختد موارد جدید که نسبت به سایر اعضا حق تقدم دارد اغاز می‌شود. تکین ها-اتم ها- ورودی /خروجی‌ها هسکل به عنوان یک زبان خالص اثرات جانبی توابع را ندارد این یک رقابت برای برنامه‌های واقعی است که در میان بقیهٔ موارد احتیاج پیدا می‌کند به تاثیرات محیط برنامه نویسی هسکل این مشکل را با نوع داده‌ای اتم حل کرده است. سیستم تایپ به ترتیب دستورات امری یک تناسب بر قرار می‌کند. یک مثال نوعی ازاین سیستم شامل حالات بی‌ثبات همزمانی حافظهٔ ترا کنشی مدیریت استثناو انتشار خطاست ولی اتمها برای رسیدن به بسیاری اهداف مفیدند. هسکل یک ترکیب ویژه برای عبارات اتمی ارائه کرده است پس برنامه هائی که اثر جانبی دارند می‌توانند به نوعی شبیه زبانهای امری نوشته شوند برنامهٔ زیر یک نام را از ورودی دریافت می‌کند ودر خروجی یک پیغام خوشامد گوئی چاپ می‌کند.

 main = do putStrLn "What's your name?"
          name <- getLine
          putStr ("Hello, " ++ name ++ "!\n")

do عبارارات با این اصطلاح کار با اتمها را اسان می‌کنند این عبارت با عبارت قبلی یکسان می با شد ولی تقریباً برای نوشتناسان تر و قابل فهم تر از De-sugared که از اپراتور اتم به طور مستقیم استفاده می‌کند.

 main = putStrLn "What's your name?">>
             getLine>>= \ name ->
              putStr ("Hello, " ++ name ++ "!\n")

برای اطلاعات بیشتر به مراجع زیر مراجعه کنید. also wikibooks:Transwiki:List of hello world programs#Haskell

نقد[ویرایش]

جان ویلیام در 2002و پیتون در 2003 در مورد مشکلات به هم پیوستن ارزیابی کند که هم چنین تصدیق کرده‌اند انگیزهٔ نظری بر ان را. انها به علاوه اظهار داشتند به اضافه کردن بعضی از سر فصل‌ها که کندی باعث می‌شود که برنامه نویسان در هدفشان دچار مشکل شوند در مورد اجرای کدهایشان نیز برخورد کنند به خصوص نسبت به استفاده از حافظه. هرن لیجن زندرن در2003مشاهده کرده‌اند بعضی از اموزندگان هسکل به یک مانع در نوشتن برنامه‌ها برخورد کردند. این مشکل بزرگ و پیچیده در هسک شمشیر ذو لبه است. عبارت پائین مطابق هسکل 98 می‌باشد.

"The subtle syntax and sophisticated type system of Haskell are a double edged sword — highly appreciated by experienced programmers but also a source of frustration among beginners, since the generality of Haskell often leads to cryptic error messages."[16]

implementations[ویرایش]

  • Glasgow Haskell Compiler (GHC

به کد اصلی به تعداد معیارهای اصلی با استفاده از "سی" به عنوان زبان حیاتی جی اچ سی مشهورترین کامپایلر هسکل می‌باشد. هسکل به تعداد نسبتاً زیادی کتابخانه‌های مفید دارد که فقط با جی اچ سی کار می‌کند.

  • Gofer

یک لهجه یا گویش جدید اموزشی هسکل است با ویژگی به نام کلاسهای سازنده به وسیلهٔ مارک جونز توسعه داده شد.

  • HBC

یکی دیگر از کامپایلر کد اصلی هسکل می‌باشد این کامپایلر به طور فعالانه کار نمی‌کند و توسعه داده نمی‌شود ولی در بعضی موارد قابل استفاده می‌باشد.

  • Helium

یک گویش جدید برای هسکل است تمرکز روی این لهجه باعث می‌شود که اموخته‌های ما در مورد پیغام‌های خطا روشن تر شود. این در همان حالت یک تایپ را کم دارد واجرای ان با بسیاری از برنامه‌های هسکل نا سازگار است.

  • Hugs, the Haskell User's Gofer System,

یک مترجم بایت کد می‌باشد که باعث کامپایل و اجرای سریع خواهد شد. همچنین با کتابخانه‌های گرافیکی ساده نیز همراه است. برای افرادی که در زبان هسکل مبتدی هستند این مترجم مفید است ولی به معنای یک اجرای ساده وبچگانه نیست بلکه بسیار قابل حمل تر در اجرا درون هسکل می‌باشد.

  • Jhc

یک کامپایلر هسکل است که این کامپایلرتاکید بر سرعت و کارایی بالای برنامه‌ها دارد چنانچه تغییراتی در برنامه اعمال شود.

  • nhc98

یک کامپایلر بایت کد هسکل است باید توجه داشت بایت کد اجرای بسیار سریعتری دارد توجه به استفادهٔ کمتر و بهینه تر از حافظه از مزایای این کامپایلر است و یک انتخاب مناسب برای کامپیوترهای قدیمی و کم مصرف است.

  • Yhc, the York Haskell Compiler

یک شاخه از ان اچ سی 98 می‌باشد با اهداف ساده‌تر شدن قابل حمل شدن تاثیر گذار تر شدن. پشتیبانی تمام و کمال برای هت. همچنین ویژگی‌ها یی برای جاوا نیز دارد که اجازه می‌دهد به کار برانی که در محیط نت کار می‌کنند هسکل را نیز اجرا کند.

کتابخانه‌ها[ویرایش]

از ژانویهٔ 2007 کتابخانه‌ها و موارد کاربردی در یک بسته به نام هکیج جمع شوند یک پایگاه داده ان لاین از برنامهٔ هسکل که از وسیله‌ای به نام بسته کنندهٔ کیبل استفاده می‌کند. از دسامبر 2008 910 بسته قابل استفاده برای کاربران گذاشته شده است.

  • "Hackage"

یک نقطهٔ میانی برای توزیع هسکل میبا شد به وسیلهٔ کابیل فعالیت‌های توسعه افرینی هسکل به صورت یک قطب در امده نصب برنامه‌های جدید هسکل به وسیلهٔ هکیج و وسایل نصب کابیل امکان‌پذیر است. این نصب‌ها بازگشتی و نیاز به وابستگی‌ها یی دارد که اینها با وجود ان در دسترس هستند. امروزه نصب کد هسکل بسیار اسانتر از قبل می‌باشد.