בראשית כהונתו נאלץ קאטיאמה להתפטר, בעקבות לחץ מצד גורמי שמאל. לאחר התפטרותו, הוא הצטרף למפלגה הדמוקרטית-סוציאליסטית וקרא לשמירה על החוקה, לעריכת רפורמות בצורת הבחירות והקמת חבר לאומים עולמי.
קאטיאמה היה ראש ממשלת יפן הסוציאליסט הראשון.
אייפל (שפת תכנות)
אייפל (במקור: Eiffel) היא שפת תכנות מונחת עצמים. שפה זו פותחה ועוצבה על ידי ברטראנד מאייר ועל ידי חברת Eiffel Software בשנת 1985. השפה נקראת על שם גוסטב אייפל, המהנדס שתכנן את מגדל אייפל.
השפה באה לענות על חסרונותיהן של שפות תכנות מונחות עצמים קודמות לה. כתיבת השפה הושפעה מהשפות פסקל, Simula, Ada, Z ושימשה השראה לשפות פופולריות כמו C#, Java, Ruby, D, ועוד. מושגים רבים שהוצגו לראשונה על ידי אייפל, לאחר מכן שולבו בעיצובן של שפות תכנות מוכרות יותר כמו C# ו־Java. מאייר חיבר ספר על עקרונות התכנות המונחה עצמים (Object-Oriented Software Construction), כללי הפרדיגמה שניסח בספר בסופו של דבר הולידו את השפה אייפל.
עיצוב.
תכנות לפי חוזה.
חוזה הוא קובץ אילוצים המוגדר על ידי המתכנת על מנת להבטיח את אמינות הקוד. העיקרון הומצא על ידי ממציא השפה וזאת אחת התכונות החשובות של השפה. בשפות תכנות עכשוויות נעשה שימוש בפיתוח מונחה בדיקות כתחליף לתכנות מונחה חוזים. לכל פונקציה ניתן להצהיר את האילוצים הבאים.
"Design by Contract" הוא סימן רשום של Eiffel Software, והמונח הוטמע והומצא על ידי ד"ר ברנרד מאייר, יוצר השפה. עובדה זאת מאוששת את חשיבות החוזה כמרכיב מרכזי בשפת התכנות אייפל.
דוגמה לשימוש בחוזה.
create
-- Initialization
make (a_day: INTEGER; a_hour: INTEGER) -- Initialize `Current' with `a_day' and `a_hour'.
require
valid_day: 1 &lt;= a_day and a_day &lt;= 31
valid_hour: 0 &lt;= a_hour and a_hour &lt;= 23
day := a_day
hour := a_hour
ensure
day_set: day = a_day
hour_set: hour = a_hour
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 &lt;= a_day and a_day &lt;= 31
day := a_day
ensure
day_set: day = a_day
invariant
valid_day: 1 &lt;= day and day &lt;= 31
valid_hour: 0 &lt;= hour and hour &lt;= 23
עקרון פתיחות/סגירות.
הקוד הקיים (מתוך ספריות) צריך להיות פתוח להרחבה, אך סגור לשינויים, והדבר יכול להתבטא בשתי צורות הבאות.
עקרון הגישה האחידה.
כיוון שיש שינויים ותוספות של אובייקטים חדשים לשפה, דאגו לעשות שכל הפניות יהיו באותה צורה כדי לחסוך תקלות. ולכן יש מנגנון גישה זהה לכל הפונקציות והמחלקות. לדוגמה הסימון codice_1 יכול לשמש בתור קריאה לפונקציה ושליחת הערך 5 כפרמטר, ויכול גם לשמש לאתחול מחלקה שהמשתנה שלה יקבל את הערך 5.
עקרון הפרדת פקודות משאילתות.
הפרדה מוחלטת בין פונקציה שמחזירה ערך, כלומר בקשת מידע ואשר אינה יכולה בשום אופן לעדכן מידע, לבין פרוצדורה המעדכנת או מבצעת פעולה, אך אינה מחזירה מידע. עקרון זה ידוע יותר בתכנות פונקציונלי באופן מקובל יותר כהפרדת פונקציות פונקציונליות גרידא מפונקציות שאינן פונקציונליות גרידא ולהן תוצאות לוואי. מעצב השפה כינה פונקציות עם תוצאות לוואי כ־"פקודות", ופונקציות פונקציונליות גרידא כ־"שאילתות", אך המינוח הזה אינו נהוג בשפות אחרות.
תאימות לשפות אחרות.
השפה בנויה כך שתוכל להתממשק בקלות עם מגוון שפות (בדגש על שפת C, ושפות התכנות מבוססות .NET). השפה מאפשרת לכתוב קוד בשפת C הישר בגוף הפונקציה של Eiffel, ובכך להשלים כל חיסרון שעלול להיות בשפה עם הספריות של שפת C.
ניהול זיכרון.
ניהול זיכרון של תוכנית Eiffel הוא מאתגר כהשלכה מהנסיבות הבאות.
מסיבות אלה, Eiffel אינה מסתפקת ב־codice_2 (שכן codice_3 לא יכול להחזיר את הזיכרון אל מערכת ההפעלה), אלא יש לה מנגנון לניהול זיכרון משלה.
כמו כן, על מנת לפתור את בעיית איסוף הזבל, השפה אינה מסתפקת באלגוריתם יחיד לאיסוף זבל, אלא היא משתמשת בכמה אלגוריתמים בסיסיים, ובכל פעם שיש צורך, בחירת האלגוריתם המיטבי נקבעת לפי הנסיבות ורמת הדחיפות.
שני האלגוריתמים העיקריים לאיסוף זבל בשפת Eiffel, הם mark &amp; sweep, ו־memory compaction. כברירת מחדל, כל יישום בשפת Eiffel כולל איסוף זבל אוטומטי. אבל בכל אופן ניתן לשלוט על מנגנון ניהול זיכרון ולכוון אותו כך שיתאים לצרכים הספציפיים של המתכנת באמצעות פונקציות ופרוצדורות השייכות למחלקה codice_4, המאפשרות למתג את תהליך איסוף הזבל האוטומטי.
המאפיין הייחודי של מאסף הזבל של 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
server.connect
ensure
connected: server.is_connected
rescue
if attempts &lt; 10 then
attempts := attempts + 1
retry
אפשרויות נוספות בשפה.
קריאות חד פעמיות – משמשות לאיפוס ערכים באובייקטים.
תחביר.
המהדר אינו מבחין בין אותיות גדולות וקטנות, אבל מקובל להשתמש בסגנון כתיבה קבוע לשפה כדי לשמור על הקוד קריא לכל מי שמכיר את השפה. נוהגים לכתוב שמות של מחלקות באותיות גדולות, שמות פונקציות באותיות קטנות, שמות משתנים עם אות ראשונה גדולה והשאר קטנות, צירוף מילים כותבים תמיד עם קו תחתון בין המילים.
ב־Eiffel אין חובה להפריד בין פקודות באמצעות נקודה פסיק codice_5 בסוף שורה.
יש להבדיל בין אופרטור הבדיקה codice_6 המחזיר ערך בוליאני (אמת או שקר) כתוצאה של הערכת תנאי, לבין אופרטור ההקצאה codice_7.
הסימון codice_8 (מינוס כפול) פותח הערה באותה שורה.
פונקציות יצירה הן סוג של פונקציות בונות (אלא שקוראים להן אקטיבית) המשמשות לאתחול והגדרות המחלקה. מגדירים פונקציות כאלה בחלק codice_9 במחלקה, אך ממשים אותן בחלק codice_10 כמו כל שאר הפונקציות.
החלק codice_11 בהגדרת הפונקציה מכיל הערה הממצה את מהות המחלקה ("מטפורה").
פונקציות נקראות באופן דומה למשתנים, ולכן המתכנת לא צריך לדעת את אופן המימוש.
השפה מבנית, נכתבת בבלוקים לכל קבוצת קוד באופן דומה לשפת התכנות עדה.
כאשר פונקציה מחזירה פרמטר, משתמשים בפרמטר המובנה בשפה codice_12 לצורך החזרה. (בדומה ל-PL/SQL)
אין נגישות למערך אחרי הגדרתו. לכן מאתחלים עצמים כגון מערכים, וקבצים בעזרת codice_9.
בטיפוס מסוג עצם בברירת מחדל הקצאה מחזירה מצביע לעצם, ולכן אם הוא נמחק קיים מצביע מתנדנד ולכן רצוי להשתמש ב־codice_14 או codice_15.
משתנים פשוטים.
נקראים גם codice_16
הגדרת משתנים נעשית בדרך דומה לשפת פסקל, שם המשתנה נכתב מצד שמאל לאחריו נקודתיים ושם הטיפוס.
flag: BOOLEAN
i: INTEGER
s: STRING
r: REAL
d: DOUBLE
c: CHARACTER
עצמים.
נקראים גם codice_17 ומכילים עצמים או מערכים. לדוגמה,
i: MYoBJ
מערכים.
נקראים codice_18. הכרזה לדוגמה,keywords : ARRAY[STRING]
numbers: ARRAY[INTEGER]
יצירה (מערך מ-1 עד 100).
create keywords.make(1,100)
רשומה.
נקראת codice_19, מקבילה של codice_20 או codice_21 ללא פונקציות, אלא רק נתונים.
t: TUPLE [name: STRING; weight: REAL; date: DATE]
יכול להוות תאריך או רשומה מסוימת וא"צ להגדיר מחלקה
["Brigitte", 3.5, Last_night]
גישה
t.weight := t.weight + 0.5
תנאי.
if תנאי
then גוף
else אם לא מתקיים התנאי
end סוף תנאי
if(num&gt;10) then
output.putint (num)
output.new_line
output.putstring ("Error")
לולאה.
from תנאי התחלה
until תנאי עצירה
loop/end גוף הלולאה
from I:=0 until I&gt;10 loop
RESULT := RESULT + 1
פונקציות ופרוצדורות.
במינוח השפה ישנה הסכמה לגבי הפרדה גמורה בין פונקציות ללא תוצאות לוואי ופונקציות עם תוצאות לוואי.
פונצקיות - עושות חישובים ומחזירות ערך, אבל לא יכולות לבצע שינויים במשתנים.
פרוצדורות - עושות שינויים במשתנים, אבל לא מחזירות ערך.
בצורה כזאת, אפשר לשלוח פונקציה בלי לדאוג שישתנו דברים בתוכנית. אך בפועל המהדר אינו אוכף נושא זה. אחרי שם הפונקציה באים הפרמטרים בסוגרים, ואחר כך הערך המוחזר (אפשר להשמיט את הערך המוחזר, את פרמטרים, או את שניהם) ה־codice_11 מכיל הערה שמתארת את הפונקציה.
מחלקות.
כמו בשפות תכנות מונחות עצמים אחרות, ב־Eiffel מגדירים תבנית לעצמים בעזרת מחלקה.
note - תיעוד המחלקה.
class - שם המחלקה.
inherit - ירושה (אפשרות).
create - פונקציות מאתחלות.
local - משתני מחלקה.
do...end - גוף המחלקה.
description : "targil5 application root class"
date : "$Date$"
revision : "$Revision$"
MY_CLASS
inherit
OTHER_CLASS
create
Function1
feature {NONE} my_function (variable_name: SOME_TYPE)-- Initialization
-- Run application.
local
cmp : CLASS1
cmp.make
מהדרים.
Eiffel רצה על Windows, לינוקס, Unix, OpenBSD, FreeBSD, macOS, ו־OpenVMS.