امال (به انگلیسی: ML)، یک زبان برنامهنویسی تابعی همه منظوره است که توسط رابین میلنر و همکاران در اواخر دهه ۱۹۷۰ در دانشگاه ادینبورگ توسعه یافت.
نحو این زبان از زبان برنامهنویسی آیسوییم الهام گرفتهاست.
پارادایم برنامهنویسی | پارادایم برنامهنویسی: برنامهنویسی دستوری، برنامهنویسی تابعی |
---|---|
طراحی شده توسط | رابین میلز & others at the دانشگاه ادینبروگ |
ظهوریافته در | ۱۹۷۳ |
static، وابستگی زیاد و کم به نوع، inferred، ایمنی نوع | |
گویش | |
استاندارد امال، Caml | |
متأثر از | |
آیسوییم (زبان برنامهنویسی) | |
تأثیر گذاشته بر | |
کلوژر، Coq، Cyclone، سی پلاسپلاس، Elm، اف شارپ، هسکل (زبان برنامهنویسی)، Idris، میراندا (زبان برنامهنویسی)، Nemerle، اکمل، اوپا، ارلنگ، راست (زبان برنامهنویسی)، اسکالا |
کلمه ML از فوق زبان (Meta Language) گرفته شدهاست. امال برای بهبود بخشیدن به رویه اثبات در قضیه LFC طراحی شدهاست. این برای کاربرد آن در الگوریتم استنتاج نوع هیندلی- میلنر که بهطور خودکار اکثر عبارتها بدون نیاز به تفسیر نوع صریح شناخته شدهاست.
امال معمولاً به عنوان یک زبان تابعی ناخالص یاد میشود چرا که به اثرات جنبی و بنابراین برنامهنویسی امری، بر خلاف زبان برنامهنویسی تابعی خالص مانند هاسکل، اجازه میدهد. به همین دلیل امال یک زبان برنامهنویسی چند نمونهای (multi-paradigm) نیز عنوان میشود.
برنامههایی که در این زبان نوشته میشود شامل عباراتی است که مخالف دستورات ارزیابی میشوند با وجود اینکه برخی از عبارات یک مقدار بدیهی را برمیگردانند که فقط برای اثرات جانبی ارزیابی میشوند.
مانند تمام زبانهای برنامهنویسی تابعی، یک ویژگی کلیدی این زبان تابع است. تابع فاکتوریل را در کد زیر نگاه کنید:
fun factorial n = if n = 0 then 1 else n * factorial (n-1)
یک کامپایلر استاندارد برای پی بردن به نوع استاتیک int -> int این تابع بدون اینکه کاربر نیاز داشته باشد یادداشت کند. میتوان استنباط کرد که متغیر n فقط در عبارات از نوع عدد صحیح استفاده میشود و خودش هم باید از نوع عدد صحیح باشد و تمامی اعدادی که توسط عبارات تولید میشود از نوع عدد صحیح است.
خصوصیات امال شامل استراتژی سنجش فراخوانی با مقدار (call – by – value)، توابع درجه یک، مدیریت حافظه خودکار در مواجه با مجموعه دادههای ناخواسته، چندریختی پارامتریک و انواع پویا، انواع استنتاج، انواع دادههای جبری، آزمون الگو و جابه جایی استثناء است.
برخلاف هاسکل، امال از ارزیابی مشتاق استفاده میکند به این معنا که تمام عبارات همگی ارزیابی میشوند. در نتیجه شما نمیتوانید مستقیماً از لیستهای نامحدود استفاده کنید. هرچند ارزیابی کند و بنابراین ساختمان دادههای نامحدود مانند لیستها میتوانند به واسطهٔ توابع بی نام شبیهسازی شوند.
امروزه زبانهای مختلفی در خانوادهامال است دو گویش اصلی آن امال استاندارد و Caml است. اما بقیه شامل F# که یه پروژهٔ تحقیق باز که هدف .NET شرکت مایکروسافت بود نیز وجود دارند. ایدههای امال در زبانهای بی شماری نفوذ کردهاست مانند هاسکل و Cyclone و Nemerle.
از تواناییهای امال معمولاً در طراحی زبان بکار برده میشود (کامپایلرها، استفاده برای تحقیقات زیستی، سیستمهای مالی و کاربردها شامل پایگاه دادههای شجره نامهها، برنامهٔ سرویس دهنده / سرویس گیرنده نظیر به نظیر.
زبان sml را به راحتی میتوان یادگرفت برای این کار باید ان را به یک سطح بالاتر وارد کرد که به ان یک حلقه خواندن-محاسبه-چاپ یا repl میگویند. این یک جلسه تعاملی است که در ان معنی عبارتهای از پیش تعیین شده مشخص میشود. بسیاری از پیادهسازیهای sml شامل repl میشود از جمله sml/nj:
$ sml Standard ML of New Jersey v110.52 [built: Fri Jan 21 16:42:10 2005] -
کد میتواند بعد از "-" وارد شود. به عنوان مثال برای محاسبه ۲*3+1:
- 1 + 2 * 3; val it = 7 : int
sml با استنتاج در سطح بالا نشان میدهد که نتیجه دارای نوع "int" و مقدار "۷" میباشد.
برنامه زیر برنامه "hello.sml" است:
print "Hello world!\n";
که با دستور زیر میتوان ان را کامپایل کرد:
$ mlton hello.sml
و با این دستور میتوان ان را اجرا کرد:
$. /hello Hello world!
مرتبسازی درجی برای اعداد صحیح (صعودی) است به اختصار به شرح زیر بیان میشود:
fun ins (n, []) = [n] | ins (n, ns as h::t) = if (n) then n::ns else h::(ins (n, t)) val insertionSort = List.foldr ins []
در اینجا ما از نشان ">>" برای مرتبسازی در اینجا استفاده میکنیم:
fun ins' <<(num, nums) = let fun i (n, []) = [n] | i (n, ns as h::t) = if <<(n,h) then n::ns else h::i(n,t) in i (num, nums) end fun insertionSort' <<= List.foldr (ins' <<) []
نوع تابع ('insertionSort) از نوع ('a * 'a -> bool) -> ('a list) -> ('a list) میباشد.
مرتبسازی سریع از نماد "<<" برای این کار استفاده میکند:
fun quicksort < = let fun qs [] = [] | qs [x] = [x] | qs (p::xs) = let val (less, more) = List.partition (fn x => <<(x, p)) xs in qs less @ p :: qs more end in qs xs end
برنامهٔ 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 است. توجه کنید که پارامترهای تابع لزوماً در پرانتز نیستند اما حتماً توسط فاصله گذاری جدا شدهاند. زمانی که متغیر ورودی تابع ۰ است، تابع نوع صحیح ۱ برمیگرداند، برای حلات دیگر خط دوم اجرا خواهد شد. این خط بازگشتی است و تابع را دوباره فراخوانی و اجرا میکند تا زمانی که به وضعیت پایه برسد.
پیادهسازیهای بسیاری برای sml معرفی شدهاند از:
تمامی این پیادهسازیها متن-باز و مجانی هستند. دیگر هیچگونه نسخهٔ پولی از sml وجود ندارد.
ویکیپدیای انگلیسی Wikipedia contributors, "ML (programming language)," Wikipedia, The Free Encyclopedia, http://en.wikipedia.org/w/index.php?title=ML_(programming_language)&oldid=196070433
This article uses material from the Wikipedia فارسی article امال, which is released under the Creative Commons Attribution-ShareAlike 3.0 license ("CC BY-SA 3.0"); additional terms may apply (view authors). محتوا تحت CC BY-SA 4.0 در دسترس است مگر خلافش ذکر شده باشد. Images, videos and audio are available under their respective licenses.
®Wikipedia is a registered trademark of the Wiki Foundation, Inc. Wiki فارسی (DUHOCTRUNGQUOC.VN) is an independent company and has no affiliation with Wiki Foundation.