(Go: >> BACK << -|- >> HOME <<)

לדלג לתוכן

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

מתוך ויקיפדיה, האנציקלופדיה החופשית
תוכן שנמחק תוכן שנוסף
מ הטמעת תבנית:בקרת זהויות בערכים (תג)
Gevayu (שיחה | תרומות)
אפשרות הצעות קישורים: נוספו 8 קישורים.
 
(10 גרסאות ביניים של 5 משתמשים אינן מוצגות)
שורה 1: שורה 1:
{{שפת תכנות
{{שפת תכנות
| שם =
| שם =
| שם בשפת המקור = Eiffel
| שם בשפת המקור = Eiffel
}}
}}
'''אייפל''' (במקור '''Eiffel''') היא שפת [[תכנות מונחה עצמים]]. שפה זו נוצרה בידי [[ברטראנד מאייר]], חלוץ בתכנות מונחה עצמים, ועל ידי חברת Eiffel Software ב־[[1985]]. ונקראה על שם [[גוסטב אייפל]], המהנדס שתכנן את [[מגדל אייפל]].
'''אייפל''' (במקור: '''Eiffel''') היא שפת [[תכנות מונחה עצמים|תכנות מונחת עצמים]]. שפה זו פותחה ועוצבה על ידי [[ברטראנד מאייר]] ועל ידי חברת Eiffel Software בשנת [[1985]]. השפה נקראת על שם [[גוסטב אייפל]], המהנדס שתכנן את [[מגדל אייפל]].


