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

תוכן שנמחק תוכן שנוסף
מ ←‏תרגום לשפת מכונה: זה לא כמו בג'אווה
Matanyabot (שיחה | תרומות)
מ בוט החלפות: על פי, על ידי, תוכנית, אחר כך, זיכרון, תאור\1, אובייקט, מסוי\1, דוגמה\1
שורה 22:
 
===design by contract===
"חוזה" הן למעשה קבוצה של התניות שמוגדרות ע"יעל ידי המתכנת, המגדיר את כל הממשק וההשפעות של התוכנית על סביבתה, בכך ניתן להקל על כל מי שרוצה להשתמש בצורה הכי בטוחה והכי יעילה. העיקרון הומצא על ידי ממציא השפה וזאת אחת התכונות החשובות של השפה.
לכל פונקציה ניתן להצהיר:
*תנאים לפני הרצת הפונקציה (Pre Conditions)
שורה 33:
*ביטויים קבועים לאורך התוכנית (Invariant)
 
design by contract הינו סימן רשום של Eiffel software והמונח הוטמע והומצא ע"יעל ידי ד"ר ברנרד מאייר יוצר השפה ולכן "החוזה" הינו חלק מאוד מרכזי בשפת אייפל.
 
 
==== דוגמאדוגמה ל design by contract class DATE ====
 
<source lang="eiffel">
שורה 85:
===uniform access principle===
מכיוון שיש שינויים ותוספות של אובייקטים חדשים לשפה, דאגו לעשות שכל הפניות יהיו באותה צורה כדי לחסוך תקלות. ולכן יש מנגנון גישה זהה לכל הפונקציות והמחלקות.
לדוגמה:
לדוגמא:
 
(Foo.bar(5
שורה 100:
ניהול זיכרון של תוכנית בשפת Eiffel הינה משימה לא קלה בגלל שלוש סיבות:
 
א. תוכנית בשפת Eiffel יכולה לקרוא לפונקציות בשפת C, לכן צריך להתחשב בכך שיכולות להיות בתוכנית 2 סוגי זיכרון: זכרוןזיכרון ל-Eiffel וזיכרון ל-C.
 
ב. צריך להבחין בין אובייקטים רגילים - אובייקטים בעלי גודל קבוע שנקבע באופן סטטי (בזמן הקומפילציה) עפ"יעל פי מספר תכונות האובייקט - לבין אובייקטים מיוחדים - אובייקטים בעלי גודל משתנה (מערכים, מחרוזות ועוד...).
 
ג. לא מספיק לשחרר זיכרון רק לשם שימוש חוזר בתוכניות בשפת Eiffel, אלא אנו מעוניינים שניתן יהיה להחזיר את הזיכרון אל מערכת ההפעלה לשימוש חוזר גם באפליקציות אחרות.
שורה 115:
כברירת מחדל, כל יישום בשפת Eiffel כולל GC אוטומטי. אבל בכל אופן ניתן לשלוט על מנגנון ניהול זיכרון ולכוון אותו כך שיתאים לצרכים הספציפיים של המתכנת באמצעות פונקציות ופרוצדורות השייכות למחלקה MEMORY, שמאפשרים "להדליק" או "לכבות" את ה GC האוטומטי.
 
המאפיין הייחודי של ה-GC של Eiffel הוא שה-GC אינו מבצע שחרור זיכרון רק עבור שימוש חוזר ע"יעל ידי הקצאת אובייקטים נוספים לאותה תכניתתוכנית, אלא למעשה, מחזיר את הזיכרון למערכת ההפעלה ומשחרר אותו לשימוש חוזר ע"יעל ידי תכניתתוכנית אחרת. למרות שקשה ליישם את המאפיין החשוב הזה, הוא הכרחי בעיקר למערכות שצריכות לרוץ במשך הרבה זמן או אפילו באופן קבוע.
 
== מבנה השפה ==
שורה 141:
=== אובייקטים ===
 
נקראים גם REFERENCE ומכילים אוביקטיםאובייקטים או מערכים לדוגמאלדוגמה אובייקט שאני הגדרתי(אלא אם כן הגדרתי במפורש EXPEND):
 
<source lang="eiffel">i: MYoBJ</source>
שורה 183:
t: TUPLE [name: STRING; weight: REAL; date: DATE]
 
</source> יכול להוות תאריך או רשומה מסויימתמסוימת וא"צ להגדיר מחלקה <source lang="eiffel">
 
["Brigitte", 3.5, Last_night]
שורה 299:
 
== מנגנון ניהול חריגות ==
לשפה יש מנגנון מאוד יעיל של ניהול חריגות שעובד בצורה כזאת שהוא משתמש בבדיקת ה-post condition שלו, ובמקרה שזה לא עובר, הוא עושה את הפונקציה מחדש בשביל לנסות שוב לפי מספר הניסיונות שהוגדרו לו מראש.{{ש}}לדוגמאלדוגמה: <source lang="eiffel">
connect_to_server (server: SOCKET) -- Connect to a server or give up after 10 attempts.
require
שורה 326:
קוד ששונה "הותך", ועל ההרצה שלו מופקד המפרש של השפה.
 
היתרון של הטכנולוגיה, הוא שהיא נותנת לנו להנות מכל העולמות - מהירות הריצה שמספק קוד שכבר תורגם במלואו לשפת מכונה ע"יעל ידי המהדר, ומהירות תגובה לשינויים בעזרת קוד מפורש.
 
==תרגום לשפת מכונה==
באייפל יש שני שלבי תרגום:
החלק הראשון הוא הידור לקוד ביניים בעזרת מהדר, עליו רץ מפרש.
אח"כאחר כך, הקוד מתורגם לשפת C, ובעזרת מהדר C הוא מהודר לשפת מכונה.
 
ע"פ מתכנני השפה, מטרת התרגום לשפת C כשפת ביניים, הוא ניצול שיטות הייעול הקיימות במהדרי שפת C. (לטענת מעצבי השפה, קוד בשפת Eiffel יכול להיות יעיל כאילו נכתב בשפת C עצמה או Fortran)
שורה 354:
*אין נגישות למערך אחרי הגדרתו. יש לעשות CREATE לאובייקטים כגון מערכים, קבצים וכו'.
*בטיפוס מסוג אובייקט בצורה דפולטיבית השמה מחזיר פוינטר לאובייקט ולכן אם הוא נמחק קיים פוינטר מתנדנד ולכן רצוי להשתמש ב בCLONE או COPY
* קיים קושי במציאת מדריך שפשוט מראה פקודות ולא רק מדבר על תיאוריהתאוריה של השפה.
* פתיחת קבצים נעשית בצורה שונה מתוכניות אחרות, צריך להכניס את מיקום הקובץ למשתנה ורק אחרי זה להתחיל לפעול עליו.
* מערכת שונה של החזרת ערך מהפונקציה במקום לעשות return מכניסים את הערך שרוצים אל המשתנה result. (בדומה לPL/SQL)