Eiffel (programski jezik)

S Vikipedije, slobodne enciklopedije
Ajfel
Modelobjektno-orijentisan
Pojavio se1986
Autor(i)Bertrand Majer i Ajfel Softver
Dizajner(i)Bertrand Majer
ImplementacijeAfjelStudio, SlobodniAjfel, PametniAjfel, VizuelniAjfel, Gobo Ajfel, "Ajfel kompilator" tekomp
UticajiAda, Simula, Z
Uticao naAda 2012, Albatros, C#, D, Java, Lissac, Racket, Rubi,[1] Sather, Skala

Ajfel je ISO-standarizovan, objektno-orijentisan programski jezik dizajniran od strane Betranda Majera (zagovornik objektne-orijentacije i autor Konstrukcije objektno-orijentisanog softvera) i Ajfel softver. Dizajn jezika je najbliže povezan sa metodom Ajfel programiranja. Oba su bazirana na skupu principa, uključujući dizajn po ugovoru, odvajanjem komande upita, princip jedinstvenog-pristupa, princip jednostavnog-izbora, otvoreno-zatvoreni princip, i opcija-operand razdvajanja.

Mnogi koncepti prvobitno predstavljeni preko Ajfela kasnije su došli do Jave, S#, i ostalih jezika[2]. Nove ideje dizajna jezika, posebno kroz Ekma/ISO standarzacioni proces, nastavljaju da budu inkorporisani u Ajfel jezik.

Karakteristike[uredi | uredi izvor]

Ključne karakteristike Ejfel jezika uključuju:

  • Objektno-orijentisana struktura programa u kojoj klasa služi kao klasičan član dekompozicije .
  • Dizajn po ugovoru čvrsto integrisan sa ostalim jezičkim konstrukcijama
  • Automatsko upravljanje memorijom, obično se sprovodi kolekcija otpadaka.
  • Nasleđivanje, uključujući višestruko nasleđivanje, preimenovanje, redefinisanje, "izaberite", neusaglašeno nasledstvo, i drugi mehanizmi namenjenih za sigurno nasledstvo .
  • Ograničeno i neograničeno generičko programiranje
  • Jedinstveni tip sistema koji upravlja vrednostima i referentnom semantikom u kojima su sve vrste, uključujući osnovne vrste, kao što su celi brojevi, su klase na bazi.
  • Statično kucanje
  • Bezbednost praznine, ili statička zaštita od poziva na nulte reference, kroz mehanizam priloženih-tipova.
  • Agenti, ili objekti koji obuhvataju izračunavanja, blisko povezani sa zatvaranjem i lambda izračunavanjem.
  • Kada rutine, ili rutinu procenjuju samo jednom, za deljenje objekta i decentralizovane inicijalizacije.
  • Ključna reč-zasnovana na sintaksi u ALGOL / Paskal tradiciji, ali slobnodnog-razdvakača, utoliko što zarez je neobavezan, sa sintaksom operatera dostupnim za rutine.
  • Slučaj neosetljivosti
  • Jednostavno Istovremeno Objektno-orijentisano programiranje (SCOOP) olakšava stvaranje više, istovremeno aktivnih izvršenja vozila na nivou apstrakcije iznad specifičnih detalja ovih vozila (npr više niti bez konkretnog upravljanja muteksom).

Ciljevi dizajna[uredi | uredi izvor]

Ajfel naglašava deklarativne naredbe preko procedurnog koda i pokušava da eliminiše potrebu za knjigovodstvom uputstava.

Ajfel izbegava trik kodove ili tehnike kodova namenjene za optimizaciju saveta kompilatora. Cilj nije samo da se kod učini čitljivijim, ali takođe da dozvoli programerima da se koncetrišu na važne aspekte programa da se zaglave u detaljima implementacije. Ajfelova jednostavnost je namenjena da promoviše jednostavne, proširive, ponovo koristive i pouzdane odgovore računarskih problema. Kompilatori za računarske probleme napisani u Ajfelu pružaju izvanredne tehnike optimizacije, kao što je automatsko oblaganje, koji oslobađa programera od dela optimizacije tereta.

Pozadina[uredi | uredi izvor]

Ajfel je originalno razvijen preko Ajfel softvera, kompanija osnovana od strane Bertranda Majera. Softver objektno-orijentisane konstrukcije sadrži detaljan tretman koncepata i teorije o objektnoj tehnologiji koja je dovela do Ajfelovom dizajna.[3]

Cilj dizajna iza Ajfelovog jezika, biblioteka, i metoda programiranja je da omogući programerima da naprave pouzdanane, ponovo koristive module softvera. Ajfel podržava više nasledstva, generičko programiranje, polimorfizam, enkapsulaciju, i parametarsku pokrivenost. Ajfelova najvažnija donacija softverskom inženjerstvu je dizajn po ugovoru (DbC), u kome potvrde, preduslovi, postuslovi i varijante klasi su napravljene da osiguraju tačnost programa bez žrtvovanja efikasnosti.

Ajfelov dizajn je baziran na teoriji objektno-orijentisanog programiranja, sa samo većim uticajem drugih paradigmi ili zabrinutosti za podršku zastarelog koda. Ajfel formalno podržava apstraktne tipove podataka. Pod Ajfelovim dizajnom, tekst je trebalo da bude u mogućnosti da proizvodi svoj dizajn dokumentacije iz teksta, koristeći formalizovanu implementaciju "Apstraktni tip podataka".  

Implementacije i okruženja[uredi | uredi izvor]

