1. הקדמה


פרק זה כשמו כן הוא: הקדמה. הנושאים הנלמדים בו אינם חיוניים לשם הבנת המשך החומר, אך הם בהחלט מועילים. רובם, אך לא כולם מוסברים בסרטון. החומר הכתוב מכסה גם נושאים שלא מתוארים בסרטון. מומלץ שלא להסתפק בצפיה בסרטון, אלא לקרוא את הטקסט.

אעיר כי באופן כללי, בכל 'שיעור' בודד שאתם מקיימים באתר, מומלץ לצפות בסרטון באורך של עד 15 ד', ולקרוא את החומר הכתוב המקביל. להערכתי, קשה ללמוד באופן רציף יותר חומר מכך.

פרק זה כשמו כן הוא: פרק הקדמה. מטרתו ללמד אתכם מעט אודות המכונה בה תשתמשו במהלך לימודיכם: המחשב. יאמר מיד, כשם שאתם יכולים לנהוג במכונית, או לתפעל מכונת כביסה, בלי להכיר כלל את עקרונות פעולתם של אותם מכשירים, כך אתם יכולים גם לתפעל את המחשב בלי להבין כיצד הוא פועל; אולם לדעתי יועיל לכם להבין, ולו באופן כללי ועל קצה המזלג, כיצד פועל המחשב, מדוע אתם מבצעים צעד זה או אחר, ולְמה אותו צעד גורם במחשב. על-כן בחרתי לפתוח את מסענו בהסבר קצר וכללי אודות המחשב. אני מודע לכך שמי שהיכרותו עם עולם המִחְשוב התמצתה עד היום בתפעול מכשיר בנק אוטומטי או בשימוש במעבד תמלילים, עלול, בשלב זה, שלא להבין חלק מהדברים, על כן אני ממליץ לכם לקרוא פרק זה עתה, אך לשוב אליו אחרי שתצברו ניסיון מסוים בתפעול המחשב ובתִכנותו. אני תקווה כי מה שלא יובן עתה יובן אז בצורה מלאה יותר.

נפתח בשאלה: מהו המחשב? במה הוא שונה ממכונת הכביסה (ודומה, אולי, ללגו)?

ביסודו כמכשיר אבסטרטי מורכב המחשב משני מרכיבים א. זיכרון (memory, ולעיתים נדייק ונאמר זיכרון ראשי main memory כדי להבדיל בין הזיכרון הראשי לזיכרון המשני), ב. מעבד (processor ולעיתים נדייק ונאמר מעבד ראשי או Central Processing Unit ובקיצור CPU. ללשון הדיוק נזדקק עת נרצה להבחין בין המעבד הראשי למעבדי עזר נוספים שעשויים להיות מותקנים במחשב).

כדי להפוך את המכשיר האבסטרקטי לפרקטי, יחוברו למחשב רכיבי ציוד היקפי (peripheral device) נוספים כגון מקלדת, מסך, דיסק קשיח (hard disk), כונן תקליטונים, עכבר, מדפסת. ברכיבים אלה נדון בהמשך שכן הם חיוניים לשם תפעולו של המחשב, אולם הם אינם חלק מהמחשב ביסודו, במובנו הצר ביותר.

1.1 הזיכרון

הזיכרון כשמו כן הוא: תפקידו לזכור (במילים אחרות: לשמור) את מה שאוחסן בו. הזיכרון שומר את מה שאוחסן בו רק כל עוד המחשב פועל (עת מכבים את המחשב תוכנו של הזיכרון אובד). מה הזיכרון זוכר? לא זיכרונות ילדות, אלא: (א) נתונים (data) כגון המספר 17, או השם 'יוסי כהן', (ב) תכניות (programs): תכנית היא סדרה של פקודות (statements) המובַנות למחשב, כגון: (1) חבר את המספרים 3879 ו- 17, (2) שמור את הסכום בזיכרון, (3) הגדל את הסכום באחד, (3) אם הסכום אינו מתחלק ב- 121 אזי אפֵּס (הכנס אפס) את תא הזיכרון בו שמרת את הסכום.

הזיכרון אינו יודע לעשות דבר עם הנתונים והתכניות השמורים בו פרט לשמירתם.

המחשבים בהם אנו משתמשים כיום נקראים מחשבי פון-נוימן, על-שם האדם שהגה אותם. אחד הרעיונות שהגה פון-נוימן הוא שאותו זיכרון עשוי להחזיק שני סוגים של 'יצורים': תכניות ונתונים (שישמשו את התכניות).

