**مرکوری** یک زبان برنامه‌نویسی منطقی تابعی است که جهت کاربردهای دنیای واقعی بهینه شده‌است. این زبان در ابتدا در دانشکده علوم کامپیوتر دانشگاه ملبورن تحت نظارت زولتان سوموگی ابداع شد. فرگوس هندرسون، توماس کانوی و زلتان سوموگی نخستین نسخه مرکوری را در ۸ آوریل سال ۱۹۹۵ منتشر کردند.

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

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

مرور کلی
--------

مرکوری مبتنی بر زبان برنامه‌نویسی منطقی پرولوگ است به طوری که همان نحو و همان مفاهیم پایه‌ای همانند الگوریتم تصمیم SLD را داراست. می‌توان به مرکوری به عنوان زیرمجموعه از پرولوگ با نوع داده‌ای و حالت قوی نگاه کرد. به این ترتیب مرکوری همواره با نسخه‌های قبلی آن از لحاظ ویژگی‌ها و بهره‌وری زمان اجرا قابل مقایسه است.

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

با توجه به استفاده از اطلاعات به دست آمده در زمان کامپایل (مانند نوع و اطلاعات حالت)، برنامه‌های نوشته شده در مرکوری به‌طور قابل توجهی سریعتر از برنامه‌های معادل نوشته شده در پرولوگ اجرا می‌شوند. نویسندگان آن ادعا می‌کنند که مرکوری با اختلافی زیاد، سریع‌ترین زبان منطقی در جهان است.

مرکوری زبان اعلانی خالص است. از آنجا که مرکوری فاقد عبارات «فوق منطقی» پرولوگ مانند «برش» و ورودی/خروجی دستوری است، بر خلاف پرولوگ، قادر است تجزیه و تحلیل استاتیک پیشرفته و بهینه‌سازی برنامه، از جمله زباله‌روب زمان کامپایل انجام دهد، از طرفی ممکن است ساختارهای برنامه‌نویسی خاصی (مانند یک سوئیچ با بیش از تعداد خاصی از گزینه‌ها، با پیش فرض) سخت‌تر به بیان شود. (توجه داشته باشید که با این که مرکوری اجازه افزودن کد زبان‌های دیگر را می‌دهد، این اقدام در درجه اول به عنوان یک راه فراخوانی کد زبان دیگر است. همه کدهای زبان‌های دیگر استفاده شده در کد مرکوری باید به صراحت مشخص شده باشند) عملیاتی که به‌طور معمول ناخالص‌اند (مانند ورودی/خروجی) با استفاده از سازه خالص در مرکوری توسط چندریسمانی ساختگی، با ارزش «جهانی» از طریق تمام کدهای مربوط، بیان می‌شوند.

از برنامه‌های قابل توجه نوشته شده در مرکوری می‌توان به خود کامپایلر مرکوری و فرمت‌کننده Prince XML اشاره کرد. شرکت نرم‌افزاری Mission Critical IT، نیز از مرکوری از سال ۲۰۰۰ به منظور توسعه برنامه‌های سازمانی و پلتفرم Ontology-Driven-development با عنوان ODASE استفاده می‌کند.

زیرساخت‌ها
----------

مرکوری زیرساخت‌های متعددی دارد. این زبان به زبان‌های زیر قابل کامپایل است:

**مرحله تولید**

* C سطح پایین برای GCC (زیرساخت اصلی مرکوری)
* C سطح بالا

**کیفیت بتا**

* Java
* C#
* Erlang

**کیفیت آلفا** (ممکن است درست کار نکند، یا اصلاً کار نکند):

* IL برای Microsoft's .NET
* Assembly برخلاف زیرساخت GCC

**زیرساخت‌های گذشته:**

ادیتی، یک سیستم پایگاه داده استنتاجی که در دانشگاه ملبورن توسعه یافته‌است. مرکوری ۰٫۱۲٫۲ آخرین نسخه از مرکوری است که از ادیتی پشتیبانی می‌کند.

مرکوری همچنین دارای یک رابط زبان خارجی است، که اجازه می‌دهد کد به زبان‌های دیگر (بسته به انتخاب به زیرساخت) لینک شود. زبان‌های خارجی امکان‌پذیر در جدول زیر آمده‌اند:

| زیرساخت | زبان خارجی |
| --- | --- |
| C (هر دو سطح) | C |
| Java | Java |
| Erlang | Erlang |
| IL | IL یا C# |

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

بیشترین زیرساخت مورد استفاده زیرساخت سطح پایین C است.

مثال‌ها
-------

Hello World:

```
 :- module hello.
 :- interface.
 :- import\_module io.
 :- pred main(io::di, io::uo) is det.

 :- implementation.
 main(!IO) :-
  io.write\_string("Hello, World!\n", !IO).

```
محاسبه ده جمله اول دنباله فیبوناچی

```
 :- module fib.
 :- interface.
 :- import\_module io.
 :- pred main(io::di, io::uo) is det.

 :- implementation.
 :- import\_module int.

 :- func fib(int) = int.
 fib(N) = (if N =<2 then 1 else fib(N - 1) + fib(N - 2)).

 main(!IO) :-
        io.write\_string("fib(10) = ", !IO),
        io.write\_int(fib(10), !IO),
        io.nl(!IO).
        % Could instead use io.format("fib(10) = %d\n", [i(fib(10))], !IO).

```

زمانبندی انتشار
---------------

پروژه مرکوری دارای یک چرخه انتشار ۶ ماهه است. نسخه‌ها با توجه به سال و ماه انتشار نام‌گذاری می‌شوند. نسخه پایدار فعلی ۱۴٫۰۱٫۱ (سپتامبر ۲۰۱۴) است. قبلاً نسخه‌ها به صورت ۰٫۱۲، ۰٫۱۳، و غیره شماره می‌شدند و دوره بین نسخه‌های پایدار بسیار زیاد (۳ سال) بود.

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

منابع
-----

1. 1 2  The Mercury Project - Motivation
2. ↑  The Mercury Project - Benchmarks
3. ↑  Somogyi, Zoltan; Henderson, Fergus; Conway, Thomas (October–December 1996).
4. ↑  Mazur, Nancy (May 2004).
5. ↑  Adapted from Ralph Becket's Mercury tutorial