פרדיגמות תכנות
הוצג| English | משמעות |
|---|---|
| paradigm/ˈpærədaɪm/ | פרדיגמה |
| low-level/ləʊ ˈlevl/ | זמין |
| imperative/ɪmˈperətɪv/ | פיקטיבי |
| declarative/dɪˈklærətɪv/ | הצהרתי |
| functional/ˈfʌŋkʃənl/ | פונקציונלי |
| pure functions/pjʊə ˈfʌŋkʃnz/ | פונקציות טהורות |
| logic/ˈlɒdʒɪk/ | לוגי |
אותו תוכנית, כתובה בארבעה אופנים
- לבקש את כל הלקוחות בבריטניה ופרוגרמר C כותב לולאה על מערך. פרוגרמר Haskell כותב פילטר. פרוגרמר Prolog מגדיר כלל ושואל שאלה. משתמש SQL כותב
SELECT * FROM Customer WHERE Country = 'UK'. - רק הראשון אומר איך לעשות זאת. האחרים אומרים מה נדרש ומשאירים את ה"איך" למכונה, שיכולה לחזור על סדר העבודה, להשתמש באינדקס או לייצר אותה בשמונה ליבות.
- אף אחד מהם אינו טוב יותר באופן כללי. מה שמשתנה הוא אילו החלטות השפה לוקחת ממך, והעניין הוא בדיוק מהו פאראדיגמה.
- שיעור זה עוסק בפאראדיגמות שהסילבוס מציין: נמוכה-רמה, אימפרטיבית ו-דקלארטיבית.
תכנות נמוך-רמה
- תכנות נמוך-רמה עובד קרוב ל-hardware, בקוד מכונה או בשפת אסמבלר, עם גישה ישירה לרישומים, כתובות זיכרון והוראות יחידיות.
- יתרונות: בקרה מקסימלית ומהירות, וגודל קוד מינימלי ככל האפשר, דבר שחשוב כאשר יש רק קילובייטים של זיכרון.
- חסרונות: היא ספציפית לארכיטקטורה, ולכן יש לכתוב מחדש עבור מעבד אחר, והיא איטית בכתיבה וקשה בתחזוקה.
- משמשת במקום שבו יש לפקד את ה-hardware במדויק: דרייברים, firmware, בקרים מובנים ולולאה הפנימית ביותר של מערכת בזמן אמת.
- תרגלו כתובות מידיות, ישירות, עקיפות, אינדקסיות ויחסיות בשיעור שפת האסמבלי. הניתוח המפורט שלו מראה מדוע אותה ארגומנט יכול לייצר תוצאות שונות.
מה נכון לגבי תכנות ברמת נמוכה? בחרו את כולן שחלות על המצב.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
השליטה מגיעה במחיר: אסמבליות נכתבת לאט וקשה לתחזק, ולכן היא מוגבלת לדרייברים ופירמוויר.
תכנות אימפרטיבי
- תכנות אימפרטיבי, המכונה גם פרוצ'ורדורלי, הוא רצף של הוראות המשנות את מצב התוכנה: הצבות, תנאים, לולאות וקריאות לפרוצ'דורות.
- הפרוגרמר קובע איך התוצאה תחושב, צעד אחר צעד. המשתנים המחזיקים את המצב הם הנקודה המרכזית.
- זוהי הסגנון של Python, C, Java ו-pseudocode, והוא מה שכמעט כולם לומדים תחילה.