AjfelStudio je integrisano razvojno okruženje dostupno preko otvorenog koda ili komercijalne licence. Omogućuje objektno orijentisano okruženje za softversko inženjerstvo. AjfelEnvižn je dodatak za Majkrosoft Vižual Studio koji dozvoljava korisnicima da uređuju, sastavljaju i debaguju Ajfelove projekte iz Majskrosoftovog Vižual Studia IDE. Pet ostalih otvorenih kodova implementacija su dostupni: "Ajfelov Kompilator" tecomp, Gobo Ajfel, PametniAjfel—GNU implementacija, bazirana na starijim verzijama jezika—, SlobodniAjfel—baziran na kompilatoru PametnogAjfela— i Vizujelni Ajfel.

Nekoliko ostalih programskih jezika ugrađuju elemente prvi put predstavljene u Ajfelu. Sather, na primer, je originalno baziran na Ajfelu ali se skoro raširio, i sada uključuje nekoliko karakteristika funkcionalnog programiranja. Interaktivni-učiteljski jezik Blue, prethodnik od BlueJ, je takođe baziran na Ajfelu. Epl alatka media uključuje Epl media jezik baziran na Ajfelu.

Specifikacije i standardi[uredi | uredi izvor]

Definicija Ajfel jezika je internacionalni standard ISO-a. Standard je razvio ECMA Internacional, koji je prvi dozvolio standard 21. juna 2005 kao Standard ECMA-367, Ajfel: Analiza, Dizajn i Programski Jezik. Juna 2006., ECMA i ISO su usvojili drugu verziju. Novembra 2006., ISO je prvi put objavio tu verziju. Standard može biti nađen i besplatno koriščen na ECMA sajtu.[4] ISO verzija[5] je identična u svakom smislu osim u formatiranju.

Ajfel softver, "Ajfel Kompilator" tekomp i razvojnik Ajfelove-biblioteke  Gobo je počinio implementovanje standarda; Ajfel softver AjfelStudio 6.1 i "Ajfel Kompilator" tekomp je implementovao neke nove mehanizme —tačnije, dvoredni agenti, dodeljivači komandi, nosač notacija, neusaglašeno nasledstvo i prikačene tipove. PametniAjfel team se sklonio od ovog standarda kako bi kreirao svoju verziju jezika, za koju veruju da je bliza originalnom stilu Ajfela. Objekti alata nisu otkriveni iako buduće verzije Ajfel kompilatora će biti sa standardom. SlobodniAjfel implementuje dijalekat negde između PametnogAjfela jezika i standarda. 

Standard navodi sledeće, prethodnik specifikacije Ajfelovog-jezika:

  • Bertrand Majer: Ajfel: Jezik, Prentis Hol, drugo izdanje, 1992 (prvo izdanje: 1991)
  • Bertrand Majer: Standardi Ajfel (ponovna verzija prethodnog unosa), odlazeći, 1997–danas, na Bertrand Majerovoj ETL3 stranici , i
  • Bertrand Majer: Konstrukcija objektno-orijentisanog softvera, Prentis Hol: prva edicija, 1988; druga edicija, 1997.
  • Bertrand Majer: Dodirni klasu: Učenje za dobro programiranje sa objektima i ugovorima, Springer-Verlag. 2009. ISBN 978-3-540-92144-8. lxiv + 876 strana štampanja u punoj boji, numerisane fotografije u boji

Trenutna verzija standarda iz Juna 2006 sadrži neke nedoslednosti (npr. kovarijantne redefinicije). ECMA komitet nije još progrlasio bilo koju vremensku liniju i direkciju kako rešiti te nedoslednosti. 

Sintaksa i semantika[uredi | uredi izvor]

Ukupna struktura[uredi | uredi izvor]

Ajfelov "sistem" ili "program" je kolekcija klasa. Iznad nivo klasa, Ajfel definiše klaster, koji je suštinski grupa klasa, i moguće podklaster (ugnježđeni klasteri). Klasteri nisu jezička sintaksna konstrukcija, već standardna organizaciona konvecija. Tipično Ajfel program će biti organizovan sa svakom klasom u različitim fajlovima, i svaki klaster u direktorijum sadržeći fajlove klase. U ovoj organizaciju, podklasteri su poddirektorijumi. Na primer, pod standardnim organizacionim i konvecijama futrola,  x.e može biti ime fajla koji definiše klasu pod imenom X.

Klasa sadrži karakteristike, koji su slični "rutinama", "članovima", "atributima" ili "metodama" u objektno-orijentisanim programskim jezicima. Klasa takođe definiše njene invarijante, i sadrži druge osobine, kao što su "beleške" sekcija za dokumentaciju i metapodatke. Ajfelovi standardi tipa podataka, kao što su  INTEGER, STRING iARRAY, su svi sami od sebe klase.

Svaki sistem mora imate klasu označenu kao "koren", sa jednom od njegovih kreacija procedura označenih kao "koren procedure". Izvršenje sistema se sastoji od stvaranja instance korena klase i izvršenje korena procedure. Obično, radeći to stvara nove objekte, poziva nove karakteristike, i tako dalje. 

Ajfel ima pet klasičnih instrukcija izvršenja: dodela, kreiranje objekta, poziv rutine, uslov i ponavljanje. Ajfelove stukture kontrole su striktne u sprovođenju strukturnog programiranja: svaki blok ima tačno jedan ulaz i tačno jedan izlaz.

Određivanje okvira[uredi | uredi izvor]