כאשר אנו, כבני אדם המורגלים בשימוש במספרים עשרוניים, חושבים על התא הבסיסי ממנו נרכיב מערכת לשמירת מספרים, סביר שנחשוב על תא שעשוי להכיל ספרה עשרונית (כלומר ספרה שעשויה להכיל ערך שבין אפס לתשע). באמצעות שני תאים כאלה נוכל לשמור מספרים בתחום שבין אפס ל- 99, באמצעות שלושה תאים נוכל לשמור מספרים שבין אפס ל- 999 וכך הלאה. במחשב היחידה הבסיסית ממנה בנוי הזיכרון היא תא יחיד הקרוי סיבית (bit) ואשר מסוגל להכיל אחד משני ערכים: אפס או אחד, במילים אחרות ערך בינארי. באמצעות שתי סיביות נוכל לשמור ארבעה ערכים שונים (00, 01, 10, 11), באמצעות שלוש סיביות נוכל לשמור שמונה ערכים שונים (שעשויים לייצג את המספרים אפס עד שבע, האותיות א' עד ח', או כל שמונה ערכים שנרצה). באמצעות שמונה סיביות נוכל לשמור 256 ערכים שונים. קבוצה של שמונה סיביות מכונה בית (byte). שני בתים (או לעתים ארבעה או שמונה בתים) מכונים מילה (word). מכיוון שסיבית בודדת היא יחידה קטנה מאוד, נהוג לציין את גודלו של הזיכרון ביחידות של בתים (גודלו של הזיכרון ביחידות של סיבית הוא, כמובן, פי שמונה מגודלו ביחידות של בית).

על הזיכרון ניתן לבצע אחת משתי פעולות: (א) לאחסן ערך בתא זיכרון כלשהו (במילים אחרות לכתוב ערך על התא), או (ב) לשלוף את הערך המצוי בתא זיכרון כלשהו (הקריאה\שליפה אינה מוחקת את הערך המצוי בתא). זיכרון המחשב כולל מילארדי בתים. על-מנת שניתן יהיה לפנות לבית רצוי כלשהו בזיכרון, (כדי לכתוב עליו או על מספר בתים רצופים המתחילים בבית זה, או כדי לקרוא את הערך המצוי בתא הזיכרון), נותנים לכל בית בזיכרון כתובת. לפיכך, לדוגמה, תכנית במחשב עשויה לכלול פקודה אשר מכניסה את הערך 17 לתא המצוי בכתובת 38789 בזיכרון.

במחשבים האישיים המיוצרים בעת כתיבת שורות אלה, גודלו של הזיכרון הראשי נע בין 512 mega byte (כלומר 512 מיליוני בתים) לבין 4 giga byte (כלומר ארבעה מיליארדי בתים) לערך.

1.2 המעבד

המעבד הוא המוח של המחשב, הוא זה שיודע לבצע (execute, לעיתים נאמר להריץ run) את התכניות השמורות בזיכרון. עת המעבד מריץ תכנית, ועל-ידי כך מבצע משימה כלשהי, אנו אומרים כי המחשב ביצע חישוב (computation) זה או אחר. בשפת יומיום חישוב משמש בהֵקְשר המתמטי, בעולם המחשבים חישוב מציין כל משימה שתורגמה לתכנית מחשב, (במילים אחרות שתוכנתה), ושמבוצעת על-ידי המחשב (דוגמה לחישוב: קרא מהמשתמש סדרה של מילים באנגלית, מיין את המילים על-פי סדר לקסיקוגרפי, כלומר על-פי הסדר בו הן מופיעות במילון, ואחר הצג את המילים הממוינות).

אמרנו שהמחשב (או ליתר דיוק המעבד שבו) מבצע תכנית, כלומר סדרה של פקודות. גדולתו של המחשב היא שהפקודות הבסיסיות אותן מכיר המעבד (ומסוגל לבצע) הן פשוטות ביותר, אך על-ידי שילובן יחד ניתן לבצע משימות מורכבות ביותר. בכך דומה המחשב ללגו. גם בלגו קיימות מספר קוביות קטנות ופשוטות אשר על-ידי הרכבתן יחד ניתן לבנות מבנים באופן שרק השמים (והתקציב) הם הגבול (תרתי משמע). בכך שונה המחשב ממכונת הכביסה: במכונת הכביסה קיימות מספר תכניות מוגדרות וקבועות מראש, ואתם אינכם יכולים לבנות לכם תכנית כבקשתכם אשר תכניס מים, תשטוף, תסחט בכל סדר שהוא וכמה פעמים שאתם רוצים.

את מהירות המעבד נהוג למדידות ביחידות של הרץ. מהירות המעבד במחשבים הביתיים המיוצרים כיום היא כ- 700 מגה הרץ (כלומר שעון המעבד מבצע 700 מיליון פעימות בשניה). קיים קשר עקיף בין מהירות זאת לבין מספר הפקודות בשפת מכונה שהמעבד מסוגל לבצע, ולכן יהיה זה מדויק אך בחלקו לומר שמעבד שמהירותו X מבצע תכנית כלשהי מהר יותר ממעבד שני שמהירותו Y (עבור Y < X).

