한국   대만   중국   일본 
Eiffel (programozasi nyelv) ? Wikipedia Ugras a tartalomhoz

Eiffel (programozasi nyelv)

A Wikipediabol, a szabad enciklopediabol
Eiffel

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) .

Elvek [ szerkesztes ]

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.

Beepitett tipusok [ szerkesztes ]

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.

Konvenciok [ szerkesztes ]

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?.

Rutinok [ szerkesztes ]

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.

Agensek [ szerkesztes ]

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:

agent
 r
(
a
,
?
)

azt jelenti, hogy az els? parameter az a, a masodik parameter nyitott. Hasonloan,

agent
 r
(
?
,
b
)

jelentese az, hogy az els? parameter nyitott, a masodik parameter a b. De lehet ilyen is:

agent
 r
(
a
,
b
)

itt minden parameter meg van adva, de a behelyettesites meg nem tortent meg, hanem arra var, hogy meghivjak az agenst.

Lehet akar ilyen is:

agent
 r
(
?
,
?
)

ami ugyanazt jelenti, mint

agent
 r

.

Osztalyok [ szerkesztes ]

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.

Orokl?des [ szerkesztes ]

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,

export
{
NONE
}
 feature

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.

Szerz?desek [ szerkesztes ]

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.

Kivetelkezeles [ szerkesztes ]

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.

Generikusok [ szerkesztes ]

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 [ szerkesztes ]

Tombok megadhatok az ARRAY generikus osztaly peldanyaikent, vagy peldaul igy:

tomb
 =
 <<
4
,
 6
,
 9
>>

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
,
 b
,
 c
,
 n
 =
 unique

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:

FUNCTION
[
TUPLE
,
 T
]

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.

Peldaprogram [ szerkesztes ]

class

    HELLO_WORLD

create

    make

    feature

       make

          do

             io
.
put_string
 (
"Hello, world!"
)

             io
.
put_new_line

          end

    end

Jegyzetek [ szerkesztes ]

  1. EiffelStudio 22.05 is available! . (Hozzaferes: 2022. december 19.)
  2. 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.”  

Forrasok [ szerkesztes ]

  1. Nyekyne Gaizler Judit: Programozasi nyelvek