Za razliku od mnogih objketno-orijentisanih jezika, ali kao Smalltalk, Ajfel ne dozvoljava bilo koju dodelu unutar polja objekta, osim unutar karakteristika objekta, koji je praktična aplikacija principa skrivanja informacija ili apstrakcija podataka, zahtevajući formalna sučelja za mutaciju podataka. Da bi stavio u jezik drugih objektno-orijentisanih programskih jezika, sva Ajfelova polja su "privatna", i "postavljači" treba da modifikuju vrednosti. Poenta sve ovoga je da "postavljači" mogu, i obično rade, implementovanje invarijanti za koje Ajfel daje sintaksu.

Dok Ajfel ne dozvoljava direktan pristum karakteristikama klase od strane klijenta klase, ono dozvoljava definiciju "komande dodeljivanja", kao što je:

   some_attribute: SOME_TYPE assign set_some_attribute
   
   set_some_attribute (v: VALUE_TYPE)
               -- Set value of some_attribute to `v'.
           do
               some_attribute := v
           end

Dok blagi naklon na ukupnu zajednicu programera da dozvole da nešto izgleda lepo kao direktni pristup (npr. razbijanje principa sakrivanja informacija), praksa je opasna pošto ona kriva ili zamračuje realnost "postavljača" koji se koristi. U praksi, bolje je čitati direktan poziv postavljača pre nego podrazumevanje direktno pristupa karakteristici kao some_attribute što je u primeru koda iznad.

Za razliku od drugih jezika, imati pojmove "javno", "privatno" i tako dalje, Ajfel koristi tehnologiju izvoza za precizniju kontrolu određivanja polja između klienta i dostavljača klasa. Štaviše, da bi se izvozila logika koja je korišćena može biti proverena statično preko kompilatora, koji dozvoljava raniju detekciju određivanja polja prekršaja poziva prilikom kompiliranja pre nego izvršna verzija. Na primer, (dole), "{NONE}" je slično "privatnom" u drugim jezicima. Primenjena oblast na ovaj način na "grupu karakteristika" (npr. sve ispod ključne reči "karakteristika" ili do sledeće karakteristike grupe ključnih reči ili do kraja klasa) može biti izmenjen u potomku klasa koristeći ključnu reč  "izvoz".

feature {NONE} -- Иницијализација
	default_create
			-- Иницијализује нову `нулту' инстанцу децимале.
		do
			make_zero
		end

Alternativno, nedostatak {x} izvoz deklaracije podrazumeva {ANY}i sličan je oblasti "javno" drugih jezika.

feature -- Константе

Konačno, određivanje oblasti može biti selektivno i precizno kontrolisano pri svakoj klasi u Ajfelovom projektnom univerzumu, kao što je:

feature {DECIMAL, DCM_MA_DECIMAL_PARSER, DCM_MA_DECIMAL_HANDLER} -- Приступ

Ovde, kompilator će da dozvoli samo klase navedene između vitičastih zagrada da bi se pristupilo karakteristikama unutar grupe karakteristika (npr. DECIMAL, DCM_MA_DECIMAL_PARSER, DCM_MA_DECIMAL_HANDLER).

"Hello, world!"[uredi | uredi izvor]

Izgled i osećaj programskog jezika se često prenosi koristeći "Hello, world!" program. Takav program pisan u Ajfelu može biti:

class
    HELLO_WORLD
create
    make
feature
    make
        do
            print ("Hello, world!%N")
        end
end

Ovaj program sadrži klasu HELLO_WORLD. Konstruktor (napravi rutinu) za klasu, nazvan make, priziva  print rutinu sistemske biblioteke da napiše"Hello, world!" poruku za izlaz.

Dizajn po ugovoru[uredi | uredi izvor]

Koncept dizajna po ugovoru je glavni za Ajfel. Ugovori potvrđuju šta mora biti tačne pre nego što je rutina izvršena (preduslov) i šta mora čekati da bude tačno nakon što se rutina završi (post-uslov). Ugovori invarijante klase definišu šta potvrde moraju držati obema tačnim pre i nakon što je pristupljeno karakteristikama klase (obemama rutinama i atributima). Štaviše, ugovori se šifruju u izvršujući kod programera i dizajnerovih potvrda o operativnom okruženju karakteristika klase u celini preko značenja invarijanti.

Ajfelov kompilator je dizajniran da sadrži karakteristiku i klasu ugovora u različitim nivoima. AjfelStudio, na primer, izvršava sve karakteristike i klase ugovora, tokom izvršavanja u "Režimu radnog stola". Kada je izvršenje stvoreno, kompilator je upućen putem projekta osobina fajla (npr. ECF fajl) da ili uključuje ili isključuje bilo koju grupu ugovora. Na taj način, izvršeni fajl može biti sastavljen da ili uključuje ili isključuje bilo koji nivo ugovora, time dovodeći kontinuirane nivoe jedinice i testiranje integracije. Štaviše, ugovori mogu biti kontinuirano i metodički ostvareni putem karakteristike  Auto-Test nađene u AjfelStudiju.

Mehanizmi dizajna po ugovoru su usko integrisani sa jezikom i vodičem redefinisanja karakteristika u nasleđivanju:

  • Preduslov rutine : Preduslov može biti oslabljen samo preko nasleđivanja; svaki poziv koji se sretne sa uslovima predka sretne one od potomka 
  • Postuslov rutine: Postuslob može biti ojačan samo pomoću nasleđivanja; svaki garantovani rezultat od strane predka je idalje omogućen preko potomka.
  • Invarijanta klase: Uslovi koji moraju držati tačni oba pre (osim pre kreiranja) i posle (osim post-uništavanja) pristupa karakteristici klase (rutine ili atributa). Zato što je invarijanta proverena često, čini ga istovremeno najskupljom i najjačom formom uslova ili ugovora.

