Brainfuck

Brainfuck (בתרגום חופשי מאנגלית: "זיון מוח"), ובקיצור BF, היא שפת תכנות אזוטרית המורכבת משמונה פקודות בלבד, אך יחד עם זאת ממָמשת מכונת טיורינג אוניברסלית, ובנוסף, פונקציות קלט ופלט. את השפה פיתח אורבן מילר, בשנת 1993. השפה לא נועדה לשרת צורך מעשי כלשהו, אלא למטרת שעשוע והדגמה של מינימליזם.

מטעמי נימוס, השפה מכונה גם ***Brainf או Brainf*ck.

המכונה שעליה פועלת שפת BF כוללת: 
* זיכרון לאחסון התוכנית.
* זיכרון נפרד לאחסון הנתונים שעליהם פועלת התוכנית. זהו מערך של תאים, שגודל כל אחד מהם בית אחד והערך ההתחלתי של כל אחד מהם הוא 0.
* מצביע על התא הנוכחי בזיכרון הנתונים. בערכו ההתחלתי המצביע מצביע על התא הראשון בזיכרון הנתונים. 
* מחרוזת קלט.
* מחרוזת פלט.

== הפקודות של BF ==
{| class="wikitable"
! הפקודה !! המשמעות
|- 
| align="center" | < || קדם את המצביע לתא הבא
|- 
| align="center" | > || החזר את המצביע תא אחד לאחור
|- 
| align="center" | + || הוסף 1 לתא הנוכחי
|- 
| align="center" | - || חסר 1 מהתא הנוכחי
|- 
| align="center" |, || קרא תו ממחרוזת הקלט והכנס את ערך ה-ASCII שלו לתוך התא הנוכחי
|- 
| align="center" | . || כתוב את ערך ה-ASCII של התא הנוכחי למחרוזת הפלט
|- 
| align="center" | ] || דלג קדימה לפקודה שאחרי ה-[ המתאים אם התא הנוכחי שווה ל-0
|- 
| align="center" | [ || דלג אחורה לפקודה שאחרי ה-] המתאים אם התא הנוכחי שונה מ-0
|-
| כל תו אחר || כל תו אחר, כולל רווחים ושורות חדשות, נחשב להערה, ופרשן או מהדר השפה מתעלם ממנו 
|}
ניתן להוכיח ששפת תכנות זו מממשת מכונת טיורינג אוניברסלית שלמה (במידה ויש מספר אינסופי של תאים או שאין הגבלה על גודל התא). אוצר הפקודות הדל של השפה, ופשטותן של הפקודות, עושים את התכנות באמצעותה למשימה מייגעת (עניין המסביר את שמה). 

דוגמה לתוכנית Hello world (כמובן, זו לא הדרך היחידה לייצר פלט זה):
<syntaxhighlight lang="bf" line="1">
+++++ +++++ מאתחל את האוגר (תא מס' 0) ב 10
[ משתמש בלולאה כדי להוסיף לכל אחד מהתאים הבאים את הערכים 7/10/3/1
 > +++++ ++ מוסיף 7 לתא מס' 1
 > +++++ +++++ מוסיף 10 לתא מס' 2 
 > +++ מוסיף 3 לתא מס' 3
 > + מוסיף 1 לתא מס' 4
 <<<< - מחזיר את הרגיסטר לתא מס' 0
]
 :לאחר 10 מעברים על הלולאה שבשורות 2–8 תאים 1–4 מכילים את הערכים הבאים
 תא מס' 1 מכיל 70
 תא מס' 2 מכיל 100
 תא מס' 3 מכיל 30
 תא מס' 4 מכיל 10
 
> ++ . מדפיס 'H' מוסיף לתא 1 שמכיל 70 עוד 2 ומדפיס את קוד האסקי 72 שהוא האות
> + . מדפיס 'e' המצביע מתקדם לתא 2 שמכיל 100 מוסיף לו 1 ומדפיס את קוד האסקי 101 שהוא האות
+++++ ++ . מדפיס 'l' מוסיף 7 ומדפיס את קוד אסקי 108
. מדפיס 'l' קוד אסקי 108
+++ . מדפיס 'o' קוד אסקי 111
> ++ . עובר לתא 3 שמכיל 30 מוסיף לו 2 ומדפיס את קוד אסקי 32 ומדפיס רווח 
<< +++++ +++++ +++++ . מדפיס 'W' 
> . מדפיס 'o' 
+++ . מדפיס 'r'
----- - . מדפיס 'l'
----- --- . מדפיס 'd'
> + . מדפיס '!'
> . יורד שורה
</syntaxhighlight>

כאמור, רווחים, שורות חדשות, וכל תו פרט לשמונת התווים המרכיבים את השפה נחשב להערה. את אותה תוכנית ניתן לרשום, בלי כל ההערות, כך:
<syntaxhighlight lang="bf">++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.</syntaxhighlight>

ניתן "לתרגם" בין שפת BF ובין חלק משפת C לפי הטבלה הבאה:

{| class="wikitable" style="direction: ltr;"
! Brainfuck שפת !! C שפת 
|-
| align="center" | <code>></code> || <code> ++ptr; </code>
|-
| align="center" | <code><</code> || <code> --ptr; </code>
|-
| align="center" | <code>+</code> || <code> ++*ptr; </code>
|-
| align="center" | <code>-</code> || <code> --*ptr; </code>
|-
| align="center" | <code>,</code> || <code> *ptr = getchar(); </code>
|-
| align="center" | <code>.</code> || <code> putchar(*ptr); </code>
|-
| align="center" | <code>[</code> || <code> while (*ptr) { </code>
|-
| align="center" | <code>]</code> || <code> } </code>
|}
כמובן שתרגום זה איננו מלא, ולא ניתן ליצור כך תוכנית תקינה בשפת C.

== ראו גם ==
* JSFuck
* Ook, שפת תכנות פארודית לאורנגאוטנים המבוססת על BF.

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

קטגוריה:שפות תכנות