1.3 שפת מכונה, שפת הרכבה, ושפה עילית

הפקודות אותן המעבד יודע לבצע נקראות שפת המכונה (machine language) של המחשב. תכוּנוֹתיה של שפת המכונה הן: (א) היא מורכבת ממספר מוגבל של פקודות בסיסיות\פשוטות. (ב) היא ספציפית לכל מעבד ומעבד (שפת המכונה של מעבדים המיוצרים על-ידי חברה X (לדוגמה אינטל) שונה משפת המכונה של מעבדי חברת Y (לדוגמה: מוטורולה)). (ג) פקודותיה מקודדות כאפסים ואחדים (על-מנת שנוכל לשמרן בזיכרון).

פקודה אפשרית בשפת מכונה עשויה להראות באופן הבא: 00101 00001 101 (הרווחים הוכנסו רק כדי להקל עלינו כבני אדם את הקריאוּת), ומשמעותה עשויה להיות: שלוש הסיביות השמאליות (101) מציינות שיש לחסר את הנתון המופיע בכתובת שבחמש הסיביות הבאות (00001 כלומר כתובת מספר 1) מהנתון המופיע בחמש הסיביות שאחר-כך (00101 או הכתובת מספר 5).

כתיבת תכניות המורכבות מפקודות כנ"ל היא משימה המועדת לטעויות מרוּבות (לדוגמה: בהיסח הדעת יזין המתכנת 110 במקום 101 בתור מציין הפקודה שיש לבצע, והתוצאה תהיה שהמחשב יבצע פקודה שונה מפקודת החיסור אליה התכוון המתכנת). על-כן באו חכמים והגו את שפת ההרכבה (assembly language). פקודותיה של שפת ההרכבה זהות לאלה של שפת המכונה, אולם במקום לכתוב סְדרות של אפסים ואחדים (כפי שכותב המתכנת בשפת המכונה) כותב המתכנת בשפת ההרכבה פקודות בשפה מילולית. לדוגמה את הפקודה שתיארנו קודם לכן בשפת מכונה נכתוב בשפת הרכבה כ- SUB #1, #5 כלומר החסר (subtract) את הנתון בכתובת מספר 1, מהנתון בכתובת מספר 5. תכנית הכתובה בשפת הרכבה אין המעבד מסוגל לבצע (זו אינה תכנית בשפת מכונה). כדי שהמעבד יהיה מסוגל לבצע את התכנית יש ראשית לתרגמה משפת הרכבה לשפת מכונה. את פעולת התרגום עושה תכנית במחשב בשם מרכיב (assembler). שימו לב כי המרכיב מבצע עבודת תרגום די פשוטה, לדוגמה הוא מתרגם מילה כגון SUB לרצף של אפסים ואחדים כגון 101, את המספר העשרוני 5 עליו לתרגם למספר הבינארי 00101, וכך הלאה.

אין ספק כי תיכנות בשפת הרכבה נח הרבה יותר מאשר תכנות בשפת מכונה, אולם גם לשפת ההרכבה יש מספר חסרונות מהותיים: (א) היא מורכבת מפקודות שאינן די תואמות את דרך החשיבה של מתכנת אנושי, ועל כן התכנות בה פחות נח מכפי שהינו מעוניינים. (ב) מכיוון שפקודותיה זהות לאלה של שפת המכונה היא תלויית מעבד; משְמַע איננו יכולים להעביר תכנית שכתבנו בדִי עמל בשפת הרכבה של מחשב אחד, למחשב אחר בו מותקן מעבד שונה ('הדובר' שפת מכונה, ולכן גם שפת הרכבה שונה), וזו כמובן מגבלה מאוד משמעותית בעולם כה דינמי כמו עולם המחשבים. על שתי המגבלות הללו מתגברות (חלקית) השפות העיליות.

שפה עילית היא שפה שפקודותיה נהגו בדמיונו הקודח של מפתח השפה. פקודות השפה אינן קשורות למחשב זה או אחר, והסיבה להכללתן בשפה היא שלדעת מפתח השפה כתיבת תכניות תוך שימוש בפקודות אלה תהיה משימה יחסית נוחה, באשר הפקודות תואמות את צורת החשיבה של מתכנת אנושי עת האחרון מעוניין לכתוב תכנית מחשב. קריטריון נוסף אותו מפתח שפה ישקול הוא המידה בה התכנית תהיה קריאה לאדם אחר מזה שכתב אותה. על כן פקודות בשפה עילית נראות דומות במידת מה למשפטים בשפה האנגלית. לדוגמה הפקודה: if (x > y) then write(x) משמעה שאם תא הזיכרון המכוּנה בשםx מכיל ערך גדול מהערך המוחזק בתא הזיכרון המכונה y, אזי הצג את ערכו של תא הזיכרון x. מתכנן שפה ישקול גם את המידה בה ניתן יהיה לתרגם בקלות וביעילות תכנית הכתובה בַשפה אותה הוא מפתח לשפת מכונה. לכאורה, אפשר היה להציע שהמתכנת יכתוב את תכניתו באנגלית ציחה, אולם אז יש קרוב לודאי שתרגום התכנית לשפת מכונה היה משימה בלתי אפשרית. על כן מפתח של שפה עלית צריך לשמור על מתח בין רצון לפתח שפה בה נקל יהיה לכתוב, לבין היכולת לתרגם תכנית בשפה אותה הוא מפתח לשפת מכונה (שהיא, ורק היא, השפה אותה 'דובר' המעבד).

