אייפל (שפת תכנות) – הבדלי גרסאות

תוכן שנמחק תוכן שנוסף
←‏עריכת הפתיח: תבנית בעבודה
מ הגהה
שורה 2:
'''אייפל''' ('''Eiffel''') היא שפת [[תכנות מונחה עצמים]]. שפה זו נוצרה בידי [[ברטנארד מאייר]] (שהיה חסיד של תכנות מונחה עצמים) ועל ידי חברת Eiffel Software ב-[[1985]]. ונקראה על שם [[גוסטב אייפל]], המהנדס שתכנן את [[מגדל אייפל]].
 
השפה נועדה לשפר שפות OOP קודמות. כתיבת השפה הושפעה מהשפות [[Simula]], [[Ada]] , Z ושימשה השראה לשפות פופולאריות כמו: [[C#]] ,[[Java]] ,[[Ruby]] ,D ועוד. מושגים רבים שהוצגו לראשונה על ידי אייפל, לאחר מכן מצאו את דרכם לשפות תכנות מודרניות כ-#Java, C ושפות אחרות.
 
== מאפיינים עיקריים ==
 
* '''יבילות''' - רץ על פלטפורמות שונות.
* '''Melting ice''' - שילוב של הידור ומפרש שרץ ב-byte Code.
* '''Design by contract''' - יצירת חוזה בעבודה עם קטעי קוד.
* '''טיפוסיות חזקה''' (strong type) ללא המרות מרומזות.
* '''קישור דינמי''' (dynaic bounding) בזמן ריצה. מאפשר [[פולימורפיזם]].
* '''קריאות''' - מנגנונים ללוגיקה, מבניות בקוד ותיעוד.
* '''statically typed''' - מצריכה הגדרה בזמן קומפילציה.
* דוקומנטציה אוטומטית.
* '''מחלקות גנריות''' - מאפשרת שימוש במחלקות גנאריות.
* '''העמסת שיטות''' (MeyhodMethod overloading) - ניתן לבצע חפיפת מתודות של השפה.
* '''העמסת אופרטורים''' (Operators overloading) - ניתן לבצע חפיפת אופרטורים של השפה.
* Pointer Arithmetic לא קיים בשפה.
* [[ביטוי רגולרי|ביטויים רגולריים]] לא קייםקיימיים בשפה.
 
==עקרונות עיקריים==
 
===design by contract===
"חוזה" שמוגדרהן למעשה קבוצה של התניות שמוגדרות ע"י המתכנת, המגדיר את כל הממשק וההשפעות של התוכנית על סביבתה, בכך ניתן להקל על כל מי שרוצה להשתמש בצורה הכי בטוחה והכי יעילה. העיקרון הומצא על ידי ממציא השפה וזאת אחת התכונות החשובות של השפה.
לכל פונקציה ניתן להצהיר:
:*תנאים לפני הרצת הפונקציה (Pre Conditions)
:*תנאים לאחר הרצת הפונקציה (Post Conditions)
*מגבלות לגבי תוכן הפרמטרים שהפונקציה מקבלת.
:מה מותר ואסור לתת לפונקציה בפרמטרים
*מגבלות לגבי התוכן שהפונקציה מחזירה.
:מה מותר ואסור לפונקציה להחזיר
:מה*מגבלות מותרלגבי ואסורתוכן לפונקציההחריגות שהפונקציה יכולה לזרוק (exception)
:*תופעות לוואי של הרצת הפונקציה (לדוגמה שימוש בלולאה לצורך השהייה)
:*נתונים על הביצועים שלה (זיכרון, זמן ריצה)
:*ביטויים קבועים לאורך התוכנית (Invariant)
 
design by contract הינו סימן רשום של Eiffel software והמונח הוטמע והומצא ע"י ד"ר ברנרד מאייר יוצר השפה ולכן "החוזה" הינו חלק מאוד מרכזי בשפת אייפל.
שורה 83:
 
===Open Closed principle===
קוד צריך להיות פתוח להרחבה וסגור לשינויים, זהוהדבר יכול להתבטא בשתי צורות:
#בצורה שזהשהדבר מתבטא בשפהבשפת שלנואייפל - כותבים מחלקה בצורה רגילה, ואם מתגלה באג בתוכנה, אז במקום לשנות את המחלקה המקורית, יוצרים מחלקה חדשה שמשתמשת במחלקה הקודמת ועושה את השינויים שנצרכים, או שעושיםשיוצרים מחלקה שיורשת מהמחלקה המקורית ושםשבה עושים את השינויים.
#בצורה הרגילה שימוש במחלקה אבסטרקטית, וירושות ממנה בצורה כזאת שכולם צריכים להיות באותה התבנית, ואז מקשרים את כולם בפולימורפיזם.
 
===uniform access principle===
מכיוון שיש שינויים ותוספות של אובייקטים חדשים לשפה, דאגו לעשות שכל הפניות יהיו באותה צורה כדי לחסוך תקלות. ולכן יש מנגנון גישה זהה לכל הפונקציות והמחלקות.
לדוגמא:
 
(Foo.bar(5
 
יכול לשמש בתור פונקציה שמקבלת את הערך 5 ויכול גם לשמש בתור מחלקה שהמשתנה שלה יקבל את הערך 5.
 
===Command Quiery seperetion===
הפרדה מוחלטת בין פונקציה שמחזירה ערך, כלומר בקשת מידע ואשר אינה יכולה בשום אופן לעדכן מידע, לבין פרוצדורה המעדכנת או מבצעת פעולה, אך אינה מחזירה מידע. וזאת ע"מ לא ליצור side effects שלא התכוונתשהמתכנת לא התכוון אליהם.
תאימות
 
===תאימות לשפות אחרות===
השפה בנויה כך שתוכל להתממשק בקלות עם מגוון שפות (בדגש על שפת [[C]] ודוט נט) אפשר אפילו לכתוב קוד בשפת C בגוף הפונקציה של Eiffel, ובכך להשלים כל חיסרון שעלול להיות בשפה עם הסיפריות של שפת C.
 
==ניהול זיכרון==
ניהול זיכרון של תוכנית בשפת Eiffel הינה משימה לא קלה בגלל שלוש סיבות:
 
א. תוכנית בשפת Eiffel יכולה לקרוא לפונקציות בשפת C, לכן צריך להתחשב בכך שיכולות להיות בתוכנית 2 סוגי זיכרון: זכרון ל-Eiffel וזיכרון ל-C.
צריך להבחין בין אובייקטים רגילים - אובייקטים בעלי גודל קבוע שנקבע באופן סטטי (בזמן הקומפילציה) עפ"י מספר תכונות האובייקט - לבין אובייקטים מיוחדים - אובייקטים בעלי גודל משתנה (מערכים, מחרוזות ועוד...).
 
לא מספיק לשחרר זיכרון רק לשם שימוש חוזר בתוכניות בשפת Eiffel, אלא אנו מעוניינים שניתן יהיה להחזיר את הזיכרון אל מערכת ההפעלה לשימוש חוזר גם באפליקציות אחרות.
ב. צריך להבחין בין אובייקטים רגילים - אובייקטים בעלי גודל קבוע שנקבע באופן סטטי (בזמן הקומפילציה) עפ"י מספר תכונות האובייקט - לבין אובייקטים מיוחדים - אובייקטים בעלי גודל משתנה (מערכים, מחרוזות ועוד...).
 
ג. לא מספיק לשחרר זיכרון רק לשם שימוש חוזר בתוכניות בשפת Eiffel, אלא אנו מעוניינים שניתן יהיה להחזיר את הזיכרון אל מערכת ההפעלה לשימוש חוזר גם באפליקציות אחרות.
 
מסיבות אלה, Eiffel אינה מסתפקת ב- syscall malloc() (שכן malloc() לא יכול להחזיר את הזיכרון אל מערכת ההפעלה), אלא יש לה מנגנון לניהול זיכרון משלה.
 
כמו כן, על מנת לפתור את בעיית ה-Garbage Collection, השפה אינה מסתפקת באלגוריתם מוכן לביצוע Garbage Collection, אלא היא משתמשת בכמה אלגוריתמים בסיסיים, ובכל פעם שיש צורך ב -GC, האלגוריתם נקבע לפי הנסיבות ורמת הדחיפות.
 
שתי האלגוריתמים העיקריים למימוש GC בשפת Eiffel, הם:
שורה 112 ⟵ 118:
* Memory Compaction
כברירת מחדל, כל יישום בשפת Eiffel כולל GC אוטומטי. אבל בכל אופן ניתן לשלוט על מנגנון ניהול זיכרון ולכוון אותו כך שיתאים לצרכים הספציפיים של המתכנת באמצעות פונקציות ופרוצדורות השייכות למחלקה MEMORY, שמאפשרים "להדליק" או "לכבות" את ה GC האוטומטי.
המאפיין הייחודי של ה-GC של Eiffel הוא שה GC אינו מבצע שחרור זיכרון רק עבור שימוש חוזר ע"י הקצאת אובייקטים נוספים לאותה תכנית, אלא למעשה, מחזיר את הזיכרון למערכת ההפעלה ומשחרר אותו לשימוש חוזר ע"י תכנית אחרת. למרות שקשה ליישם את המאפיין החשוב הזה, הוא הכרחי בעיקר למערכות שצריכות לרוץ במשך הרבה זמן או אפילו באופן קבוע.
 
המאפיין הייחודי של ה-GC של Eiffel הוא שה -GC אינו מבצע שחרור זיכרון רק עבור שימוש חוזר ע"י הקצאת אובייקטים נוספים לאותה תכנית, אלא למעשה, מחזיר את הזיכרון למערכת ההפעלה ומשחרר אותו לשימוש חוזר ע"י תכנית אחרת. למרות שקשה ליישם את המאפיין החשוב הזה, הוא הכרחי בעיקר למערכות שצריכות לרוץ במשך הרבה זמן או אפילו באופן קבוע.
 
== שפהמבנה השפה ==
 
=== משתנים פשוטים ===
שורה 286 ⟵ 292:
ישנה הסכמה בשפה לגבי הפרדה גמורה בין פונקציות לבין פרוצדורות.
:פונקציות - עושות חישובים ומחזירות ערך, אבל לא יכולות לבצע שינויים במשתנים.
:פרוצדורות - עושות שינויים במשתנים, אבל לא מחזירות ערך.
בצורה כזאת, אפשר לשלוח פונקציה בלי לדאוג שישתנו דברים בתוכנית. אך בפועל בשפה הקומפיילר לטלא אוכף נושא זה.
שם הפונקציה בסוגרים פרמטרים ואחרי ערך מוחזר (אפשר להשמיט ערך מוחזר או פרמטרים או שניהם) הIS מכיל הערה שמתארת את הפונקציה.
 
שורה 342 ⟵ 348:
 
== מנגנון ניהול חריגות ==
לשפה יש מנגנון מאוד יעיל של ניהול חריגות שעובד בצורה כזאת שהוא משתמש בבדיקת הpostה-post condition שלו, ובמקרה שזה לא עובר, הוא עושה את הפונקציה מחדש בשביל לנסות שוב לפי מספר הניסיונות שהוגדרו לו מראש.{{ש}}לדוגמא: <source lang="eiffel">
connect_to_server (server: SOCKET) -- Connect to a server or give up after 10 attempts. require
None_Null: server /= Void and then server.address /= Void
שורה 368 ⟵ 374:
קוד שלא נעשה בו שינוי מאז הפעם האחרונה, כולל ספריות מערכת, הוא קוד שעבר הידור – ולכן הוא "קפוא".
קוד ששונה "הותך", ועל ההרצה שלו מופקד המפרש של השפה.
 
היתרון של הטכנולוגיה, הוא שהיא נותנת לנו להנות מכל העולמות - מהירות הריצה שמספק קוד שכבר תורגם במלואו לשפת מכונה ע"י המהדר, ומהירות תגובה לשינויים בעזרת קוד מפורש.
 
==תרגום לשפת מכונה==
כמו ב -Java, באייפל יש שני שלבי תרגום:
 
החלק הראשון הוא תרגום לקוד ביניים בעזרת מהדר, עליו רץ מפרש.
שורה 380 ⟵ 387:
== חווית המשתמש ==
התוכנה מתאימה לכותבים שצריכים לתאם ביניהם ממשקים, או שהשימוש בקוד לא ידוע מראש (ירושה מבוקרת).
ה- writeabilty (הכתיבות) סביר, דרוש מעט זמן להתרגל לשפה, וכן יש הרבה דוקומנטציה על השפה היתרון הוא שהוא מפורט והחיסרון שהוא כמעט היחיד (עיין למטה בקישורים)
 
==הערות כלליות==
 
*השפה הינה case insensitive - הקומפיילר אינו מבחין בין אותיות גדולות וקטנות, זאת אומרת שלא משנה אם כותבים InTeGer או iNtEgEr. אבל... בכל מקרהמקובל ישלהשתמש סגנוןבסגנון כתיבה קבוע לשפה, כדי לעשות את הקוד קריא לכל מי שמכיר את השפה. ולכן נוהגים לכתוב: מחלקות - באותיות גדולות, פונקציות - באותיות קטנות, משתנים - אות ראשונה גדולה והשאר קטנות, מספר מילים - כותבים עם קו תחתון בין המילים.
* באייפל אין חובה לשיםלהבדיל בין פקודות באמצעות נקודה פסיק (;) בסוף שורה.
 
* באייפל אין חובה לשים נקודה פסיק (;) בסוף שורה
* יש להבדיל בין אופרטור שוה (=) שמחזיר ערך בוליאני ואינו מבצע השמה לבין אפרטור השמה (=:)
* הסימן -- (מינוס כפול) מבטא הערה.
* פונקציות יצירה הם סוג של פונקציות בונות (אלא שקוראים להן אקטיבית) המשמשות לאיתחול והגדרות המחלקה יש להגדיר פונקציות כאלה בחלק CREATE במחלקה ולממשן בחלק FEATURS כמו כל שאר הפונקציות.
* חלק IS בהגדרת הפונקציה מכיל הערה הממצה את מהות ה מחלקה ("מטפורה").
* פונקציות נקראות בדומה למשתנים ולכן המשתמש לא צריך לדעת את אופן המימוש.
* השפה מאד מבנית, משתמשת בבלוקים לכל קבוצת קוד. בדומה לADA.
 
==בעיות ופתרונן==
 
*כאשר פונקציה מחזירה פרמטר יש להשתמש בפרמטר המובנה בשפה RESULT לצורך החזרה.
*אין נגישות למערך אחרי הגדרתו. יש לעשות CREATE לאובייקטים כגון מערכים, קבצים וכו'.