אייפל (שפת תכנות) – הבדלי גרסאות
תוכן שנמחק תוכן שנוסף
מ הגהה |
דויד פון תמר (שיחה | תרומות) הגהה, ניסוח, הרחבה, עריכה, עדכון, תקלדה, ויקיזציה, עיצוב. הערך עבר תיקונים באופן מקיף. הוא היה במצב רע מאוד עם שגיאות כתיב ודקדוק. כעת הוא קריא ומובן יותר. |
||
שורה 1:
{{שפת תכנות
| שם =
| שם בשפת המקור = Eiffel
}}
'''אייפל''' (במקור
השפה
מאייר כתב ספר על תכנות מונחה עצמים (''Object-Oriented Software Construction''), בספר ניסח כללים
== מאפיינים עיקריים ==
* '''
* '''
* '''
* '''[[מערכת טיפוסים|טיפוסיות]] חזקה'''
* '''טיפוסיות קבועה''' - דורשת הגדרה והתאמת טיפוסיות בזמן הידור.
* '''[[קישור דינמי]]''' - קישור בזמן ריצה. מאפשר [[פולימורפיזם (מדעי המחשב)|פולימורפיזם]].
* '''קריאות''' - מנגנונים ללוגיקה, מבניות בקוד ותיעוד.
* '''תיעוד אוטומטי'''.
* '''מחלקות [[תכנות גנרי|גנריות]]''' - מאפשרת שימוש במחלקות גנריות.
* '''העמסת
* '''העמסת
*
* [[ביטוי רגולרי|ביטויים רגולריים]] לא קיימים בשפה.
==עקרונות עיקריים==
===
{{הפניה לערך מורחב|חוזה (תכנות)}}
חוזה הוא קובץ אילוצים המוגדר על ידי המתכנת על מנת להבטיח את אמינות הקוד. העיקרון הומצא על ידי ממציא השפה וזאת אחת התכונות החשובות של השפה. בשפות תכנות עכשוויות נעשה שימוש ב[[פיתוח מונחה-בדיקות|פיתוח מונחה בדיקות]] כתחליף לתכנות מונחה חוזים.
לכל פונקציה ניתן להצהיר את האילוצים הבאים.
*תנאים
*תנאים לאחר ביצוע הפונקציה (post-conditions).
*מגבלות לגבי תוכן הפרמטרים שהפונקציה מקבלת.
*מגבלות לגבי התוכן שהפונקציה מחזירה.
*מגבלות לגבי תוכן [[חריגה|החריגות
*תופעות לוואי של הרצת הפונקציה (לדוגמה, שימוש בלולאה לצורך השהייה).
*נתונים על הביצועים שלה (זיכרון, זמן ריצה).
*ביטויים קבועים לאורך התוכנית (
"''Design by
==== דוגמה
<syntaxhighlight lang="eiffel">
create
שורה 80 ⟵ 81:
</syntaxhighlight>
===עקרון פתיחות/סגירות===
{{הפניה לערך מורחב|עקרון פתיחות/סגירות}}
הקוד הקיים (מתוך [[ספרייה (תכנות)|ספריות]]) צריך להיות פתוח להרחבה, אך סגור לשינויים, והדבר יכול להתבטא בשתי צורות הבאות.
#כפי שהעיקרון מתבטא בשפת אייפל - כותבים מחלקה בצורה רגילה, ואם נתפס [[באג]] בתוכנה, אז במקום לשנות את המחלקה המקורית, יוצרים מחלקה חדשה שמשתמשת במחלקה הקודמת ועושה את השינויים הדרושים, או שיוצרים מחלקה שיורשת מהמחלקה המקורית שבה עושים את השינויים.
#בצורה הרגילה. שימוש במחלקה מופשטת, וירושה המאלצת הלימה לממשק ההפשטה. מכאן עקרון הפולימורפיזם בתכנות מונחה עצמים יאפשר שימוש עם תאימות לאחור בקוד הקיים.
===עקרון הגישה האחידה===
כיוון שיש שינויים ותוספות של אובייקטים חדשים לשפה, דאגו לעשות שכל הפניות יהיו באותה צורה כדי לחסוך תקלות. ולכן יש מנגנון גישה זהה לכל הפונקציות והמחלקות. לדוגמה הסימון <code>Foo.Bar(5)</code> יכול לשמש בתור קריאה לפונקציה ושליחת הערך 5 כפרמטר, ויכול גם לשמש לאתחול מחלקה שהמשתנה שלה יקבל את הערך 5.
===עקרון הפרדת פקודות משאילתות===
הפרדה מוחלטת בין פונקציה שמחזירה ערך, כלומר בקשת מידע ואשר אינה יכולה בשום אופן לעדכן מידע, לבין פרוצדורה המעדכנת או מבצעת פעולה, אך אינה מחזירה מידע. עקרון זה ידוע יותר ב[[תכנות פונקציונלי]] באופן מקובל יותר כהפרדת פונקציות ''פונקציונליות גרידא'' מפונקציות שאינן פונקציונליות גרידא ולהן ''תוצאות לוואי''. מעצב השפה כינה פונקציות עם תוצאות לוואי כ־"פקודות", ופונקציות פונקציונליות גרידא כ־"שאילתות", אך המינוח הזה אינו נהוג בשפות אחרות.
===תאימות לשפות אחרות===
השפה בנויה כך שתוכל להתממשק בקלות עם מגוון שפות (בדגש על שפת [[C (שפת תכנות)|C]], ושפות התכנות מבוססות
==ניהול זיכרון==
ניהול זיכרון של תוכנית
# תוכנית בשפת Eiffel יכולה לקרוא לפונקציות בשפת C, לכן צריך להתחשב בכך
# צריך להבחין בין אובייקטים רגילים - אובייקטים בעלי גודל קבוע שנקבע באופן סטטי (בזמן ההידור) על פי מספר תכונות האובייקט
# לא מספיק לשחרר זיכרון רק לשם שימוש חוזר בתוכניות בשפת Eiffel, אלא אנו מעוניינים שניתן יהיה להחזיר את הזיכרון אל מערכת ההפעלה לשימוש חוזר גם באפליקציות אחרות.
מסיבות אלה, Eiffel אינה מסתפקת
כמו כן, על מנת לפתור את בעיית
שני האלגוריתמים העיקריים לאיסוף זבל בשפת Eiffel, הם '''mark & sweep''', ו־'''memory compaction'''. כברירת מחדל, כל יישום בשפת Eiffel כולל איסוף זבל אוטומטי. אבל בכל אופן ניתן לשלוט על מנגנון ניהול זיכרון ולכוון אותו כך שיתאים לצרכים הספציפיים של המתכנת באמצעות פונקציות ופרוצדורות השייכות למחלקה <code>MEMORY</code>, המאפשרות למתג את תהליך איסוף הזבל האוטומטי.
המאפיין הייחודי של
== מבנה השפה ==
=== משתנים פשוטים ===
נקראים גם <code>EXPANDED</code>
הגדרת משתנים נעשית בדרך דומה לשפת [[פסקל (שפת תכנות)|פסקל]]
<syntaxhighlight lang="eiffel">
שורה 136 ⟵ 130:
</syntaxhighlight>
===
נקראים גם <code>REFERENCE</code> ומכילים [[אובייקט (מדעי המחשב)|
<syntaxhighlight lang="eiffel">i: MYoBJ</syntaxhighlight>
שורה 144 ⟵ 138:
{| cellspacing="1" cellpadding="1" border="1" align="center" style="width: 284px; height: 200px;"
|-
! !! ערך !!
|-
| 1 || align="center"| <code>0</code> || align="center" | <code>INTEGER
|-
| 2 || align="center" | <code>0</code> || align="center" | <code>REAL
|-
| 3 || align="center" | <code>0</code> || align="center" | <code>DOUBLE</code>
|-
| 4 || align="center" | <code>FALSE</code> || align="center" | <code>BOOLEAN</code>
|-
| 5 || align="center" | <code>NULL</code> || align="center" | <code>CHARACTER</code>
|-
| 6 || align="center" | <code>VOID REFERENCE</code> || align="center" | <code>REFERENCE
|}
=== מערכים
נקראים <code>ARRAY</code>. הכרזה לדוגמה,<syntaxhighlight lang="eiffel">keywords : ARRAY[STRING]
numbers: ARRAY[INTEGER]</syntaxhighlight>
יצירה (מערך מ-1 עד 100)
<syntaxhighlight lang="eiffel">create keywords.make(1,100)</syntaxhighlight>
=== רשומה ===
<syntaxhighlight lang="eiffel">
שורה 182 ⟵ 174:
</syntaxhighlight>
גישה
t.weight := t.weight + 0.5
שורה 201 ⟵ 193:
| 4 || שונה || align="center" | =/
|-
| 5 || גדול או שווה || align="center" | =<
|-
| 6 || קטן או שווה || align="center" | =>
|-
| 7 ||
|}
===
'''if''' תנאי
'''then''' גוף
שורה 228 ⟵ 220:
</syntaxhighlight>
===
'''from''' תנאי התחלה
'''until''' תנאי עצירה
שורה 243 ⟵ 235:
===פונקציות ופרוצדורות===
במינוח השפה ישנה הסכמה
'''פונצקיות''' - עושות חישובים ומחזירות ערך, אבל לא יכולות לבצע שינויים במשתנים.
'''פרוצדורות''' - עושות שינויים במשתנים, אבל לא מחזירות ערך.
בצורה כזאת, אפשר לשלוח פונקציה בלי לדאוג שישתנו דברים בתוכנית. אך בפועל המהדר אינו אוכף נושא זה. אחרי שם הפונקציה באים הפרמטרים בסוגרים, ואחר כך הערך המוחזר (אפשר להשמיט את הערך המוחזר, את פרמטרים, או את שניהם) ה־<code>IS</code> מכיל הערה שמתארת את הפונקציה.
=== מחלקות ===
כמו בשפות [[תכנות מונחה-עצמים|תכנות מונחות עצמים]] אחרות, ב־Eiffel מגדירים תבנית לעצמים בעזרת [[מחלקה (תכנות)|מחלקה]].
'''note''' - תיעוד המחלקה.
'''class''' - שם המחלקה.
'''inherit''' - ירושה (אפשרות).
'''create''' - פונקציות מאתחלות.
'''local''' - משתני מחלקה.
'''do'''...'''end''' - גוף המחלקה.
<syntaxhighlight lang="eiffel">note
שורה 286 ⟵ 280:
</syntaxhighlight>
== מנגנון
לשפה קיים מנגנון חזק ל[[טיפול בחריגות]] המבצע מספר נסיונות שהוגדרו לו מראש על מנת לטפל בחריגה בזמן הריצה. הגדרת ההצלחה לטיפול נעשת לפי בדיקת ה־post-condition של החוזה שהוגדר לו מראש.
<syntaxhighlight lang="eiffel">
connect_to_server (server: SOCKET) -- Connect to a server or give up after 10 attempts.
שורה 307 ⟵ 301:
==אפשרויות שונות בשפה==
'''קריאות חד פעמיות''' - משמש לאיפוס ערכים באובייקטים ועובד בצורה קלה ונוחה.
'''מנגנון ניהול חריגות''' - לשפה יש מנגנון מאוד יעיל של ניהול חריגות שעובד בצורה כזאת שהוא משתמש בבדיקת ה-Post condition שלו, ובמקרה שזה לא עובר, הוא עושה את הפונקציה מחדש בשביל לנסות שוב לפי מספר הניסיונות שהוגדרו לו מראש.
'''השפה משלבת שתי גישות לתרגום''' – יש לה גם מפרש, וגם מהדר. קוד שלא נעשה בו שינוי מאז הפעם האחרונה, כולל ספריות מערכת, הוא קוד שעבר הידור – ולכן במינוח השפה הוא ''קפוא''. קוד ששונה ''הותך'', ועל ההרצה שלו מופקד המפרש של השפה.
היתרון
== חווית מתכנת ==
השפה מתאימה למתכנתים שצריכים לתאם ביניהם ממשקים, או שהשימוש בקוד לא ידוע מראש (ירושה מבוקרת). הכתיבות (רמת הקושי בכתיבה) של השפה היא סבירה, דרוש זמן להתרגל אליה, וכן יש תיעוד מקיף על השפה, היתרנו שהוא מפורט היטב, אך חסרונו שהוא שהתיעוד היחיד של השפה.
==תרגום לשפת מכונה==
ב־Eiffel יש שני שלבי תרגום. החלק הראשון הוא הידור לקוד ביניים בעזרת מהדר, עליו רץ מפרש. אחר כך, הקוד מתורגם לשפת C, ובעזרת מהדר C הוא מהודר לשפת מכונה. לטענת מתכנני השפה, מטרת התרגום לשפת C כשפת ביניים, הוא ניצול שיטות הייעול הקיימות במהדרי שפת C. (לטענת מעצבי השפה, קוד בשפת Eiffel יכול להיות יעיל כאילו נכתב בשפת C עצמה או [[Fortran]]).
==תחביר==
*המהדר אינו מבחין בין [[אותיות רישיות ואותיות קטנות|אותיות גדולות וקטנות]], אבל מקובל להשתמש בסגנון כתיבה קבוע לשפה כדי לשמור על הקוד קריא לכל מי שמכיר את השפה. נוהגים לכתוב שמות של מחלקות באותיות גדולות, שמות פונקציות באותיות קטנות, שמות משתנים עם אות ראשונה גדולה והשאר קטנות, צירוף מילים כותבים תמיד עם קו תחתון בין המילים.
* ב־Eiffel אין חובה להפריד בין פקודות באמצעות נקודה פסיק <code>;</code> בסוף שורה.
* יש להבדיל בין אופרטור הבדיקה <code>=</code> המחזיר ערך בוליאני (אמת או שקר) כתוצאה של הערכת תנאי, לבין אופרטור ההקצאה <code>=:</code>.
* הסימון <code>--</code> (מינוס כפול) פותח הערה באותה שורה.
* פונקציות יצירה הן סוג של פונקציות בונות (אלא שקוראים להן אקטיבית) המשמשות לאתחול והגדרות המחלקה. מגדירים פונקציות כאלה בחלק <code>CREATE</code> במחלקה, אך ממשים אותן בחלק <code>FEATURS</code> כמו כל שאר הפונקציות.
* החלק <code>IS</code> בהגדרת הפונקציה מכיל הערה הממצה את מהות המחלקה ("מטפורה").
* פונקציות נקראות באופן דומה למשתנים, ולכן המתכנת לא צריך לדעת את אופן המימוש.
* השפה [[תכנות מובנה|מבנית]], נכתבת בבלוקים לכל קבוצת קוד באופן דומה לשפת התכנות [[עדה (שפת תכנות)|עדה]].
* כאשר פונקציה מחזירה פרמטר, משתמשים בפרמטר המובנה בשפה <code>RESULT</code> לצורך החזרה. (בדומה ל-PL/SQL)
*אין נגישות למערך אחרי הגדרתו. לכן מאתחלים עצמים כגון מערכים, וקבצים בעזרת <code>CREATE</code>.
*בטיפוס מסוג עצם בברירת מחדל הקצאה מחזירה מצביע לעצם, ולכן אם הוא נמחק קיים מצביע מתנדנד ולכן רצוי להשתמש ב־<code>CLONE</code> או <code>COPY</code>.
==
Eiffel רצה על [[Windows]], [[Linux]], [[Unix]], [[OpenBSD]], [[FreeBSD]], [[macOS]], ו־[[OpenVMS]].
*'''EiffelStudio''' - סביבת הפיתוח והמהדר העיקריים של השפה, פותחו ועוצבו על ידי מתכנני השפה. הסביבה חינמית אך ורק לפיתוח [[תוכנה חופשית]].<ref>{{קישור כללי|כתובת=https://www.eiffel.org/doc/eiffelstudio|כותרת=EiffelStudio|אתר=www.eiffel.org|תאריך=2020-05-22|תאריך_וידוא=2020-07-17}}</ref>
*'''SmartEiffel''' - מהדר חינמי קוד פתוח מתאים לכל מעבד ANSI C.<ref>{{קישור כללי|כתובת=http://smarteiffel.loria.fr/|כותרת=SmartEiffel, the GNU Eiffel Compiler, Tools and Libraries|אתר=smarteiffel.loria.fr|תאריך_וידוא=2020-07-17}}</ref>
*'''Visual Eiffel''' - סביבת פיתוח מסחרית IDE כולל GUI עובד על Win32, Linux.<ref>{{קישור כללי|כתובת=http://visual-eiffel.com/|כותרת=Visual-Eiffel|אתר=visual-eiffel.com|תאריך_וידוא=2020-07-17}}</ref>
== הערות שוליים ==
{{הערות שוליים}}
[[קטגוריה:תכנות מונחה-עצמים]]
[[קטגוריה:שפות תכנות מונחות עצמים]]
|