Pored toga, jezik podržava "instrukciju provere" (tip "potvrde") i invarijante petlje.

Sigurnost-praznine[uredi | uredi izvor]

Praznina-sigurnost, kao statično kucanje, je još jedan objekat za poboljšanje kvaliteta softvera. Praznina-sigurnosti softver je zaštićen od grešaka vremenskog pokretanja prouzrokovanih preko praznih poziva referenci, a samim tim će biti puzdaniji nego softver u kome će se mete poziva za prazninu izvršiti. Analogija statičnom kucanju je korisna. U stvari, sposobnost praznine-sigurnosti se može videti kao ekstenzija sistemu kucanja, ili korak iznad statičnog kucanja, zato što mehanizam za osiguravanje praznine-sigurnosti je integrisan u sistem pisanja.

Čuvar protiv meti poziva praznine može biti viđen putem ideje priloga i (preko ekstenzije) odreda (npr. odvojive ključne reči). Objekat praznine-sigurnosti može biti viđen u kratkom ponovnom radi primera koda korišćenom iznad:

   some_attribute: detachable SOME_TYPE
   
   use_some_attribute
               -- Поставља вредност some_attribute на `v'.
           do
               if attached some_attribute as l_attribute then
                   do_something (l_attribute)
               end
           end
   
   do_something (a_value: SOME_TYPE)
               -- Ради нешто са `a_value'.
           do
              ... ради нешто са `a_value' ...
           end

Primer koda iznad pokazuje kako kompilator može statičo adresovati puzdanost da li će some_attribute biti prikačeni ili otkačeni u tački koja se koristi. Naime, attached ključna reč dozvoljava za "prilog lokalne" (npr. l_attribute), kojoj je određeno polje da samo blokira kod ograđenog preko if-naredbe konstrukcije. Stoga, unutar malog blok koda, lokalna varijabla (npr.. l_attribute) može biti statično garantovana da je ne-prazna (tj. praznina-sigurnosti).

Detalji, komande i upiti[uredi | uredi izvor]

Primarne karakteristike klase su te da definišu grupu karakteristika: tako što klasa reprezentuje grupu izvršnih verzija objekata, ili "instanci", karakteristika je operacija nad ovim objektima. Postoje dve vrste ovih karakteristika: upiti i komande. Upit daje informacije o instancama. Komanda modifikuje instancu. 

Razlika između komande i upita je važna za Ajfelov metoda. Naročito: 

  • Princip jedinstvenog pristupa: od tačke gledišta softvera klient pravi poziv karakteristici klase, bez obzira da li je red atribitu (vrednost polja) ili funkcija (izračunata vrednost) ne bi treblo da pravi bilo kakvu razliku. Na primer a_vehicle.speed može biti atribut pristupljen nad objektom a_vehicle, ili se može izračunati preko funkcijek koja deli udaljenost vremenom. Izraz je isti kod obe klase, tako da je lako promeniti implementaciju klase bez uticaja na softver klijenta.
  • Princip razdvajanja komande-upita: Upiti ne smeju modifikovati instance. Ovo nije pravilo jezika ali je metodologički princim. Tako u dobro stilu Ajfela, jedan ne nalazi "nađi" funkciju koja menja nešto i vraća rezultat; umesto postoje komande (procedure) da promene objekte, i upiti da preuzmu informacije o objektima, koji proizilaze i pretphodnih promena.

Preopterećenje[uredi | uredi izvor]

Ajfel ne dozovoljava preopterećenje argumenta. Svako ime karakteristike unutar klase uvek mapira specifičnu karakteristiku unutar klase. Jedno ime, unutar jedne klase, znači jedno. Ovaj izbor dizajna pomaže u čitkosti klasa, izbegavajući dvosmislenost pri čemu će rutina biti pokrenuta preko poziva. Takođe pojednostavlja mehanizam jezika; tačnije, ovo čini Ajfelovu mehanizam više nasleđivanja mogućim.[6]

Imena se, naravno, mogu ponovo koristiti u drugim klasama. Na primer karakteristika plus (zajedno sa svojim umetnutim aliasom "+") je definisan u nekoliko klasa: INTEGER, REAL, STRING, itd.

Genericitet[uredi | uredi izvor]

Generička klasa je klasa koja varira u tipovima (npr. LIST [PHONE], lista brojeva telefona; ACCOUNT [G->ACCOUNT_TYPE], dozvoljavajući za  ACCOUNT [SAVINGS] i ACCOUNT [CHECKING], itd.). Klase mogu biti generične, da izraze da su parametrizovane preko tipova. Generički parametri se pokazuju u kockastim zagradama: 

class LIST [G] ...

G je poznat kao "formalni generički parametar". (Ajfel rezerviše "argument" za rutine, i koristi "parametar" samo za generičke klase.). Sa ovakvom deklaracijom G reprezentuje unutar klase proizvoljan tip; tako da funkcija može vratiti vrednost tipa G, i rutina može uzeti argument tog tipa: 

item: G do ... end
put (x: G) do ... end

 LIST [INTEGER] i LIST [WORD] su "generičke derivacije" ove klase. Dozvoljene kombinacije (sa n: INTEGER, w: WORD, il: LIST [INTEGER], wl: LIST [WORD]) su

n := il.item
wl.put (w)

INTEGER iWORD su "stvarni generički paramteri" u ovim generičkim derivacijama. Moguće je takođe imati "ograničene" formalne parametre, za koje stvarni parametri moja nasleđivati iz date klase, "ograničen". Na primer u 

   class HASH_TABLE [G, KEY -> HASHABLE]

derivacija HASH_TABLE [INTEGER, STRING]je tačna samo akoSTRING nasleđuje od HASHABLE (kao što zaista radi u tipičnim Ajfelovim bibliotekama). Unutar klase, imajući KEY ograničen preko HASHABLE znači da za  x: KEY je moguće primeniti na x sve karakteristikeHASHABLE, kao u x.hash_code.

Osnove nasleđivanja[uredi | uredi izvor]

Da bi se nasleđivalo iz jedne ili više drugih, klasa će uključivati inherit klauzulu na početku:

class C inherit
   A
   B

-- ... Остатак декларације класе ...

Klasa može redefinisati (poništenje) neke ili sve karakteristike nasleđivanja. Ovo mora biti eksplicitno objavljeno na početku klase kroz redefinepodklauzulu klauzule nasleđivanja, kao u 

class C inherit
    A
        redefine f, g, h end
    B
        redefine u, v end

Videti [7] za kompletnu diskusiju o Ajfelovom nasleđivanju.

Odložene klase i karakteristike[uredi | uredi izvor]

Klase mogu biti definisane sa deferred class pre nego sa class da pokazuju da ne moraju direktno da instanciraju. Ne-instancirajuće klase se nazivaju apstraktnim klasama u nekim objektno-orijentisanim programskim jezicima. U Ajfelovom načinu govora, samo "efektivne" klase mogu biti instancirane (može biti potomak odložene klase). Karakteristika može biti takođe odložena korišćenjem deferred ključne reči umesto do klauzule. Ako klasa ima bilo koje odložene karakteristike mora biti deklarisane kao odložene; međutim, klasa bez odloženih karakteristika može sama od sebe biti odložena.

Odložene klase igraju jednu od istih uloga kao sučelja u jezicima kao što su Java, iako mnogi objektno-orijentisani programski teoretičari veruju da su sučelja sama od sebe odgovori za Javin nedostatak višestrukog nasleđivanja (koji Ajfel ima) .[8][9][10]

Preimenovanje[uredi | uredi izvor]

Klasa koja nasleđuje od jedne ili više drugih dobija sve njene karakteristike, po difoltu pod njihovim originalnim imenima. Mogu, međutim, promeniti njihova imena kroz rename klauzulu. Ovo se zahteva u slučaju višestrukih nasleđivanja ako postoje sukobi imena između karakteristika nasleđivanja; bez preimenovanja, rezultujuća klasa bi prekršila princip ne-preopterećenja što je gore navedeno i stoga će biti nevažeći. 

Torke[uredi | uredi izvor]

Tipovi torki se mogu videti kao jednostavne forme klase, pružajući samo atribute i odgovarajuće "postavljač" procedure. Tipičan tip torki čita 

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

i može se koristiti da opiše jednostavan pojam podatka rođenja ako je klasa bez potrebna. Takva instanca torke je jednostavna sekvenca vrednosti sa datim tipovima, datim u zagradama, kao ovo

   ["Brigitte", 3.5, Last_night]

Komponentama ovakve torke može se pristupiti ako bi tagovi torki bili atributi klase, na primer ako je  t dodeljena torka iznad onda t.weight ima vrednost 3.5. Zahvaljujući pojmu komande dodele (videti ispod), pojam tačke se takođe može koristiti za dodelu komponenti kao što je torka, kao u

   t.weight := t.weight + 0.5

Tagovi torki su opcionalni, tako da je takođe moguće napisati tip torki kaoTUPLE [STRING, REAL, DATE]. (U nekim kompilatorima ovo je jedina forma torki, pošto su tagovi predstavljeni sa ECMA standardom.)

Precizna specifikacija primera TUPLE [A, B, C] je da on opisuje sekvence najmanje tri elementa, prva tri su tipa A, B, C redom. Kao rezultat TUPLE [A, B, C] u skladu sa (može biti dodeljen) TUPLE [A, B],  TUPLE [A] i TUPLE (bez parametara), top tip torki kome svi tipovi torki odgovaraju. 

Agenti[uredi | uredi izvor]

Ajfelov "agent" mehanizam pakuje operacije u objekte. Ovaj mehanizam može biti korišćen za iteraciju, dogođaj-pogon programiranje, i ostali konteksi u kojima je korisno proći operacije oko strukture programa. Ostali programski jezici, specijalno oni koji naglašavaju funkcionalno programiranje, dozovoljavaju slični šablon koristeći nastavke, zatvarače, ili generatore; Ajfelovi agenti naglašavaju objektno-orijentisanu paradigmu, i koriste sintaksu i semantiku sličnu blokovima koda u Smalltalk i Rubi.  

Na primer, za izvršavanje my_action bloka za svaki element my_list, jedan bi pisao:

   my_list.do_all (agent my_action)

Da bi se izvršila my_actionsamo na elementima koji zadovoljavaju my_condition, ograničenje/filter može biti dodat:

   my_list.do_if (agent my_action, agent my_condition)

U ovim primerima, my_action i my_condition su rutine. Fiksiranjem sa agent predaje objekat koji predstavlja odgovarajuću rutinu sa svih njenim osobinama, a naročito sposobnost da bude pozvana sa dobrim argumentima. Tako ako a predstavlja taj objekat (na primer zato što je a argument za do_all), instrukcija

   a.call ([x])

će pozvati originalnu rutinu sa argumentom x, kao da smo imali direktno pozvanu originalnu rutinu: my_action (x). Argumenti za call su prošli kao torke, ovde [x]. Moguće je zadržati neke argumente za agenta otvorene i ostale zatvorene. Otvoreni argumenti prolaze kao argumenti za call: oni su obezbeđeni u trenutku vremena korišćenja agenta. Zatvoreni agenti su obezbeđeni u trenutku definicije agenta. Na primer, ako action2 ima dva argumenta, iteracija

   my_list.do_all (agent action2 (?, y))

iterira action2 (x, y) za uspešne vrednosti x, gde drugi argumenti ostali su u grupi y. Znak pitanja ? pokazuje otvoreni argument; y je zatvoreni argument agenta. Imati na umu da klasična sintaksaagent f is je skraćenica od agent f (?, ?, ...) sa svim otvorenim argumentima. Takođe je moguće napraviti metu otvorenog agenta kroz pojam {T}? gde jeT tip mete.

Razlika imeđu otvorenih i zatvorenih operandi (operande= argumenti + meta) odgovara razlici između granice i besplatnih varijabli u lambda kalkulusu. Ekspresija agenata kao što je action2 (?, y) sa nekim operandima zatvorenim i neki otvorenim odgovorima verziji originalnih operacija nad nekim zatvorenim operandima.

Mehanizam agenta takođe dozvoljava definisanje agenta bez reference postojeće rutine (kao što je my_action, my_condition, action2), kroz reda agenta kao u

my_list.do_all (agent (s: STRING)
     require
         not_void: s /= Void
     do
         s.append_character (',')
     ensure
         appended: s.count = old s.count + 1
     end)

U redu agenta koji je prošao može imati sva svojstva normalne rutine, uključujući preduslov, postuslov, klauzulu spasa (ne koristi se ovde), i pun potpis. Ovime se izbegava definisanje rutina kada je sve što je potrebno da računanje bude ubačeno u agenta. Ovo je korisno u posebni slučajevima za ugovore, kao u klauzuli invarijante koja prikazuje da su svi elementi liste pozitivni: 

   my_list.for_all (agent (x: INTEGER): BOOLEAN do Result := (x > 0) end)

Trenutni mehanizam agenta daje mogućnost greške pokretanja-vremena (ako rutina sa n argumenata je prošla do agenta očekujući m argumenata sa m<n). Ovo se može izbeći preko provere pokretanja-vremena kroz preduslov valid_arguments call. Nekoliko predloza za čistu statičnu proveri ovog problema je dostupna, uključujući izmenu predloga jezika preko  Ribet et al.[11]

Kada rutine[uredi | uredi izvor]

Rezultat rutine može biti uhvaćen korišćenjem once ključne reči umesto do. Ne-prvi pozivi za rutinu ne zahtevaju dodatno izračunavanje ili alokaciju resursa, ali jednostavno vraćaju prethodno izračunati rezultat. Čest šablon za "kada funkcije" da omoguće deljene objekte; prvi poziv će napraviti objekat, kasnije oni će se vratiti referencu na taj objekat. Tipična šema je: 

shared_object: SOME_TYPE
    once
        create Result.make (args)
             -- Ово креира објекат и враћа референцу њему кроз `Result'.
    end