השפה באה לענות על חסרונותיהן של שפות תכנות מונחות עצמים קודמות לה. כתיבת השפה הושפעה מהשפות [[פסקל (שפת תכנות)|פסקל]], [[Simula]], [[Ada]], [[Z (שפת תכנות)|Z]] ושימשה השראה לשפות פופולריות כמו [[C sharp|C#]]{{D}}, [[Java]], [[Ruby]], [[D (שפת תכנות)|D]], ועוד. מושגים רבים שהוצגו לראשונה על ידי אייפל, לאחר מכן מצאו את דרכם לשפות תכנות מודרניות כ־Java, C#{{D}} ושפות אחרות.
השפה באה לענות על חסרונותיהן של [[שפת תכנות|שפות תכנות]] מונחות עצמים קודמות לה. כתיבת השפה הושפעה מהשפות [[פסקל (שפת תכנות)|פסקל]], [[Simula]], [[Ada]], [[Z (שפת תכנות)|Z]] ושימשה השראה לשפות פופולריות כמו [[C sharp|C#]]{{D}}, [[Java]], [[Ruby]], [[D (שפת תכנות)|D]], ועוד. מושגים רבים שהוצגו לראשונה על ידי אייפל, לאחר מכן שולבו בעיצובן של שפות תכנות מוכרות יותר כמו C#{{D}} ו־Java. מאייר חיבר ספר על עקרונות התכנות המונחה עצמים (Object-Oriented Software Construction), כללי ה[[פרדיגמת תכנות|פרדיגמה]] שניסח בספר בסופו של דבר הולידו את השפה אייפל.


== עיצוב ==
מאייר כתב ספר על תכנות מונחה עצמים (''Object-Oriented Software Construction''), בספר ניסח כללים ל[[פרדיגמת תכנות|פרדיגמה]], שלבסוף הפכו לשפה עצמה.
=== סקירה כללית ===

* [[חוצה-פלטפורמות|חוצה פלטפורמות]]
== מאפיינים עיקריים ==
* השפה משלבת שתי גישות לתרגום—יש לה גם מפרש, וגם [[מהדר]]. קוד שלא נעשה בו שינוי מאז הפעם האחרונה, כולל ספריות מערכת, הוא קוד שעבר הידור, ולכן במינוח השפה הוא קפוא. לעומת זאת, קוד ששונה הותך, ועל ההרצה שלו מופקד המפרש של השפה.
* '''[[חוצה-פלטפורמות|חוצה פלטפורמות]]''' - רצה על פלטפורמות שונות.
* [[חוזה (תכנות)|תכנון לפי חוזה]]—יצירת [[חוזה (תכנות)|חוזה]] בעבודה עם קטעי קוד.
* '''הידור בזמן ריצה''' - שילוב של הידור ומפרש שרץ ב־[[בייטקוד]].
* [[מערכת טיפוסים|טיפוסיות]] חזקה—ללא המרות מרומזות.
* '''[[חוזה (תכנות)|תכנון לפי חוזה]]''' - יצירת [[חוזה (תכנות)|חוזה]] בעבודה עם קטעי קוד.
* טיפוסיות קבועה—דורשת הגדרה והתאמת טיפוסיות בזמן הידור.
* '''[[מערכת טיפוסים|טיפוסיות]] חזקה''' - ללא המרות מרומזות.
* [[קישור דינמי]]—קישור בזמן ריצה. מאפשר [[פולימורפיזם (מדעי המחשב)|פולימורפיזם]].
* '''טיפוסיות קבועה''' - דורשת הגדרה והתאמת טיפוסיות בזמן הידור.
* קריאות—מנגנונים ללוגיקה, מבניות בקוד ותיעוד.
* '''[[קישור דינמי]]''' - קישור בזמן ריצה. מאפשר [[פולימורפיזם (מדעי המחשב)|פולימורפיזם]].
* תיעוד קוד אוטומטי
* '''קריאות''' - מנגנונים ללוגיקה, מבניות בקוד ותיעוד.
* מחלקות [[תכנות גנרי|גנריות]]—מאפשרת שימוש במחלקות גנריות.
* '''תיעוד אוטומטי'''.
* העמסת מתודות—ניתן לבצע חפיפת מתודות של השפה.
* '''מחלקות [[תכנות גנרי|גנריות]]''' - מאפשרת שימוש במחלקות גנריות.
* '''העמסת מתודות''' - ניתן לבצע חפיפת מתודות של השפה.
* העמסת אופרטורים—ניתן לבצע חפיפת אופרטורים של השפה.
* חשבון [[מצביע]]ים לא קיים בשפה.
* '''העמסת אופרטורים''' - ניתן לבצע חפיפת אופרטורים של השפה.
* חשבון [[מצביע|מצביעים]] לא קיים בשפה.
* [[ביטוי רגולרי|ביטויים רגולריים]] לא קיימים בשפה.
* [[ביטוי רגולרי|ביטויים רגולריים]] לא קיימים בשפה.


=== תכנות לפי חוזה ===
==עקרונות עיקריים==
===תכנות לפי חוזה===
{{הפניה לערך מורחב|חוזה (תכנות)}}
{{הפניה לערך מורחב|חוזה (תכנות)}}
חוזה הוא קובץ אילוצים המוגדר על ידי המתכנת על מנת להבטיח את אמינות הקוד. העיקרון הומצא על ידי ממציא השפה וזאת אחת התכונות החשובות של השפה. בשפות תכנות עכשוויות נעשה שימוש ב[[פיתוח מונחה-בדיקות|פיתוח מונחה בדיקות]] כתחליף לתכנות מונחה חוזים.
חוזה הוא קובץ אילוצים המוגדר על ידי המתכנת על מנת להבטיח את אמינות הקוד. העיקרון הומצא על ידי ממציא השפה וזאת אחת התכונות החשובות של השפה. בשפות תכנות עכשוויות נעשה שימוש ב[[פיתוח מונחה-בדיקות|פיתוח מונחה בדיקות]] כתחליף לתכנות מונחה חוזים. לכל פונקציה ניתן להצהיר את האילוצים הבאים.
לכל פונקציה ניתן להצהיר את האילוצים הבאים.
*תנאים לפני ביצוע הפונקציה (pre-conditions).
*תנאים לפני ביצוע הפונקציה (pre-conditions).
*תנאים לאחר ביצוע הפונקציה (post-conditions).
*תנאים לאחר ביצוע הפונקציה (post-conditions).
שורה 38: שורה 35:
*ביטויים קבועים לאורך התוכנית (invariant).
*ביטויים קבועים לאורך התוכנית (invariant).


"''Design by Contract''" הוא סימן רשום של [[Eiffel Software]], והמונח הוטמע והומצא על ידי ד"ר ברנרד מאייר, יוצר השפה. עובדה זאת מאוששת את חשיבות החוזה כמרכיב מרכזי בשפת התכנות אייפל.
"Design by Contract" הוא סימן רשום של [[Eiffel Software]], והמונח הוטמע והומצא על ידי ד"ר ברנרד מאייר, יוצר השפה. עובדה זאת מאוששת את חשיבות החוזה כמרכיב מרכזי בשפת התכנות אייפל.


==== דוגמה לשימוש בחוזה ====
==== דוגמה לשימוש בחוזה ====
<syntaxhighlight lang="eiffel">
<syntaxhighlight lang="eiffel">
create
create
make feature {NONE}
make feature {NONE}
-- Initialization
-- Initialization
make (a_day: INTEGER; a_hour: INTEGER) -- Initialize `Current' with `a_day' and `a_hour'.
make (a_day: INTEGER; a_hour: INTEGER) -- Initialize `Current' with `a_day' and `a_hour'.

require
require
valid_day: 1 <= a_day and a_day <= 31
valid_day: 1 <= a_day and a_day <= 31
valid_hour: 0 <= a_hour and a_hour <= 23
valid_hour: 0 <= a_hour and a_hour <= 23
do
do
day := a_day
day := a_day
hour := a_hour
hour := a_hour

ensure
ensure
day_set: day = a_day
day_set: day = a_day
hour_set: hour = a_hour
hour_set: hour = a_hour

end
end

feature -- Access
feature -- Access
day: INTEGER -- Day of month for `Current'
day: INTEGER -- Day of month for `Current'
hour: INTEGER -- Hour of day for `Current'
hour: INTEGER -- Hour of day for `Current'

feature -- Element change
feature -- Element change
set_day (a_day: INTEGER) -- Set `day' to `a_day'
set_day (a_day: INTEGER) -- Set `day' to `a_day'

require
require
valid_argument: 1 <= a_day and a_day <= 31
valid_argument: 1 <= a_day and a_day <= 31
do
do
day := a_day
day := a_day
ensure
ensure
day_set: day = a_day
day_set: day = a_day
end

invariant
valid_day: 1 <= day and day <= 31
valid_hour: 0 <= hour and hour <= 23
end
end
invariant
valid_day: 1 <= day and day <= 31
valid_hour: 0 <= hour and hour <= 23
end
</syntaxhighlight>
</syntaxhighlight>


שורה 85: שורה 82:
הקוד הקיים (מתוך [[ספרייה (תכנות)|ספריות]]) צריך להיות פתוח להרחבה, אך סגור לשינויים, והדבר יכול להתבטא בשתי צורות הבאות.
הקוד הקיים (מתוך [[ספרייה (תכנות)|ספריות]]) צריך להיות פתוח להרחבה, אך סגור לשינויים, והדבר יכול להתבטא בשתי צורות הבאות.
#כפי שהעיקרון מתבטא בשפת אייפל - כותבים מחלקה בצורה רגילה, ואם נתפס [[באג]] בתוכנה, אז במקום לשנות את המחלקה המקורית, יוצרים מחלקה חדשה שמשתמשת במחלקה הקודמת ועושה את השינויים הדרושים, או שיוצרים מחלקה שיורשת מהמחלקה המקורית שבה עושים את השינויים.
#כפי שהעיקרון מתבטא בשפת אייפל - כותבים מחלקה בצורה רגילה, ואם נתפס [[באג]] בתוכנה, אז במקום לשנות את המחלקה המקורית, יוצרים מחלקה חדשה שמשתמשת במחלקה הקודמת ועושה את השינויים הדרושים, או שיוצרים מחלקה שיורשת מהמחלקה המקורית שבה עושים את השינויים.
#בצורה הרגילה. שימוש במחלקה מופשטת, וירושה המאלצת הלימה לממשק ההפשטה. מכאן עקרון הפולימורפיזם בתכנות מונחה עצמים יאפשר שימוש עם תאימות לאחור בקוד הקיים.
#בצורה הרגילה. שימוש במחלקה מופשטת, וירושה המאלצת הלימה לממשק ההפשטה. מכאן עקרון הפולימורפיזם בתכנות מונחה עצמים יאפשר שימוש עם [[תאימות לאחור]] בקוד הקיים.


===עקרון הגישה האחידה===
===עקרון הגישה האחידה===
שורה 91: שורה 88:


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


===תאימות לשפות אחרות===
===תאימות לשפות אחרות===
השפה בנויה כך שתוכל להתממשק בקלות עם מגוון שפות (בדגש על שפת [[C (שפת תכנות)|C]], ושפות התכנות מבוססות [[.NET]]). השפה מאפשרת לכתוב קוד בשפת C הישר בגוף הפונקציה של Eiffel, ובכך להשלים כל חיסרון שעלול להיות בשפה עם הספריות של שפת C.{{דרוש מקור|סיבה=}}
השפה בנויה כך שתוכל להתממשק בקלות עם מגוון שפות (בדגש על שפת [[C (שפת תכנות)|C]], ושפות התכנות מבוססות [[.NET]]). השפה מאפשרת לכתוב קוד בשפת C הישר בגוף הפונקציה של Eiffel, ובכך להשלים כל חיסרון שעלול להיות בשפה עם הספריות של שפת C{{הערה|[https://www.eiffel.org/doc/solutions/Interfacing_with_C_and_C%2B%2B התממשקות עם C ו-C++] באתר של שפת התכנות אייפל}}.


==ניהול זיכרון==
=== ניהול זיכרון ===
ניהול זיכרון של תוכנית Eiffel הוא מאתגר כהשלכה מהנסיבות הבאות.
ניהול זיכרון של תוכנית Eiffel הוא מאתגר כהשלכה מהנסיבות הבאות.
# תוכנית בשפת Eiffel יכולה לקרוא לפונקציות בשפת C, לכן צריך להתחשב בכך שיכולים להיות בתוכנית שני סוגי זיכרון: זיכרון ל־Eiffel וזיכרון ל־C.
# תוכנית בשפת Eiffel יכולה לקרוא לפונקציות בשפת C, לכן צריך להתחשב בכך שיכולים להיות בתוכנית שני סוגי זיכרון: זיכרון ל־Eiffel וזיכרון ל־C.
# צריך להבחין בין אובייקטים רגילים - אובייקטים בעלי גודל קבוע שנקבע באופן סטטי (בזמן ההידור) על פי מספר תכונות האובייקט, לבין אובייקטים מיוחדים - אובייקטים בעלי גודל משתנה (מערכים, מחרוזות ועוד).
# צריך להבחין בין אובייקטים רגילים - אובייקטים בעלי גודל קבוע שנקבע באופן סטטי (בזמן ההידור) על פי מספר תכונות האובייקט, לבין אובייקטים מיוחדים - אובייקטים בעלי גודל משתנה (מערכים, מחרוזות ועוד).
# לא מספיק לשחרר זיכרון רק לשם שימוש חוזר בתוכניות בשפת Eiffel, אלא אנו מעוניינים שניתן יהיה להחזיר את הזיכרון אל מערכת ההפעלה לשימוש חוזר גם באפליקציות אחרות.
# לא מספיק לשחרר זיכרון רק לשם שימוש חוזר בתוכניות בשפת Eiffel, אלא אנו מעוניינים שניתן יהיה להחזיר את הזיכרון אל [[מערכת הפעלה|מערכת ההפעלה]] לשימוש חוזר גם באפליקציות אחרות.


מסיבות אלה, Eiffel אינה מסתפקת ב־<code>syscall malloc()</code>{{D}} (שכן <code>malloc()</code>{{D}} לא יכול להחזיר את הזיכרון אל מערכת ההפעלה), אלא יש לה מנגנון לניהול זיכרון משלה.
מסיבות אלה, Eiffel אינה מסתפקת ב־<code>syscall malloc()</code>{{D}} (שכן <code>malloc()</code>{{D}} לא יכול להחזיר את הזיכרון אל מערכת ההפעלה), אלא יש לה מנגנון לניהול זיכרון משלה.


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


שני האלגוריתמים העיקריים לאיסוף זבל בשפת Eiffel, הם '''mark & sweep''', ו־'''memory compaction'''. כברירת מחדל, כל יישום בשפת Eiffel כולל איסוף זבל אוטומטי. אבל בכל אופן ניתן לשלוט על מנגנון ניהול זיכרון ולכוון אותו כך שיתאים לצרכים הספציפיים של המתכנת באמצעות פונקציות ופרוצדורות השייכות למחלקה <code>MEMORY</code>, המאפשרות למתג את תהליך איסוף הזבל האוטומטי.
שני האלגוריתמים העיקריים לאיסוף זבל בשפת Eiffel, הם '''mark & sweep''', ו־'''memory compaction'''. כברירת מחדל, כל יישום בשפת Eiffel כולל איסוף זבל אוטומטי. אבל בכל אופן ניתן לשלוט על מנגנון ניהול זיכרון ולכוון אותו כך שיתאים לצרכים הספציפיים של המתכנת באמצעות פונקציות ופרוצדורות השייכות למחלקה <code>MEMORY</code>, המאפשרות למתג את תהליך איסוף הזבל האוטומטי.


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


=== מנגנון לטיפול בחריגות ===
== מבנה השפה ==
לשפה קיים מנגנון ל[[טיפול בחריגות]] המבצע מספר ניסיונות שהוגדרו לו מראש על מנת לטפל בחריגה בזמן הריצה. הגדרת ההצלחה לטיפול נעשית לפי בדיקת ה־post-condition של החוזה שהוגדר לו מראש.
<syntaxhighlight 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
local
attempts: INTEGER
do
server.connect
ensure
connected: server.is_connected
rescue
if attempts < 10 then
attempts := attempts + 1
retry
end
end
</syntaxhighlight>

=== אפשרויות נוספות בשפה ===
'''קריאות חד פעמיות''' – משמשות לאיפוס ערכים באובייקטים.

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

ב־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>.

=== משתנים פשוטים ===
=== משתנים פשוטים ===
נקראים גם <code>EXPANDED</code>
נקראים גם <code>EXPANDED</code>


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


<syntaxhighlight lang="eiffel">
<syntaxhighlight lang="eiffel">
שורה 136: שורה 178:


=== ערכי ברירת מחדל ===
=== ערכי ברירת מחדל ===
{| cellspacing="1" cellpadding="1" border="1" align="center" style="width: 284px; height: 200px;"
{| class="wikitable" style="width: 284px; height: 200px;" cellspacing="1" cellpadding="1" border="1" align="center"
|-
|-
! !! ערך !! טיפוס
! !! ערך !! טיפוס
|-
|-
| 1 || align="center"| <code>0</code> || align="center" | <code>INTEGER</code>
| 1 || align="center"| <code>0</code> || align="center" | <code>INTEGER</code>
שורה 181: שורה 223:


=== אופרטורים ===
=== אופרטורים ===
{| border="1" align="center" width="200"
{| class="wikitable" width="200" border="1" align="center"
|-
|-
! !! שם !! סימן
! !! שם !! סימן
שורה 207: שורה 249:


<syntaxhighlight lang="eiffel">
<syntaxhighlight lang="eiffel">
if(num>10) then
if(num>10) then


output.putint (num)
output.putint (num)


output.new_line
output.new_line


else
else


output.putstring ("Error")
output.putstring ("Error")


end
end
שורה 227: שורה 269:
<syntaxhighlight lang="eiffel">
<syntaxhighlight lang="eiffel">


from I:=0 until I>10 loop
from I:=0 until I>10 loop


RESULT := RESULT + 1
RESULT := RESULT + 1


end
end
שורה 259: שורה 301:


class
class
MY_CLASS
MY_CLASS


inherit
inherit
OTHER_CLASS
OTHER_CLASS


create
create
Function1
Function1


feature {NONE} my_function (variable_name: SOME_TYPE)-- Initialization
feature {NONE} my_function (variable_name: SOME_TYPE)-- Initialization
-- Run application.
-- Run application.
local
local
cmp : CLASS1
cmp : CLASS1
do
do
cmp.make
cmp.make
....
....
....
....
end
end


end
end
</syntaxhighlight>
</syntaxhighlight>


== מהדרים==
== מנגנון לטיפול בחריגות ==
Eiffel רצה על [[Windows]], [[לינוקס]], [[Unix]], [[OpenBSD]], [[FreeBSD]], [[macOS]], ו־[[OpenVMS]].
לשפה קיים מנגנון חזק ל[[טיפול בחריגות]] המבצע מספר ניסיונות שהוגדרו לו מראש על מנת לטפל בחריגה בזמן הריצה. הגדרת ההצלחה לטיפול נעשית לפי בדיקת ה־post-condition של החוזה שהוגדר לו מראש.
<syntaxhighlight 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
local
attempts: INTEGER
do
server.connect
ensure
connected: server.is_connected
rescue
if attempts < 10 then
attempts := attempts + 1
retry
end
end
</syntaxhighlight>

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

'''מנגנון ניהול חריגות''' - לשפה יש מנגנון מאוד יעיל של ניהול חריגות שעובד בצורה כזאת שהוא משתמש בבדיקת ה-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>
*'''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>
*'''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>
*'''Visual Eiffel''' - סביבת פיתוח מסחרית IDE כולל GUI עובד על Win32, Linux.<ref>{{קישור כללי|כתובת=http://visual-eiffel.com/|כותרת=Visual-Eiffel|אתר=visual-eiffel.com|תאריך_וידוא=2020-07-17}}</ref>

=== שפת C כשפת ביניים ===
ל־Eiffel שני שלבי הידור: החלק הראשון הוא הידור לקוד ביניים בעזרת מהדר, עליו רץ מפרש. אחר כך, הקוד מתורגם לשפת C, ובעזרת מהדר C הוא מהודר לשפת מכונה. לטענת מתכנני השפה, מטרת התרגום לשפת C כשפת ביניים, הוא ניצול שיטות הייעול הקיימות במהדרי שפת C. (לטענת מעצבי השפה, קוד בשפת Eiffel יכול להיות יעיל כאילו נכתב בשפת C עצמה או [[Fortran]]).


== הערות שוליים ==
== הערות שוליים ==
{{הערות שוליים}}
{{הערות שוליים}}
==קישורים חיצוניים==
{{ויקישיתוף בשורה}}
{{רשתות חברתיות}}

{{בקרת זהויות}}
{{בקרת זהויות}}



גרסה אחרונה מ־16:30, 16 בינואר 2024

אייפל
Eiffel
פרדיגמות תכנות מונחה-עצמים, תכנות גנרי, class-based programming, תכנות מרובה פרדיגמות, concurrent computing עריכת הנתון בוויקינתונים
תאריך השקה 1986 עריכת הנתון בוויקינתונים
מתכנן ברטראן מייר עריכת הנתון בוויקינתונים
מפתח ברטראן מייר עריכת הנתון בוויקינתונים
הושפעה על ידי עדה, Z notation, Simula, Simula 67 עריכת הנתון בוויקינתונים
לעריכה בוויקינתונים שמשמש מקור לחלק מהמידע בתבנית

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

השפה באה לענות על חסרונותיהן של שפות תכנות מונחות עצמים קודמות לה. כתיבת השפה הושפעה מהשפות פסקל, Simula, Ada, Z ושימשה השראה לשפות פופולריות כמו C#‎, Java, Ruby, D, ועוד. מושגים רבים שהוצגו לראשונה על ידי אייפל, לאחר מכן שולבו בעיצובן של שפות תכנות מוכרות יותר כמו C#‎ ו־Java. מאייר חיבר ספר על עקרונות התכנות המונחה עצמים (Object-Oriented Software Construction), כללי הפרדיגמה שניסח בספר בסופו של דבר הולידו את השפה אייפל.

עיצוב[עריכת קוד מקור | עריכה]

סקירה כללית[עריכת קוד מקור | עריכה]

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

תכנות לפי חוזה[עריכת קוד מקור | עריכה]

ערך מורחב – חוזה (תכנות)

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

  • תנאים לפני ביצוע הפונקציה (pre-conditions).
  • תנאים לאחר ביצוע הפונקציה (post-conditions).
  • מגבלות לגבי תוכן הפרמטרים שהפונקציה מקבלת.
  • מגבלות לגבי התוכן שהפונקציה מחזירה.
  • מגבלות לגבי תוכן החריגות שהפונקציה יכולה לזרוק.
  • תופעות לוואי של הרצת הפונקציה (לדוגמה, שימוש בלולאה לצורך השהייה).
  • נתונים על הביצועים שלה (זיכרון, זמן ריצה).
  • ביטויים קבועים לאורך התוכנית (invariant).

"Design by Contract" הוא סימן רשום של Eiffel Software, והמונח הוטמע והומצא על ידי ד"ר ברנרד מאייר, יוצר השפה. עובדה זאת מאוששת את חשיבות החוזה כמרכיב מרכזי בשפת התכנות אייפל.

דוגמה לשימוש בחוזה[עריכת קוד מקור | עריכה]

 create
 make feature {NONE}
 -- Initialization
 make (a_day: INTEGER; a_hour: INTEGER) -- Initialize `Current' with `a_day' and `a_hour'.

 require
 valid_day: 1 <= a_day and a_day <= 31
 valid_hour: 0 <= a_hour and a_hour <= 23
 do
 day := a_day
 hour := a_hour

 ensure
 day_set: day = a_day
 hour_set: hour = a_hour

 end

feature -- Access
 day: INTEGER -- Day of month for `Current'
 hour: INTEGER -- Hour of day for `Current'

 feature -- Element change
 set_day (a_day: INTEGER) -- Set `day' to `a_day'

require
 valid_argument: 1 <= a_day and a_day <= 31
 do
 day := a_day
 ensure
 day_set: day = a_day
 end

 invariant
 valid_day: 1 <= day and day <= 31
 valid_hour: 0 <= hour and hour <= 23
 end

עקרון פתיחות/סגירות[עריכת קוד מקור | עריכה]

ערך מורחב – עקרון פתיחות/סגירות

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

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

עקרון הגישה האחידה[עריכת קוד מקור | עריכה]

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

עקרון הפרדת פקודות משאילתות[עריכת קוד מקור | עריכה]

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

תאימות לשפות אחרות[עריכת קוד מקור | עריכה]

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

ניהול זיכרון[עריכת קוד מקור | עריכה]

ניהול זיכרון של תוכנית Eiffel הוא מאתגר כהשלכה מהנסיבות הבאות.

  1. תוכנית בשפת Eiffel יכולה לקרוא לפונקציות בשפת C, לכן צריך להתחשב בכך שיכולים להיות בתוכנית שני סוגי זיכרון: זיכרון ל־Eiffel וזיכרון ל־C.
  2. צריך להבחין בין אובייקטים רגילים - אובייקטים בעלי גודל קבוע שנקבע באופן סטטי (בזמן ההידור) על פי מספר תכונות האובייקט, לבין אובייקטים מיוחדים - אובייקטים בעלי גודל משתנה (מערכים, מחרוזות ועוד).
  3. לא מספיק לשחרר זיכרון רק לשם שימוש חוזר בתוכניות בשפת Eiffel, אלא אנו מעוניינים שניתן יהיה להחזיר את הזיכרון אל מערכת ההפעלה לשימוש חוזר גם באפליקציות אחרות.

מסיבות אלה, Eiffel אינה מסתפקת ב־syscall malloc()‎ (שכן malloc()‎ לא יכול להחזיר את הזיכרון אל מערכת ההפעלה), אלא יש לה מנגנון לניהול זיכרון משלה.

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

שני האלגוריתמים העיקריים לאיסוף זבל בשפת Eiffel, הם mark & sweep, ו־memory compaction. כברירת מחדל, כל יישום בשפת Eiffel כולל איסוף זבל אוטומטי. אבל בכל אופן ניתן לשלוט על מנגנון ניהול זיכרון ולכוון אותו כך שיתאים לצרכים הספציפיים של המתכנת באמצעות פונקציות ופרוצדורות השייכות למחלקה MEMORY, המאפשרות למתג את תהליך איסוף הזבל האוטומטי.

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

מנגנון לטיפול בחריגות[עריכת קוד מקור | עריכה]

לשפה קיים מנגנון לטיפול בחריגות המבצע מספר ניסיונות שהוגדרו לו מראש על מנת לטפל בחריגה בזמן הריצה. הגדרת ההצלחה לטיפול נעשית לפי בדיקת ה־post-condition של החוזה שהוגדר לו מראש.

 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
 local
 attempts: INTEGER
 do
 server.connect
 ensure
 connected: server.is_connected
 rescue
 if attempts < 10 then
 attempts := attempts + 1
 retry
 end
 end

אפשרויות נוספות בשפה[עריכת קוד מקור | עריכה]

קריאות חד פעמיות – משמשות לאיפוס ערכים באובייקטים.

תחביר[עריכת קוד מקור | עריכה]

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

ב־Eiffel אין חובה להפריד בין פקודות באמצעות נקודה פסיק ; בסוף שורה.

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

הסימון -- (מינוס כפול) פותח הערה באותה שורה.

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

החלק IS בהגדרת הפונקציה מכיל הערה הממצה את מהות המחלקה ("מטפורה").

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

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

כאשר פונקציה מחזירה פרמטר, משתמשים בפרמטר המובנה בשפה RESULT לצורך החזרה. (בדומה ל-PL/SQL)

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

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

משתנים פשוטים[עריכת קוד מקור | עריכה]

נקראים גם EXPANDED

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

flag: BOOLEAN

i: INTEGER

s: STRING

r: REAL

d: DOUBLE

c: CHARACTER

עצמים[עריכת קוד מקור | עריכה]

נקראים גם REFERENCE ומכילים עצמים או מערכים. לדוגמה,

i: MYoBJ

ערכי ברירת מחדל[עריכת קוד מקור | עריכה]

ערך טיפוס
1 0 INTEGER
2 0 REAL
3 0 DOUBLE
4 FALSE BOOLEAN
5 NULL CHARACTER
6 VOID REFERENCE REFERENCE

מערכים[עריכת קוד מקור | עריכה]

נקראים ARRAY. הכרזה לדוגמה,

keywords : ARRAY[STRING]
numbers: ARRAY[INTEGER]

יצירה (מערך מ-1 עד 100).

create keywords.make(1,100)

רשומה[עריכת קוד מקור | עריכה]

נקראת TUPLE, מקבילה של STRUCT או CLASS ללא פונקציות, אלא רק נתונים.

t: TUPLE [name: STRING; weight: REAL; date: DATE]

יכול להוות תאריך או רשומה מסוימת וא"צ להגדיר מחלקה

["Brigitte", 3.5, Last_night]

גישה

t.weight := t.weight + 0.5

אופרטורים[עריכת קוד מקור | עריכה]

שם סימן
1 גדול <
2 קטן >
3 שווה =
4 שונה =/
5 גדול או שווה =<
6 קטן או שווה =>
7 הקצאה =:

תנאי[עריכת קוד מקור | עריכה]

if תנאי
then גוף
else אם לא מתקיים התנאי
end סוף תנאי
if(num>10) then

 output.putint (num)

 output.new_line

else

 output.putstring ("Error")

end

לולאה[עריכת קוד מקור | עריכה]

from תנאי התחלה
until תנאי עצירה
loop/end גוף הלולאה
from I:=0 until I>10 loop

 RESULT := RESULT + 1

end

פונקציות ופרוצדורות[עריכת קוד מקור | עריכה]

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

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

פרוצדורות - עושות שינויים במשתנים, אבל לא מחזירות ערך.

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

מחלקות[עריכת קוד מקור | עריכה]

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

note - תיעוד המחלקה.
class - שם המחלקה.
inherit - ירושה (אפשרות).
create - פונקציות מאתחלות.
local - משתני מחלקה.
do...end - גוף המחלקה.
note
description : "targil5 application root class"
date : "$Date$"
revision : "$Revision$"

class
 MY_CLASS

 inherit
 OTHER_CLASS

 create
 Function1

 feature {NONE} my_function (variable_name: SOME_TYPE)-- Initialization
 -- Run application.
 local
 cmp : CLASS1
 do
 cmp.make
 ....
 ....
 end

end

מהדרים[עריכת קוד מקור | עריכה]

Eiffel רצה על Windows, לינוקס, Unix, OpenBSD, FreeBSD, macOS, ו־OpenVMS.

  • EiffelStudio - סביבת הפיתוח והמהדר העיקריים של השפה, פותחו ועוצבו על ידי מתכנני השפה. הסביבה חינמית אך ורק לפיתוח תוכנה חופשית.[2]
  • SmartEiffel - מהדר חינמי קוד פתוח מתאים לכל מעבד ANSI C.[3]
  • Visual Eiffel - סביבת פיתוח מסחרית IDE כולל GUI עובד על Win32, Linux.[4]

שפת C כשפת ביניים[עריכת קוד מקור | עריכה]

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

הערות שוליים[עריכת קוד מקור | עריכה]

  1. ^ התממשקות עם C ו-C++ באתר של שפת התכנות אייפל
  2. ^ EiffelStudio, www.eiffel.org, ‏2020-05-22
  3. ^ SmartEiffel, the GNU Eiffel Compiler, Tools and Libraries, smarteiffel.loria.fr
  4. ^ Visual-Eiffel, visual-eiffel.com

קישורים חיצוניים[עריכת קוד מקור | עריכה]

ויקישיתוף מדיה וקבצים בנושא אייפל בוויקישיתוף