Eiffel
|
![](//upload.wikimedia.org/wikipedia/commons/thumb/6/6a/Eiffel_logo.svg/150px-Eiffel_logo.svg.png) |
|
Paradigma
| objektumorientalt
|
Megjelent
| 1986
|
Tervez?
| Bertrand Meyer
|
Fejleszt?
| Bertrand Meyer
&
Eiffel Software
|
Utolso kiadas
| 22.05
(stabil verzio, 2022. majus 31., legfrissebb ertek)
[1]
|
Tipusossag
| statikus tipusossag
,
Er?sen tipusos
|
Megvalositasok
| EiffelStudio
,
SmartEiffel
,
Visual Eiffel
,
Gobo Eiffel
,
"The Eiffel Compiler" tecomp
|
Hatassal volt ra
| Ada
,
Simula
,
Z
|
Befolyasolt nyelvek
| C#
,
D
,
Java
,
Lisaac
,
Racket
,
Ruby
,
[2]
Sather
|
Weboldal
|
Az
Eiffel
programozasi nyelvet
Bertrand Meyer
tervezte az 1980-as evek kozepen.
Objektumorientalt
programozasi nyelv
, amely jellegzetesebb tulajdonsagai koze tartozik a
tobbszoros orokl?des
es a
szerz?desalapu programozas
. A nyelv a nevet
Gustave Eiffel
francia epiteszr?l, az
Eiffel-torony
es a budapesti
Nyugati palyaudvar
tervez?jer?l kapta. A nyelv szintaxisa a
Pascalra
es az
Adara
hasonlit.
Er?sen tipusos
, tisztan objektumorientalt nyelv. A programnyelvet ugy terveztek meg, hogy a program kodja maga legyen a
dokumentacio
. Meyer, a nyelv alkotoja, sajat ceget alapitott,
Eiffel Software
neven, amelyik a programnyelv fejlesztesere szakosodott. Sajat implementaciojuk az
EiffelStudio
(wd)
.
Az Eiffel objektumorientalt, es ezt igyekszik minel kovetkezetesebben megvalositani. A programkonyvtarak es az alaptipusok is osztalyok. A programkonyvtarak hasznalata is objektumorientalt: orokolni kell bel?luk.
Az azonos osztalyu objektumok nem latnak bele jobban egymas belsejebe, mint mas kliensek. Sok mas nyelvvel, peldaul a
C++
-szal es a
Javaval
ellentetben a leszarmazott osztaly peldanyai korlatozasok nelkul hozzaferhetnek azokhoz a feature-jeikhez is, amelyeket az alaposztalybol orokoltek. Tehat az Eiffel nyelv a tobbi, osztalyorientalt nyelvvel szemben objektumorientalt.
Engedelyezi a tobbszoros orokl?dest, es a
gyemantproblema
(wd)
megoldasara tobb eszkozt is kinal. Sem az osszeolvasztas, sem a szetvalasztas nem automatikus. A problema megoldasat a programozora bizza, es ehhez nyelvi eszkozoket is kinal.
A nyelv tervezeseben fontosak voltak a kenyelmi szempontok es az intuicio tamogatasa is. A leszarmazottakban a lathatosag akar sz?kithet? is. A rutinok parameterkeszlete, ertelmezesi tartomanya sz?kithet?. Ha G generikus osztaly, es B alosztalya A-nak, akkor G[B] is alosztalya G[A]-nak, holott az elmelet a masik iranyt indokolna. Ezekkel az eszkozokkel egyszer?en megvalosithatok olyan megkotesek, amelyek mas nyelvekben bonyolult, vagy akar lehetetlen lenne megvalositani. Mindezek az eszkozok azonban alaassak a tipusbiztonsagot, tehat a tipusok nem bizonyitjak a program helyesseget. A probleman a polimorfikus catcall segithet.
A nyelv alapelvei koze tartozik az altalanositas is. A nyelvhez csatolt modszertanban a projekt kulon fazisaban vegzik az altalanositasokat, a projektben szerepl? osztalyok generikussa tetelet. A generikussag korlatozhato kozos ?sosztallyal. Ennek az a hatranya, hogy a kozos ?sbe be kell tenni minden m?veletet, amire hivatkozni kivanunk. Ez reszletes el?zetes tervezest igenyel. Az agensek segithetnek megkerulni ezt a kerdest.
A helyesseg ellen?rzesere az el?- es utofeltetelek, meg az invariansok szolgalnak. Kozos neven szerz?deseknek nevezik ?ket, es a vallalkozok kozotti szerz?desekhez hasonlitjak. Meg az ?s es a leszarmazott osztalyok is szerz?dnek, ahol is a leszarmazott kapja az alvallalkozo szerepet. Az egyes objektumokban a privat rutinok belsejeben nincsenek szerz?desek; az egyes objektumnak nem kell onmagaval szerz?dnie, de az invarianst a m?velet elvegzese utan biztositania kell.
Szintaxis es szemantika
[
szerkesztes
]
Az Eiffel nyelv csak az ASCII karaktereket fogadja el. Ha mas karakterek bukkannak fel, akkor a fordito hibat jelez.
Az Eiffel beepitett elemi tipusai:
INTEGER
,
REAL
,
DOUBLE
,
CHARACTER
,
BOOLEAN
.
A fordito ismeri meg a
STRING
, az
ARRAY
es a
BIT_N
(bitsorozat tipus) tipust is. Mindezek a tipusok nullaszer? ertekre inicializalodnak
az
INTEGER
0-ra, a
REAL
0.0-ra, a
DOUBLE
0.0-ra, a
CHARACTER
nullkarakterre es a
BOOLEAN
False-ra.
Maga a nyelv nagybet?-erzeketlen: a kis- es a nagybet?k hasznalatat konvenciok szabalyozzak. A nevekben csak ASCII karakterek szerepelhetnek; a neveket bet?vel kell kezdeni, de a tovabbiak lehetnek bet?k, szamok es alahuzasjelek is. Az alahuzasjel a tobb szavas nevek tagolasara szolgal.
Az osztalyok neve a konvencio szerint csupa nagybet?b?l all. A konstansok nagybet?vel, a tobbi
feature
kisbet?vel kezd?dik. Az el?re definialt entitasok es kifejezesek szinten nagybet?sek. A nagybet?-erzeketlenseg ellenere lehetseges egy osztaly peldanyanak az osztaly kisbet?s nevet adni.
A
;
tagolasra szolgal. A sorok vegen kitehet?, de nem hiba, ha nincs.
Konstans megadasa peldaul:
Solar_system_planet_count
:
INTEGER
=
9
Vezerlesi szerkezetek
[
szerkesztes
]
A felteteles utasitas igy nez ki:
if
feltetel
then
--utasitasok
elseif
feltetel
then
--utasitasok
else
--utasitasok
end
ahol akarhany
elseif
utasitas lehet, es ha nincs
elseif
, akkor
else
sem kotelez?.
Tobbszoros elagazas irhato ezzel is:
inspect
--egesz, vagy karakter kifejezes
when
ertek1
,
ertek2
then
utasitas
when
ertek3
..
ertek4
then
utasitas
else
utasitas
end
A ciklus:
from
--kezdofeltetel
invariant
--invarians
variant
--ciklusvaltozo
until
--amig nem
loop
--ciklusmag
end
ahol is az
invariant
es a
variant
nem kotelez?.
A rutinok a
Result
valtozoban lev? ertekkel ternek vissza.
A parameter nelkuli rutinok zarojel nelkul hivhatok. Ez lehet?ve teszi, hogy egy absztrakt osztaly egyik konkret utoda kiszamitsa azt, ami egy masik leszarmazottban attributum.
A
once
rutinok csak els? meghivodasukkor futnak le, a kes?bbiekben ennek a futasi eredmenye erhet? el ugyanazzal a nevvel. Altalaban parameter nelkuli, de lehetnek parameterei is. Ezekben a rutinokban a
do
helyett
once
szerepel.
Az elavult rutinok a
obsolete
utasitassal jelolhet?k meg. Ennek egy string a parametere, amiben leirhato, hogy mit hasznaljunk helyette.
A feluliras letilthato a
frozen
deklaracioval.
A rutinok agensbe burkolva atadhatok parameterkent. Ezek az agensek azonban nem azonosak a robotok programozasaban hasznalt
agensekkel
.
Legyen az r rutin definialva a C osztalyban. Ekkor a C.r rutinbol agens keszithet?:
class
C
feature
--...
r
(
parameterek
)
do
--a rutinban megvalositott tevekenyseg
end
agent
r
end
Az
agent
r
kifejezes szerepelhet azokban az osztalyokban is, amelyekb?l az r rutin egyebkent is hivhato lenne. Ha az r rutinnak vannak parameterei, akkor tobbfelekeppen is atadhato, mint agens:
azt jelenti, hogy az els? parameter az a, a masodik parameter nyitott. Hasonloan,
jelentese az, hogy az els? parameter nyitott, a masodik parameter a b. De lehet ilyen is:
itt minden parameter meg van adva, de a behelyettesites meg nem tortent meg, hanem arra var, hogy meghivjak az agenst.
Lehet akar ilyen is:
ami ugyanazt jelenti, mint
.
Osztalyok a
class
kulcsszoval deklaralhatok. Az Eiffel programok osztalyokbol allnak. A beepitett tipusok es a programkonyvtarak is osztalyok. A tobbszoros orokl?des es az ismetelt orokl?des megengedett. A metodusokat es az osztaly- es peldanyvaltozokat, konstans tagokat a nyelv kozos neven
feature
-nek nevezi. Alapelveiben szerepel az egyseges kinezet elve, ami szerint a parameter nelkuli tagfuggvenyek zarojel nelkul hivhatok. Ez lehet?seget biztosit arra, hogy egy absztrakt osztaly ket leszarmazottja kozul az egyikben kiszamoljuk azt, amit a masikban megadunk.
Az osztalyokban kiemelt szerep jut a letrehozo feature-oknek. Ezek a konstruktoroknak felelnek meg. A letrehozo feature-oket az osztaly elejen a
create
mondatban kell felsorolni:
class
HELLO_WORLD
create
make
feature
make
do
print
(
"Hello, world!"
)
end
end
A letrehozo rutinok szokasos neve
make
. Ezt nem egyszer? atallitani, ezert javasolt, hogy az egyik letrehozo rutin a
make
legyen. Ezek a rutinok indithatok el peldanyositaskor:
create
x
.
make
(
a
:
INTEGER
,
b
:
STRING
,
c
:
ACCOUNT
)
Osztalyon belul nincs tulterheles, de kulonboz? osztalyokban szabad egy m?veletet ugyanazon a neven deklaralni.
Absztrakt osztalyok es rutinok a
deferred
kulcsszoval deklaralhatok. Egy absztrakt osztaly utodai mindaddig absztraktak maradnak, ameddig az absztrakt rutinokat nem implementaljak. Konkret osztalyok utodai is absztraktta tehet?k ugyanezzel a kulcsszoval. Az absztrakt osztalyok kozvetlenul nem peldanyosithatok, csak konkret utodaik reven.
Az osztalyok alapesetben referenciak reven peldanyosulnak. Ha ezt nem akarjuk, akkor az osztalyt
expanded
-nek kell deklaralnunk. Nem expanded osztalyok peldanyai is lehetnek nem referenciak, ha
expanded
-kent hozzuk letre ?ket. Az alaptipusok is expanded osztalyok.
expanded
class
PONT
feature
x
,
y
:
REAL
eltol
(
dx
,
dy
:
REAL
)
do
x
:=
x
+
dx
y
:=
y
+
dy
end
end
Az ures referencia a Void, ami a NONE fiktiv osztaly egyetlen peldanya. Ha egy osztaly
attached
, akkor az ilyen osztalyu objektumok nem lehetnek Voidok. Az
expanded
osztalyok implicit
attached
tulajdonsaguak is, mivel nem referenciak. Az
attached
ellentete a
detachable
. Ujabban az
attached
az alapertelmezett, de a regebbi verziokban a
detached
volt az alapertelmezes. Kompatibilis modban megint a regebbi verzio az ervenyes. Erre kulon figyelni kell. Az
attached
tipusu tagok nem vehetnek fel
detached
tipusu erteket. Ez alol kivetel, ha egy elagazasban ellen?rizzuk, hogy nem Void-e.
Az alacsony szint? mutatokat a
POINTER
osztaly peldanyai potoljak.
Az osztalyokban
Current
jeloli az adott peldanyt. Az adott peldany dinamikus tipusara a
like
Current
utal. Ez lehet?ve teszi, hogy a rutinok ertelmezesi tartomanya sz?kuljon az orokl?des folyaman, ami veszelybe sodorja a tipusbiztonsagot, hiszen az ertelmezesi tartomany nem sz?kithet? tipusbiztonsagos modon. Ezen a catcall segithet.
A tobbszoros orokl?des megengedett:
class
D
create
--...
inherit
A
B
feature
--...
ahol is az ?sosztalyok nem fontossaguk szerint csokken? sorrendben vannak felsorolva, mint a
Python
nyelvben, hanem egyenranguak. Nevutkozes eseten a fejleszt? dontheti el, hogy osszevonja-e a feature-oket, vagy elkuloniti. Ehhez az Eiffel nyelvi szinten is biztosit eszkozoket.
Egy feature atnevezhet? (
remane
mondat), absztraktta tehet? (
undefine
mondat), vagy ujradefinialhato (
redefine
mondat). Ujradefinialas eseten
Precursor
jeloli az eredetit. Atnevezes es elkulonites eseten a
select
jeloli ki, hogy mi fog meghivodni az eredeti neven. Ha tobb absztrakt feature-t orokol az osztaly, akkor eleg hozza egy implementaciot irni. Meyer ezt ugy fejezi ki, hogy egy konkret k?vel tobb absztrakt madarat meg lehet olni.
A letrehozo rutinok orokl?dnek, de az utodokban mar nem lesznek automatikusan letrehozo rutinok. Azokat minden ujabb osztaly elejen uj
create
mondattal be kell jelenteni.
Az orokl?desben az osztalyoknak van egy kozos ?se, az ANY. Ez implemental nehany hasznos feature-t, mint a
copy
, a
clone
vagy a
deep_clone
. Van benne egyenl?segvizsgalat, amely az objektumok egyenl?seget vizsgalja. Tovabbi egyenl?segvizsgalatra szolgal az
equal
es az
is_equal
. Ezek a rutinok feluldefinialhatok az utodokban, de mindegyikhez tartozik egy alapertelmezett, aminek neve
default_
-tal kezd?dik, es ami nem definialhato at. Az egyenl?segvizsgalatban
=
jeloli az egyenl?t, es
/=
a nem egyenl?t. A
~
az
equal
alapjan keszul. Az
:=
ertekadas mellett felteteles ertekadas is van, a
?=
. A peldanyok fajlba menthet?k:
x.
store
(fajl_neve)
. Az ANY b?vithet? is, de szul?je, a GENERAL mar nem.
Az osszes osztalynak van egy kozos utoda, a NONE fiktiv osztaly, aminek csak egy eleme van, az ures referencia, a
Void
.
Az ANY es a NONE az exportlistakban valik fontossa:
export
{
ANY
}
feature
xyz
azt jelenti, hogy az xyz feature barhonnan lathato,
pedig azt, hogy az adott objektumon kivulr?l meg az azonos osztalyu peldanyok sem ferhetnek hozza. A tobbi eset ezek kozott all, a kapcsos zarojelek kozott felsorolt osztalyu objektumok lathatjak az osztaly adott feature-et. Ez a lathatosag finomabb szabalyozasat teszi lehet?ve.
Az Eiffel nyelv alapelve a szerz?desalapu programozas. Ez azt jelenti, hogy akar minden utasitasnak lehet el?-, utofeltetele, vagy invariansa. Ezek felfoghatok szerz?deskent a hivo es a hivott kozott. A hivo biztositja az el?feltetelt es az invarianst, es a hivott vallalja, hogy normalis lefutas eseten biztositja az utofeltetelt es az invarianst, kivetel eseten pedig legalabb az invarianst. A konstruktoroknak nincs kulon el?felteteluk, es az invarianst sem kell a hivonak biztositania, hiszen eppen a konstruktor allitja be az invarianst. Az el?felteteleket a hivo ellen?rzi, ezert nem hivhatok benne olyan rutinok, amiket a hivo nem tud hivni. Az utofeltetelben
old
-dal hivatkozhatok a rutin futasa el?tti ertekek.
A szerz?desek alakja abban az osztalyban, ahol az oroklesben el?szor definialjak az illet? feature-t:
feature
nev
require
--az elofeltetelt leiro allitasok
do
begin
--a rutin utasitasai
ensure
--az utofeltetelt leiro allitasok
end
invariant
--az invarianst leiro allitasok
Az orokl?des folyaman az el?feltetelek enyhulhetnek, az utofeltetelek szigorodhatnak. Ha nem irunk el?- vagy utofeltetelt, akkor azok azonosan igazak lesznek. Ha egy rutinnak nincs el?feltetele, akkor a tovabbiakban sem lehet, viszont az utofeltetelben mar lehetnek vallalasai. Az el?feltetelhet vaggyal, az utofeltetelhez essel lehet tovabbiakat hozzavenni:
feature
nev
require
else
--az elofeltetelt leiro allitasok
do
begin
--a rutin utasitasai
ensure
then
--az utofeltetelt leiro allitasok
end
Tobbszoros orokl?des eseten is az el?feltetelek osszevagyolodnak, az utofeltetelek es az invariansok osszeesel?dnek.
Az Eiffel lehet?ve teszi, hogy egy rutint, aminek nem volt parametere, ujraimplementaljunk attributumkent. Ekkor az el?feltetelek elfelejt?dnek, az utofeltetelek es az invariansok az osztaly invariansai lesznek.
Az
only
a megvaltoztathato elemeket jelolheti ki. Az utofeltetelben az
old
a rutin futasanak kezdetekor meglev? ertekekre hivatkozik. A
check
egyes ellen?rzend? allitasokat jelol meg. Ha a forditonak a megfelel? opciot adjuk, akkor az ellen?rzi ezeket az allitasokat.
Az Eiffel nyelv a normal tevekenysegt?l valo elterest els? vonalban a szerz?desekkel fogja meg. A kivetelek megmaradnak kiveteles esemenynek. Akkor kerul rajuk sor, ha az adott rutin nem tudja biztositani az utofeltetelet. Ekkor az az elvaras, hogy legalabb az osztalyinvarianst allitsa helyre. A kivetelkezelesre a rutin torzsen kivul, az
end
el?tt elhelyezett
rescue
mondat szolgal. Innen a
retry
a rutin elejere visz vissza, hogy egy masik modon probalja meg biztositani az utofeltetelet. Ha nincs kiirva, akkor az osztaly alapertelmezett rescue rutinja, az esetleg atnevezett
default_rescue
hivodik meg. Gyakran a konstruktort teszik meg default_rescue-nak, hiszen annak is az a dolga, hogy beallitsa az osztalyinvarianst. Ha nem sikerult el?allitani az utofeltetelt, akkor a kivetel tovabbdobodik a hivoba.
Egy Eiffel rutin vazlata a
rescue
mondattal:
feature
nev
do
begin
--a rutin utasitasai
rescue
--a kivetelek kezelese
retry
end
Kivetelek az EXCEPTIONS osztalybol szarmaztathatok.
Az altalanositas es az absztrakcio az Eiffel nyelv alapelvei koze tartozik. A modszertan kiemelten kezeli az altalanos, de specializalhato szerkezeteket. Bertrand minden projekthez javasol egy altalanositasi szakaszt, ahol a projektben megalkotott osztalyokat lehet?seg szerint altalanositjak. Generikusok valositjak meg peldaul az adatszerkezeteket.
Egy generikus osztaly vazlata:
class
SHD
[
G
]
feature
--definiciok
end
Egy altalanos generikusban csak olyan m?veletekre szabad hivatkozni, amelyek altalanossagban minden osztalyra meghivhatok, kulonben a generikus hibas lesz, es nem fog lefordulni. Megkotesekkel ez a hiba javithato:
class
SORTABLE_ARRAY
[
G
->
COMPARABLE
]
feature
--definiciok; hasznalhatja az osszehasonlitast, a COMPARABLE muveleteit
end
Keverhet? a nem korlatozottal:
class
HASH_TABLE
[
G
,
H
->
HASHABLE
]
feature
--definiciok
end
Tombok megadhatok az ARRAY generikus osztaly peldanyaikent, vagy peldaul igy:
Ez egy manifeszt tomb, tipusa
ARRAY
[
INTEGER
]
, tehat ekkor is a generikus
ARRAY
osztaly all a hatterben.
Manifeszt konstansok stringekhez is elerhet?k:
INTEGER
=
"Go get a life!"
Hasznalhato az
unique
is:
A fordito ad nekik erteket. Ez potolja a felsorolasi tipust.
Tuple es rutin tipusok
[
szerkesztes
]
A TUPLE az Eiffel direkt szorzat tipusa. Hasonlit a generikusokra, de nem az, hiszen akarhany parametere lehet:
TUPLE
[]
=
TUPLE
:
>
TUPLE
[
STRING
]
TUPLE
[
STRING
]
:
>
TUPLE
[
STRING
,
INTEGER
]
TUPLE
[
STRING
,
INTEGER
]
:
>
TUPLE
[
STRING
,
INTEGER
,
STRING
]
--...
ahol is a hosszabb TUPLE a kezd?szeletet tartalmazo
TUPLE
altipusa (
:
>
). Emellett meg teljesul az is, hogy a b?vebb tipust tartalmazo TUPLE tartalmazo tipus (
<
:
):
TUPLE
[]
=
TUPLE
TUPLE
[
STRING
]
<
:
TUPLE
[
ANY
]
TUPLE
[
STRING
,
INTEGER
]
<
:
TUPLE
[
ANY
,
ANY
]
TUPLE
[
STRING
,
INTEGER
,
STRING
]
<
:
TUPLE
[
ANY
,
ANY
,
ANY
]
--...
A rutin tipusok leszarmazasa:
A rutinok tipusa a
ROUTINE
; ebb?l szarmazik a
PROCEDURE
es a
FUNCTION
tipus. A logikai fuggvenyek tipusa a PREDICATE a FUNCTION altipusa. A TUPLE-hoz hasonloan tovabbi altipusok kepezhet?k:
ROUTINE
[
TUPLE
[]]
=
ROUTINE
[
TUPLE
]
=
ROUTINE
:
>
ROUTINE
[
TUPLE
[
STRING
]]
ROUTINE
[
TUPLE
[
STRING
]]
:
>
ROUTINE
[
TUPLE
[
STRING
,
INTEGER
]]
ROUTINE
[
TUPLE
[
STRING
,
INTEGER
]]
:
>
ROUTINE
[
TUPLE
[
STRING
,
INTEGER
,
STRING
]]
--...
valamint
ROUTINE
[
TUPLE
[]]
=
ROUTINE
[
TUPLE
]
=
ROUTINE
ROUTINE
[
TUPLE
[
STRING
]]
<
:
ROUTINE
[
TUPLE
[
ANY
]]
ROUTINE
[
TUPLE
[
STRING
,
INTEGER
]]
<
:
ROUTINE
[
TUPLE
[
ANY
,
ANY
]]
ROUTINE
[
TUPLE
[
STRING
,
INTEGER
]]
<
:
ROUTINE
[
TUPLE
[
ANY
,
ANY
,
ANY
]]
--...
ahol a TUPLE-k a parametereket tartalmazzak. A fuggvenyek altalanos tipusa hasonlo, csak kib?vul a visszateresi ertekkel:
ahol T a visszateresi ertek tipusa. Az altipusok a ROUTINE altipusaihoz hasonloan kepz?dnek, a visszateresi ertek figyelembe vetelevel.
A rutin tipusok az agensbe valo burkolaskor valnak fontossa.
class
HELLO_WORLD
create
make
feature
make
do
io
.
put_string
(
"Hello, world!"
)
io
.
put_new_line
end
end
- ↑
EiffelStudio 22.05 is available!
. (Hozzaferes: 2022. december 19.)
- ↑
Cooper, Peter.
Beginning Ruby: From Novice to Professional
, 2nd, Beginning from Novice to Professional, Berkeley: APress, 101. o. (2009).
ISBN 1-4302-2363-4
?To a lesser extent, Python, LISP, Eiffel, Ada, and C++ have also influenced Ruby.”
- Nyekyne Gaizler Judit: Programozasi nyelvek
F?bb programozasi nyelvek
|
---|
|
|