Vraćeni objekat—Result u primeru—može sama od sebe biti promenljiva, ali njena referenca ostaje ista.

Često "kada rutine" izvrše traženu instalaciju:višestruki pozivi biblioteke mogu uključivati poziv inicijalizacije procedure, ali samo prvi takav poziv će izvršiti tražene akcije. Koristeći šablon inicijalizacije može biti decentralizovan, izbegavajući potrebu za specijalnom inicijalizacijom modula. "Kada rutine" su slične svrhe i uticaj na jedan uzorak u mnogim programskim jezicima, i za   Borg uzorak korišćen u Pajtonu.

Po difoltu, "kad rutine" su pozvane jednom po niti. Semantike mogu biti prilagođene jednom po procesu ili jednom po objektu kvalifikovanjem preko "kada ključ", npr. . once ("PROCESS").

Konverzije[uredi | uredi izvor]

Ajfel omogućuje mehanizam da dozvoli konverzije između različitih tipova. Mehanizmi postoje zajedno sa nasleđivanjem i dopunjuje se. Da bi se izbegla bilo kakva konfuzija između dva mehanizma, dizajn sprovodi sledeći princiš:  

(Princip konverzije) Tip ne može ibti i u skladi i da se pretvara u drugu.

Na primer NEWSPAPER može se konverzovati uPUBLICATION, aliINTEGER konverzuje u REAL (i ne nasleđuje ga).