כמעט כל התכניות הנכתבות בימינו מתוכנתות בשפות עליות כגון פסקל, C, C++, Java, בייסיק, קובול, ורבות אחרות. כמובן שתכנית הכתובה בשפה עילית אינה ניתנת לביצוע (להרצה) כמות שהיא על-ידי המעבד (שכן היא אינה כתובה בשפת מכונה). כדי שהמעבד יוכל לבצע את התכנית יש, ראשית, לתרגמה לשפת מכונה. פעולת התרגום משפה עילית לשפת מכונה נעשית על-ידי תכנה במחשב הנקראת מהדר או קומפיילר (compiler) ובת זוגה הנקראת כורך או לינקר (linker). הקומפיילר מתרגם את פקודות התכנית כפי שכתב המתכנת (בשפה עילית) לשפת מכונה. אנו אומרים כי הקומפיילר תירגם את תכנית המקור (source program) לקוד (code ולעיתים נדייק ונאמר object code). בעגה אנו אומרים כי קימפלנו את התכנית (או שהקומפילר קימפל את התכנית). אולם הקוד המתקבל אינו שלם עדיין, ואינו ניתן להרצה (לביצוע) על-ידי המעבד. את השלמת התהליך לכדי תכנית ניתנת להרצה מבצעת תוכנת הלינקר. הלינקר מוסיף לקוד המתקבל נדבכים נוספים, שעל מהותם לא נעמוד בקורס זה, ויוצר תכנית ניתנת להרצה (executable code). את התכנית הניתנת להרצה יוכל המעבד לבצע. במקרים רבים איננו מדייקים בלשוננו ואנו משתמשים בביטוי לקמפל עבור התהליך המלא של קומפילציה ולינקינג.

ציינו כי שפת ההרכבה קשורה לשפת המכונה. שפה עילית אינה קשורה לשפת המכונה, רק הקומפיילר הוא שקושר בין התכנית הכתובה בשפה עילית למעבד זה או אחר. על-כן את אותה תכנית נוכל לתרגם באמצעות קומפיילר א' לשפת מכונה של מחשב 1#, ובאמצעות קומפיילר ב' לשפת המכונה של מחשב 2#. התוצאה היא שהתכנית הפכה להיות נשיאה (portable) במובן זה שניתן לשאת אותה, במילים אחרות להעביר אותה, ממחשב למחשב; ועת אנו עוברים ממחשב למחשב אין צורך לכתוב מחדש את כל התכניות שכתבנו על המחשב הישן. יש צורך רק בכתיבת תוכנות קומפיילר ולינקר חדשות, ובאמצעות תכנות אלה נוכל לתרגם את כל התכניות שכתבנו בשפה עילית למחשב החדש.

לקומפיילר תפקיד נוסף מֵעבר לתִרגום התכנית משפה עילית לשפת מכונה: במידה ובמהלך התרגום מאתר הקומפיילר שגיאות בתכנית המקור, הוא מודיע על-כך ואינו מבצע את התרגום. לדוגמה אם במקום לכתוב if יכתוב המתכנת בטעות iif, אזי הקומפיילר יתקל, מבחינתו, בפקודה שגויה בתכנית. הוא לא ינסה לנחש מה הייתה כוונת המתכנת, אלא הוא יודיע כי הוא איתר שגיאה בתכנית.

בשפת C עשוי הקומפיילר גם להזהיר אתכם על פקודות 'חשודות' בתכנית. אזהרות שכאלה לא תמנענה מהקומפיילר לתרגם את התכנית לשפת מכונה, ובכל אופן ראוי שהתכניות שתכתבו לא 'תזכנה' לאזהרות מצד הקומפיילר.

1.4 האדיטור, והדיבגר

