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

לדלג לתוכן

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

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


השפה נועדה לשפר שפות OOP קודמות. כתיבת השפה הושפעה מהשפות פסקל, [[Simula]], {{כ}}[[Ada]]{{כ}}, Z ושימשה השראה לשפות פופולריות כמו: [[C sharp|C#]] {{כ}},[[Java]] {{כ}},[[Ruby]]{{כ}} ,D ועוד. מושגים רבים שהוצגו לראשונה על ידי אייפל, לאחר מכן מצאו את דרכם לשפות תכנות מודרניות כ-#Java, C ושפות אחרות.
השפה באה לענות על חסרונותיהן של [[שפת תכנות|שפות תכנות]] מונחות עצמים קודמות לה. כתיבת השפה הושפעה מהשפות [[פסקל (שפת תכנות)|פסקל]], [[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).
*תנאים לאחר ביצוע הפונקציה (post-conditions).
*מגבלות לגבי תוכן הפרמטרים שהפונקציה מקבלת.
*מגבלות לגבי התוכן שהפונקציה מחזירה.
*מגבלות לגבי תוכן [[חריגה|החריגות]] שהפונקציה יכולה לזרוק.
*תופעות לוואי של הרצת הפונקציה (לדוגמה, שימוש בלולאה לצורך השהייה).
*נתונים על הביצועים שלה (זיכרון, זמן ריצה).
*ביטויים קבועים לאורך התוכנית (invariant).


"Design by Contract" הוא סימן רשום של [[Eiffel Software]], והמונח הוטמע והומצא על ידי ד"ר ברנרד מאייר, יוצר השפה. עובדה זאת מאוששת את חשיבות החוזה כמרכיב מרכזי בשפת התכנות אייפל.
* '''יבילות''' - רץ על פלטפורמות שונות.
* '''Melting ice''' - שילוב של הידור ומפרש שרץ ב-byte Code.
* '''Design by contract''' - יצירת [[חוזה (תכנות)|חוזה]] בעבודה עם קטעי קוד.
* '''טיפוסיות חזקה''' (strong type) ללא המרות מרומזות.
* '''קישור דינמי''' (dynaic bounding) בזמן ריצה. מאפשר [[פולימורפיזם (מדעי המחשב)|פולימורפיזם]].
* '''קריאות''' - מנגנונים ללוגיקה, מבניות בקוד ותיעוד.
* '''statically typed''' - מצריכה הגדרה בזמן הידור.
* דוקומנטציה אוטומטית.
* '''מחלקות גנריות''' - מאפשרת שימוש במחלקות גנאריות.
* '''העמסת שיטות''' (Method overloading) - ניתן לבצע חפיפת מתודות של השפה.
* '''העמסת אופרטורים''' (Operators overloading) - ניתן לבצע חפיפת אופרטורים של השפה.
* Pointer Arithmetic לא קיים בשפה.
* [[ביטוי רגולרי|ביטויים רגולריים]] לא קיימיים בשפה.


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


require
===design by contract===
valid_day: 1 <= a_day and a_day <= 31
"[[חוזה (תכנות)|חוזה]]" הן למעשה קבוצה של התניות שמוגדרות על ידי המתכנת, המגדיר את כל הממשק וההשפעות של התוכנית על סביבתה, בכך ניתן להקל על כל מי שרוצה להשתמש בצורה הכי בטוחה והכי יעילה. העיקרון הומצא על ידי ממציא השפה וזאת אחת התכונות החשובות של השפה.
valid_hour: 0 <= a_hour and a_hour <= 23
לכל פונקציה ניתן להצהיר:
do
*תנאים לפני הרצת הפונקציה (Pre Conditions)
day := a_day
*תנאים לאחר הרצת הפונקציה (Post Conditions)
hour := a_hour
*מגבלות לגבי תוכן הפרמטרים שהפונקציה מקבלת.
*מגבלות לגבי התוכן שהפונקציה מחזירה.
*מגבלות לגבי תוכן החריגות שהפונקציה יכולה לזרוק (exception)
*תופעות לוואי של הרצת הפונקציה (לדוגמה שימוש בלולאה לצורך השהייה)
*נתונים על הביצועים שלה (זיכרון, זמן ריצה)
*ביטויים קבועים לאורך התוכנית (Invariant)


ensure
design by contract הינו סימן רשום של Eiffel software והמונח הוטמע והומצא על ידי ד"ר ברנרד מאייר יוצר השפה ולכן "החוזה" הינו חלק מאוד מרכזי בשפת אייפל.
day_set: day = a_day
hour_set: hour = a_hour


end


feature -- Access
==== דוגמה ל design by contract class DATE ====
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'


<syntaxhighlight lang="eiffel">
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&nbsp;:= a_day
hour&nbsp;:= 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
require
valid_argument: 1 <= a_day and a_day <= 31
valid_argument: 1 <= a_day and a_day <= 31
do
do
day&nbsp;:= 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>


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


===עקרון הגישה האחידה===
===uniform access principle===
מכיוון שיש שינויים ותוספות של אובייקטים חדשים לשפה, דאגו לעשות שכל הפניות יהיו באותה צורה כדי לחסוך תקלות. ולכן יש מנגנון גישה זהה לכל הפונקציות והמחלקות.
כיוון שיש שינויים ותוספות של אובייקטים חדשים לשפה, דאגו לעשות שכל הפניות יהיו באותה צורה כדי לחסוך תקלות. ולכן יש מנגנון גישה זהה לכל הפונקציות והמחלקות. לדוגמה הסימון <code>Foo.Bar(5)</code> יכול לשמש בתור קריאה לפונקציה ושליחת הערך 5 כפרמטר, ויכול גם לשמש לאתחול מחלקה שהמשתנה שלה יקבל את הערך 5.
לדוגמה:


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


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


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


מסיבות אלה, Eiffel אינה מסתפקת ב־<code>syscall malloc()</code>{{D}} (שכן <code>malloc()</code>{{D}} לא יכול להחזיר את הזיכרון אל מערכת ההפעלה), אלא יש לה מנגנון לניהול זיכרון משלה.
===תאימות לשפות אחרות===
השפה בנויה כך שתוכל להתממשק בקלות עם מגוון שפות (בדגש על שפת [[C (שפת תכנות)|C]] ו[[.NET|דוט נט)]] אפשר אפילו לכתוב קוד בשפת C בגוף הפונקציה של Eiffel, ובכך להשלים כל חיסרון שעלול להיות בשפה עם הסיפריות של שפת C.


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


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


המאפיין הייחודי של מאסף הזבל של 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 אינה מסתפקת ב- syscall malloc() (שכן malloc() לא יכול להחזיר את הזיכרון אל מערכת ההפעלה), אלא יש לה מנגנון לניהול זיכרון משלה.
'''קריאות חד פעמיות''' – משמשות לאיפוס ערכים באובייקטים.


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


ב־Eiffel אין חובה להפריד בין פקודות באמצעות נקודה פסיק <code>;</code> בסוף שורה.
שתי האלגוריתמים העיקריים למימוש GC בשפת Eiffel, הם:
* Mark & Sweep
* Memory Compaction
כברירת מחדל, כל יישום בשפת Eiffel כולל GC אוטומטי. אבל בכל אופן ניתן לשלוט על מנגנון ניהול זיכרון ולכוון אותו כך שיתאים לצרכים הספציפיים של המתכנת באמצעות פונקציות ופרוצדורות השייכות למחלקה MEMORY, שמאפשרים "להדליק" או "לכבות" את ה GC האוטומטי.


יש להבדיל בין אופרטור הבדיקה <code>=</code> המחזיר ערך בוליאני (אמת או שקר) כתוצאה של הערכת תנאי, לבין אופרטור ההקצאה <code>=:</code>.
המאפיין הייחודי של ה-GC של Eiffel הוא שה-GC אינו מבצע שחרור זיכרון רק עבור שימוש חוזר על ידי הקצאת אובייקטים נוספים לאותה תוכנית, אלא למעשה, מחזיר את הזיכרון למערכת ההפעלה ומשחרר אותו לשימוש חוזר על ידי תוכנית אחרת. למרות שקשה ליישם את המאפיין החשוב הזה, הוא הכרחי בעיקר למערכות שצריכות לרוץ במשך הרבה זמן או אפילו באופן קבוע.


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


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


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

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

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

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

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

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

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


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


<syntaxhighlight lang="eiffel">
<syntaxhighlight lang="eiffel">
שורה 141: שורה 172:
</syntaxhighlight>
</syntaxhighlight>


=== אובייקטים ===
=== עצמים ===
נקראים גם <code>REFERENCE</code> ומכילים [[אובייקט (מדעי המחשב)|עצמים]] או מערכים. לדוגמה,

נקראים גם REFERENCE ומכילים [[אובייקט (מדעי המחשב)|אובייקט]]ים או מערכים. לדוגמה אובייקט שאני הגדרתי (אלא אם כן הגדרתי במפורש EXPEND):


<syntaxhighlight lang="eiffel">i: MYoBJ</syntaxhighlight>
<syntaxhighlight lang="eiffel">i: MYoBJ</syntaxhighlight>


=== ערכים דפולטיבים ===
=== ערכי ברירת מחדל ===
{| class="wikitable" style="width: 284px; height: 200px;" cellspacing="1" cellpadding="1" border="1" align="center"

{| cellspacing="1" cellpadding="1" border="1" align="center" style="width: 284px; height: 200px;"
|-
! !! ערך !! משתנה
|-
|-
! !! ערך !! טיפוס
| 1 || align="center"| 0 || align="center" | INTEGER
|-
|-
| 2 || align="center" | 0 || align="center" | REAL
| 1 || align="center"| <code>0</code> || align="center" | <code>INTEGER</code>
|-
|-
| 3 || align="center" | 0 || align="center" | DOUBLE
| 2 || align="center" | <code>0</code> || align="center" | <code>REAL</code>
|-
|-
| 4 || align="center" | FALSE || align="center" | BOOLEAN
| 3 || align="center" | <code>0</code> || align="center" | <code>DOUBLE</code>
|-
|-
| 5 || align="center" | NULL || align="center" | CHARACTER
| 4 || align="center" | <code>FALSE</code> || align="center" | <code>BOOLEAN</code>
|-
|-
| 6 || align="center" | VOID REFERENCE || align="center" | REFERENCE TYPE
| 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>ARRAY</code>. הכרזה לדוגמה,<syntaxhighlight lang="eiffel">keywords : ARRAY[STRING]

הצהרה:&nbsp;

<syntaxhighlight lang="eiffel">keywords : ARRAY[STRING]
numbers: ARRAY[INTEGER]</syntaxhighlight>
numbers: ARRAY[INTEGER]</syntaxhighlight>


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


<syntaxhighlight lang="eiffel">create keywords.make(1,100)</syntaxhighlight>
<syntaxhighlight lang="eiffel">create keywords.make(1,100)</syntaxhighlight>


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

נקרא tuples מקבילה של struct או class ללא פונקציות רק data members:


<syntaxhighlight lang="eiffel">
<syntaxhighlight lang="eiffel">
שורה 191: שורה 216:
</syntaxhighlight>
</syntaxhighlight>


גישה: <syntaxhighlight lang="eiffel">
גישה <syntaxhighlight lang="eiffel">


t.weight := t.weight + 0.5
t.weight := t.weight + 0.5
שורה 198: שורה 223:


=== אופרטורים ===
=== אופרטורים ===
{| class="wikitable" width="200" border="1" align="center"

{| border="1" align="center" width="200"
|-
|-
! !! שם !! סימן
! !! שם !! סימן
שורה 211: שורה 235:
| 4 || שונה || align="center" | =/
| 4 || שונה || align="center" | =/
|-
|-
| 5 || גדול שווה || align="center" | =<
| 5 || גדול או שווה || align="center" | =<
|-
|-
| 6 || קטן שווה || align="center" | =>
| 6 || קטן או שווה || align="center" | =>
|-
|-
| 7 || השמה || align="center" | =:
| 7 || הקצאה || align="center" | =:
|}
|}


=== IF ===
=== תנאי ===

'''if''' תנאי
'''if''' תנאי
'''then''' גוף
'''then''' גוף
שורה 226: שורה 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
</syntaxhighlight>
</syntaxhighlight>


=== LOOP ===
=== לולאה ===

'''from''' תנאי התחלה
'''from''' תנאי התחלה
'''until''' תנאי עצירה
'''until''' [[תנאי עצירה]]
'''loop/end''' גוף הלולאה
'''loop/end''' גוף הלולאה


<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
שורה 255: שורה 277:


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

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


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


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


=== מחלקות ===
*'''note''' - הערות המחלקה
כמו בשפות [[תכנות מונחה-עצמים|תכנות מונחות עצמים]] אחרות, ב־Eiffel מגדירים תבנית לעצמים בעזרת [[מחלקה (תכנות)|מחלקה]].
*'''class''' - שם המחלקה
*'''inherit''' - ממי יורש (אופציונלי)
*'''create''' - פונקציות מאתחלות
*'''local''' - משתני מחלקה
*'''do-end''' - גוף המחלקה


'''note''' - תיעוד המחלקה.
'''class''' - שם המחלקה.
'''inherit''' - ירושה (אפשרות).
'''create''' - פונקציות מאתחלות.
'''local''' - משתני מחלקה.
'''do'''...'''end''' - גוף המחלקה.


<syntaxhighlight lang="eiffel">note
<syntaxhighlight lang="eiffel">note
שורה 279: שורה 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>&nbsp;

== מנגנון ניהול חריגות ==
לשפה יש מנגנון מאוד יעיל של ניהול חריגות שעובד בצורה כזאת שהוא משתמש בבדיקת ה-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>
</syntaxhighlight>


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

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

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

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

ע"פ מתכנני השפה, מטרת התרגום לשפת C כשפת ביניים, הוא ניצול שיטות הייעול הקיימות במהדרי שפת C. (לטענת מעצבי השפה, קוד בשפת Eiffel יכול להיות יעיל כאילו נכתב בשפת C עצמה או Fortran)

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

==הערות כלליות==

*השפה הינה case insensitive - הקומפיילר אינו מבחין בין אותיות גדולות וקטנות, אבל מקובל להשתמש בסגנון כתיבה קבוע לשפה, כדי לעשות את הקוד קריא לכל מי שמכיר את השפה. ולכן נוהגים לכתוב: מחלקות - באותיות גדולות, פונקציות - באותיות קטנות, משתנים - אות ראשונה גדולה והשאר קטנות, מספר מילים - כותבים עם קו תחתון בין המילים.
* באייפל אין חובה להבדיל בין פקודות באמצעות נקודה פסיק (;) בסוף שורה.
* יש להבדיל בין אופרטור שוה (=) שמחזיר ערך בוליאני ואינו מבצע השמה לבין אפרטור השמה (=:)
* הסימן -- (מינוס כפול) מבטא הערה.
* פונקציות יצירה הם סוג של פונקציות בונות (אלא שקוראים להן אקטיבית) המשמשות לאיתחול והגדרות המחלקה יש להגדיר פונקציות כאלה בחלק CREATE במחלקה ולממשן בחלק FEATURS כמו כל שאר הפונקציות.
* חלק IS בהגדרת הפונקציה מכיל הערה הממצה את מהות ה מחלקה ("מטפורה").
* פונקציות נקראות בדומה למשתנים ולכן המשתמש לא צריך לדעת את אופן המימוש.
* השפה מאד מבנית, משתמשת בבלוקים לכל קבוצת קוד. בדומה לADA.

==בעיות ופתרונן==
*כאשר פונקציה מחזירה פרמטר יש להשתמש בפרמטר המובנה בשפה RESULT לצורך החזרה.
*אין נגישות למערך אחרי הגדרתו. יש לעשות CREATE לאובייקטים כגון מערכים, קבצים וכו'.
*בטיפוס מסוג אובייקט בצורה דפולטיבית השמה מחזיר פוינטר לאובייקט ולכן אם הוא נמחק קיים פוינטר מתנדנד ולכן רצוי להשתמש ב בCLONE או COPY
* קיים קושי במציאת מדריך שפשוט מראה פקודות ולא רק מדבר על תאוריה של השפה.
* פתיחת קבצים נעשית בצורה שונה מתוכניות אחרות, צריך להכניס את מיקום הקובץ למשתנה ורק אחרי זה להתחיל לפעול עליו.
* מערכת שונה של החזרת ערך מהפונקציה במקום לעשות return מכניסים את הערך שרוצים אל המשתנה result. (בדומה לPL/SQL)


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


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


{{בקרת זהויות}}
*[http://smarteiffel.loria.fr/ smartEiffel - מהדר חינמי קוד פתוח מתאים לכל מחשב ANSI C.]
*[http://visual-eiffel.com visual eiffel - מסחרי IDE כולל GUI עובד על Win32, linux.]
*[http://sourceforge.net/projects/eiffelstudio/?source=directory EiffelStudio - חינמי IDE מתקדם כולל GUI אחד העורכים המתקדמים] ,זוהי הסביבת פיתוח הכי עדכנית כולל debuger והשלמה אוטומטית. כמו כן, יש בו יוצר תיעוד ותרשים מערכת(class Diagram).


[[קטגוריה:תכנות מונחה-עצמים]]
[[קטגוריה:תכנות מונחה-עצמים]]
[[קטגוריה:שפות תכנות מונחות עצמים]]

גרסה אחרונה מ־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

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

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