שגרה (תכנות)
| יש להשלים ערך זה: ערך זה עשוי להיראות מלא ומפורט, אך עדיין חסר בו תוכן מהותי. ייתכן שתמצאו פירוט בדף השיחה. | |||
| הנכם מוזמנים להשלים את החלקים החסרים ולהסיר הודעה זו. שקלו ליצור כותרות לפרקים הדורשים השלמה, ולהעביר את התבנית אליהם. | |||
בתכנות מחשבים, שגרה (באנגלית: Subroutine) או פרוצדורה (באנגלית: Procedure) היא רצף של פקודות המאוגדות יחדיו, במטרה לבצע מטלה מוגדרת. פונקציה היא שגרה המחזירה ערך.
קריאה לשגרה היא הפעלה שלה תוך כדי פעולת התוכנית. קריאה של שגרה לעצמה, ישירות או בעקיפין, נקראת רקורסיה. החלק בשגרה שמתבצע בפועל נקרא "גוף" השגרה. שגרה עשויה לקבל קלט.
שימוש בשגרות ובפונקציות משפר את מבנה התוכנית, את קריאות הקוד ואת מידת הגמישות של התוכנית לביצוע שינויים. עובדה זו מאפשרת להפחית במידה משמעותית את עלויות הפיתוח והתחזוקה של תוכנה. ברוב שפות התכנות המודרניות ישנו שימוש נרחב בשגרות. שגרות נתמכות באופן בסיסי גם בשפות סף ושפות מכונה.
תכנות פרוצדורלי הוא פרדיגמת תכנות המתבססת על שימוש בשגרות. בתכנות מונחה עצמים, לכל עצם יש מספר שגרות או פונקציות השייכות אליו, הנקראות "שיטות" או "פונקציות חברות", ופועלות על המידע הכמוס בתוכו או בעזרתו. שיטות אלה מהוות גם ממשק בין העצם לתוכנית כולה.
תוכן עניינים |
קריאה לשגרה [עריכה]
העברת הקלט לשגרה [עריכה]
ישנן מספר דרכים להעביר פרמטרים לשגרות. הדרך הסטנדרטית להעברת קלט אל שגרות הוא באמצעות רשימת ארגומנטים - בקריאה לשגרה מצרפים גם סדרה של משתנים או קבועים. בצורה זו מתקבל תחביר דומה מאוד לכתיבה של פונקציה מתמטית: (Make(a,b, למשל.
העברת המשתנים עשויה להיות על ידי העברה של הערך שלהם (By Value), כלומר העתקת תוכנם אל משתנים חדשים, או על ידי התייחסות (By Reference), המהווה בפועל נתינת שם נוסף לאותו משתנה.
במקרה שמעבירים על ידי ערך (בשפת C, למשל, זו הדרך היחידה) ויש צורך לשנות את המשתנה המקורי, ניתן להשתמש בחלק מהשפות במצביע. המצביע מכיל את הערך המספרי של כתובת המשתנה בזיכרון המחשב, וכך ניתן לגשת ישירות לכתובת זו ולשנות את ערכו של המשתנה.
ישנן שפות המאפשרות גם העמסה (function overloading), כלומר, מתן שם זהה למספר שגרות המשמשות למטרה דומה, אך עם קלט שונה (או חתימה שונה, לפי הגדרות השפה). מקרה פרטי של העמסה הוא אפשרות למתן ערכי ברירת מחדל לארגומנטים. שפות אחדות, בהן #C ופייתון, מאפשרות גם העברת פרמטרים לפי שמם בהצהרת השגרה.
שיטה נוספת להעביר מידע היא דרך שטח איחסון הנגיש לכל, כמו משתנים גלובליים.
לשגרה עשויות להיות תוצאות לוואי, המשפיעות על מצב התוכנית כולה, למשל על ידי שינוי של מבנה נתונים בזיכרון המחשב, או פעולה על הארגומנטים במקרה של העברת ארגומנטים לפי התייחסות, או העברה של מצביעים. לשגרות או פונקציות המבצעות פלט וקלט מול המשתמש או זיכרון המחשב יש תמיד תוצאות לוואי.
פונקציה [עריכה]
פונקציות משמשות על פי רוב לחישוב פונקציה מתמטית. . בתכנות פרוצדורלי, כגון בשפת C, אין הבדל מהותי בין פונקציה לשגרה, ולא תמיד יש הבחנה בתחביר בין שגרות לפונקציות - לעתים ההבדל היחיד הוא השימוש בערך ההחזרה מפונקציה על מנת לדווח על מידת הצלחת הפעולה שהתבצעה.
עם זאת, באופן מהותי, קריאה לפונקציה מהווה "ביטוי", כלומר התייחסות לערך כלשהו, לעומת קריאה לפרוצדורה המהווה "פקודה", כלומר שינוי מצב של משתנים בדרך כלשהי. בתכנות פונקציונלי, פונקציה היא טיפוס נתונים בסיסי לכל דבר, והוא לב ליבה של השפה. בשפות פונקציונלית (בהן LISP, Haskell, או ML) לפונקציות, ולביטויים בכלל, אין תוצאות לוואי, בשאיפה. דבר זה מקל על הוכחת נכונות של קטע קוד, ולעתים גם על עיבוד מקבילי.