הזכרנו כי המחשב מורכב מזיכרון ומעבד. התכניות שנכתוב במחשב שוכנות (בשלב ראשון) בזיכרון. התוכנה במחשב אשר מאפשרת לנו לכתוב תכניות, כלומר להזין את התכנית שכתבנו על דף, לזיכרון המחשב נקראת עורך או אדיטור (editor) בלע"ז. האדיטור דומה למעבד תמלילים, אולם הוא מותאם במיוחד ורק לכתיבת תכניות, ככזה אין בו חלק מהכלים שקיימים במעבד תמלילים (באדיטור אין אפשרות להקליד אותיות דגושות למשל או לקבוע גופן כזה או אחר) ומנגד יש בו עזרים אשר מסייעים להקלדת התכנית באופן נח (לדוגמה: הוא צובע מילות מפתח שונות בצבעים שונים, מעמֵד את התכנית באופן המקובל). באמצעות האדיטור נקליד את התכנית שכתבנו (בשפה עילית), אחר באמצעות הקומפיילר והלינקר נתרגם את התכנית לשפת מכונה, ואז יוכל המעבד להריצה.

כלי נוסף שעומד לרשות המתכנת הוא המנפה (debugger). הדיבגר מסייע לכם לאתר שגיאות בתכנית. קודם ציינו כי במידה והקומפיילר מאתר שגיאות בתכנית הוא אינו מתרגם את התכנית לשפת מכונה. עתה נדייק ונאמר כי המהדר מאתר שגיאות תחביריות (כדוגמת החלפת if ב- iif, או העדרו של פסיק במקום בו הוא מצוּפה להופיע). לעיתים התכנית עשויה להיות חפה משגיאות תחביריות, על-כן הקומפיילר יוכל לתרגמה לשפת מכונה, אולם התכנית תכלול שגיאות לוגיות, כלומר שגיאות אשר גורמות לתכנית שלא לבצע את המשימה אותה היא אמורה לבצע. לדוגמה, נניח כי על התכנית לחבר את ערכם של תא הזיכרון המכונה בשם x עם תא הזיכרון המכונה y, אולם המתכנת, בהיסח הדעת, במקום לכתוב x+y כתב x-y. מבחינה תחבירית התכנית תקינה, ועל כן הקומפיילר יצליח לתרגמה לשפת מכונה, אולם עת התכנית תורץ היא לא תבצע את מה שהיה עליה לבצע. אנו אומרים כי התכנית כוללת שגיאה לוגית. סוג מיוחד של שגיאה לוגית היא שגיאה אשר גורמת למחשב להפסיק את ביצוע התכנית, שכן התכנית מנסה לבצע פעולה אסורה או בלתי אפשרית. לדוגמה נניח כי המתכנת כלל בתכניתו פקודה כגון x/y שמשמעה חלק את הערך המצוי בתא הזיכרון שכינויו x בערך המצוי בתא הזיכרון שכינויו y. עוד נניח כי מסיבה כלשהי תא הזיכרון y כולל את הערך אפס. עת המחשב (ליתר דיוק המעבד) ינסה לחשב את המנה (תוצאת החילוק), הוא ייכשל, שהרי לא ניתן לחלק באפס. המחשב יפסיק מיידית את ביצוע התכנית ויודיע כי ביצוע התכנית נקטע בשל שגיאה. אנו נוהגים לומר במקרה כזה כי התכנית עפה (aborted or terminated).

הדיבגר מאפשר לכם להריץ תכניות בצורה מודרכת, לבצע בכל פעם רק פקודה יחידה, להציג את ערכם של תאי זיכרון שונים, וכך לאתר את המקום בו התכנית שוגה.

במקרים רבים קיימת במחשב תכנה יחידה הנקראת סביבת עבודה ואשר כוללת את כל הכלים להם אנו נזקקים לשם כתיבת תכניות, כלומר אדיטור, קומפיילר, לינקר, ודיבגר. Microsoft Visual Studio, Eclipse, Anjuta, borland C, או Borland Project הן כמה דוגמות לסביבות עבודה.

1.5 מערכת ההפעלה

מחשב המורד מפס היצור נקרא מכונה עירומה, יש לו את כל הרכיבים הדרושים, אולם אין מי שיארגן את הרכיבים הללו לכדי מערכת אחת שלמה, אינטגרטיבית, בה ניתן לעשות שימוש מועיל. את הארגון והפיקוח על פעולת הרכיבים השונים מבצעת תכנה במחשב הקרויה מערכת ההפעלה (operating system). מערכת ההפעלה היא שמאפשרת לכם להשתמש במחשב באופן שתקבלו ממנו את שאתם צריכים, ולא תגרמו נזקים לנתונים ולתכניות השמורים בו. עם הדלקת המחשב פונֵה המעבד להרצת מערכת ההפעלה, ולכל אורך פעולת המחשב מערכת ההפעלה היא שמוֹרַה למעבד מה עליו לעשות בכל שלב, היא שמאפשרת לו להריץ תוכנה זו או אחרת אותה אתם מבקשים להפעיל. היא גם שמפקחת שהפעלתה של התכנה (במלים אחרות, שהרצתה על-ידי המעבד) לא תגרום לנזקים (למשל שהתכנה לא תנסה לכתוב על תאים בזיכרון עליהם אין היא אמורה לכתוב). כל תכנית המורצת במחשב, בין אם זה מעבד תמלילים משוכלל, ובין אם תכנית קטנה שאתם כתבתם, מורצת בפיקוחה של מערכת ההפעלה.