Mehanizam konverzije jednostavno generalizuje u pravila konverzije (kao naravno između INTEGER i REAL)koji postoji u većini programskih jezika, čineći ih primenljivim za bilo koji tip sve dok je gornji princip posmatran. Na primerDATE može biti deklarisana da se konvertuje u STRING; ovime je moguće napraviti string od datuma jednostavno kroz

   my_string := my_date

kao prečica za korišćenje eksplicitnog objekta kreacije sa procedurom konverzije:

   create my_string.make_from_date (my_date)

Kako bi omogućili prvu formu mogućom kao sinonim za drugu, ona je suficit liste kreacije procedure (konstruktor) make_from_date uconvert klauzulu na početku klase. Kao još jedan primer, ako postoji ovakva konverzija procedure navedena izTUPLE [day: INTEGER; month: STRING; year: INTEGER], onda jedan može direktno dodeliti torku datumu, prouzrokovajući pristojnu konverziju, kao u

      Bastille_day := [14, "July", 1789]

Obrada izuzetaka[uredi | uredi izvor]

Obrada izuzetaka u Ajfeli je bazirana na principima dizajna preko ugovora. Na primer, izuzetak se podiže kada pozivač rutine zadovoljava preduslov, ili kada rutina ne može osigurati obećani postuslov. U Ajfelu, obrada izuzetaka nije korišćena za upravljanje tokom ili za ispravljanje grešaka unosa podataka.

