משתנה (תכנות)
מתוך ויקיפדיה, האנציקלופדיה החופשית
בתכנות, משתנה (variable) הוא חלק זיכרון בתוכנית המכיל נתון שיכול להשתנות בזמן הריצה, על פי הפקודות הניתנות לו, בניגוד לקבוע שמכיל ערך שנקבע בתחילת ההרצה ונשאר קבוע עד סופה. גודל המשתנה עצמו שונה לפי סוג הטיפוס שלו ויכול לנוע מבית אחד ועד טווח זיכרון גדול של מגהבייטים שלמים. בנוסף לפעולת ההשמה ניתן לבצע גם פעולה של שליפת המידע שבמשתנה.
תוכן עניינים |
[עריכה] שמות
לכל משתנה חייב להיות שם. שם משתנה יכול להכיל רצף מכל סוג שהוא של אותיות ומספרים. ישנם תוים בודדים שאסור שיהיו בשם משתנה או בתחילתו. לצורך קריאות הקוד ישנן שיטות שונות לקבוע את שמות המשתנים. אחת הידועות שבהן היא "השיטה ההונגרית". אחד הדברים החשובים בהבנת קוד תוכנית הוא נתינת שמות משתנים משמעותיים וארוכים, שמסבירים את תפקידו של המשתנה בעצם שמו. לעתים ישנן מוסכמות לקידומת של משתנה בהתאם לסוגו, ולטווח הכרתו. הדבר נפוץ בעיקר בהגדרת פקדים בטפסים, ומאפשר לנווט ביניהם בקלות.
[עריכה] הכרזה מפורשת והכרזה מרומזת
בחלק משפות התכנות כמו שפת C ושפת Pascal, חובה להכריז על המשתנה לפני השימוש בו. שימוש במשתנה בלי הכרזה מפורשת שלו תגרום להודעת שגיאה. שפות אחרות, בעיקר שפות סקריפט כמו VBScript לא דורשות מן התוכניתן להכריז על המשתנה בטרם השימוש בו, והמערכת מגדירה אותו בפעם הראשונה שהיא נתקלת בו. אם כי על פי נוהלי התכנות המתוקנים, רצוי להכריז על כל המשתנים באופן מאורגן, והדבר תורם לקוד מסודר, איתור שגיאות כתיב, ולניפוי יעיל של הקוד. לעתים יש שפות שיש בהן את שתי האפשרויות, לעבוד במוד של הכרזה מפורשת והכרזה מרומזת, על פי סוג ההצהרה בתחילת המודול (למשל use strict ב-Perl).
[עריכה] סוג טיפוס
לכל משתנה יש טיפוס שקובע איזה סוג נתונים הוא יכול להכיל. גודל המשתנה שונה בהתאם לטיפוס ויכול להיות בטווח רחב. גודל קטן ביותר למשתנה מסוג בוליאני ותו ועד לגודל גדול למשתנה מסוג מערך או אובייקט. בחלק מהשפות (בעיקר אלו שבהן לא מחויבים להגדיר את המשתנים) יש טיפוס "כללי" שמאפשר לשים את רוב הערכים.
סוגים טיפוסיים של משתנים הם: מספר שלם (בטווחים שונים), מספר ממשי - (נקודה צפה) (בטווחים שונים), תו, מחרוזת, מערך, מצביע, רשומה, אובייקט וערך בוליאני, ישנן שפות שמוסיפות טיפוסים ספציפיים נוספים כמו משתני אוסף, תאריך ומטבע.
[עריכה] אורך חיים
אורך חיים הוא הטווח שבו המשתנה קיים פיזית. משתנה גלובלי יהיה קיים כל זמן שהתוכנה רצה. משתנה לוקאלי המוגדר בפונקציה יהיה קיים בזמן שהפונקציה מורצת, אך לפניה או אחריה הוא לא יהיה קיים כלל. משתנה גלובלי במחלקה יהיה קיים כאשר נוצר מופע של המחלקה. יכול להיות מצב שבו משתנה יהיה קיים, אך לא יהיה נגיש לפעילות באזור מסוים. ומאידך יכול להיות מצב שבו משתנה לא יהיה נגיש, אך תוכנו ישמר כאשר הוא יוגדר מסוג סטטי.
[עריכה] שמות משתנים
בשפות תכנות ישנות (למשל BASICA) היה מקובל להשתמש בשמות קצרים מאוד (לרוב אות אחת), כיום גישה זו איננה מקובלת. במרבית שפות התכנות המודרניות, שמות המשתנים חייבים להיות מזהים חוקיים, כלומר הם מוגבלים על פי אותם חוקים המגבילים את שמות הפונקציות, המחלקות, הקבועים וכדומה. מגבלות אלו משתנות משפת תכנות אחת לשנייה אולם הם לרוב כוללות מגבלת תווים אפשריים (תווים המשתמשים לאופרטורים כמו + או ? לרוב אסורים), איסור על שמות הזהים למילים שמורות וכן מספר תווים משמעותיים (למשל ב-Embedded SQL משתנים שהם בעלי 31 תווים ראשונים זהים נחשבים זהים).
בחלק משפות התכנות לכל שם משתנה מוצמד תג המציין את סוגו, כך למשל המשתנים $Wikipedia, @Wikipedia, %Wikipedia הם משתנה סקלרי, מערך ו-Hash ב-Perl שאינם מושפעים אחד מהשני (הגם שניתן לגשת לכולם באמצעות Wikipedia*).
ישנן מספר שיטות מקובלות לשמות משתנים, התלויות בשפת התכנות (במיוחד בשאלה האם היא מבחינה בין אותיות קטנות לגדולות) ובספריות בהן משתמשים, כך ניתן למצוא שדה של אובייקט בעל השמות m_WikipedaCount, wikipediaCount, wikipediaCount_, wikipedia_count ועוד.
[עריכה] טווח הכרה
טווח ההכרה הוא הטווח שבו המשתנים חשופים בתוך התוכנית. ישנם שלושה סוגים עיקריים של טווח הכרה במשתנים:
- משתנים גלובליים - מוכרים בכל התוכנית.
- משתנים לוקליים - מוכרים בבלוק או בשגרה שהגדירה אותן.
- נתוני אובייקט - האובייקט עצמו מוגדר כמשתנה גלובלי או לוקלי, אבל הנתונים שבתוכו מטופלים בצורה אחרת שמאפשרת להסתיר אותם מחלקים אחרים בתוכנית.
[עריכה] אתחול
בחלק מהשפות כמו למשל C, חובה לאתחל את המשתנה לערך מסוים, אחרת עלול להמצא בו "זבל" (שהוא ערך מספרי סתמי, שנמצא בזיכרון המחשב, עקב פעולות קודמות). בשפות אחרות נעשה אתחול אוטומטי בזמן היצירה של המשתנה, כך שמשתנה מספרי מאופס, משתנה מחרוזתי מאותחל למחרוזת ריקה, משתנה מצביע מאותחל למיקום לא קיים וכדומה. בשפות שאין אתחול אוטומטי הדבר מאפשר גמישות ומאפשר למתכנת לבחור באיתחול או לוותר עליו, מכיוון שלפעמים אין צורך באתחול והדבר מבזבז פעולות מחשב, במיוחד כאשר מדובר במשתנים רבים. החיסרון שבחוסר אתחול אוטומטי שתמיד המתכנת צריך לדאוג לערכים שבמשתנה, ולעתים אי תשומת לב מספקת לעניין, עלולה לגרום לבאגים קשים לאיתור.
[עריכה] שימוש
על כל משתנה ניתן לבצע שתי פעולות: פעולת השמה של ערכים לתוכו, ופעולה של שליפת מידע הנתון בו. בדרך כלל ניתן לבצע פעולות השמה למשתנה, כאשר הנתונים המושמים בו, הם מסוג הטיפוס של המשתנה. פעולות על המשתנים יבוצעו בדרך כלל באמצעות אופרטורים שונים.
דוגמה שכוללת את שתי הפעולות היא היא למשל חישוב מתמטי של ערכים שנעשה בין משתנים שונים. בדוגמה הבאה:
A=B+C
התוכנה תשלוף את הנתון שקיים במשתנה C תחבר אותו לערך שקיים במשתנה B, ותבצע השמה של הערך החדש לתוך משתנה A. מכיוון שהפעולה המתמטית נעשית באופן הזה (מימין לשמאל), ערך התוצאה יהיה מוגבל לא רק לפי ערכו של משתנה A אלא גם לפי ערכו של משתנה B. במקרה שמשתנה B יהיה מטיפוס קטן יחסית למשתנה C, הערך יוגבל לפיו. למשל אם משתנים C וA הם מטיפוס נקודה צפה ומשתנה B הוא מספר שלם, התוצאה ב-A תמיד תהיה מספר שלם.
במקרה של השמת נתונים מטיפוס אחר מסוג המשתנה, לעתים תתבצע שגיאת הידור ולעתים תתבצע פעולת המרה באופן אוטומטי בהתאם לסוג הטיפוס, לשפת התכנות ולמהדר. כאשר נעשה ניסיון לבצע השמת מחרוזת למשתנה מטיפוס מספרי לרוב הדבר יהיה כרוך בהודעת שגיאה. לעומת זאת כאשר תתבצע השמה של מספר נקודה צפה (שבר) למספר שלם, יתבצע חיתוך של השארית, והתוכנה תמשיך לרוץ כרגיל. גם במקרה של השמה של מספר גדול למשתנה קטן שלא יכול להכיל אותו לא תופיע שגיאה, ותתבצע גלישה של המספר. דברים הפותחים פתח לבאגים של טעויות ואי דיוק חישובי, שקשה לנפות אותם לעומת באגים אחרים.
באמצעות משתנים ניתן לבצע פעולות חישוב שונות, גם בלי השמה למשתנה אחר או שליפה מפורשת. משתנים יכולים להופיע בהתניה לוגית. למשל
If A+b > 5 then beep
שמשמעותה (ב-BASIC) להשמיע צפצוף במקרה שצירוף הערכים שבמשתנים A ו-B גדול מ-5. במקרה זה בזמן ביצוע התנאי מתבצעת פעולה של חיבור הערכים שבמשתנים A ו-B באופן זמני והשוואה לערך של הקבוע 5. משתנים אלו ישמרו על ערכם ללא כל שינוי.
האינטרקציה בפעולות חישוביות איננה חייבת להיות רק בין משתנים, והיא יכולה להיות בין משתנה לקבוע ואף בין משתנה לפונקציה. כך למשל ניתן לבצע השמה של ערך שמוחזר מפונקציה + ערך של משתנה למשתנה אחר. לדוגמה
A=B+MaxOf(C,D)
שמשמעותו השם למשתנה A את הערך שבמשתנה B + את הערך שמוחזר מהפונקציה MaxOf כאשר הפונקציה מקבלת שני ערכים ומחזירה את הגדול שבהם.
[עריכה] דוגמאות של הגדרת משתנים
דוגמאות להגדרת משתנה בשם A מסוג Integer ואיתחול שלו בערך 5 בשפות תכנות שונות. ישנן שפות שחייבת להיות מילת קידומת מסוימת על מנת להכריז על משתנה כמו Var (קיצור של Variable) בפסקל וDIM (או Public או Private) בVB, וישנן שפות שבהן אין כתיבה של מילה קבועה, אלא כתיבת סוג הטיפוס עצמו לפני משתנה היא הוראה ליצירת משתנה. בדוגמאות ניתן לראות שהכתיבה בשפת C הינה התמציתית ביותר, ואילו הכתיבה בVB הינה המובנת ביותר.
[עריכה] פסקל
Var a: Integer=5;
[עריכה] C ו C++
int a=5;
[עריכה] VB
Dim a As Integer=5