מערכת ההפעלה כוללת מרכיבים רבים. לדוגמה עת תכנית נזקקת לזיכרון במחשב מערכת ההפעלה היא שמקצה את קטע הזיכרון שיעמוד לרשות אותה תכנית (וכך דואגת מערכת ההפעלה שתכניות שונות תקבלנה קטעי זיכרון שונים, ועל-כן לא תפרענה אחת לשניה). עת תכנית מעונינת להדפיס נתונים מערכת ההפעלה היא זו שבפועל מעבירה את הנתונים הדרושים למדפסת (מערכת ההפעלה תדאג לכך שאם שתי תכניות בקשו להדפיס בו זמנית אזי ראשית יודפסו נתוני התכנית האחת ורק אחר נתוני התכנית השניה). מערכת ההפעלה היא שאחראית לקרוא מהמקלדת את שמוקלד עליה (ולהעביר את המידע שמוקלד לַתכנית שזקוקה לו), והיא שמעבירה למסך את הנתונים שתכנית המורצת במחשב מעוניינת להציג על המסך. מערכת ההפעלה תדאג שהפלט של כל תכנית יופיע במסך במקום המתאים. בקיצור כל מלאכת ניהול המחשב והפיקוח על שקורה בו מסור בידיה הנאמנות(?) של מערכת ההפעלה.

1.6 ציוד המתחבר למחשב

עד כה תיארנו את המחשב כמורכב מזיכרון ומעבד. אלה הם המרכיבים הבסיסיים של המחשב כמכשיר אבסטרקטי; אך עת רוצים שהמחשב יהיה גם מכונה פְרקְטית יש לחבר לו מרכיבים נוספים, כפי שכולכם מכירים, מרכיבים הנקראים ציוד קלט פלט (input output device או בקיצור i/o device) או ציוד היקפי: המסך (ולעיתים רמקולים המחוברים למחשב) מאפשרים הצגת נתונים (במובן הרחב של המילה), המקלדת והעכבר מאפשרים הזנת נתונים.

מרכיב חשוב בציוד הקלט פלט הוא הזיכרון המשני המורכב במקרים רבים מהדיסק הקשיח (hard disk) , התקליטון\דיסקט (diskette), או זיכרון נייד כדוגמת disk on key. ציינו כי הזיכרון (או ליתר דיוק הזיכרון הראשי) שומר את הנתונים הנכתבים עליו רק כל עוד המחשב דולק. במקרים רבים אנו מעונינים לשמור נתונים לאורך זמן, גם עת המחשב מכובה (לדוגמה: כתבנו תכנית מחשב חשובה או חיברנו יצירת מופת). מספר רכיבי ציוד מאפשרים שמירת נתונים גם עת המחשב כבוי; החשובים ביניהם הם הדיסק הקשיח והזיכרון הנייד. עקרונית דרך פעולתם של שני כלים אלה זהה. (דיסקטים, סרטים מגנטיים, הדומים לקלטות במכשירי הקלטה, ותקליטים אופטיים, compact disks, הם כלים נוספים המאפשרים שמירת נתונים גם עת המחשב אינו פועל).

מבחינתנו כמשתמשים, ההבדל המשמעותי בין הדיסק הקשיח לתקליטון או ל- disk on key הוא שהדיסק הקשיח מותקן בדרך כלל בַמחשב באופן קבוע, ולא ניתן לשאתו ממקום למקום בנפרד מהמחשב בו הוא מותקן, לעומתו את התקליטון ניתן להתקין במחשב (להכניסו לכונן התקליטונים), לכתוב עליו או לקרוא ממנו את המידע הרצוי, ואחר לנתקו מהמחשב, ולשאתו עמכם לכל מקום אליו תפְנו. הבדל נוסף הוא שתהליך הכתיבה על גבי הדיסק הקשיח והקריאה ממנו מהירים יותר מאשר ביצוע אותן פעולות על גבי תקליטון. כמו כן נפחו של הדיסק הקשיח גדול מזה של תקליטון.

נפחו של תקליטון המיוצר כיום הוא כ- 1.5 מגה בית, בעוד נפחו של דיסק קשיח במחשב ביתי הוא בסדר גודל של מאתיים ג'יגה בית (כלומר מאתיים מיליארד בתים).

