امال (به : ML)، یک همه منظوره است که توسط رابین میلنر و همکاران در اواخر دهه ۱۹۷۰ در توسعه یافت. این زبان از الهام گرفته است.
کلمه ML از فوق زبان (Meta Language) گرفته شده است. امال برای بهبود بخشیدن به رویه اثبات در قضیه LFC طراحی شده است. این برای کاربرد آن در الگوریتم استنتاج نوع هیندلی- میلنر که به طور خودکار اکثر عبارتها بدون نیاز به تفسیر نوع صریح شناخته شده است.
مرور کلی
امال معمولاً به عنوان یک زبان تابعی ناخالص یاد میشود. چرا که به اثرات جنبی و بنابراین برنامه نویسی امری، بر خلاف زبان خالص مانند هاسکل، اجازه میدهد. به همین دلیل امال یک زبان برنامهنویسی چند نمونهای (multi-paradigm) نیز عنوان میشود.
خصوصیات امال شامل استراتژی سنجش فراخوانی با مقدار (call – by – value)، توابع درجه یک، خودکار در مواجه با مجموعه دادههای ناخواسته، چندریختی پارامتریک و انواع پویا، انواع استنتاج، انواع دادههای جبری، ازمون الگو و استثناء است.
برخلاف هاسکل، امال از استفاده میکند به این معنا که تمام عبارات همگی ارزیابی میشوند. در نتیجه شما نمیتوانید مستقیماً از لیستهای نامحدود استفاده کنید. هرچند و بنابراین ساختمان دادههای نامحدود مانند لیستها میتوانند به واسطهٔ توابع بی نام شوند.
امروزه زبانهای مختلفی در خانوادهامال است دو گویش اصلی آن و Caml است. اما بقیه شامل F# که یه پروژهٔ تحقیق باز که هدف .NET بود نیز وجود دارند. ایدههای امال در زبانهای بی شماری نفوذ کرده است مانند هاسکل و Cyclone و Nemerle.
از تواناییهای امال معمولاً در طراحی زبان بکار بـرده میشود (کامپایلرها، استفاده برای تحقیقات زیستی، سیستمهای مالی و کاربردها شامل پایگاه دادههای ها، برنامهٔ سرویس دهنده / سرویس گیرنده .
مثال هایی از امال
تشریح برنامهٔ امال خالص
برنامهٔ Hello world! یک زبان تابعی، تابع فاکتوریل است. به عنوان یک امال خالص:
fun fac (0 : int) : int = 1
| fac (n : int) : int = n * fac (n-1)
این فاکتوریل را به عنوان یک با یک وضعیت پایه (base case) محدود توصیف میکند. این شبیه تعاریف فاکتوریل یافت شده در ریاضیات است. بسیاری از کدهای ML از نظر امکانات و نحو نیز شبیه ریاضیات است.
قسمتی از تعریف نشان داده شده اختیاری است و نوع این تابع را تعریف میکند. E: میتواند به عنوان عبارت E که دارای نوع t هست تلقی شود. برای مثال متغیر n، برای نوع صحیح (integer) است و نتیجهٔ اجرای fac برای n (fac(n) ) هم نوع صحیح دارد.
بنابراین تابع فاکتوریل تابعی از نوع صحیح به نوع صحیح ( int -> int ) است. به خاطر نوع استنتاج، حاشیه نویسی نوع میتواند حذف شود و توسط کامپایلر نتیجه گیری شود. بازنویسی بدون درج نوع مانند مثال:
fun fac 0 = 1
| fac n = n * fac (n-1)
تابع همچنین وابسته به آزمون الگو است و این یک بخش مهم برنامه نویسی ML است. توجه کنید که پارامترهای تابع لزوماً در پرانتز نیستند اما حتماً توسط جدا شدهاند. زمانی که متغیر ورودی تابع 0 است، تابع نوع صحیح 1 برمی گرداند، برای حلات دیگر خط دوم اجرا خواهد شد. این خط بازگشتی است و تابع را دوباره فراخوانی و اجرا میکند تا زمانی که به وضعیت پایه برسد.
کلمه ML از فوق زبان (Meta Language) گرفته شده است. امال برای بهبود بخشیدن به رویه اثبات در قضیه LFC طراحی شده است. این برای کاربرد آن در الگوریتم استنتاج نوع هیندلی- میلنر که به طور خودکار اکثر عبارتها بدون نیاز به تفسیر نوع صریح شناخته شده است.
مرور کلی
امال معمولاً به عنوان یک زبان تابعی ناخالص یاد میشود. چرا که به اثرات جنبی و بنابراین برنامه نویسی امری، بر خلاف زبان خالص مانند هاسکل، اجازه میدهد. به همین دلیل امال یک زبان برنامهنویسی چند نمونهای (multi-paradigm) نیز عنوان میشود.
خصوصیات امال شامل استراتژی سنجش فراخوانی با مقدار (call – by – value)، توابع درجه یک، خودکار در مواجه با مجموعه دادههای ناخواسته، چندریختی پارامتریک و انواع پویا، انواع استنتاج، انواع دادههای جبری، ازمون الگو و استثناء است.
برخلاف هاسکل، امال از استفاده میکند به این معنا که تمام عبارات همگی ارزیابی میشوند. در نتیجه شما نمیتوانید مستقیماً از لیستهای نامحدود استفاده کنید. هرچند و بنابراین ساختمان دادههای نامحدود مانند لیستها میتوانند به واسطهٔ توابع بی نام شوند.
امروزه زبانهای مختلفی در خانوادهامال است دو گویش اصلی آن و Caml است. اما بقیه شامل F# که یه پروژهٔ تحقیق باز که هدف .NET بود نیز وجود دارند. ایدههای امال در زبانهای بی شماری نفوذ کرده است مانند هاسکل و Cyclone و Nemerle.
از تواناییهای امال معمولاً در طراحی زبان بکار بـرده میشود (کامپایلرها، استفاده برای تحقیقات زیستی، سیستمهای مالی و کاربردها شامل پایگاه دادههای ها، برنامهٔ سرویس دهنده / سرویس گیرنده .
مثال هایی از امال
تشریح برنامهٔ امال خالص
برنامهٔ Hello world! یک زبان تابعی، تابع فاکتوریل است. به عنوان یک امال خالص:
fun fac (0 : int) : int = 1
| fac (n : int) : int = n * fac (n-1)
این فاکتوریل را به عنوان یک با یک وضعیت پایه (base case) محدود توصیف میکند. این شبیه تعاریف فاکتوریل یافت شده در ریاضیات است. بسیاری از کدهای ML از نظر امکانات و نحو نیز شبیه ریاضیات است.
قسمتی از تعریف نشان داده شده اختیاری است و نوع این تابع را تعریف میکند. E: میتواند به عنوان عبارت E که دارای نوع t هست تلقی شود. برای مثال متغیر n، برای نوع صحیح (integer) است و نتیجهٔ اجرای fac برای n (fac(n) ) هم نوع صحیح دارد.
بنابراین تابع فاکتوریل تابعی از نوع صحیح به نوع صحیح ( int -> int ) است. به خاطر نوع استنتاج، حاشیه نویسی نوع میتواند حذف شود و توسط کامپایلر نتیجه گیری شود. بازنویسی بدون درج نوع مانند مثال:
fun fac 0 = 1
| fac n = n * fac (n-1)
تابع همچنین وابسته به آزمون الگو است و این یک بخش مهم برنامه نویسی ML است. توجه کنید که پارامترهای تابع لزوماً در پرانتز نیستند اما حتماً توسط جدا شدهاند. زمانی که متغیر ورودی تابع 0 است، تابع نوع صحیح 1 برمی گرداند، برای حلات دیگر خط دوم اجرا خواهد شد. این خط بازگشتی است و تابع را دوباره فراخوانی و اجرا میکند تا زمانی که به وضعیت پایه برسد.