שפת התכנות Visual Basic [המכונה בקצרה - VB, וכמוה VBAכ(Visual Basic for Appliations) שהיא למעשה גרסה מצומצמת יותר של VB המיועדת לשימוש ביישומי Office] הִנַה "שפת תכנות מבנית" (יובהר בהמשך), שפה מונחית אובייקטים (Object Oriented Languages) [ - את ממשק המשתמש של התכנית מרכיבים אובייקטים], ושפה מונעת אירועים (Events Driven Languages) [ - פעילות התכנית מתבצעת כתגובה לפעולת משתמש - להבדיל משפת תכנות פרוצדורלי].
השם Visual Basic ניתן לה אודות לכך שהיא מבוססת על שפת התכנות Basic של Microsoft (עוד משנות השמונים...), ו-Visual מכיון שבניית הממשק היא ויזואלית.
מהותה של שפת תכנות, "שפת תכנות מבנית"
לפני שניכנס לעניינים כדאי להקדיש כמה דקות בשביל להבין מהי בעצם "שפת תכנות" ולמה היא מיועדת.
ובכן, לב ליבו של ה"מחשב" הוא המעבד, כאשר אנו באים ליצור תכנית אנחנו בעצם כותבים למעבד רשימת פקודות לביצוע. המעבד מסוגל לבצע רשימה מוגדרת של פקודות; פקודות אלו הנן ב"שפה" המכונה "שפת/קוד מכונה"
הפקודות בשפת מכונה הן למעשה הספרות 1 ו-0 ברצפים מסוימים המורים למעבד הוראות שונות, כאשר כל רצף שונה מורה על משמעות אחרת. רצפים אלו נקראים "קוד בינארי"
לדוגמה, הקוד הבא מורה למעבד לחבר את המספר המאוחסן באוגר BX עם המספר המאוחסן באוגר DX ולהציב את הסיכום באוגר AX
קוד:
10001001110110000000000111010000
למעשה, המחשב לעולם איננו "מבין" שפה כלשהי כבן אנוש, גם את אותם 1 ו-0 המחשב איננו מבין כלל והם אינם כתובים בשום מקום בזיכרון המחשב, מה שכן יש בזיכרון של המחשב זה מעגלים חשמליים שחלקם "מחושמלים" וחלקם לא, מעגל חשמלי פעיל - ז"א מחושמל - מוגדר כ-1 ושאינו מחושמל מוגדר כ-0 (ובאותה מידה היינו יכולים להגדירם כ'חתול' ו'עכבר' אלא שלנו יותר נוח לעבוד עם 1 ו-0...), הסדר בו מסודרים המעגלים המחושמלים עם אלה שאינם מחושמלים משנה את משמעות ה"חישמול" וזהו הדבר היחידי שנקלט אצל המחשב. משום כך השפה היחידה שיש "לדבר" בה עם המחשב היא אך ורק שפת מכונה.
כל שפה אחרת שנשתמש בה תצטרך לעבור "הידור" (קומפילציה (Compilation). או בפשטות: המרה) לשפת מכונה (ועל-כך בהמשך).
מכיון שלנו - בני אנוש - יהיה קשה לזכור את הסדר ואת המשמעות של רצפים אלו, נוצר הצורך ביצירת שפה שתבצע מעין תיווך בין המתכנת למחשב, וזאת על-ידי קביעת קודים מסוימים למילים שיש להם משמעות אמתית בשפה. שפה זו נקראת "שפת סף" (Assembly).
שפת סף (Assembly) :
"שפת סף" - כאמור - נועדה לסייע לנוחות כתיבת קוד התכנה ע"י קביעת פקודות מתוך מילים בשפה.
לדוגמה:
מורה למעבד להוסיף את הערך C לערך שנמצא באוגר AX. זאת כבר באמת התקדמות גדולה.
אבל כאמור, המחשב הרי אינו מבין שפה אחרת מלבד שפת ה-1/0, כיצד אם כן יוכל לקלוט פקודות בשפה אחרת?
ובכן, כל תכנית שנכתבת בכל שפה שהיא מלבד שפת מכונה צריכה לעבור תהליך שנקרא "איסוף" (Assembly). את האיסוף מבצעת תוכנת עזר הנקראת "מאסף" (Assembler). זהו למעשה תהליך ההידור של שפת הסף, כאשר Assembler הנו מהדר שפת סף.
המאסף קולט את קוד התכנית בשפת סף ויוצר ממנו כפלט קובץ חדש הכתוב כקובץ בינארי המכיל בעצם את אותם פקודות שנכתבו ע"י המתכנת בשפת הסף - בשפת מכונה.
עד כאן הכל טוב ויפה, אבל לא מספיק. נכון שלכתוב בשפה אנושית זה הרבה יותר נוח, קל ופרקטי, אבל מבחינת פונקציונליות של השפה המצב לא מזהיר. שפת הסף אמנם נכתבת בשפה מובנת למתכנת אבל סוג וכמות הפקודות בה זהה לפקודות הניתנות להיכתב בשפת מכונה המקורית, זאת אומרת - לסט הפקודות המובנה של המעבד. זאת משום שבפיתוח שפת הסף רק נקבעו מילות שפה במקום פקודות בינאריות, אך סט הפקודות לא הורחב, וממילא השפה עדיין מצומצמת מבחינה פונקציונלית, כך שבשביל להגיע לתוצאה קצת מורכבת נזדקק לקוד ארוך ומורכב ולתכנון מדויק.
בנוסף, מאותה סיבה, שפת סף - בדיוק כמו שפת מכונה - מוגבלת לסוג המעבד הספציפי, כך שלכל סדרת מעבדים יש שפת סף משלה, בעלת תלות בסט הפקודות המובנה של המעבד.
לשם כך הומצאו השפות העיליות (המבניות).
שפה עילית :
החל משנות השבעים התחיל לפחות השימוש בשפת סף. עד אז התכנות בשפת סף - על אף הקושי שבו - היה הנפוץ והעיקרי. זאת משום ששפת סף חסכונית מבחינת זיכרון ויעילה מבחינת מהירות יותר משפה עילית מכיון שהיא מתייחסת ישירות אל המעבד, ומפאת משאבים טכנולוגיים מוגבלים העדיפו את השימוש בשפת הסף היעילה (מבחינת מהירות) והחסכונית (מבחינת זיכרון).
כיום, אודות להתפתחות הטכנולוגיה ובעיקר שיפור ושכלול המהדרים של השפות העיליות, השימוש בשפת סף הוא נדיר וההבדל המזערי אינו מצדיק את קושי הכתיבה בה.
שפה עילית כשפה מבנית:
הפקודות והכלים העומדים לרשות המתכנת בשפה עילית משוכללים הרבה יותר מאשר בשפת סף, מה שמקנה למתכנת חופשיות וגמישות בכתיבת התכנית.
באופן כללי ניתן לחלק את סוגי הפקודות לשלושה חלקים:
c- הקצאה - שמירת מקום בזיכרון המחשב לשימוש התכנה ע"י הַשַֹמַת ושליפת נתונים ב/מ-יחידת זיכרון.
- מבנה - פקודות השולטות בזרימת התכנית המגדירות את 'מבנה' התכנית. בכלל זה פקודות המורות לתכנית לעבור אל מיקום אחר בתכנית ולבצע את הקוד מאותו מקום ואילך וכדו'.
- פקודה - פקודות 'רגילות'. לדוגמה: הַשֶֹם במשתנה y את ערך החיבור של משתנה a ו-x, וכדו'.
c
חלוקה זו תקפה גם לגבי שפה עילית מבנית וניתן לכתוב בה שלושה סוגי קודים: משפטי הגדרות והצהרות; משפטי הוראה על זרימת התכנית; ופקודות.
גם כאשר מדברים על שפות עיליות, עדיין לכל שפת תכנות ישנם 'כללי כתיבה' - תחביר (Sintax) תִּקְני (ונוח) שרק בו ניתן לכתוב את פקודות התכנה. לכל סוגי הפקודות ישנו תחביר קבוע, עבור כתיבת ביטויים וערכים, מתן שמות (למשתנים ושגרות), הַשַֹמַת ערכים וכדו'.
מצד שני שפה עילית מאפשרת גמישות רבה בכתיבת הקוד ע"י האפשרות להגדיר דברים חדשים, וע"י טיפול בחלק הטכני של כתובות הזיכרון וההקצאות.
שפת סף איננה מוגדרת שפה מבנית משום שקוד התכנות אינו מחולק לקטעים במבנה מוגדר וברור ואין לו היררכיה מסודרת. שפת סף נכתבת כרצף פקודות שבאות זו אחר זו. גם כשהתכנית עוברת ממקום למקום בקוד (ולפעמים אפילו בתנאי ש-) זהו רק דילוג ללא תבנית מסודרת.
עיקר מעלתה של שפה מבנית היא בכך שהיא מוגדרת תחבירית למבני קוד. ניתן להגדיר "חטיבות" קוד בתבנית מוגדרת וניתן לכתוב משפטים ופקודות השולטות בזרימת התכנית כמבנה מסודר ולא ע"י קפיצות ודילוגים.
המילות המוקצות לתחביר השפה הן אבני היסוד של השפה ונקראות "מילות שמורות", לא ניתן להשתמש בהן לאף מטרה שהיא בתכנית (שם משתנה או כל דבר אחר) מלבד המטרה לה הן מוגדרות מראש.
רק בשביל להדגים את יעילותה של שפה עילית על פני שפת סף נוכל לראות את הקוד הבא (VB):
קוד:
a = (x + d * 5) / (b * y - 20) - 17
בשפה עילית הקוד מתפרס על-פני שורה אחת, לעומת זאת אם נרצה לכתוב את הקוד בשפת סף נצטרך לכתוב קוד ארוך שמורכב מדי הרבה פקודות, זאת משום ששפת סף לרוב אינה יודעת לבצע יותר מפעולה אריתמטית אחת (כפל או חילוק של שני ערכים למשל).
מאפיינים נוספים שמשפרים פלאים את ביצועי המתכנת בשפה עילית הם פונקציות (להחזרת ערכים) ומחלקות שהופכות את מלאכת התכנות לקלה עשרת מונים. גם הן כמובן אינן קיימות בשפת סף.
יתרון בולט נוסף של שפה עילית על-פני שפת סף הוא תאימות לכל סוג של מעבד, יתרון זה מתאפשר הודות לכך שהשפה עצמה אינה משתמשת בסט הפקודות המובנה של המעבד ואינה מתייחסת ישירות אליו, רק לאחר תהליך ההידור (להלן) התכנית מתייחסת למעבד הספציפי ולעתים אפילו למערכת ההפעלה הספציפית.
הידור (Compilation) :
כאמור, כל קוד תכנות שאינו כתוב בשפת מכונה צריך לעבור המרה לשפת מכונה בשביל שהמחשב "יבין" אותו.
אם בשפת סף נזקקנו לתהליך האיסוף (Assembly) בשביל להמיר את הקוד לקוד מכונה, בשפה עילית התהליך לא יהיה כה פשוט, לא תספיק לנו פעולת איסוף בשביל להמיר את הקוד לקוד מכונה. זאת משום ששפת סף על-אף שהיא שונה בפועל מקוד המכונה, מספר הפקודות שלה ומאפייניהם מקבילים לפקודות בשפת מכונה, לכן, כל שעלינו לעשות הוא להמיר כל פקודה למקבילתה בשפת מכונה. שפה עילית בשונה מזה איננה מקבילה לשפת מכונה והפקודות בה מורכבות פי כמה וקצרות באותה מידה, פקודה מורכבת אחת בשפה עילית תופסת, כאמור, בדרך-כלל פי כמה וכמה בשפת מכונה.
לשם כך כל שפה עילית מצוידת במהדר (Compiler).
תפקידו של המהדר דומה ומקביל לזה של המאסף - קליטת קוד התכנית בשפה עילית ויצירה כפלט קובץ בינארי המכיל את הקוד המקביל בשפת מכונה. תהליך זה נקרא הידור (Compilation).