הוראה אחרי הוראה, כל אחת משנה מה שנשמר
תכנות אימפרטיבי (פרוצדורלי) מתבסס על:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
קוד אימפרטיבי מספק הוראות צעד-בצעד (הטלות, לולאות, קריאות) המשנות מצב.
תכנות דקלארטיבי
- תכנות דקלארטיבי מגדיר מה יש לחשב, ולא איך. הזמן הריצה מחשב את השלבים.
- תכנות פונקציונלי מרכיב פונקציות טהורות, שאין להן אפקטים לוואי: אותו קלט תמיד מייצר אותו פלט, ואין שינוי מחוץ לפונקציה. Haskell ו-Lisp הם הדוגמאות.
- תכנות לוגי מגדיר עובדות וכללים, ומנוע עונה על שאלות באמצעות היסק. Prolog היא הדוגמה.
- SQL היא השפה הדקלרטיבית שכל כמעט פגש בה: השאלה קובעת אילו שורות נדרשות, והמאגר מחליט איך למצוא אותן.
מעבדת מושגי תכנות
קשר בין הדוגמאות לבין הרעיון התכנותי שהן מדגימות.
תכנות דקלרטיבי פירונו שאתה מציין:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
קוד דקלרטיבי (פונקציונלי, לוגי, SQL) מציין את היעד; התוכן הרץ מחושב לקבוע את הצעדים.
פונקציה טהורה (תכנות פונקציונלי):
Difficulty 1/5 · 100 coins + a small bonus on first completion today
טהורה פירונו שאין אפקטים לוואי ותוצאה דטרמיניסטית, מה שמקל על הבנת הקוד הפונקציונלי.
פארדיגמות דקלרטיביות (פונקציונליות, לוגיות, SQL) מצינות מה לחשב ומשאירות לתוכן הרץ מחושב לקבוע כיצד, בעוד שקוד אימפרטיבי מפרט כל צעד.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
שאלת SQL אומרת אילו שורות תרצה, לא כיצד לסרוק את הטבלאות — ההפך מקוד אימפרטיבי צעד-בצעד.
פונקציה טהורה תמיד נותנת אותה תוצאה עבור אותו קלט וללא ____.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
זה מה שמאפשר לה להיבחן בבידוד, להירץ במקביל בבטחה ולהשמר בתוצאותיה.
דוגמה מופת: זיהוי הפרגמטה
FOR i ← 1 TO n : total ← total + A[i] : NEXT i— אימפרטיבי: רצף של פקודות המשנות את המצב הנשמר בtotal.SELECT Name FROM Customer WHERE Country = 'UK'— דקלרטיבי: הוא אומר אילו שורות נדרשות ולא כיצד לחפש אותן.LDD 200 : ADD 201 : STO 202— נמוך-רמה: הוראות אסמבלי המפנות ישירות למיקומי זיכרון.parent(X, Y) :- father(X, Y).— דקלרטיבי, ובפרט לוגי: כלל ממנו המנוע מסיק תשובות.- ציין את הפרגמטה וגם את התכונה בקוד שמראה זאת.
התאם כל קטע לפרגמטיקה שלו.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
פקודות המשינות מצב, הצהרה על מה שנדרש, הוראות הפונדות זיכרון, וחוק להסקה.
השוואה ביניהן
| פרגמטה | אומר | חוזק | שימוש נפוץ |
|---|---|---|---|
| נמוך-רמה | הוראות מדויקות | שליטה, מהירות, גודל | דרייברים, פירמוויר |
| אימפרטיבי | איך, צעד אחר צעד | ישיר ומוכר | תכנות כללי |
| דקלרטיבי | מה נדרש | קצר, הרצ-טיים אופטימיזציה | שאלות, כללים, טרנספורמציות נתונים |
- שפות מודרניות משלבות אותן. Python היא אימפרטיבית אך כוללת מאפיינים פונקציונליים; SQL ממוקמת בתוך תוכניות שנכתבות באופן אימפרטיבי. פרגמטה היא סגנון, לא חומה.
התאם כל פרגמטיקה לעיקר הרעיון שלה.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
ציונית אומרת איך צעד-צעד; OO מדגמת אובייקטים; פונקציונלי משתמש בפונקציות טהורות; צהירותית מגדירה את המטרה.
מהו ההבדל הבסיסי בין תכנות ציוני לתכנות צהירותי?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
מכיוון שהגרסה הפונקציונלית אינה קובעת את האופן, עיבוד הזמן עלול למפות מחדש את העבודה, להשתמש באינדקס או לבצע אותה במקביל.
דוגמה מופת: למה אפקטים משניים חשובים
- פונקציה טהורה אין לה אפקטים משניים. הסבר יתרון אחד.
- מכיוון שאותו קלט תמיד נותן אותו תוצאה ואין שינוי בחוץ, פונקציה טהורה ניתנת לבדיקה בידוד: ללא הכנה, ללא מצב נסתר לסידור.
- היא יכולה גם לרץ ב-מקביל בבטחה, מכיוון ששתי קריאות לא יכולות להתערב אחת בשנייה, ותוצאתה ניתנת לשמירה במטאבוקס (cache).
- ההבדל: שגרת אימפרטיבית שעדכנית משתנה גלובלית מתנהגת אחרת בהתאם למה רץ לפניה, וזה מה שהופך באגים כאלה לקשים לאיתור.
סימונים נופלים מהיד
- אימפרטיבי אומר איך; דקלרטיבי אומר מה. הבדל זה הוא התשובה לרוב השאלות כאן.
- החיסרון של נמוך-רמה הוא שהוא תלוי בארכיטקטורה וקשה לתחזוקה, ולא שהוא "ישן".
- פונקציה טהורה אינה גורמת לתוצרי לוואי ומחזירה את אותו תוצר עבור אותה קלט. שני החלקים נדרשים.
- SQL היא דקלראטיבית. זו הדוגמה שהמבחן משתמש בה הכי הרבה, לכן זיהו אותה.
הבנתך מושלמת
- פרדיגמה היא סגנון במבנה הקוד, ושפות מודרניות משלבות מספר פרדיגמות
- רמת-תחתונה: קוד מכונה או אסמבלי, גישה ישירה לחומרה, שליטה ומהירות מקסימליות, אך תלויות בארכיטקטורה וקשות לתחזוקה
- אימפרטיבית: רצף של פקודות המעבירות מצב, המפרש איך; הסגנון של Python, C וקוד פסאודו
- דקלראטיבית: מציגה מה נדרש ומשאירה את ה"איך" למערכת ההפעלה, כפי שמופיע בתכנות פונקציונלי עם פונקציות טהורות, תכנות לוגיקלי עם עובדות וחוקים, וב-SQL