Euphoria یک زبان برنامه‌نویسی است که توسط Robert Craig از Rapid Deployment Software در تورنتو، انتاریو، کانادا ایجاد شده‌است. ابتدا در Atari ST توسعه یافت (اگرچه به صورت عمومی منتشر نشده بود)، اولین نسخه تجاری برای پلتفرم ۱۶ بیتی DOS و نرم‌افزار مالکیتی بود. در سال ۲۰۰۶، با انتشار نسخه ۳، Euphoria به یک نرم‌افزار متن‌باز تبدیل شد. گروه OpenEuphoria به مدیریت و توسعه پروژه ادامه می‌دهد. در دسامبر ۲۰۱۰، گروه OpenEuphoria نسخه 4 OpenEuphoria را به همراه یک هویت جدید برای پروژه منتشر کرد. OpenEuphoria در حال حاضر برای ویندوز، لینوکس، macOS و سه رده از \* BSD در دسترس است.

Euphoria یک زبان برنامه‌نویسی سطح بالا ،دستوری و مفسر است. یک مترجم کد منبع C را تولید می‌کند و مجموعه کامپایلرهای GNU (GCC) و کامپایلرهای Open Watcom پشتیبانی می‌شوند. متناوباً، ممکن است برنامه‌های Euphoria به مفسر متصل شوند تا اجراهای اجرایی مستقل ایجاد کنند. تعدادی از کتابخانه‌های رابط کاربر گرافیکی (GUI) از جمله Win32lib و تابع لفاف‌پیچی wxWidgets و +GTK و IUP پشتیبانی می‌شوند. Euphoria دارای یک پایگاه داده داخلی ساده است و یانواع پایگاه‌ها داده دیگر.

دید کلی
-------

Euphoria یک زبان رویه ای با اهداف عمومی است که بر روی سادگی، خوانایی، توسعه سریع و عملکرد از چند طریق متمرکز است.

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

تاریخچه
-------

Euphoria به عنوان یک پروژه شخصی برای اختراع یک زبان برنامه‌نویسی از ابتدا ساخته شد، توسط رابرت کریگ در Atari Mega-ST ایجاد شد. بسیاری از ایده‌های طراحی برای این زبان از پایان‌نامه کارشناسی ارشد کریگ در علوم کامپیوتر در دانشگاه تورنتو ناشی شده‌است. پایان‌نامه کریگ به شدت تحت تأثیر کار جان بکوس در مورد زبانهای برنامه‌نویسی تابعی (FP) بود.

کریگ اجرای اصلی آتاری خود را به سیستم عامل ۱۶ بیتی DOS منتقل کرد و Euphoria برای اولین بار، نسخه ۱٫۰، در ژوئیه ۱۹۹۳ تحت مجوز اختصاصی منتشر شد. اجرای اصلی آتاری توسط کریگ «بدوی» توصیف شده‌است و به صورت عمومی منتشر نشده‌است. Euphoria توسط کریگ از طریق شرکت خود Rapid Deployment Software (RDS) و وب سایت rapideuphoria.com توسعه و منتشر شد. در اکتبر ۲۰۰۶، RDS نسخه 3 Euphoria را منتشر کرد و اعلام کرد که از این پس Euphoria آزادانه تحت مجوز نرم‌افزار منبع آزاد توزیع می‌شود.

RDS به توسعه Euphoria ادامه داد و با انتشار نسخه ۳٫۱٫۱ در اوت ۲۰۰۷ به اوج خود رسید. پس از آن، RDS توسعه یک جانبه Euphoria را متوقف کرد و گروه OpenEuphoria توسعه مداوم را به دست گرفت. گروه OpenEuphoria نسخه ۴ را در دسامبر ۲۰۱۰ به همراه آرم جدیدی برای پروژه OpenEuphoria منتشر کرد.

نسخه ۳٫۱٫۱ همچنان یک نسخه مهم است که آخرین نسخه Euphoria است که از پلتفرم DOS پشتیبانی می‌کند.

مفسر Euphoria در اصل در C. نوشته شده‌است. با انتشار نسخه ۲٫۵ در نوامبر ۲۰۰۴، مفسر Euphoria به دو قسمت تقسیم شد: تجزیه کننده جلویی، و مفسر back-end. جلوی جلوی آن در Euphoria نوشته شده‌است (و با مترجم Euphoria-to-C و Binder استفاده می‌شود). کتابخانه اصلی back-end و run در C نوشته شده‌است.

امکانات
-------

با اهداف و ویژگی‌های طراحی زیر تصور و توسعه یافته‌است:

* سهولت یادگیری و با سازه‌های سطح بالا سازگار
* اجرای حافظه مسطح ۳۲ بیتی برای جلوگیری از مدیریت پیچیده حافظه و محدودیت آدرس دهی اندازه
* رفع اشکال در پشتیبانی و خطای زمان اجرا
* زیرنویس و بررسی نوع
* تایپ متغیر شل و سخت
* برنامه‌نویسی از طریق شی گرایی به عنوان انواع (تعریف شده توسط کاربر یا موارد دیگر)
* تفسیر شده، با مدیریت خودکار حافظه و بازیافت زباله
* مجموعه ناهمگن (توالی)
* کتابخانه گرافیکی DOS (نسخه‌های زبان Euphoria تا و شامل ۳٫۱٫۱)
* رفع اشکالگر
* سیستم پایگاه داده یکپارچه
* کنترل سطح پایین حافظه
* تابع لفاف‌پیچی مستقیم کتابخانه‌های C (یا دسترسی به آنها)