Kontroler Ajfelovih izuzetaka je definisan koristeći rescue ključnu reč. Unutar rescue sekcije,  retry ključna reč izvršava rutinu ponovo. Na primer, sledeća rutina prati broj pokušaja pri izvršenju rutine, i samo se ponavlja određeni broj puta:

connect_to_server (server: SOCKET)
      -- Конектује се на сервер или се предаје после 10 покушаја.
    require
        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

Ovaj primer je verovatno pogrešan za bilo šta osim jednostavnih programa, međutim, problem sa konekcijom se očekuje. Za većinu programa ime rutineattempt_connecting_to_server bi bilo bolje, i postuslob ne bi obećao konekciju, ostavljajući pozivaču da preuzme prikladne koreka ako konekcija nije otvorena.

Konkurencija[uredi | uredi izvor]

Broj umrežavanja i niti biblioteka je dostupan, kao što je AjvelMreža i AjfelNiti. Model konkurencije za Ajfel, baziran na konceptima dizajna preko ugovora, je SCOOP, ili Jednostavno konkuretno objektno-orijentisano programiranje, nije još deo oficijelne definicije jezika ali je dostupan u AjfelStudiju. CAMEO[12] je (neimplementovana)varijacija SKOOP-a za Ajfel. Konkurencija takođe interaguje sa izuzetcima. Asinhroni izuzeci mogu biti problematični (gde rutina podiže izuzetak pošto je završio pozivač svoje).[13]

Operator i nosač sintakse, dodeljivač komandi[uredi | uredi izvor]

Ajfelov pogled na računanje je komplentno u smislu objektne-orijentacije da je svaka operacija povezana za ovjekat, "metu". Za primer adicije kao što je

a + b

je koncepcijski razumljivo kao da je poziv metode

a.plus (b)

sa metom a, karakteristika plus i argument b. Naravno, bivši je koncencionalna sintaksa i obično se preferira. Operator sintakse ga čini mogućim za korišćenje forme deklarisanjem karakteristike (na primer u  INTEGER, ali ovo se odnosi na ostale klasične klase i može se koristiti u bilo kom drugom sa ovakvo prikladnom operacijom):

plus alias "+" (other: INTEGER): INTEGER
        -- ... Нормална декларација функције...
    end

Opseg operatora se može koristiti kao "alias" je prilično širok; oni uključuju predefinisane operatore kao što je "+"ali takođe "besplatne operatore"napravljeni od alfanumeričkih simbola. Ovo čini mogućim za dizajn specijalnih infiksih i prefiksnih pojmova, na primer u matematici i aplikacija fizike.  Svaka klasa može u adiciji imati jednu funkciju alijasovanom preko "[]", "držač" operator, dozvoljavajući pojama [i, ...] kao sinonim za a.f (i, ...) gde je f izabrana funkcija. Ovo je posebno korisno za kolekcije struktura kao što su nizovi, liste, itd. Na primer pristup elementu haš tabele sa string ključevima može biti zapisan

   number := phone_book ["JILL SMITH"]

"Komande dodeljivača" su mehanizmi pratioca dizajnirani u istom duhu dopuštajući, praktične pojmove ponovo uvedene u okviru objektno-orijentisanog programiranja. Komande dodeljivača dozvoljavaju dodeljivanje-kao sintakse da bi se pozvale procedure "postavljača". Pravilno odstupanje nikada ne može biti u obliku a.x := v pošto ovo krši sakrivanje informaciju; mora se ići za komandu postavljača (procedura). Na primer klasa heš tabela može imati funkciju i proceduru

item alias "[]" (key: STRING): ELEMENT [3]
      -- Елемент кључа `key'.
      -- ("Getter" упиз)
    do
        ...
    end

put (e: ELEMENT; key: STRING)
      -- Унети елемент `e', удруживањем са кључем `key'.
      -- ("Setter" команда)
    do
        ...
    end

Onda da bi se ubacio element mora se koristiti eksplicitan poziv kod komande postavljača:

   [4] phone_book.put (New_person, "JILL SMITH")

Moguće je napisati ovo ekvivalentno sa

   [5] phone_book ["JILL SMITH"] := New_person

(na isti način kao što je phone_book ["JILL SMITH"] sinonim zanumber := phone_book.item ("JILL SMITH")), pruža deklaraciju item koji sada počinje (zamena za [3]) sa

   item alias "[]" (key: STRING): ELEMENT assign put

