BLISS

**BLISS** היא שפת תכנות אשר פותחה על ידי ויליאם אלן וולף, ד.ב ראסל ו-א.נ הברמן מאוניברסיטת קרנגי מלון בשנת 1970. היא הייתה אחת משפות התכנות הידועות ביותר (ישנם הטוענים שהייתה הכי ידועה) עד להופעתה של שפת C כמה שנים לאחר מכן. כאשר C הייתה בחיתוליה, מספר פרויקטים במעבדות בל דנו ביתרונות ובחסרונות של BLISS לעומת C.

BLISS היא שפת תכנות עם טיפוסיות typeless, כלומר, יש רק סוג נתונים יחיד, ולפיכך משתנה יכול להכיל כל סוג נתונים. זאת בניגוד למרבית שפות התכונות, בהן ישנה חלוקה לטיפוסים (סוגי משתנים). שפות כאלו לדוגמה הן פייתון, C, java ועוד רבות. לשפות שונות ישנם טיפוסים שונים במקצת, אם כי ישנם כאלה החוזרים על עצמם ברוב השפות, כגון **integer** – מספר שלם, **string** – מחרוזת, ו-**float** – מספר עשרוני. שפות נוספות עם טיפוסיות typeless הן Rexx ו-TCL.

## תיאור השפה
ל-BLISS יש פיצ'רים רבים של שפות תכנות עיליות אחרות (אם כי ניתן לטעון ש-BLISS היא שפת low level ביחס לשפות עיליות כגון פייתון ו-#C). יש לה מבנה של בלוקים של קוד, מחסנית (מבנה נתונים שבו הנתון האחרון שנכנס אליו יוצא ראשון) אוטומטית ומנגנונים להגדרה ולקריאה למתודות רקורסיביות (מתודות שמזמנות את עצמן). בנוסף, BLISS מספקת מגוון מבני נתונים מוגדרים מראש ושירותים לבדיקות תוכנה ואיטרציות. עם זאת, ל-BLISS חסרים פיצ'רים מסוימים של שפות תכנות עיליות אחרות, למשל, אין לה שירותים מוגדרים מראש לקלט ופלט. בנוסף לכך, BLISS היא יותר "שפת מונחים" מאשר "שפת הצהרות", קרי, כל מבנה נתונים בשפה שאינו הצהרה, הוא ביטוי. ביטויים מפיקים ערך וגם יכולים לגרום לשינוי באחסון הזיכרון, העברת שליטה (מעבר לשורה אחרת בקוד, שמתבצע בשפת אסמבלי בפקודת JMP ובשפות עיליות יותר כגון C בפקודת goto למשל), והרצה של לולאות (לולאות גם הן סוג של העברת שליטה – כזו אשר פונה חזרה לשורה שבה החלה הלולאה או ל-label).

### מאפייני השפה

* כל הקבועים ב-BLISS (משתנים שערכם נשאר קבוע) הם בגודל מבנה הנתונים word, בהתאם לארכיטקטורה בה הם נמצאים, לדוגמה, במחשבים רבים כגון PDP-11, גודל word הוא 16 סיביות (16 ספרות בינאריות) ולכן גם הקבועים יהיו בגודל 16 סיביות. במחשב VAX, קבועים הם בגודל 32 סיביות ואילו במחשב PDP-10, קבוע הוא בגודל 36 סיביות.
* מצביע למשתנה הוא תמיד הפניה לכתובת בה המשתנה נמצא בזיכרון. לדוגמה, אם הכתובת בזיכרון של משתנה N היא 100H (בבסיס הקסדצימלי), וערכו 3, אזי N הוא הפניה לכתובת 100H שמכילה 3. דוגמה נוספת היא ההוראה `M+3`, אשר מוסיפה 3 לערך של משתנה `M` – זאת אומרת, לכתובת בזיכרון של משתנה M, יוסף 3. ב-BLISS, על מנת לבצע פעולה שכזו, יש להוסיף לפני שם המשתנה נקודה (' . ') : `M+3.`.
* הצהרות לפתיחה ולסגירת בלוקים (קטעי קוד) נעשות בדומה לשפת התכנות ALGOL : קטע קוד מתחיל בהצהרת `BEGIN`, ונגמר ב-`END`. כמו ב-ALGOL, הצהרות מסתיימות בנקודה פסיק `;`.
* תנאים מבוצעים, כמו בשפות רבות אחרות, בביטויי IF, אשר מבצע פעולה אם הערך הבוליאני (משתנה אשר מכיל TRUE או FALSE) שניתן לו מתברר כאמת (TRUE), ויכול לבצע פעולה אם הערך מתברר כשגוי (FALSE) באמצעות ביטוי ה-ELSE.
* השוואה בין ערכים נעשית באמצעות מילות שמורות (מילים בעלות ערך מיוחד בשפה) כגון `EQL` אשר בודקת האם שני ערכים שווים, `GTR`, אשר בודקת האם ערך אחד גדול מהשני ו-`NEQ`, אשר בודקת אם שני ערכים לא שווים. ניתן לראות פעולות בשמות דומים בשפות תכנות אחרות, כגון בתכנות קובצי אצווה. למשל, קטע קוד זה יכניס את הערך המוחלט של משתנה Z במשתנה Q:
*::`Q = (IF .Z GTR 0 THEN .Z ELSE -.Z)`
* מתודות ב-BLISS נקראות שגרות (rutines) ומוגדרים על ידי המילה השמורה `RUTINE`.
* פקודות מאקרו (Macros) מוגדרות באמצעות המילה השמורה `MACRO`.
* השפה תומכת במערכים (מערך הוא מבנה נתונים) ומוגדרים באמצעות המילה השמורה `VECTOR`.
* לשפה מספר תכונות של שפות תכנות עיליות:
**המרות אוטומטיות מסוימות מסוג נתונים אחד לאחר (למשל ממספר למחרוזת).
**לולאות באמצעות ביטוי ה-`INCR`, שדוגמה ללולאת `FOR` ב-ALGOL.
**פעולות מובנות בשפה על מחרוזות.

## דוגמה
דוגמה זו נלקחה במדויק מה-*Bliss Language Manual:*
```
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
[excessive quote]
```


## גרסאות
* BLISS-10
* BLISS-11
* BLISS-16
* BLISS-11
* BLISS-32
* BLISS-36
* BLISS-64
* Common BLISS

## לקריאה נוספת

* Wulf, W. A.; Russell, D. B.; Habermann, A. N. (1971). *[http://www.cs.arizona.edu/classes/cs520/spring06/bliss.pdf BLISS: A Language for Systems Programming]*. CACM 14(12):780-790, Dec 1971
* Wulf, W. A.; Johnson, R. K.; Weinstock, C. B.; Hobbs, S. O.; Geschke, C. M. (1975). *The Design of an Optimizing Compiler*. New York: Elsevier, .
* Brender, Ronald F. (2002). "The BLISS programming language: a history" (PDF). *Software: Practice and Experience*. **32** (10): 955–981. doi:10.1002/spe.470.
** BLISS Manual at DECUS
** Alan Lehotsky posting about BLISS at DEC
** "BLISS: A Language for Systems Programming" by W.A. Wulf, D.B. Russell, and A.N. Habermann. (PostScript)
** Session notes for "Introduction to BLISS" by Matthew D. Madison. (PostScript)


## קישורים חיצוניים

## הערות שוליים

קטגוריה:ערכים שבהם תבנית אתר רשמי אינה מתאימה להוספה אוטומטית
קטגוריה:שפות תכנות
קטגוריה:תוכנות שהושקו ב-1970