حالت‌های اجرا
-------------

* مترجم
* مترجم C (E2C) برای اجراهای مستقل یا پیونددهنده پویا
* کامپایلر و مفسر بایت‌کد
* Binder کد منبع Euphoria را به مترجم متصل می‌کند تا یک نسخه اجرایی ایجاد کند.
* نسخه حلقه read-eval-print (REPL) در نقشه راه openEuphoria است.

موارد استفاده
-------------

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

انواع داده
----------

Euphoria دارای دو نوع داده اساسی است:

Atom(اتم) - یک عدد، به عنوان یک عدد صحیح امضا شده ۳۱ بیتی یا یک نقطه شناور IEEE 64 بیتی اجرا می‌شود. Euphoria با توجه به مقدار فعلی به‌طور پویا بین نمایش عدد صحیح و نقطه شناور تغییر می‌کند.

Sequence(توالی) - برداری (آرایه ای) با عناصر صفر یا بیشتر. هر عنصر ممکن است یک اتم یا دنباله دیگری باشد. تعداد عناصر در یک دنباله ثابت نیست (به عنوان مثال، لازم نیست اندازه برداری / آرایه اعلام شود). برنامه ممکن است عناصر را در صورت نیاز در زمان اجرا اضافه یا حذف کند. تخصیص حافظه - تخصیص حافظه به‌طور خودکار با شمارش مرجع انجام می‌شود. با استفاده از مقدار شاخصی که در پرانتز مربع محصور شده‌است، به عناصر جداگانه ارجاع داده می‌شود. اولین عنصر در یک دنباله دارای شاخص یک است [۱]. عناصر داخل توالی‌های جاسازی شده با مقادیر اضافی شاخص ترمز ارجاع داده می‌شوند، بنابراین X[3][2]به عنصر دوم موجود در توالی اشاره دارد که عنصر سوم X است. هر عنصر از یک دنباله از نوع شی است.

Euphoria دارای دو نوع داده اضافی از پیش تعریف شده‌است:

Integer (عدد صحیح) - یک اتم، محدود به مقادیر صحیح امضا شده ۳۱ بیتی در محدوده -۱۰۷۳۷۴۱۸۲۴ تا ۱۰۷۳۷۴۱۸۲۳ (-۲ ^ ۳۰ تا ۲ ^ ۳۰–۱). انواع داده‌های عدد صحیح کارآمدتر از انواع داده‌های اتمی هستند، اما نمی‌توانند حاوی مقادیر یکسانی از مقادیر باشند. کاراکترها به صورت عدد صحیح ذخیره می‌شوند، به عنوان مثال، کدگذاری ASCII-'A دقیقاً همان کدگذاری ۶۵ است.

Object(شی) - نوع داده آرایه است که ممکن است حاوی هر یک از موارد فوق باشد (به عنوان مثال، اتم، توالی یا عدد صحیح) و ممکن است در طول زمان اجرا به نوع دیگری تغییر کند.

نوع داده رشته‌ای کاراکتر وجود ندارد. رشته‌ها با دنباله ای از مقادیر صحیح نشان داده می‌شوند. با این حال، از آنجا که رشته‌های تحت‌اللفظی معمولاً در برنامه‌نویسی مورد استفاده قرار می‌گیرند، Euphoria شخصیت‌های محصور شده با دو نقل قول را به عنوان دنباله ای از اعداد صحیح تفسیر می‌کند.

بدین ترتیب :

```
"ABC"
```

به نظر می‌رسد که رمزگذار نوشته‌است:

```
{'A', 'B', 'C'}
```

که همانند:

```
{۶۵, ۶۶, ۶۷}
```

!Hello, World
-------------

```
puts(1, "Hello, World!\n")
```

مثال
----

توضیحات کد برنامه با یک خط دوتایی شروع می‌شوند -- و از انتهای خط عبور می‌کنند.

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

```
global function delete\_item( object old, sequence group )
 integer pos
 -- Code begins --
 pos = find( old, group )
 if pos> 0 then
 group = group[1 .. pos-1] & group[pos+1 .. $]
 end if
 return group
end function

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

```
global function replace\_item( object old, object new, sequence group )
 integer pos
 -- Code begins --
 pos = find( old, group )
 if pos> 0 then
 group[pos] = new
 end if
 return group
end function

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

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

```
 group = group[1 .. pos-1] & group[pos+1 .. $]
```

عبور پارامتر
------------

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

زبان‌های قابل مقایسه
--------------------

* Lua
* Nim
* Phix
* Python
* REBOL
* Ruby

منابع
-----

1. ↑  "Euphoria (programming language)". *Wikipedia* (به انگلیسی). 2021-03-13.
2. ↑  «OpenEuphoria: News Index». *openeuphoria.org*. دریافت‌شده در ۲۰۲۱-۰۶-۲۸.
3. ↑  «WebCite query result». *www.webcitation.org*. بایگانی‌شده از اصلی در ۱۹ ژوئیه ۲۰۲۱. دریافت‌شده در ۲۰۲۱-۰۶-۲۸.