תוכנייה How a computer works? חומרת המחשב רקע תוכנה רקע צעדים ראשונים בשפת C * חלקים מפרק זה מבוססים על: http://www.eingang.org/lecture 4
חומרה )Hardware( אנו מוקפים מחשבים,,Laptop טלוויזיה,,DVD ועוד. לכל אלו מבנה עקרוני משותף:,ipod מכונית, מכונת כביסה, טלפון, Bus אמצעי פלט זיכרון ראשי CPU אמצעי קלט התקני אחסון 5
חומרה: המרכיבים השונים :Bus ערוץ תקשורת פנימי שדרכו עובר מידע בין היחידות השונות. רוחבו מכתיב את מהירותו )לדוגמה,.)64bits.1 - Central Processing Unit( CPU יחידת עיבוד מרכזית(: אוסף רכיבים ומעגלים אלקטרוניים המנהלים את פעילות המחשב. יחידה זו מבצעת הבאת פקודות מהזיכרון, פענוחן, וביצוען..2 זיכרון ראשי memory( :)RAM בו נשמרים הנתונים והפקודות של התכניות בזמן ביצועם. Random-Access-Memory מהיר. המידע ברובו אינו נשמר כאשר מכבים את המחשב..3 6
חומרה: המרכיבים השונים - המשך זיכרון משני disk( :)cdrom,disk on key,hard עליו נשמרת מידע משני שאינו נחוץ לפעולות המחשב המידיות. בעת הצורך מועבר מידע מהזיכרון המשני לראשי ולהפך. המידע בזיכרון המשני נשמר עד אשר מוחקים אותו..4 אמצעי קלט ופלט devices( :)I/O התקני חומרה כדוגמת מקלדת, עכבר, מסך, מצלמה, מדפסת, אמצעי תקשורת וכיו"ב שבאמצעותם נקלטים נתונים הנחוצים לתכניות שמריץ המחשב ומוצגים )פלט( נתונים שמייצרות תכניות אלו..5 7
חוק Moore להתקדמות בציוד מחשוב עליה פי 100 כל כ- 10 שנים פקטור 1.3~ לשנה ניתן להראות גרפים דומים המתייחסים לגידול במהירותם ונפחם של זיכרונות.)RAM( 8
חוק Moore מקור: wikimedia 9
:CPU קצב עבודה מחזורי הפקודות מבוצעים תחת פיקוחו של השעון הפנימי. מקובל לכן למדוד את מהירות ה CPU על פי תדירות השעון )מספר הפעימות בשנייה(. דוגמאות: 1. II Apple )מתחילת שנות ה- 80 (: ~1MHz )מיליון תקתוקי שעון בשנייה(. 2. מחשב 486 משנת 93': כ- )33 33MHz מיליון בשנייה(. 3. מחשבי 3.5GHz :Pentium IV )כשלושה וחצי מיליארד בשנייה(. 4. טלפון סלולארי נוקיה 6680:.280MHz.800MHz : Apple של iphone 4S.5 ביצוע פקודה אחת נמשך מספר מחזורי שעון. 10
מרכיבי ה- CPU Arithmetic Logic Unit( ALU יחידה אריתמטית לוגית(: זוהי יחידת החישוב המבצעת פעולות אריתמטיות )חיבור, כפל,...(. פעולות לוגיות OR(.)AND, השוואת נתונים הנמצאים בזיכרון הראשי או ברגיסטרים. רגיסטרים )אוגרים(: מספר יחידות זיכרון שהגישה אליהן מהירה במיוחד )מעין RAM מקומי וקטן בתוך ה- CPU (. אחד הרגיסטרים משמש כ- counter program )המציין מהי הפקודה הבאה לביצוע(. 11
פעולת ה- :CPU דוגמה המטרה: חישוב C=A+B והשמת התוצאה ב- C..RAM נמצאים ב- C וכן,B,A תאי זיכרון RAM A B ל- R1, צעדי הפעולה: רגיסטרים R1 CPU ALU העבר תוכן A העבר תוכן B ל- R2, R2 חבר R1 ל- R2, C R3 העבר התוצאה מ- R3 ל- C. ב- 4 צעדי שעון הושלמה פעולת חיבור ב-.CPU 12
ארגון הזיכרון במחשב התקני זיכרון משמשים לכתיבת )שמירת( מידע ו/או לקריאתו )שחזורו(. זיכרון פועל כטבלה, לקוראו. בה לכל תא כתובת אליה ניתן לגשת ולטעון ערך או סיבית )bit( הינה יחידת המידע הקטנה ביותר של הזיכרון במחשב. סיבית מקבלת ערכים בינאריים, כלומר 0 או 1. זיכרון מאורגן בבתים )bytes( בני 8 סיביות. בית: יחידת הזיכרון הקטנה ביותר בעלת כתובת. ניתן לפרש סדרה כזו כמספר הכתוב בבסיס 2. משמעויות נוספות שיתכנו: חלק מפקודה, ועוד. 13
הזיכרון הראשי התקן זיכרון קטן )יחסית לדיסק( שהגישה אליו מהירה בנוי משבבי זיכרון.(chips) - הזיכרון הראשי גודל הזיכרון )RAM( המקובל כיום למחשבים ביתיים הוא 1-12. GB KB = 2 10 bytes MB= 2 20 bytes GB = 2 30 bytes TB = 2 40 bytes.64 גודל הזיכרון ב- Apple II היה KB הזיכרון הראשי הינו.)Random Access Memory( RAM בזיכרון מסוג זה ניתן לגשת לכל כתובת באופן ישיר, כלומר אין צורך לבצע מעבר על כל הזיכרון כדי להגיע לכתובת הרצויה. 14
ספירה בבסיס שתיים )בינארי( דרך בנייתו של מספר עשרוני: 9 3 7 5 * 10 3 10 2 10 1 10 0 9375 = 9000 +300 + 70 + 5 1 0 1 0 * 0 2 3 2 2 2 1 2 0 ובאנלוגיה, המרה ממספר בינארי לעשרוני תיעשה ע"י 10 = 8 + 0 + 2 + 15
וההמרה חזרה... תרגום ממספר עשרוני לבינארי 10 )עשרוני( =? 0 0 1 0 1 0 2 5 2 4 2 3 2 2 2 1 2 0 תרגום ממספר עשרוני למספר בינארי גישה שונה: מנה 0 / 2 1 / 2 2 / 2 מנה מנה מנה 5 / 2 10 שארית שארית שארית שארית 1 0 1 0 16
תוכנייה How a computer works? חומרת המחשב רקע תוכנה רקע צעדים ראשונים בשפת C 17
תוכנה )Software( תוכנית מחשב הינה סדרת פקודות שנועדו לבצע משימה מסוימת. פקודות התוכנית, בשעת ריצתה, נמצאות בזיכרון הראשי. ב- CPU יש מנגנון אשר באופן סידרתי קורא פקודה, מפענח אותה ומבצעה. הפקודות מבוצעות בזו אחר זו, למעט פקודות הסתעפות. לפי סדר ישיבתן בזיכרון, 18
מערכת ההפעלה מערכת הפעלה תוכנה )אוסף תוכניות( אשר: מפקחת על ומנהלת את המחשב על התקניו, משאביו ומשימותיו. מאתחלת ביצוע משימות )תוכניות(. מקצה משאבים למשימות )תוכניות(. מערכת ההפעלה מתווכת בין התוכנה לחמרה. כשמחשב דלוק, מערכת ההפעלה בפעולה ומשרתת אותנו. דוגמאות: 19
תוכנה: שפת מכונה שפת מכונה: השפה שמבין ה- CPU והיא משתנה בין מחשב למחשב. שפות מכונה מכילות פקודות בסיסיות מהסוגים הבאים: העברת נתונים בין הרגיסטרים ותאי הזיכרון. פעולות אריתמטיות ולוגיות. קפיצות והסתעפויות מותנות. שפת מכונה הינה שפה בינארית. 01000010 פקודה לדוגמא: 00010000 move from R1 to R2 20
תוכנה: שפת אסמבלי )סף( שפת סף )Assembly( : ייצוג סמלי של שפת מכונה. למשל, mov mov mov #0, x #1, y #0, i השם 0 מה עושה התוכנית? x במשתנה השם 1 y במשתנה השם 0 i במשתנה mov #30, n השם 30 במשתנה n loop: mov y, t העתק את ערכו של המשתנה t y למשתנה add x, y הוסף את ערכו של המשתנה y x למשתנה mov t, x העתק את ערכו של המשתנה x t למשתנה add #1, i הוסף i 1 למשתנה cmp i, n n השווה את המשתנה i עם המשתנה blt ואם קטן יותר חזור loop אסמבלר: תכנית המתרגמת פקודות שפת סף לשפת מכונה בינארית. 21
תוכנה: שפה עילית x = 0; y = 1; i = 0; n = 30; do { t = y; y = y + x; x = t; } while(i++ < n); :)...,Pascal שפה עילית,C(,Fortran,C++,Java דמוית אנגלית. פקודות מורכבות יותר מפקודות מכונה. מה עושה התוכנית? תכנית בשפה עילית מתאימה לריצה על מחשבים שונים ואינה תלויה בשפת המכונה של מעבד ספציפי. compiler )מהדר(: תכנית המתרגמת תכניות משפה עילית לתכניות בשפת מכונה של מעבד נתון. את קוד המכונה )קובץ הרצה( המתקבל ניתן להריץ פעמים רבות. y = 1, 1, 2, 3, 5, 8, 13, 21, 34, i = 0, 1, 2, 3, 4, 5, 6, 7, 8, 22
שלב התרגום ושלב ההרצה מהדר compiler תוכנית בשפת מכונה my_prog.exe שגיאות הידור )אם יש( compilation errors תוכנית בשפה עילית my_prog.c פלט התוכנית output תוכנית בשפת מכונה my_prog.exe שגיאות הרצה )אם יש( runtime errors קלט לתוכנית input 23
שפת C פותחה ע"י דניס ריצ'י )Dennis Ritchie( במקור יועדה לכתיבת מערכת הפעלה בשנות ה- 70 של המאה ה- 20 )UNIX( ומהדר.)Compiler( זוהי שפה יעילה המאפשרת כתיבה עילית וירידה לפרטים ברמת הביטים )אם רוצים זאת(. בשימוש נרחב במגוון יישומים הנדסיים. שפה זו הינה הבסיס ל- ++C, קל לשגות בה, ל-,Java ול- Ada. וקשה לאתר ולתקן שגיאות אלה. הרגלים נכונים בתכנות משפרים את המצב, ממש! זו השפה בה נתמקד בקורס זה 25
תוכנייה How a computer works? חומרת המחשב רקע תוכנה רקע צעדים ראשונים בשפת C 26
איך אומרים Hello World בשפת C? /* The traditional first program in honor of Dennis Ritchie who invented C at Bell Labs in 1972 */ RUN #include<stdio.h> int main() { printf("hello World!\n"); return 0; } 27
מבנה תוכנית בשפת C /* The traditional first program in honor of Dennis Ritchie who invented C at Bell Labs in 1972 */ #include<stdio.h> RUN הערה הכללת קובץ int main() { printf("hello World!\n"); return 0; } הדפסה למסך ע"י קריאה לפונקציה mainהפונקציה ערך מוחזר אנו נעבור על כל אחד ממרכיבי התוכנית בשקפים הבאים 28
הערות /*... */ */ הערה )Comment( טקסט בתוך ההערה מתחילה בצירוף */ ומסתיימת בצירוף הערה יכולה להשתרע על פני מספר שורות דוגמה: /* In this part of the program we handle the computation of the final grades. */ לפי תקן C99 הערה היא גם טקסט שבא אחרי // עד לסוף השורה: // This is a comment a = b + c; // This is another comment 29
פונקציות פונקציה )Function( לקבל ערכים )פרמטרים( לחשב חישוב מסוים לבצע קלט/פלט להחזיר ערך יחידת חישוב אשר יכולה: )ודברים נוספים( בשפות אחרות משתמשים גם במונחים...,Routine,Procedure לכל פונקציה: הצהרה המתארת את שמה, הפרמטרים שהיא מקבלת ואת ערך החזרה. הגדרת גוף הפונקציה. הגדרה מכילה, בין היתר, לפני השימוש בפונקציה חייבת לבוא ההצהרה עליה. נרחיב את נושא הפונקציות בהמשך הקורס. קלט\פלט ערכי מוצא פונקציה את ההצהרה. פרמטרי כניסה 30
פונקציות דוגמה הצהרה בלבד: שם טיפוס מוחזר double power(double x, int n); double power(double x, int n) { double p; int i; הגדרה: שני פרמטרים } p = 1.0; for (i = 0; i < n; ++i) p = p * x; return p; 31
קבצי כותרת והכללתם ע"י #include קובץ כותרת File( :)Header הצהרות על עצמים חיצוניים. קובץ בעל סיומת "h." אשר מכיל #include <stdio.h> // #include <math.h> // מכיל מכיל הצהרות הצהרות על על פונקציות פונקציות קלט-פלט מתמטיות הנחיה להכליל קובץ כותרת בתוכנית HelloWorld שראינו, ישנה הכללה של stdio.h כיוון שאנו משתמשים בפונקציה printf המוצהרת שם. ללא הכללה זו הקוד לא היה עובר קומפילציה כי הקומפיילר מצפה לראות הצהרה על הפונקציה לפני השימוש בה. 32
פלט מעוצב ע"י printf stdio.h פרמטרים: הארגומנט הראשון הוא מחרוזת בקרה )פירוט בתרגול(, ואחריה באים הערכים אותם יש לכתוב לפי הפורמט. כל ארגומנט מתאים לקוד ה-% הבא בתור במחרוזת הבקרה. מחרוזת הבקרה יכולה גם להכיל טקסט רגיל )ללא %( שיודפס כמו שהוא. ערך החזרה: מספר התווים שנכתבו, או מספר שלילי בעת כישלון. דוגמאות: printf("just printing text.\n"); int i = 5; printf("the sum of %d and %d is %d", i, 2, 2+i); 33
קלט מעוצב ע"י scanf stdio.h פרמטרים: הארגומנט הראשון הוא מחרוזת בקרה )פירוט בתרגול(, ואחריה באים המשתנים אותם יש לקרוא לפי הפורמט. כל ארגומנט מתאים לקוד ה-% הבא בתור במחרוזת הבקרה. יש להוסיף & לפני שם המשתנה )נבין מדוע בהמשך(. ערך החזרה: מספר הנתונים שנקראו בהצלחה, או 1- כשלון. במקרה של לא לשכוח את ה-& int i; double x; float y; scanf("%d%lf%f", &i, &x, &y); דוגמה: 34
הפונקציה main תוכנית ב- C חייבת להכיל פונקציה אשר שמה הוא.main הביצוע המעשי של התוכנית יחל בפונקציה זו. int main() {... } בשלב זה נניח כי main אינה מקבלת פרמטרים. הערך המוחזר ממנה הוא ההפעלה. "קוד סיום התוכנית". ערך זה מוחזר למערכת 0: סיום בהצלחה שונה מ- 0 : בעיה כלשהי 35
מחזור החיים של תוכנה ניתוח הבעיה )הגדרת הקלט והפלט הרצוי( תכנון - Design : מציאת האלגוריתם )algorithm( לפתרון. i. תכנון מבנה הנתונים..ii.iii חלוקת האלגוריתם לתתי-מרכיבים. מימוש : קידוד באמצעות שפת התכנות שנבחרה. מציאת שגיאות,)debug( שימוש ותחזוקה..1.2.3.4 כאשר כותבים תוכניות גדולות ומורכבות, שלב 4 הינו הארוך ביותר. ככל ששלבים 1,2 יסודיים יותר, כך שלבים 3 ו- 4 קצרים ופשוטים יותר. במקרים מסוימים )בעיות מורכבות( שלב )i( 2 הוא הקשה ביותר. 36
תוכנית ראשונה בשפת C הגדרת הבעיה נכתוב תכנית מחשב בשפת C הקוראת 10 מספרים מהמשתמש ומדפיסה את סכומם. הגדרת הבעיה: קלט: סדרה של 10 מספרים. פלט: סכום המספרים. 37
תוכנית ראשונה בשפת C תכנון האלגוריתם: אפס את הסכום. בצע 10 פעמים קרא את הערך הבא. הוסף ערך זה לסכום. הוצא את הסכום כפלט. מבנה הנתונים.1.2.3 נזדקק לשלשה תאי זיכרון: הסכום )sum( המספר הנקרא הנוכחי )num( מספר הערכים שקראנו עד כה )i( בחירת האלגוריתם ומבנה הנתונים בד"כ אינה תלויה בשפת התכנות. 38
תוכנית ראשונה בשפת C הקוד #include <stdio.h> int main() { int i, sum = 0; RUN for (i = 0; i < 10; i++) { int num; scanf("%d", &num); sum += num; // sum = sum + num; } printf("%d\n", sum); } return 0; 39
תוכנית לסיכום מספרים שיפורים #include <stdio.h> int main() { int i, sum = 0, numbers_to_read; RUN printf("please enter number of values\n"); scanf("%d", &numbers_to_read); for (i = 0; i < numbers_to_read; i++) { int num; printf("enter the next integer: "); scanf("%d", &num); sum = sum + num; } printf("the sum of the %d numbers is %d\n", numbers_to_read, sum); } return 0; 40
תוכנית לסיכום 10 מספרים בדיקת קלט...... printf("please enter number of values\n"); scanf_result = scanf("%d", &numbers_to_read); if(scanf_result < 1) { printf("failed reading the number of values\n"); return 1; } for( i = 0; i < numbers_to_read; i++ ) { printf("enter the next integer: "); int num; scanf("%d", &num); sum = sum + num; } RUN איזו בדיקה נוספת כדאי לעשות? מה יקרה אם נכניס מספר שאינו שלם? 41
מקוד המקור לתוכנית שרצה - התהליך קוד מטרה נוסף other.obj קוד מקור prog.c מהדר )קומפיילר( קוד מטרה prog.obj ספריה libc.lib ק ש ר )linker( תוכנית לביצוע prog.exe 42
סוגי שגיאות שגיאות תחביר Errors( )Syntax קוד מקור שאינו חוקי: המהדר מגלה בקלות. החלפת השורה sum); printf("%d \n", בשורה printf("%d \n", num); תגרום לקבלת הודעה מהקומפיילר על כך שהמשתנה num אינו מוגדר. שגיאות משמעות Errors( )Semantic קוד מקור חוקי אבל שגוי: קשה יותר לגלות. sum += num; החלפת השורה בשורה עדיף sum = sum + num; sum = num + num; תוביל לשגיאה בפעולת התוכנית, אך הקומפיילר לא יראה בה שגיאה. שגיאות זמן ריצה Errors( )Run-time כגון חלוקה ב- 0 וכד': מתגלות בזמן הריצה. Bug! שגיאות לוגיות Errors( )Logical שגיאות בפיתוח האלגוריתם: לא תמיד מצליחים לאתר את כולן. 43