מושג חשוב אותו עלינו להכיר עת אנו דנים בזיכרון המשני הוא הקובץ (file). נניח שכתבנו תכנית מחשב, או להבדיל פואמה, וברצוננו לשמור את יצירתנו לאורך זמן, ולכן על-גבי דיסק (או זיכרון נייד). כדי שהמחשב (או ליתר דיוק המעבד בפיקוחה של מערכת ההפעלה) יוכל לשמור את הנתונים עבורנו, הוא מקצה על-גבי הדיסק שטח או במילים אחרות קובץ, ועליו הוא שומר\כותב את הנתונים. אנו איננו יודעים היכן מצוי השטח שהוקצה על גבי הדיסק (כלומר, מה כתובתו), כל שאנו יודעים הוא מה השם שאנו בחרנו לתת לקובץ שנוצר. לדוגמה נניח שבחרנו לקרוא לקובץ my_poem. בהמשך נוכל להורות למחשב להדפיס את הקובץ ששמו my_poem, לטעון למעבד התמלילים קובץ זה, או אפילו למחוק את הקובץ הנ"ל. המחשב ידע לאיזה קובץ אנו מתכוונים שכן לכל קובץ יש שם ייחודי המזהה רק אותו (כמובן שניסיון לקמפל את הקובץ my_poem, המכיל פואמה היסטורית דידקטית, יגרום למהדר להודיע לנו על אינספור שגיאות שהוא מצא ב-'תכנית' שביקשנו ממנו לקמפל).

עת אתם כותבים תכנית חדשה במחשב, באמצעות האדיטור, התכנית רֵאשית נשמרת בזיכרון. אחת הפעולות שהאדיטור מאפשר לכם לבצע היא לשמור את התכנית כקובץ בזיכרון המשני. עת תבקשו מהאדיטור לבצע פעולה זאת הוא ישאלכם לשמו של הקובץ שברצונכם ליצור ושיכיל את התכנית שכתבתם.

מושג נוסף שנרצה להציג בשלב זה הוא מושג המחיצה (folder) או המדריך (directory). נניח שאתם אנשים מסודרים. עוד נניח כי במסגרת עבודתכם אתם כותבים מכתבים, מחברים מנגינות ומציירים ציורים. על-כן סביר לצפות שבשולחן העבודה שלכם (הפיזי, הניצב בחדרכם) נמצא מגרת מכתבים, מגרה ובה מצויים תווים, ומגרה בה שוכנים ציוריכם. באופן כזה נקל יהיה עליכם לאתר 'מסמך' (דף) רצוי זה או אחר. אם תוך כדי עבודתכם מתברר לכם שאתם כותבים מכתבים רבים ואיתור מכתב רצוי בין כלל המכתבים שכתבתם נעשה קשה, סביר שתפצלו את מגירת המכתבים למגרת מכתבים רשמיים לעומת מגירת מכתבים אישיים. גם במחשב קיים מנגנון דומה. האנלוג במחשב למגרה היא המחיצה או המדריך. על-כן במחשב האוניברסיטה סביר שתימצא מחיצה לכל תלמיד. כל תלמיד יוכל לשמור במחיצה שלו, ורק במחיצה שלו, חומר שהוא יצר. אם התלמיד לומד מספר קורסים יתכן שאת המחיצה שלו הוא יחלק למספר תת-מחיצות, אחת לכל קורס (ואולי כמה מסמכים\קבצים שאינם שייכים לשום קורס ישכנו במחיצה הראשית של התלמיד, לצד מחיצות המשנה של הקורסים השונים). יתכן שאת המחיצה של הקורס מבוא לתכנות יחלק התלמיד שוב למספר מחיצות אחת עבור כל תרגיל, כך שבמחיצה של כל תרגיל ישכון כל החומר השייך לתרגיל זה (כגון קובץ הכולל את תכנית המקור שהתלמיד יצר, קובץ הכולל את תרגום תכנית המקור לשפת מכונה).

1.7 שפת C

הקורס שלפנינו מתנהל בשפת C או ליתר דיוק בשפת ++C . למעשה מרבית הנושאים שילמדו משותפים לשתי השפות גם יחד, ואת ההיבטים המרכזיים שמייחדים את ++C מ- C (קריא תכנות מונחה עצמים) לא נכיר במהלך קורס זה. (במקומות בהם חומר הלימוד נכון רק לשפת ++C ולא לשפת C נציין זאת).

ניתן לנהל דיונים ארוכים ומלומדים מדוע לבחור בשפה זו או אחרת לקורס ראשון במדעי המחשב. לצורך ענייננו נאמר בקצרה כי C היא השפה הנפוצה ביותר לתכנות מודולרי (modular programming) כפי שנלמד בקורס זה.

לשפת C מגבלה עבור מתכנתים מתחילים והיא שהשפה מאוד 'ליברלית', כלומר הקומפיילרים שלה נוטים להניח שהמתכנת יודע מה הוא עושה, ועל כן אם הוא כתב דבר מה יש להניח שיש לו סיבה טובה לעשות זאת. דא עקא עבור מתכנתים מתחילים הנחה זאת לעיתים קרובות אינה תקפה---מתכנת מתחיל כותב לעיתים שטויות חסרות פשר או תכלית. התוצאה היא שהשפה (או ליתר דיוק הקומפיילר) אינו די שומר עליכם, וחובת השמירה מועברת אליכם. עבור מתכנתים מתחילים זו לעיתים חובה כבדה (מדי). שנאמר "אלוהים מרחם על ילדי הגן…".

