משתמש:Fargoth~hewikibooks/פייתון/דרכה של תוכנה

תבנית:פייתון

דרכה של התוכנה

עריכה

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

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

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


1.1 שפת התיכנות פייתון

עריכה

שפת התיכנות שתלמד היא פייתון. פייתון היא שפת תיכנות גבוהה; דוגמאות נוספות לשפות תוכנה גבוהות מוכרות הן C, C++, perl ו java. כפי שהשם "שפת תיכנות גבוהה" עשוי לרמוז, יש גם שפות תיכנות נמוכות, לפעמים אלה מכונות "שפות מכונה". מחשבים מסוגלים להריץ רק תוכנות הכתובות בשפה נמוכה. לכן תוכנה שכתובה בשפה גבוהה חייבת לעבור עיבוד לפני שתוכל לעבוד. העיבוד הנוסף הזה לוקח זמן [1] , חיסרון קטן של שפות גבוהות, אבל הייתרונות עצומים.


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

קיימות שתי שיטות לתרגם שפה גבוהה לשפת מכונה: תוכנות פענוח (מפענחים=interpreters) ותוכנות הידור (מהדרים=compilers).

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


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

פייתון נחשבת לשפה מפוענחת, היות שהיא "רצה" דרך מפענח.

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

Python 2.4.1 (#1, Apr 29 2005, 00:28:56)
Type "help", "copyright", "credits" or "license" for more information.
>>> print 1 + 1
2

שתי השורות הראשונות בדוגמא זו מוצגות ע"י המפענח מיד לאחר שמפעילים אותו. השורה השלישית מתחילה ב <<<, זהו הסימן בו המפענח משתמש כדי להראות שהוא מוכן. אם אתה כותב print 1+1, המפענח עונה 2.

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

print 1+1

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

python dinsable.py

במערכות שונות ייתכן שהרצת התסריט תהיה שונה.

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

1.2 מהי תוכנה?

עריכה

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

הפרטים שונים משפה לשפה, אבל כמה הוראות בסיסיות מופיעות בכל שפה:

קלט: קבל נתונים מהמקלדת, מקובץ, או מהתקן אחר.

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

מתמטיקה: בצע פעולות חשבון בסיסיות כמו חיבור וכפל.

הרצה מותנית: בדוק האם תנאים מסויימים מתקיימים והרץ את רצף ההוראות המתאים.

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

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

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

1.3 מהו ניפוי תוכנית

עריכה

תיכנות היא פעולה מועדת לשגיאות.

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


1.3.1 שגיאות תחביר

עריכה

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

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


1.3.2 שגיאות זמן ריצה

עריכה

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

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


1.3.3 שגיאות משמעות

עריכה

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

הבעיה היא שהתוכנה שכתבת היא לא התוכנה שרצית לכתוב. המשמעות של התוכנה לא נכונה. אפיון שגיאות משמעות יכול להיות בעייתי מפני שהיא דורשת חזרה על פעולות התוכנה ע"י בחינה של הפלט ונסיון להבין מה התוכנה עושה.


1.3.4 ניפוי שגיאות נסיוני

עריכה

אחד הכשרונות החשובים ביותר שתרכוש הוא ניפוי שגיאות (debugging). ניפוי שגיאות יכולה להיות פעילות מתסכלת, אך היא אחת מהפעולות המחכימות, מאתגרות והמעניינות ביותר בתיכנות.

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

ניפוי שגיאות דומה גם למדע נסיוני. לאחר שגיבשת רעיון לגבי מה השתבש, אתה משנה את התוכנה ומתחיל שוב. אם התיאוריה שלך נכונה, הצלחת לחזות נכון את תוצאות השינוי שעשית בתוכנה, והתקרבת עוד צעד ליצירת תוכנה עובדת. אם התוצאות שקיבלת לא היו צפויות, תצטרך למצוא תיאוריה חדשה. כפי ששרלוק הולמס אמר "לאחר ששללת את כל הבלתי אפשרי, מה שנשאר, לא משנה כמה לא סביר, חייב להיות האמת." (A. Conan Doyle, The Sign of Four)

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

לדוגמא, לינוקס היא מערכת הפעלה שמכילה אלפי שורות קוד, אבל היא החלה בתור תוכנה פשוטה שלינוס טרובלדס יצר כדי לחקור את ארכיטקטורת ה 80386. לארי גרינפלד טוען שאחד מהפרוייקטים הראשונים של לינוס היה תוכנה שהדפיסה BBBB במקום AAAA. בהמשך התוכנה הזו התפתחה ללינוקס. [2]

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


1.4 שפות רשמיות ושפות טבעיות

עריכה

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

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

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

לשפות רשמיות יש בדרך כלל כללים נוקשים לתחביר. למשל, 3+3=6 היא הצהרה נכונה מבחינה תחבירית (הערת המתרגם: וגם משמעותית במקרה זה), אבל 3+ = 3$6 אינה כזו.   היא נוסחא כימית נכונה מבחינה תחבירית, אבל   אינה כזו.

ניתן לחלק כללים תחביריים לשתי קבוצות: סימנים, ומבנה. סימנים הם האלמנטים הבסיסיים של השפה, כמו מילים, מספרים, וסודות כימיים. אחת הבעיות עם 3+ = 3$6 היא ש- $ אינו סימן חוקי במתמטיקה (לפחות ככל הידוע לי). באופן דומה, 2Zz אינו חוקי מפני שאין יסוד העונה לסימן Zz.

הקבוצה השניה של שגיאות תחביר קשור למבנה התחבירי; כלומר, הסדר בו הסימנים מסודרים. ההצהרה 3+ = 3$6 אינה חוקית על אף ש = ו + הם סימנים חוקיים מפני שהם אינם יכולים להופיע מיד אחד אחרי השני. באופן דומה, בנוסחא כימית המספר התחתון מופיע אחרי שם היסוד ולא לפניו (והוא אינו מופיע כלל כשיש רק יסוד אחד בנוסחא).

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

כאשר אתה קורא משפט בעברית, או הצהרה בשפה רשמית, אתה צריך למצוא את מבנה המשפט (בעברית דבר זה נעשה בצורה טבעית בתת המודע שלך). תהליך זה נקרא פירוק משפט (parsing).

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

למרות שלשפות רשמיות ולשפות טבעיות יש הרבה במשותף - סימנים, מבנה, תחביר, ומשמעות - ישנם גם לא מעט הבדלים:

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

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

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

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

דיקלום: משמעותן המילולית של המילים חשובה יותר, והמבנה תורם יותר למשמעות. דיקלום קל יותר לפיענוח מאשר שירה, אך עדיין יש בו חוסר בהירות.

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

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

1.5 התוכנה הראשונה

עריכה

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

print 'Hello, World!'

זוהי דוגמא להצהרת ההדפסה (print), שלא באמת מדפיסה על נייר. היא מציגה ערך על המסך, ובמקרה שלנו התוצאה הן המילים

Hello, World!

הגרשיים בתוכנה מסמנים את תחילת וסוף הטקסט, הן לא מוצגות בתוצאה.

יש אנשים ששופטים איכות של שפת תיכנות על פי הפשטות של תוכנת ה- "שלום, עולם". על פי הקריטריון הזה, לא ניתן להצליח יותר משפת פייתון.

1.6 ניפוי שגיאות

עריכה

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

בכל פעם שתתנסה בתכונה חדשה, כדאי שתנסה לעשות טעויות. למשל, בתוכנת ה- "שלום, עולם", מה קורה אם לא תכלול סימן גרשיים אחד? מה קורה אם לא תכלול את שניהם? מה יקרה אם תאיית את המילה print לא כשורה?

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

עדיף לעשות שגיאות עכשיו ובכוונה, מאשר אחר כך ובטעות.

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

1.8 תרגילים

עריכה
  • גלוש לאתר http://python.org. בדף זה תמצא מידע רב על פייתון, והפנוית לדפים הקשורים לפייתון.

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

  • הפעל את מפענח הפייתון וכתוב

help() כדי להפעיל את שירות העזרה הקוונת (online help utility). לחילופין, כתוב

help('print')

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

לפרק הבא: משתמש:Fargoth/פייתון/משתנים ביטויים והצהרות

הערות

עריכה
  1. ^ במקרה של שפות המורצות במפענח בצורה דינאמית כמו java ופייתון - הניתוח הזה נכון, אבל כאשר מדובר בשפות שעוברות הידור (compilation זמן העיבוד הוא לא הגורם לחוסר היעילות, אלא הדרך הלא תמיד אופטימלית שהמהדר בוחר לתרגם את הקוד לשפת מכונה.
  2. ^ (The Linux Users' Guide Beta Version 1)