- רעיונות בסיסיים
- מאפיינים
- פונקציות טהורות
- תכונות מהשורה הראשונה
- שקיפות הפניה
- רקורסיה
- חוסר יכולת
- דוגמאות
- גישות חיוביות והצהרתיות
- פונקציות טהורות
- מתפקד כאובייקטים מהשורה הראשונה
- יתרון
- קצר יותר וקל להבנה
- אין זרימת שליטה
- חסרונות
- יישומים
- מתודולוגיה פונקציונאלית
- שפות התומכות בתכנות פונקציונאליות
- ד
- ארלנג
- האסל
- מ.ל.
- Caml המטרה
- תָכְנִית
- הפניות
תכנות הפונקציונלי תואם את תכנות הדפוס מבוסס על הרעיון של הקובע את ההתנהגות של תכנית כמודל מתמטי פונקציונלי ולא רצפים מפורשים של הוראות מעבדות, המהווה את הקונספט העיקרי בתכנות הכרחי.
שפה פונקציונאלית מדגישה אמירות ומונחים ולא ביצוע הצהרות. בתכנות זו התוצאה תהיה תלויה רק בפרמטרים המועברים לפונקציה, בניגוד לסוגים אחרים המצייתים למצב מקומי או גלובלי.
תרשים כיצד פועלת פונקציית המיפוי בשפת התכנות הפונקציונאלית של הייסל. מקור: מאת Pluke - עבודה משלו, CC0 commons.wikimedia.org.
שמו בא מהפונקציות המתמטיות, שהן הקצאת קבוצת תשומות לסט תפוקות. פונקציה מתמטית לא עושה כל עבודה אלא מתארת את מודל התהליך, ומסבירה באמצעות נוסחה מה מערך התשומות מייצר בפונקציה.
רעיונות בסיסיים
הבסיס עליו התבססה התכנות הפונקציונליות היה חשבון הלמבדה, אשר פותח במהלך העשור השלישי של המאה ה -20 כדי להגדיר וליישם פונקציות. LISP הייתה שפת התכנות הראשונה מסוגה, שעוצבה בשנת 1960.
למרות שרוב שפות התכנות מורכבות מכניסות, יציאות ומשתנים חיצוניים שניתן לקבוע או להשתמש בהן מתוך פונקציות, תכנות פונקציונלית נמנעת מכך. הרעיון הוא שכל פעם שקוראים לפונקציה עם אותם פרמטרים, היא צריכה להחזיר את אותו ערך.
מאפיינים
שפות תכנות פונקציונליות נקראות יישומים, מכיוון שהפונקציות מיושמות על הפרמטרים שלהן, כמו גם הצהרתיות ולא-פרוצדוראליות, מכיוון שההגדרות מציינות מה צריך לחשב ולא כיצד מחושב.
פונקציות טהורות
פונקציה היא טהורה כאשר אין לה תופעות לוואי ניתנות לצפייה, כמו שינוי משתנים חיצוניים, שינויי מערכת קבצים וכן הלאה.
פונקציות אלה נחשבות משכנעות מכיוון שהן לא ישנו במפורש משתנים שחלקים אחרים של הקוד עשויים להיות תלויים בהם בשלב מסוים. זה נראה מביך לקוד עם ההגבלות הללו, אך יש לראות בפונקציות אלה כדטרמיניסטיות, ניתנות לחיזוי והלחנה.
תכונות מהשורה הראשונה
פונקציות נחשבות לערכים שניתן להקצות למשתנים, כך שניתן לעבור אליהם ולהחזיר אותם מפונקציות אחרות. כלומר, ניתן להשתמש בפונקציה כאילו היה פרמטר או כערך שמוחזר.
זה מרמז שאפשר לעבור את הפונקציה ככזו, ולא רק את תוצאת הפונקציה. לדוגמה, שקול את הפונקציה הכפולה (x), המחזירה פעמיים את הערך של פרמטר הקלט שלה. לפיכך, כפול (2) יחזיר 4.
מכיוון שמדובר בפונקציה מהמחלקה הראשונה, הקוד (כפול (כפול (2)) יהיה זהה לקוד הכפול (4.) זה מאפשר לך לקנן פונקציה אחת כפרמטר של אחרת וכן הלאה.
שקיפות הפניה
זה מתייחס לעובדה שבתבנית תכנות זו אין הצהרות מטלות. כלומר, עליך להגדיר משתנים חדשים אם ברצונך לאחסן ערכים נוספים. לכן מצבו של משתנה קבוע בכל עת.
זה מבטל את האפשרות הקלה ביותר לאפקטים לא רצויים, מכיוון שכל משתנה ניתן להחליף בערכו האמיתי בכל נקודת ביצוע של התוכנית.
רקורסיה
בתכנות פונקציונליות אין לולאות "עבור" ו- "בזמן". במקום זאת, איטרציה נשענת על רקורסיה. השחזור מיושם באמצעות פונקציות רקורסיביות, שקוראים לעצמם שוב ושוב עד להגיע לתיק הבסיס.
חוסר יכולת
משתנים אינם ניתנים לשינוי, כלומר לא ניתן לשנות משתנה לאחר שאתחל. למרות שאתה יכול ליצור משתנה חדש, אסור לשנות את המשתנים הקיימים.
דוגמאות
גישות חיוביות והצהרתיות
בעזרת דוגמה ניתן לנתח את ההבדל בין גישות אלה, לבצע את אותה פעולה בשני הסידורים, כלומר לסנן את המספרים המוזרים מהרשימה תוך החלפת 5 במספרים שווים פחות מ -5.
זה אותו חישוב, עם אותה תוצאה. עם זאת, כפי שניתן לראות, הקוד הכרח הוא מילולי ולא ברור מייד. מצד שני, הגישה ההצהרתית היא קריאה ומפורשת, מכיוון שהיא מתמקדת במה שאתה רוצה לקבל.
פונקציות טהורות
ניתן להבהיר מה מוגדר כפונקציות טהורות וטהורות באמצעות כמה דוגמאות בסיסיות:
מתפקד כאובייקטים מהשורה הראשונה
המשמעות היא להשתמש בפונקציות באותו אופן בו משתמשים בנתונים. לכן ניתן להעביר אותם כפרמטרים לפונקציה אחרת. בדוגמה הבאה ניתן להעביר את פונקציית ה- int כפרמטר לפונקציית המפה:
רשימת >>> (מפה (int,))
ניתן להקצות אותם למשתנים ולהחזירם. לדוגמה, בקוד הבא תוכלו להקצות את פונקציית hello_world, ואז לבצע את המשתנה כפונקציה.
יתרון
- התמקדו במה שאתה רוצה להשיג (הצהרתית) ולא כיצד להשיג זאת (ציווי).
- הם אינם מכילים הצהרות הקצאה, כך שאחרי שתינתן ערך למשתנים הם כבר לא ישתנו. לכן התוכניות הפונקציונליות אינן מכילות תופעות לוואי.
- הזרימה הלוגית ברורה, מכיוון שהמדינה פחות מפוזרת ואינה משתנה באופן מרומז.
- תומך במושג הערכה עצלנית, שמשמעותו שהערך מוערך ונשמר רק בעת הצורך.
- מכיוון שפונקציות טהורות אינן משנות מצב כלשהו והן תלויות לחלוטין בקלט, הן קלות להבנה. ערך התשואה הניתן על ידי פונקציות כאלה זהה לתוצאה שהופקה על ידיהם.
- מאופי הפונקציות הטהורות כדי להימנע מכך שהמשתנים או כל נתונים חיצוניים משתנים, יישום המקביל הופך להיות אפקטיבי.
- מתייחסים לפונקציות כערכים, עוברים לפונקציות אחרות כפרמטרים. זה משפר את ההבנה ואת הקריאות של הקוד.
- פונקציות טהורות לוקחות את הפרמטרים פעם אחת, ומפיקים פלט ללא שינוי. השימוש בערכים בלתי ניתנים לשינוי מקל על ניפוי באגים ובדיקות.
קצר יותר וקל להבנה
הם קצרים וקלים יותר להבנה מאשר ציווי. מחקרים הראו כי התפוקה הממוצעת של מתכנת במונחים של שורות קוד זהה פחות או יותר לכל שפת תכנות, ומתורגמת לפרודוקטיביות גבוהה יותר.
אין זרימת שליטה
קריאה לפונקציה לא יכולה להשפיע אחרת מחישוב התוצאה שלה. זה פוסל מקור עיקרי לטעויות, מה שהופך את סדר הביצוע ללא רלוונטי, מכיוון ששום תופעת לוואי אינה יכולה לשנות את ערך הביטוי וניתן להעריך אותו בכל עת.
מתכנת משוחרר מהנטל לבסס זרימת שליטה. מכיוון שניתן לבחון ביטויים בכל עת, ניתן להחליף משתנים בערכיהם.
אוטונומיה זו הופכת תוכניות פונקציונליות לניהול מתמטי יותר מתוכניות קונבנציונאליות.
חסרונות
- פרדיגמת התכנות הפונקציונלית אינה פשוטה, ולכן קשה למתחיל להבין.
- קשה לתחזק, שכן חפצים רבים מתפתחים במהלך הקידוד.
- במקרים מסוימים, כתיבת פונקציות טהורות גורמת להפחתת הקריאות של הקוד.
- ערכים בלתי משתנים בשילוב עם רקורסציה יכולים להוביל להפחתה דרסטית בביצועי המערכת.
- שימוש חוזר מסובך מאוד ודורש ביצוע מחדש מחדש מתמיד.
- כתיבת תוכניות בסגנון רקורסיבי במקום שימוש בלולאות או לולאות יכולה להיות משימה מפחידה מאוד.
- ייתכן שהאובייקטים אינם מייצגים את הבעיה בצורה נכונה.
- למרות שכתיבת פונקציות טהורות מתגלה כפשוטה, שילובם עם שאר האפליקציה ופעולות הקלט / פלט הוא די קשה
יישומים
תכנות בינה מלאכותית נעשית בשפות תכנות פונקציונאליות וטכניקות בינה מלאכותית נודדות ליישומים בעולם האמיתי.
זה גם מצטיין ביישום מודלים מתמטיים מורכבים. מסיבה זו, אחד השימושים העיקריים בשפות פונקציונליות היה באופן מסורתי אקדמי. זה שימושי לפיתוח מפרטים ניתנים להפעלה ויישום אבטיפוס.
שפות פונקציונליות רבות מצטיינות גם ביישום עיבוד מקביל. זה נובע מיכולתו לנצל פונקציות טהורות, המחזירות תמיד את אותו ערך ללא קשר לסדר בו הן מבוצעות.
מתודולוגיה פונקציונאלית
WhatsApp משתמש בשפת התכנות Erlang, העוקבת אחר מודל התכנות הפונקציונאלי, ובכך מאפשרת ליותר ממאה מעובדיה לטפל בנתונים השייכים לכ- 1.6 מיליארד איש.
מוביל חשוב נוסף של סגנון התכנות הפונקציונלי הוא האסקל. היא משמשת את פייסבוק במערכת האנטי ספאם שלה. אפילו JavaScript, אחת משפות התכנות הנפוצות ביותר, מתהדר בתכונותיה של שפה פונקציונאלית שהוקלדה באופן דינאמי.
שפות התומכות בתכנות פונקציונאליות
ד
הוא תוכנן לאחר C ++, תוך שהוא מקבל את כל היתרונות שלו תוך ביטול חולשותיו שנצפו בכך שהוא צריך להיות תואם ל- C.
ארלנג
זה ניתן להרחבה ובו-זמנית מאוד, מה שהופך אותו לאידיאלי עבור טלקומוניקציה ויישומים אחרים המקבלים כמויות אדירות של נתונים בסדר בלתי צפוי.
האסל
זוהי שפת תכנות פונקציונלית טהורה, המשתמשת בחישוב למבדה.
מ.ל.
הוא משמש ביישומים מתמטיים, מדעיים, פיננסיים, אנליטיים ואחרים. אחת החוזקות שלה היא הפיכת תוכנה לטיפול בתוכנות אחרות.
Caml המטרה
זוהי שפת קוד פתוח המבוססת על Caml. זה נוטה ליצור תוכניות קלות מאוד, ועוזרות להם לטעון ולהפעיל מהר יותר מאלו שנוצרו על ידי שפות אחרות.
תָכְנִית
זה מבוסס על תחביר LISP ומבנה ALGOL. בשל הפשטות שלו, הוא משמש בקורסים רבים במדעי המחשב כהקדמה לעיצוב התוכניות כדי להראות כמה מהיסודות של תכנות מחשבים.
הפניות
- מי מארח את זה (2019). למדו תכנות פונקציונלית: סגנון קידוד זה יפוצץ את דעתכם. לקוח מ: whoishostingthis.com.
- אנדראה ברטולי (2019). מבוא הולם לתכנות פונקציונאלי. נלקח מ: dev.to.
- האקר אדמה (2020). תכנות פונקציונלית. נלקח מ: hackerearth.com.
- קלוז'ור (2020). תכנות פונקציונלית. נלקח מ: clojure.org.
- Akhil Bhadwal (2020). תכנות פונקציונלית: מושגים, יתרונות, חסרונות ויישומים. גַרזֶן. לקוח מ: hackr.io.
- Guru99 (2020). מה זה תכנות פונקציונלית? הדרכה עם דוגמה. נלקח מ: guru99.com.