ام‌ال

ام‌ال ، یک زبان برنامه‌نویسی تابعی همه منظوره است که توسط رابین میلنر و همکاران در اواخر دهه ۱۹۷۰ در دانشگاه ادینبورگ توسعه یافت. نحو این زبان از زبان برنامه‌نویسی آی‌سوییم الهام گرفته‌است.

کلمه 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  : intsml با استنتاج در سطح بالا نشان می‌دهد که نتیجه دارای نوع "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<h) 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 <<xs = 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 معرفی شده‌اند از:
 Standard ML of New Jersey (abbreviated SML/NJ) is a full compiler, with associated libraries, tools, an interactive shell, and documentation. 
 MLton is a whole-program optimizing compiler that produces very fast code compared to other ML implementations. 
 The ML Kit integrates a garbage collector (which can be disabled) and region-based memory management with automatic inference of regions, aiming to support realtime applications. Its implementation is based very closely on the Definition.
 Poly/ML is a full implementation of Standard ML that produces fast code and supports multicore hardware (via Posix threads); its runtime system performs parallel garbage collection and online sharing of immutable substructures.
 Isabelle/ML integrates parallel Poly/ML into an interactive theorem prover, with a sophisticated IDE (based on jEdit) for official Standard ML (SML'97), the Isabelle/ML dialect, and the proof language. Starting with Isabelle2016, there is also a source-level debugger for ML.
  Moscow ML  is a light-weight implementation, based on the CAML Light runtime engine. It implements the full SML language, including SML Modules, and much of the SML Basis Library. 
 CakeML a read-eval-print loop version of ML with formally verified runtime and translation to assembler
 HaMLet is an SML interpreter that aims to be an accurate and accessible reference implementation of the standard.
 TILT is a full certifying compiler for SML. It uses typed intermediate languages to optimize code and ensure correctness, and can compile to Typed assembly language.
 SML.NET allows compiling to the Microsoft CLR and has extensions for linking with other .NET code.
 SML2c is a batch compiler and compiles only module-level declarations (i.e. signatures, structures, functors) into C. It is based on SML/NJ version 0.67 and shares the front end, and most of its run-time system, but does not support SML/NJ style debugging and profiling. Module-level programs that run on SML/NJ can be compiled by sml2c with no changes.
 The Poplog system implements a version of SML, with POP-11, and optionally Common Lisp, and Prolog, allowing mixed language programming. For all, the implementation language is POP-11, which is compiled incrementally. It also has an integrated Emacs-like editor that communicates with the compiler.
 SML# is an extension of SML providing record polymorphism and C language interoperability. It is a conventional native compiler and its name is not an allusion to running on the .NET framework.
 Alice: an interpreter for Standard ML by Saarland University adding features for lazy evaluation, concurrency (multithreading and distributed computing via remote procedure calls) and constraint programming.
تمامی این پیاده‌سازی‌ها متن-باز و مجانی هستند. دیگر هیچگونه نسخهٔ پولی از sml وجود ندارد.

جستارهای وابسته 
 Alice
 ML
 Concurrent ML
 Dependent ML
 Extensible ML
 Extended ML
 F#
 OCaml
  Ur/Web

منابع 

ویکی‌پدیای انگلیسی
Wikipedia contributors, "ML (programming language)," Wikipedia, The Free Encyclopedia, http://en.wikipedia.org/w/index.php?title=ML_(programming_language)&oldid=196070433

پیوند به بیرون 
 Standard ML Family GitHub Project
 Standard ML language Mads Tofte, Scholarpedia, 4(2):7515. doi:10.4249/scholarpedia.7515
 What is SML?
 What is SML '97?
 successor ML (sML)  is intended to provide a vehicle for the continued evolution of ML, using Standard ML as a starting point.
 Programming in Standard ML
 Programming in Standard ML '97: An On-line Tutorial
 Univ. of Chicago - SML tutorial (slides)
 CSE341: Programming Languages, Dan Grossman, University of Washington. Also on Coursera and YouTube

زبان‌های برنامه‌نویسی
زبان‌های برنامه‌نویسی آکادمیک
زبان‌های برنامه‌نویسی ایستا
زبان‌های برنامه‌نویسی تطبیق الگو
زبان‌های برنامه‌نویسی رویه‌ای
زبان‌های برنامه‌نویسی ساخته‌شده در ۱۹۷۳ (میلادی)
زبان‌های برنامه‌نویسی ساخته‌شده در دهه ۱۹۷۰ (میلادی)
زبان‌های تابعی