**بلیس** (به انگلیسی: BLISS) یک زبان برنامه‌نویسی سیستم است که در دانشگاه کارنگی ملون توسط W.A.Wulf ،دی بی راسل و ای ان هابرمن در سال ۱۹۷۰ ایجاد شد. شاید بلیس بهترین زبان برنامه‌نویسی سیستم شناخته شده تا شروع به کار کردن زبان سی بود. از آن پس سی رونق گرفت و بلیس کمرنگ شد. هنگامی که سی در نخستین دورهٔ رشدش بود در آزمایشگاه بل در تعدادی پروژه دربارهٔ شایستگی بلیس در مقابل سی بحث شد.  

بلیس یک زبان بدون نوع و ساختار بلوکی است که بر پایهٔ عبارات است نه دستورات؛ و شامل سازنده‌هایی برای ادارهٔ استثناء، کروتین هاو ماکرو هااست.  

نام این زبان در زمان‌های گوناگون کوتاه شدهٔ "Basic Language for Implementation of System Software" (زبان پایه برای اجرای نرم‌افزار سیستم) یا "System Software Implementing Language Backwards" است.  

DEC کامپایلرهایی برای BLISS برای PDP-10, PDP-11 , VAX , DEC PRISM , MIPS , DEC Alpha , Intel IA-32 ایجاد کرد و از آن در خانه در دههٔ ۱۹۸۰ به صورت گسترده استفاده شد. اکثر برنامه‌های سودمند برای سیستم عامل VMS به زبان BLISS-32 نوشته شده بود.

توضیحات زبان
------------

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

این بدان معناست که هر ساختار زبان که تعریف نشده‌است یک عبارت است. عبارات یک مقدار را تولید می‌کنند و احتمالاً باعث یک عمل مانند تغییر حافظه ، انتقال کنترل یا اجرای یک حلقهٔ برنامه می‌شود. برای مثال نقطهٔ مقابل یک دستور تخصیص در بلیس، یک عبارت است که خودش مقدار دارد. مقدار یک عبارت در بلیس می‌تواند استفاده شود یا دور اتداخته شود. در نهایت بلیس شامل امکانات ماکرو است که یک سطح از توانایی که غالباً فقط در ماکرو-اسمبلرها استفاده می‌شود را فراهم می‌کند.  

بلیس دارای مشخصات زیر است:

* همهٔ **ثابت‌ها** واژهٔ کامل هستند که برای ماشبن استفاده می‌شوند. برای مثال در ماشین ۱۶ بیتی مثل PDP-11 یک ثابت ۱۶ بیت است، در کامپیوتر VAX ثابت‌ها ۳۲ بیتی هستند و در PDP-10 همه ۳۶ بیتی هستند.
* **رجوع به متغیر** همیشه به آدرس آن متغیر است. برای مثال دستورالعمل {\displaystyle Z+8} به آدرس Z، هشت تا اضافه می‌کند و نه به مقدار آن. اگر نیاز به اضافه کردن ۸ تا به مقدار z بود باید یک پیشوند نقطه به متغیر اضافه کنیم. پس برای اجرای این دستور باید به صورت {\displaystyle .Z+8} نوشته شود که ۸ را به مقدار z اضافه می‌کند.
* **تخصیص** با نماد = صورت می‌گیرد. مثلاً {\displaystyle Z=8} که یک ثابت با محتوای ۸ تولید می‌کند و آن را در محلی که مرتبط به آدرس Z است ذخیره می‌کند؛ بنابراین می‌توانیم چیزی مانند {\displaystyle Z+12=14} را انجام دهیم که ثابت ۱۴ را در محلی که آدرس آن ۱۲ تا بیشتر از محل Z است قرار می‌دهد.
* **بلوک دستورها** مانند چیزی است که در الگول وجود دارد. یک بلوک با عبارت BEGIN شروع می‌شود و با عبارت END خاتمه می یابدو مثل الگول دستورها با؛ خاتمه می‌یابند. در روش دیگر پرانتز باز می‌تواند برای شروع بلوک و پرانتز بسته برای انتهای آن استفاده شود. وقتی که پرانتزها حاوی یک عبارت هستند قانون اولویت‌ها به کار گرفته می‌شود که در آن عبارت‌های داخل پرانتز اول محاسبه می‌شوند.
* **دستورات شرطی** عبارت IF را اسنفاده می‌کنند که حالت صحیح /غلط را امتحان می‌کنند، اعمال متناوبی انجام می‌دهند و یک نتیجه باز می‌گردانند.
* **مقایسه** از لغت کلیدی EQL برای برابری، GTR برای بزرگتری و NEQ برای نابرابری استفاده می‌کند. برای مثال کد زیر مقدار خالص z را برابر با آدرس نشان داده شده توسط Q قرار می‌دهد:

 
```
 Q = (IF .Z GTR 0 THEN .Z ELSE -.Z); 
```
 
* **شناسه‌ها** (متغیرها و ثوابت) باید قبل ازاستفاده با استفاده از لغت کلیدی OWN تعریف شده باشند. تعریف کردن معمولی یک متغیر باعث می‌شود تا کامپایلر برای آن، فضا تخصیص دهد. در مواقع ضروری یک متغیر ممکن است برابر با یک ماشین آدرس با تعریف BIND قرار گیرد. این ویژگی در درجهٔ اول برای دسترسی ثبات دستگاه و هم آدرس‌های مشخص خاص استفاده می‌شود.
* **زیرروال‌ها** در زبان، روال خوانده می‌شوند و با کلمهٔ کلیدی ROUTINE تعریف می‌شوند.
* **ماکروها** که برای جایگزینی متن اجازه می‌دهند با کلمهٔ کلیدی MACRO تعریف می‌شوند.
* این زبان **آرایه‌ها** را پشتیبانی می‌کند با کلمهٔ کلیدی VECTOR تعریف می‌شوند.
* این زبان بعضی **سازنده‌های برنامه‌نویسی سطح بالا** را پشتیبانی می‌کند. مانند:
	+ مسیرهای اجرایی جایگزین توسط عبارت CASE
	+ حلقه‌ها از طریق استفادهٔ INCR، که مانند عبارت FOR در الگول است.
	+ تابع‌های رشته‌ای
	+ تبدیل داده (عدد به رشته و...)

### مثال

 
```
 MODULE E1 (MAIN = CTRL) =
BEGIN
FORWARD ROUTINE
  CTRL,
  STEP;
ROUTINE CTRL =
!+
! This routine inputs a value, operates on it, and
! then outputs the result.
!-
  BEGIN
  EXTERNAL ROUTINE
  GETNUM,! Input a number from terminal
  PUTNUM;! Output a number to terminal
  LOCAL
  X,! Storage for input value
  Y;! Storage for output value
  GETNUM(X);
  Y = STEP(.X);
  PUTNUM(.Y)
  END;
ROUTINE STEP(A) =
!+
! This routine adds 1 to the given value.
!-
  (.A+1);
END
ELUDOM
 
```

نسخه‌های زبان برنامه نویسی بلیس
-------------------------------

* BLISS-10
* BLISS-11
* BLISS-16
* BLISS-16C
* BLISS-32
* BLISS-64
* Common BLISS

منابع
-----

* مشارکت‌کنندگان ویکی‌پدیا. «BLISS». در *دانشنامهٔ ویکی‌پدیای انگلیسی*.
* کتاب طراحی و پیاده‌سازی زبان‌های برنامه سازی تألیف ترنس دبلیو. پرات و مارون وای زیکوویتز ترجمه عین الله جعفرنژاد قمی