בקורס זה נלמד לתכנת בגישת התכנות המודולרי. קיימות גישות אחרות לתכנות (תכנות מונחה עצמים, object oriented programming, תכנות בלוגיקה, תכנות פונקציונלי). עבור גישות אחרות קיימות שפות אחרות שעשויות להתאים יותר או פחות משפת C (בפרט עבור תכנות מונחה עצים קיים ויכוח האם C++ או Java היא השפה המועדפת). עבור תכנות מודולרי, לכוחותינו, נראה כי C היא הבחירה המתאימה ביותר.

1.8 האלגוריתם

מושג אחרון אותו נכיר במסגרת ההקדמה הוא מושג האלגוריתם (algorithm). אלגוריתם הוא שיטה לפתרון בעיה. לדוגמה, ספר בישול או אפיה מכיל סדרת של אלגוריתמים (המכונים בדרך-כלל מתכונים) המסייעים בהכנת תבשילים ומאפים שונים (לדוגמה: מתכון להכנת ברווז בנוסח סצ'ואן). 'הבעיה' אותה פותר כל אלגוריתם בַספר היא כיצד להכין מאכל כזה או אחר. עת אתם משתמשים במתכון כדי להכין את המאכל אתם מבצעים את האלגוריתם. בעולם המחשבים מקובל לעיתים לומר שאתם מריצים את האלגוריתם.

נציג שתי דוגמות נוספות שימחישו מהו אלגוריתם:

א. משוואה ריבועית היא ביטוי מהצורה: y = a*x2 +b*x +c, עבור a,b,c שהינם מספרים ממשיים. לדוגמה: y = 17*x2 +3879*x –9 או y = -5*x2 +25 הן משוואות ריבועיות. שורש המשוואה הריבועית הוא ערך ממשי שאם יוצב במקום x, אזי ערך ה- y המתאים לו יהיה אפס. רובכם ודאי זוכרים שהאלגוריתם, במילים אחרות הנוסחה, או השיטה, לאיתור זוג שורשי משוואה ריבועית היא:

x1, x2 = [-b +- sqrt(b2 –4*a*c)]/[2*a]

ב. עתה נציג אלגוריתם לבדיקה האם מספר טבעי כלשהו ראשוני. האלגוריתם הוא הבא:

  1. אם המספר הוא שתיים אזי הוא ראשוני.
  2. אם המספר הוא מספר זוגי השונה משתיים אזי הוא אינו ראשוני.
  3. אם המספר פרדי (במילים אחרות, אי זוגי) אזי בדוק את כל המספרים הפרטיים הקטנים משורש המספר, אם אף אחד מהם אינו מחלק את המספר אזי המספר ראשוני; אם לפחות אחד מהם מחלק את המספר אזי המספר פַריק (במלים אחרות, לא ראשוני).

כל אלגוריתם מורכב מסדרה של פעולות בסיסיות אותן יש לבצע כדי להשיג את המטרה הרצויה, במילים אחרות כדי לפתור את הבעיה. במתכון לבישול או אפיה הפעולות הבסיסיות עשויות להיות: הקצף, טרוף, ערבב, הוסף. כמובן שההנחה היא שמבצע האלגוריתם יודע לבצע את הפעולות הבסיסיות (לדוגמה, הוא יודע כיצד מקציפים). בעולם החישובי הפעולות הבסיסיות הן הפקודות הקיימות בשפות התכנות השונות. (במרבית שפות התכנות קיימות פקודות דומות). לדוגמה, באלגוריתם שהוצג מעל לשם בדיקת ראשוניות של מספר על מבצע האלגוריתם לדעת האם מספר הוא זוגי או פרדי, עליו להיות מסוגל לחשב שורש של מספר, כלומר לבצע פעולות שאינן לגמרי טריביאליות.

המילה אלגוריתם הינה שיבוש שמו של מתמטיקאי פרסי, בן המאה התשיעית: אבו ג'עפר מחמד אל ח'ואריזמי (אל ח'ואריזמי שובש באנגלית לכדי אלגוריתם). לאורך למודיכם תכירו אלגוריתמים רבים הפותרים משימות מגוונות. בקורס זה נפתח צוהר לנושא, ע"י שנראה כיצד כותבים תכניות מחשב המשלימות משימות שונות (בשפה פורמאלית יותר אנו אומרים שהתכנית מממשת את האלגוריתם), כגון מיון של סדרת מילים או מספרים; חיפוש, במילים אחרןת בדיקה, האם מילה\מספר כלשהו מצוי במאגר מילים\מספרים.