Ovo deklariše put kao komandu dodeljivača povezanim sa  item i, u kombinaciji sa nosačem alijasa, čini [5] legalnim i jednakim [4]. (Može takođe biti zapisano, bez uzimanja koristi nosača, kao phone_book.item ("JILL SMITH") := New_person.

Napomena: Argument liste dodeljivača je ograničen da bude (kao povratni tip; svi kao argumenti liste...) 

Leksička i sintaksna svojstva[uredi | uredi izvor]

Ajfel nije osetljiv na slučaj. Tokeni make, maKe i MAKE svi označavaju isti identifikator. Videti, međutim,"pravila stila" ispod.

Komentari su predstavljeni -- (dve uzastopne crte) i nastavljaju se do kraja linije.

Zapeta, kao razdvajač instrukcije, je opcionalna. Većinu vremena zapeta je izostavljena, osim da razdvoji više instrukcija na liniji. Ovo rezultuje manjoj gužvi na stranici programa.

Nema nagomilavanja karakteristika i deklaracija klase. Kao rezultat struktura Ajfelove klase je jednostavna: neki nivio-klasa klauzula (nasleđivanje, invarijanta) i uspešne deklaracije karakteristika, su svi istog nivoa.

Običaj je da se grupiraju karakteristike u odvojene"klauzule karakteristika" za bolju čitkost, sa standardnim setom osnovnih oznaka karakteristika koje se pojavljuju u standardom redosledu, na primer:

class HASH_TABLE [ELEMENT, KEY -> HASHABLE] inherit TABLE [ELEMENT]

    feature -- Иницијализација
         -- ... Декларација команди иницијализације (креција процедура/конструкција) ...

    feature -- Приступ
         -- ... Декларација небуловог типа података упита над објектним стањем нпр. ставка ...

    feature -- Извештај статуса
         -- ... Декларације буловог типа података упита над објектним стањем, нпр. is_empty ...

    feature -- Промена елемента
         -- ... Декларација команди који мењају структуру, нпр. put ...

    -- etc.

end

Za razliku od većine vitičastih nosača programskih jezika, Ajfel pravi jasnu razliku između ekspresija i instrukcija. Ovo je u redu sa principo Komanda-upit odvajanje Ajfelovog metoda .

Stil konvencije[uredi | uredi izvor]

Većina dokumentacije Ajfela koristi karakterističan stil konvencija, dizajniran da sprovede dosledan izgled-i-osećaj. Neke od ovih konvencija pristaju formatu koda same od sebe, i ostali standardima tipografije pružajući Ajfelov kod u formatima i izdanjima gde su ove konvencije moguće. 

Dok je jezik neosetljiv na slučaj, standardi stilova propisuju koričšćenje svih glavnih gradova za imena klasa (LIST), svi niži-slučaji za imena funkcija (make), i početnih glavnih gradova za konstante (Avogadro). Preporučeni stil takođe sugestuje podvlačenje da bi se odvojile komponente višestrukog identifikatora reči,                                            kao u average_temperature.

Specifikacija Ajfela uključuje smernice za prikazivanje teksta softvera u tipset formatima: ključne reči podebljane, korisnički-definisani identifikatori i konstante su pokazane u italics, komentari, operatori i znakovi interpunkcije u,Roman, sa tekstom programa u blue kao sadašnjem članku da bi se razlikovao od teksta objašnjenja. Na primer, "Hello, world" program dat iznad bi bio donet kao u Ajfelovoj dokumentaciji dole:

class
    HELLO_WORLD
create
    make
feature
   make
      do
         print ("Hello, world!")
      end
end

Povezivanje drugih alata i jezika[uredi | uredi izvor]

Ajfel je čist objektno-orijentisan jezik ali daje otvorenu arhitekturu za povezivanje sa "spoljnim" sotftverom u bilo kom drugom programskom jeziku.

Moguće je na primer programirati mašinu - i nivo operacija operativnog-sistema u S. Ajfel pruža jednostavno povezivanje sa S rutinama, uključujući podršku za "u redu S" (pišući telo Ajfelove rutinu u S, tipično za kratke nivoa-mašina operacije).

Iako ne postoji direktna veza između Ajfela i  S, mnogo Ajfelovi kompilatori(Vizuelni Ajfel je jedan izuzetak) izbacuju S izvorni kod kao međujezik,  da se opovrgne S kompilator, za optimizovanje i portabilnost. Kao takvi, oni su primeri transkompilatora. Ajfelov Kompilator tekomp može izvršiti Ajfelov kod direktno (kao interpretator) bez odlazka preko srednjeg S koda koji će biti prosleđen do S kompilatora da bi se održao optimizovani maternji kod. Na .NET, AjfelStudio kompilator direktno generiše CIL(Česti srednji jezik)kod. Pametni Ajfel kompilator takođe može izbaciti Javin bajtkod.

Reference[uredi | uredi izvor]

  1. ^ Cooper 2009, str. 101
  2. ^ Formal Specification Languages: Eiffel, Denotational Semantics, Vienna Development Method, Abstract Machine Notation, Petri Net, General Books, 2010
  3. ^ Meyer, Bertrand (1997). Object-Oriented Software Construction (2nd izd.). Prentice Hall. ISBN 978-0-13-629155-8. 
  4. ^ ECMA International: Standard ECMA-367 —Eiffel: Analysis, Design and Programming Language 2nd edition (June 2006); available online at www.ecma-international.org/publications/standards/Ecma-367.htm
  5. ^ International Organisation for Standardisation: Standard ISO/IEC DIS 25436, available online at [1]
  6. ^ Bertrand Meyer: Overloading vs Object Technology, in Journal of Object-Oriented Programming (JOOP), vol. 14, no. 4, October–November 2001, available online
  7. ^ "9 INHERITANCE".
  8. ^ "Multiple Inheritance and Interfaces".
  9. ^ "Multiple Inheritance Is Not Evil".
  10. ^ Computer insurance  Kernel (computing) .
  11. ^ Philippe Ribet, Cyril Adrian, Olivier Zendra, Dominique Colnet: Conformance of agents in the Eiffel language, in Journal of Object Technology, vol. 3, no. 4, April 2004, Special issue: TOOLS USA (2003). str. 125-143.
  12. ^ Brooke, Phillip; Richard Paige (2008).
  13. ^ Brooke, Phillip; Richard Paige (2007).

Literatura[uredi | uredi izvor]

Spoljašnje veze[uredi | uredi izvor]