מבוא לתכנות ולמדעי המחשב בשפת C/מבוא ותוכנית ראשונה
ברוכים הבאים
עריכהשלום וברוכים הבאים לקורס "מבוא לתכנות ולמדעי המחשב". השם הארוך הזה באמת נחוץ כי הקורס משמש גם כמבוא לתחום ההנדסי שנקרא תכנות וגם כמבוא לתחום המדעי שנקרא מדעי המחשב. שני התחומים, ההנדסי והמדעי, כרוכים זה בזה ושניהם צעירים מאוד מבחינה הסטורית. המחשב האלקטרוני הראשון הופיע בעולם רק לפני כשבעים שנה. זה אולי נשמע לכם הרבה זמן אבל במונחים של ההסטוריה המדעית מדובר באירוע שקרה ממש לאחרונה. אם נשווה אותו למתמטיקה (משחר היות האדם? 5000 שנה?) או לפיזיקה (בערך אותו זמן) כמיה (יוון הקלאסית אבל תלוי איך סופרים) , הנדסת בניין (שחר האדם) או אפילו מהנדסת מכונות (המאה ה 18?).. נשתכנע שאנחנו באמת עוסקים בתחום חדש. אולי אפילו בוסרי.
ההשפעה של מחשבים על התרבות האנושית היא דרמטית ברמה קשה לעיכול. המחשבים האלקטרונים הראשונים הופיעו בשנות הארבעים של המאה הקודמת והיה להם חלק מכריע במלחמת העולם השנייה (פיצוח צפנים). כשהייתי ילד בשנות השבעים, המחשבים היו עדיין מכונות ענק (חדר שלם..) שהיו מחוץ להשיג ידם של אנשים פרטיים. המחשבים היחידים היו בבעלות מוסדות גדולים כמו אוניברסיטאות או חברות פרטיות גדולות. כאשר התחילו לעלות רעיונות על מיחשוב אישי, זכורה אמירתו המפורסמת של קן אולסן מייסד חברת המחשבים האגדית digital שאמר ש"אין שום סיבה שמישהו ירצה מחשב בבית שלו" [1] (הציטוט המדוייק). בשנות השמונים מחשבים אישיים הפכו לנורמה ובשנות התשעים הפכה האינטרנט לנורמה. בשנות האלפיים האינטרנט הנייד הפך לנורמה וההשתרשות שלו בתרבות ובחיי היום יום הפכה לדומיננטית.
אלה היו שלושים שניות על מהפכת החישוב, המידע והתקשורת, שמתרחשת לנגד עייננו ממש. קשה לנו להשקיף ולראות מה קורה לעולם מכיוון שאין לנו פרספקטיבה (בערך כמו שקשה לנו להבחין בעקמומיות של הכדור עליו אנו נמצאים). בכל רגע נתון, נדמה שהמהפכה רק החלה והסוף - מי ישורנו?
משימתינו בקורס היא לנסות להשיג מיומנות בטכניקות תכנות בסיסיות. טכניקות של כתיבת שורות תוכנה עבור המחשב לביצוע. במקביל, ננסה להתחיל להכנס לענף המדעי העשיר שנקרא "מדעי המחשב". ענף שאפשר לראות כחלק מהמתמטיקה ואפשר לראות גם בהבטים יותר הנדסיים.
תוכן עניינים כללי
עריכההסילבוס של הקורס נמצא כאן. הבה נעבור עליו יחד ונוודא שהכל ברור.
באופן כללי מאוד, הקורס עומד להתנהל לפי התוכנית הבאה:
- בתחילת הקורס נלמד איך לכתוב תוכניות מחשב פשוטות בשפת C. נכתוב את קוד התוכנית ב Editor, נשמור את הקובץ במערכת הקבצים, נפעיל Compiler שיתרגם את קובץ שפת המקור (source code) לקובץ שקול מבחינה סמנטית בשפת מכונה (machine code or binary code or just binary)
- בהמשך הקורס נלמד על משתנים, בקרת זרימה, לולאות ,מערכים והערות תעוד. אלו הם בעצם הברגים והאומים המרכיבים את שפת התכנות.
- השלב הבא יהיה לכתוב פונקציות עצמאיות עם ממשק מוגדר.
- נלמד על תכנון מלמעלה למטה (top down design) אבל נשמר לא להיות דתיים בנוגע אליו. נדבר ונדגים רקורסיה.
- נדבר על מצביעים ותפקידם החשוב במבני נתונים ובניהול זיכרון.
- נכיר מבני נתונים בסיסיים כמו רשימה משורשרת, עץ בינארי ואולי מערך גמיש, ערמה, ועוד ככל שיותיר הזמן.
במקביל ללימודים אלה, נדבר על מושגים קשורים - סיבוכיות (ריצה ומקום), אלגוריתמיקה והוכחת נכונות.
על הבדלי הידע בקורס
עריכהקורס המבוא לתכנות סובל תמיד מבעיה ידועה - הבדלי ידע ומיומנות גדולים בין הסטודנטים. לחלקכם בוודאי נסיון תכנותי רב בעוד אחרים לא תכנתו מעולם ולא יודעים אפילו מה זה בדיוק. עלי להדגיש: הקורס יכוון כל הזמן לקבוצה השניה. אלה שבאים עם רקע קודם יגלו שחלק גדול מהחומר בקורס ידוע ומוכר להם. השתתפות בהרצאות כמובן איננה חובה וסטודנטים שמרגישים שהשתתפות היא ביזבוז זמן עבורם מוזמנים לא להשתתף. אני מצידי, אנסה לדאוג שכל החומר שמלומד בכיתה יופיע בויקי זה.
אפשרות נוספת לתלמדים מנוסים היא לגשת למבחן פוטר שציונו יהיה הציון בקורס. ניתן להתרשם משאלות לדוגמה שנועדו רק לתת תחושה לגבי סוג השאלות שנשאלות במבחן כזה.
שתי נקודות חשובות בנוגע לסטודנטים בעלי ידע קודם:
א. שימו לב שאתם שומרים על קשר עם הנעשה בקורס, בעיקר בתחומים בעלי האופי התיאורתי. אדם בעל נסיון רב בתכנות בתעשיה עלול לחוש כי מבחינת הנדסת תוכנה, הקורס קל לו מאוד. אותו אדם צריך לשים לב שהוא מבין גם את הניתוחים התיאורתיים-מתמטיים כי אלה בדרך כלל לא חלק משגרת העבודה של מתכנתים בתעשיה (אלא אם הם בעלי גוון תיאורתי\אלגוריתמי)
ב. אנא המנעו מלהפריע לחבריכם חסרי הידע הקודם בהפגנת הידע שלכם (אלא כמובן אם זה מוסיף נדבך חשוב לשיעור או שהידע שאתם מפגינים נרכש במהלך הקורס). קל מאוד להגיע למצב בו מתביישים לשאול, בעיקר אם חושבים שכל האחרים כבר יודעים ושאלה רק תבזבז את זמנם.
גנו\לינוקס
עריכהמערכת ההפעלה בה נשתמש לאורך כל הקורס היא GNU\Linux. GNU\Linux היא מערכת הפעלה חופשית. הכוונה במילה "חופשית" היא שהיא מכבדת את החופש של המשתמשים, לאו דווקא שהיא חינמית (למעשה ניתן גם לרכוש אותה בכסף). מערכת הפעלה זו שומרת על שקיפות מלאה וכל אדם יכל לברר (באמצעות אחרים או בעצמו, אם יש לו את הידע הטכני) איך בדיוק היא עובדת ומה היא עושה, מתחת למכסה המנוע. זאת בניגוד למערכות נפוצות כמו Windows של מיקרוסופט או IOS ו OSX של אפל.
מבחינת השימוש הבסיסי, המערכת דומה למדי למערכות הקנייניות הנפוצות. הסירטון הבא מדגים אוסף של פעולות נפוצות (כדאי לראות במסך מלא ברזולוציה מקסימאלית):
אחרי שתסיימו לצפות בסרטון (כ- 18 דקות), אתם אמורים לדעת:
- איך להפעיל את התוכנות המותקנות במערכת
- איך להתקין תוכנות חדשות על המערכת (דבר גדול)
- לנהל את החלונות וקיצורי דרך לתוכנה
- לבצע פעולות בסיסיות מה-command line (נקראת גם shell)
- להבין קצת על התחביר של מערכת הקבצים
- טיפה על redirection של הפלט והקלט של אפליקציות
- קצת על עריכת קבצים
- נגיעה ב man (נקרא גם "המן הרשע") - התיעוד שבא יחד עם המערכת
במהלך קורס זה, כל התכנות יתבצע על מערכת הפעלה זו ולכן כדאי להתרגל אליה כבר עכשיו. את המערכת ניתן להתקין לצידה של מערכת קיימת (dual boot) ואז, כל פעם שמדליקים את המחשב להחליט אם רוצים שיפעיל את המערכת GNU\Linux או את המערכת שהיתה מותקנת במקור. אפשרות נוספת היא להשתמש בוירטואליזציה - הדמיה של פעולה מחשב נוסף עליו מותקנת מערכת ההפעלה GNU/Linux. היתרון הוא קלות ההתקנה והאפשרות לעבור בין מערכות ההפעלה בלי לכבות את המחשב. החיסרון הוא פגיעה בביצועים (למרות שבמחשבים מודרנים זה לא בהכרח מורגש).
התקנת גנו\לינוקס כמכונה וירטואלית מעל מערכת Windows
עריכהלהלן הסבר איך להתקין את המערכת הוירטואליזציה על מערכת Windows קיימת.
(במקום שלבים 1 ו 2 אפשר להעתיק בעזרת disk-on-key את התקייה virtual-gnu+linux-for-dan הנמצאת בכונן הרשת :O)
1. הורידו את הקובץ הזה (בעיה: החברה שמאכסנת את הקובץ הזה מתלוננת על ריבוי ההורדות וחסמה אותו, אני עובד על פתרון..) למערכת הקבצים שלכם. זהו קובץ גדול יחסית (כ 1.3 ג'גה בייט) וההורדה תמשך זמן מה (תלוי במהירות החיבור שלכם)
2. כאשר ההורדה מסתיימת, יש לחלץ את הקובץ (ששמו virtual-gnu+linux-for-dan.rar) מכיוון שמדובר בקובץ מכווץ. אם אינכם מצליחים לבצע זאת ע"י לחיצה כפולה, כנראה חסרה במחשבכם תוכנה המתאימה לחילוץ סוג כזה של קבצים, (מסוג rar.). נסו לתקין את WinRaR שאמורה לפתור לכם את הבעיה הזו.
3. אחרי החילוץ, ניתן לראות שהתקייה שנוצרה (virtual-gnu+linux-for-dan) מכילה שני אלמנטים: קובץ התקנה בשם ..VMware-player ותקייה בשם Ubuntu-11-04. בשלב זה יש להפעיל את קובץ ההתקנה שיתקין על מחשבכם תוכנת וירטואליזציה בשם vmware player. מדובר בתוכנה קניינית של חברת vmware (חברה עולמית עם נציגות בישראל).
4. תוכנת הוירטואליזציה שהתקנתם מאפשרת לדמות מחשבים נוספים הרצים כביכל-בנוסף למחשב שלכם. על כל מחשב כזה ניתן להתקין מערכת הפעלה אחרת. ניתן לדוגמה להריץ על מחשב אחד בעל מערכת הפעלה 7 Windows מחשב נוסף שמריץ OSX, מחשב נוסף שמריץ GNU\Linux ומחשב נוסף שמריץ Windows XP. במקרה זה, נקראת המערכת המקורית, Windows 7, "מערכת ההפעלה המארחת" והמערכות האחרות נקראות "מערכות מתארחות".
5. כזכור, לאחר שפרמנו את הקובץ שהורדנו, היתה, בנוסף לקובץ ההתקנה של vmware, גם תקייה. התקייה הזו היא מכונה וירטואלית קיימת, כלומר אוסף התוכנות שמותקנות על מחשב וירטואלי. עליכם לפתוח מכונה וירטואלית זו מתוך תוכנת הוירטואליזציה.
שני הסירטנים הבאים מדגימים את כל התהליך <youtube>lxxEBxinFI8</youtube>
<youtube>5rsR1dQosBM</youtube>
שימו לב: סיסמת המשתמש שלכם היא בבררת מחדל mosenzon (במעבדות המרכז האקדמי הסיסמה היא password). תוכלו כמובן לשנות אותה כרצונכם.
הבה נתחיל
עריכהישנם שני כלי תוכנה בהם נשתמש בכדי ליצור תוכנית מחשב. הראשון הוא Editor, תוכנה לעריכת טקסט. ה Editor מאפשר למשתמש ליצור קובץ המכיל קוד של תוכנית (או בעצם כל דבר אחר שירצה) ולשמור אותו כקובץ.
הכלי השני הוא מהדר - Compiler. מהדר הוא תוכנת מחשב שמאפשרת תרגום של קובץ הכתוב בשפה אחת לקובץ אחר המכיל את אותה התוכנית בשפה אחרת. בקורס זה אנו נשתמש במהדר שיתרגם קבצים בשפת התכנות C לקבצים שקולים בשפת מחשב. שפת המחשב (machine language, או binary) היא השפה היחידה שהמחשב מסוגל לבצע. כל שפה אחרת חייבת להיות מתורגמת לשפת מכונה על מנת שאפשר יהיה להריץ אותה.
שלום עולם
עריכהאנחנו מוכנים לכתוב את תוכנית המחשב הראשונה שלנו. בגלל שמדובר בהתחלה, נכתוב את התוכנית הפשוטה ביותר שתבצע משהו שאפשר להבחין בו. באופן מסורתי נהוג לכתוב תוכנית שמדפיסה על המסך את המילים "שלום עולם" (Hello World), מין הכרזת קיום של תוכנית שרק נולדה. אנחנו נכתוב תוכנית דומה שמדגישה את היחס הרצוי בין כותב הקוד לתוכנית שרצה (במקור מאלדין, אני חושב).
עריכה
עריכהנסו לכתוב את הקוד הבא בעורך טקסט (דוגמת gedit):
#include <stdio.h>
int main() {
printf("Your wish is my command\n");
return 0;
}
(מספרי השורות אינם חלק מהתוכנית. הם נועדו רק להסברים, כדי שאפשר יהיה להתייחס לכל שורה לפי מספרה)
שימרו אותו כקובץ בשם check.c בתוך תקייה שמיועדת לקורס הזה.
הסבר: למרות שמדובר בתוכנית פשוטה ביותר, כבר כאן נכללים הרבה אלמנטים שעדיין מוקדם לתת להם הסבר מלא. בשלב זה נסתפק בהסבר פשטני במקצת ובשלב מאוחר יותר ניתן את ההסבר המלא.
- בשורה 1, אנו מאפשרים שימוש באמצעי קלט\פלט - מקלדת ומסך (פרטים - בהמשך).
- שורה 2 ריקה וכל תפקידה הוא להפריד בין חלקי הקוד. המהדר מתעלם ממנה וכל תפקידה הוא להפוך את הקוד לקריא יותר.
- בשורה 3 אנו מצהירים על תחילתו של החלק הראשי של התוכנית שלנו, ה - main.
- שורה 4 היא פקודת הדפסה של המשפט "Your wish is my command" על המסך. הסימון n\ מורה למחשב לעבור לשורה הבאה. שימו לב לסימן ה - ; שמופיע בסוף הפקודה. נקודה-פסיק או semicolon בלעז הוא סימון שמופיע בסוף כל פקודה לביצוע ב- C. סימן זה מאפשר למהדר להבחין ולהפריד בין פקודות.
- שורה 5 מורה על הפסקת main ויציאה מהתוכנית (חזרה למערכת ההפעלה).
- שורה 6 סוגרת את "בלוק" הקוד של - main. התוכן שנמצא בין סוגריים מסולסלים - {...} מהווה קטע קוד בעל משמעות מסויימת. המשמעות נגזרת מההקשר כלומר הקוד ש"עוטף" את הבלוק. שוב, דוגמאות נוספות יבהירו את הרעיון.
אינדנטציה: כפי שבוודאי שמתם לב, שורות 4 ו 5 מוזזות לצד ימין. הזזה זו איננה נדרשת ע"י כללי השפה אבל היא עוזרת לאדם שקורא את הקוד להבין את המבנה הלוגי שלו. השם העברי לפעולה זו נקרא הזחה ובלועזית indentation (או אינדנטציה). בהירות הקוד כל כך חשובה שאינדנטציה הפכה למוסכמה בקרב אנשי המקצוע ולא מקובל לכתוב קוד שאינו מוזח.
קיימים עורכי טקסט שיודעים לבצע אינדנטציה באופן אוטמטי מתוך ידע על שפת התכנות הספציפית שבה כותבים.
הסיבה ששורות 4 ו 5 מוזזות היא ששורות אלה מהוות את התוכן של main. בכל פעם שקבוצת פקודות מסויימת מהווה חלק מוגדר בקוד, נזיח אותה ימינה בייחס לקוד העוטף. הדברים יהיו מובנים יותר אחרי שנראה דוגמאות נוספות.
צבעים: שיטה נוספת להגביר את קריאות הקוד היא שימוש בצבעים. עורכי טקסט מודרניים יודעים לצבוע בעצמם חלקים שונים בקוד לפי המשמעות התחבירית שלהם. לדוגמה, מספרים יצבעו בצבע אחד, מילים שמורות בצבע אחר וכ'. אין מוסכמה מקובלת לגבי אופן הצביעה. גם הקוד בויקי הזה נצבע אוטומטית לפי שיטת צביעה שהוגדרה עבורו.
הידור
עריכהפיתחו חלון shell (כלומר חלון שמאפשר ממשק command line), הגיעו לתקיית הקורס והדפיסו את השורה הבאה:
gcc check.c -o check
gcc הוא שם המהדר בו נשתמש במהלך הקורס. מהדר, כזכור, הוא תוכנה המקבלת קובץ תוכנה בשפה אחת ויוצרת קובץ תוכנה שקול בשפה אחרת. במקרה שלנו מדובר במהדר המקבל תוכנית בשפת C ויוצר תוכנית שקולה מבחינת המשמעות בשפת המכונה שמעבד המחשב מבין. במילים אחרות, gcc מתרגם עבורנו את הקובץ שכתבנו ב C לקובץ חדש בשפת מכונה.
פקודת ה shell שכתבנו, מפעילה את התוכנה gcc ונותנת לה מספר פרמטרים. הפרמטר הראשון, check.c הוא שם הקובץ בתקייה הנוכחית שעליה לתרגם. הפרמטר השני o- מציין שיש בדעתינו לקבוע את שם הקובץ בשפת המכונה. הפרמטר השלישי check הוא שם הקובץ שינתן לקובץ בשפת המכונה. אם לא היינו מציינים את שם קובץ התירגום וכותבים רק gcc check.c
היה ניתן לו שם של בררת מחדל - a.out.
לאחר, הפעלת פקודת התרגום שרשמנו למעלה, יווצר בתקייה הנוכחית קובץ חדש בשם check. אם ננסה לקרוא אותו בעזרת Editor או להתייחס אליו באופן אחר כקובץ טקסט, נקבל מידע חסר משמעות. הקובץ הזה מקודד באופן אחר (לפעמים מכנים אותו קובץ בינארי).
הערה: במהלך הקורס נוסיף עוד פרמטר אחד לפקודת הקומפילציה שיגרום למהדר להיות יותר קפדן מבחינת ההערות שייתן. הפרמטר Wall- הוא קיצור של all warnings כלומר, דרישה שהמהדר יתריע בפנינו בכל מקרה שהוא רואה בעיה, גם אם לא מדובר בשגיאה ממש. הדרישה הזאת תעזור לכם מאוד לאתר תקלות חמקמקות במיוחד. פקודת הקומפילציה בה השתמשנו תראה כך:
gcc -Wall check.c -o check
הרצה
עריכההקובץ check הוא קובץ ריצה, הוא כתוב בשפה שאותה המעבד שלנו יודע לבצע. בשביל להריץ את הקובץ check אפשר ללחוץ עליו לחיצה כפולה בסייר קבצים (ממשק gui) או לכתוב את שמו בשורת הפקודה. לא תמיד כתיבה כזאת תצליח. לפעמים מערכת ההפעלה מוגדרת כך שהיא לא מחפשת קבצים להרצה בתיקייה הנוכחית. אם אנחנו נמצאים באותה תקייה בה מצוי check וכותבים בשורת הפקודה:
check
אז הוא יורץ רק אם התקייה הנוכחית (.) נמצאת באוסף התיקיות שבהם מחפשת מערכת ההפעלה קבצי הרצה, אוסף שמוגדר במשתנה הסביבה PATH. אם, כפי שמומלץ מטעמי בטיחות, התקייה הנוכחית לא נמצאת שם, נקבל את הודעת השגיאה הבאה:
check: command not found
כדי להריץ את הקובץ יש לציין את המסלול המפורש:
./check
ואז נקבל את הפלט:
Your wish is my command
אם תקלידו במערכת ההפעלה שלכם את השורה:
man gcc
תקבלו את כל האופנים בהם ניתן להריץ את המהדר.