תכנות פונקציונלי
במחשבים, תכנות פונקציונלי היא פרדיגמת תכנות השמה דגש על חישוב ביטוי תוך שימוש בפונקציות ככלי ההפשטה העיקריים. זאת בניגוד לפקודות (Statements) שהן הכלי העיקרי של שפות התכנות מהפרדיגמה הנפוצה יותר, הפרדיגמה האימפרטיבית.
על השפות הפונקציונליות נמנות שפות כגון LISP הוותיקה, Haskell, ML ו-Scheme.
הפרדיגמה הפונקציונלית לא נכנסה אל הזרם המרכזי בעולם התוכנה, אך שפות מודרניות רבות הנמצאות בשימוש מסיבי בתעשיה, אף שאינן שפות פונקציונלית, מאפשרות מאפיינים פונקציונליים רבים: פייתון ו-#C הן שתי דוגמאות בולטות.
[עריכה] רקע תאורטי
המבנה התאורטי עליו מתבססת הפרדיגמה הוא תחשיב למבדא, בניגוד למודל מכונת טיורינג עליו מתבססת הפרדיגמה האימפרטיבית, הנפוצה יותר.
מודל מכונת טיורינג הוא מודל שבו יש "מכונה" מופשטת המבצעת אלגוריתם - רצף פקודות שינויי מצב; בהתאם לכך, שפות אימפרטיביות מבצעות אלגוריתם - פעולה לאחר פעולה. לעומת זאת, תחשיב למבדא עוסק בחישוב של פונקציות - בעיקר חישוב רקורסיבי. הפרדיגמה הפונקציונלית רואה את הפעולה של תוכנית כפונקציה מקלט אל פלט - המחשב מקבל קלט מסויים, מבצע עליו חישוב ומוציא פלט. תוכנית פונקציונלית בנויה בהתאם, כרצף של הצהרות על פונקציות ומשתנים, שלאחריהם מתבצעת קריאה לפונקציה, הנעזרת בפונקציות אחרות, וכן הלאה, עד שבסופו של דבר מוחזר ערך כלשהו, והוא ערך הפלט - תוצאת החישוב (בהקשר זה פלט איננו הדפסה אל המסך, המדפסת, או כל רכיב חומרה אחר).
הוכח כי המודלים הללו שקולים, ולכן אין הבדל מבחינת כוח החישוב בין שפות התומכות בפרדיגמה הפונקציונלית לבין שפות אימפרטיביות טהורות (כגון שפת C). עם זאת, עשויים להיות הבדלים ניכרים בהיבט של נוחות ההבעה של חישובים מסויימים מול חישובים אחרים, קריאות, עקביות מתמטית, יעילות המימוש וכן הלאה.
ישנו דמיון מסוים בין תכנות פונקציונלי לתכנות לוגי, אך האחרון עוסק במבנים כלליים יותר - יחסים מול פונקציות שהן מקרה פרטי של יחסים.
[עריכה] פונקציות כערכים לכל דבר
פונקציות בשפות פונקציונלית הן עצמים בעלי קיום בלתי תלוי משל עצמם, כלומר הן ערכים לכל דבר, כמו מספרים או מחרוזות. ניתן לשלוח אותן לפונקציות אחרות כפרמטרים, והן יכולות לשמש כערכי החזרה.
תכנות פונקציונלי נקרא "טהור" אם אין בו שינוי מצב, כלומר אין בו משתנים או אובייקטים שמשנים את מצבם הפנימי. כל עיבוד מידע נעשה על ידי יצירת ערכים חדשים כנדרש. כתיבה כזו מקלה על הוכחות נכונות התוכנה ביחס למפרטיה. שינוי מצב של המערכת נקרא "תופעות לוואי". מכיוון שכל תקשורת של תוכנית עם העולם החיצון (קלט/פלט) משנה מצב של אובייקט ומסיבות נוספות, של נוחות או יעילות, גם שפות פונקציונליות "טהורות" כוללות תופעות לוואי, אך חלקן מרכזות את המבנים בעלי "תופעות הלוואי" במקום מוגדר, לדוגמה, במבנה שנקרא מונדה.
[עריכה] דוגמאות
המקבילה ללולאה בשפות תכנות נפוצות היא הקריאה הרקורסיבית. לדוגמה, מימוש של חישוב 10 עצרת בשפת C עשוי להיראות כך:
int x=1, i=1;
while (i<=10) {
x*=i;
++i;
}
זהו מימוש אימפרטיבי: יש בתוכנית שני משתנים המשנים את ערכם תוך כדי ריצת התוכנית. מימוש פונקציונלי של אותו חישוב ייראה כך:
fun fact 0 = 1 | fact n = n * (fact n-1)
fact 10
המימוש הזה תואם ישירות את ההגדרה המתמטית הרקורסיבית של פעולת העצרת:
ותנאי ההתחלה
. במימוש זה, אין כל שינוי בערכי המשתנים! למעשה, המשתנים בשפות פונקציונליות אינם ברי שינוי: בכל קריאה לפונקציה נוצרים משתנים חדשים, המקבלים ערכים חדשים, וכן הלאה.
| תחומים במדעי המחשב | ||
|---|---|---|
| יסודות מתמטים |
לוגיקה מתמטית • תורת הקבוצות • תורת המספרים • תורת הגרפים • תורת הטיפוסים • תורת הקטגוריות • אנליזה נומרית • תורת האינפורמציה |
|
| תורת החישוביות | ||
| אלגוריתמים ומבנה נתונים | ||
| שפות תכנות ומהדרים |
ניתוח מלל • מפרש • תכנות פרוצדורלי • תכנות מונחה עצמים • תכנות פונקציונלי • תכנות לוגי • פרדיגמת תכנות |
|
| חישוב מבוזר, ועיבוד מקבילי | ||
| הנדסת תוכנה |
ניתוח מערכות מידע • עיצוב תוכנה • תכנות מחשבים • מתודות פורמליות • בדיקות תוכנה • מתודולוגיית פיתוח תוכנה |
|
| תקשורת | ||
| בסיס נתונים |
מערכת לניהול בסיסי נתונים • מסד נתונים יחסי • SQL • תנועה • אינדקסים • כריית מידע |
|
| בינה מלאכותית |
חשיבה אוטומטית • בלשנות חישובית • ראייה ממוחשבת • אינטליגנציה חישובית • מערכת מומחה • למידה חישובית • עיבוד שפה טבעית • רובוטיקה |
|
| גרפיקה | ||
| שימושים במדע |
ביואינפורמטיקה • מדעים קוגניטיביים • כימיה חישובית • פיזיקה חישובית • אנליזה נומרית |
|