ñòàòüèGNU Free Documentation License ìàòåðèàëû âçÿòû èç Âèêèïåäèè Ñòàòüÿ áûëà èçìåíåíà. Îðèãèíàë ñòàòüè.

Eiffel

Ìàòåðèàë èç Ýíöèêëîïåäèè â ñâîáîäíîé ýíöèêëîïåäèè
Ïåðåéòè ê: íàâèãàöèÿ, ïîèñê
Eiffel
Êëàññ ÿçûêà:

îáúåêòíî-îðèåíòèðîâàííûé

Ïîÿâèëñÿ â:

1986

Àâòîð(û):

Bertrand Meyer

Òèïèçàöèÿ äàííûõ:

ñòðîãàÿ, ñòàòè÷åñêàÿ

Îñíîâíûå ðåàëèçàöèè:

EiffelStudio[1], SmartEiffel[2], Visual Eiffel[3], Gobo Eiffel[4], The Eiffel Compiler tecomp[5]

Èñïûòàë âëèÿíèå:

Ada, Algol-60, Simula, Z

Ïîâëèÿë íà:

C#, D, Delphi, Java, Lisaac, Ruby, Sather

Eiffel (Ýéôåëü) â îáúåêòíî-îðèåíòèðîâàííûé ÿçûê ïðîãðàììèðîâàíèÿ ñ àëãîëîïîäîáíûì ñèíòàêñèñîì, ðàçðàáîòàííûé Áåðòðàíîì Ìåéåðîì. Â ýòîì ÿçûêå âïåðâûå áûë ðåàëèçîâàí ìåòîä êîíòðàêòíîãî ïðîãðàììèðîâàíèÿ.

Ñóùåñòâóþò êîìïèëÿòîðû Ýéôåëÿ äëÿ Windows, DOS, OS/2 è UNIX. Áîëüøèíñòâî ðåàëèçàöèé Eiffel ãåíåðèðóåò êîä Ñè, òî åñòü ÿâëÿþòñÿ ñâîåîáðàçíûì ïðåïðîöåññîðîì. Äàëåå ýòîò êîä êîìïèëèðóåòñÿ ñ ïîìîùüþ êîìïèëÿòîðà Ñè. Îäíàêî åñòü ñèñòåìû, êîòîðûå ïîðîæäàþò è íåïîñðåäñòâåííî ìàøèííûé êîä. Íàïðèìåð, Visual Eiffel.[3]

Ñîäåðæàíèå

[ïðàâèòü] Êëþ÷åâûå îñîáåííîñòè

  • Îáúåêòíî-îðèåíòèðîâàííàÿ ïðîãðàììíàÿ ñòðóêòóðà, â êîòîðîé êëàññ âûñòóïàåò â êà÷åñòâå îñíîâíîé åäèíèöû äåêîìïîçèöèè.
  • Äèçàéí ïî êîíòðàêòó òåñíî èíòåãðèðîâàí ñ äðóãèìè ÿçûêîâûìè êîíñòðóêöèÿìè.
  • Àâòîìàòè÷åñêîå óïðàâëåíèå ïàìÿòüþ, êàê ïðàâèëî, îñóùåñòâëÿåòñÿ â ïðîöåññå ñáîðêè ìóñîðà.
  • Íàñëåäîâàíèå, â òîì ÷èñëå ìíîæåñòâåííîå íàñëåäîâàíèå, ïåðåèìåíîâàíèå, ïåðåîïðåäåëåíèÿ, êîíñòðóêöèÿ select («âûáîð»), íàñëåäîâàíèå áåç ïîëèìîðôèçìà, è äðóãèå ìåõàíèçìû, ïðèçâàííûå ñäåëàòü íàñëåäîâàíèå áåçîïàñíûì.
  • Îãðàíè÷åííîå è íåîãðàíè÷åííîå îáîáù¸ííîå ïðîãðàììèðîâàíèå.
  • Åäèíàÿ ñèñòåìà òèïîâ, èñïîëüçóþùàÿ ìåõàíèçìû êàê çíà÷àùèõ, òàê è ññûëî÷íûõ òèïîâ äàííûõ, â êîòîðûõ âñå òèïû, âêëþ÷àÿ áàçîâûå, íàïðèìåð, INTEGER, ÿâëÿþòñÿ êëàññàìè.
  • Òèïî-áåçîïàñíîñòü (ñòàòè÷åñêàÿ òèïèçàöèÿ).
  • Ñòàòè÷åñêàÿ çàùèòà îò âûçîâîâ ïî ïóñòîé ññûëêå, èñïîëüçóÿ ìåõàíèçì ïðèêðåïëåíèÿ òèïîâ (àíãë. attached-types mechanism).
  • Àãåíòû â îáúåêòû, ñâîðà÷èâàþùèå âû÷èñëåíèÿ âíóòðè ñåáÿ, â òåñíî ñâÿçàíû ñ ìåõàíèçìàìè çàìûêàíèé è ëÿìáäà-âûðàæåíèé.
  • «Åäèíîðàçîâûå» (àíãë. once) ïðîöåäóðû èëè ïðîöåäóðû âûïîëíÿþùèåñÿ òîëüêî îäèí ðàç, äëÿ ñîâìåñòíîãî èñïîëüçîâàíèÿ îáúåêòà è äåöåíòðàëèçîâàííîé èíèöèàëèçàöèè.
  • Òðàäèöèîííûé ñèíòàêñèñ íà îñíîâå êëþ÷åâûõ ñëîâ ÿçûêîâ Àëãîë è Ïàñêàëü, íî áåç èñïîëüçîâàíèÿ ñåïàðàòîðà (òî÷êà ñ çàïÿòîé â êîíöå èíñòðóêöèè íå ÿâëÿåòñÿ îáÿçàòåëüíîé).
  • Íå÷óâñòâèòåëüíîñòü ê ðåãèñòðó.

[ïðàâèòü] Ïåðåîïðåäåëåíèå îïåðàöèé

Äëÿ ïîäïðîãðàìì äîñòóïåí ñèíòàêñèñ îïåðàöèé. Òî åñòü èíôèêñíûé îïåðàòîð + ÿâëÿåòñÿ ïñåâäîíèìîì äëÿ ìåòîäà plus, à * â äëÿ product:

class INTEGER 
  feature
    â
  feature
    plus alias "+" (other: like Current): like Current
      do â end
 
    product alias "*" (other: like Current): like Current
      do â end
  â
end

Äàííûé ñèíòàêñèñ ÿâëÿåòñÿ ðàçâèòèåì ñïîñîáà ïåðåîïðåäåëåíèÿ îïåðàöèé â ÿçûêå CLU.  îòëè÷èå îò Ñ++ è CLU, Eiffel ïîçâîëÿåò òàêæå îïðåäåëåíèå ñâîáîäíûõ îïåðàöèé, çíàêè êîòîðûõ ìîãóò ñîñòîÿòü èç îäíîãî èëè áîëåå ñèìâîëîâ èç ñëåäóþùåãî íàáîðà

: \ ? = ~ / ! # $ % & * + - / < > @ ^ ` |

ïðè óñëîâèè, ÷òî ýòîò ñèìâîë èëè êîìáèíàöèÿ ñèìâîëîâ íå çàíÿòû â ñèíòàêñèñå Eiffel äëÿ äðóãèõ öåëåé. Âîò ïðèìåðû âîçìîæíûõ ñâîáîäíûõ îïåðàöèé:

!-! @ |> <| -|-> <-|- ==> <== ++

[ïðàâèòü] Hello, world!

Êîðîòêî:

class HELLO 
  create
    make
  feature
    make
      do
        print("Hello World%N")
      end
end

èëè ðàçâ¸ðíóòî, ñîáëþäàÿ ñòèëü íàïèñàíèÿ:

note
   description: "Ïðîãðàììà Çäðàâñòâóé,ìèð!" 
   author: "Elizabeth W.Brown"
class 
  HELLO 
create    
  make
feature
  make
    -- Íàïå÷àòàòü ïðîñòîå ñîîáùåíèå.
    do      
      print ("Hello World%N")
    end
end

[ïðàâèòü] Ïðèìåðû êîäà è îñîáåííîñòè ÿçûêà

Ïðèìåð îáúÿâëåíèÿ êëàññà íà Eiffel:

class ÊÂÀÄÐÀÒ
  inherit ÏÐßÌÎÓÃÎËÜÍÈÊ
    -- ÊÂÀÄÐÀÒ - ïîäêëàññ ÏÐßÌÎÓÃÎËÎÜÍÈÊà
    -- ìîæåò áûòü óêàçàíî áîëåå îäíîãî áëîêà inherit.
    -- äëÿ êàæäîãî ðîäèòåëüñêîãî êëàññà ìîæåò áûòü óêàçàí ñïèñîê íàñëåäóåìûõ ìåòîäîâ.
    -- òàêèì îáðàçîì ðåøàåòñÿ ïðîáëåìà êîíôëèêòîâ ìíîæåñòâåííîãî íàñëåäîâàíèÿ.
  create
    -- ïåðå÷åíü èìåí êîíñòðóêòîðîâ
  feature
    -- ñâîéñòâà, îïèñûâàåìûå çäåñü, ÿâëÿþòñÿ âèäèìûìè äëÿ âñåõ êëèåíòîâ. 
    -- Áîëåå òî÷íî òàêàÿ çàïèñü ýêâèâàëåíòíà çàïèñè feature {ANY} - 
    -- ÷òî îçíà÷àåò, ÷òî ñâîéñòâà, îïðåäåëåííûå â ýòîì ðàçäåëå,
    -- äîñòóïíû êëàññó ANY è âñåì åãî íàñëåäíèêàì. 
    -- À òàê êàê êëàññ ANY ÿâëÿåòñÿ ðîäèòåëåì âñåõ êëàññîâ (èñòîêîì ãðàôà êëàññîâ),
    -- ó êîòîðûõ â ÿâíîì âèäå íå çàäàíû ðîäèòåëüñêèå êëàññû, 
    -- òî ýòî îçíà÷àåò äîñòóïíîñòü äëÿ èñïîëüçîâàíèÿ ëþáûì êëàññîì 
  feature {CHILD}
    -- ñâîéñòâà, îïèñûâàåìûå çäåñü, ÿâëÿþòñÿ äîñòóïíûìè äëÿ èñïîëüçîâàíèÿ äëÿ êëàññà CHILD è åãî íàñëåäíèêîâ
  feature {NONE}
    -- ñâîéñòâà, îïèñûâàåìûå çäåñü, ÿâëÿþòñÿ ñêðûòûìè äëÿ èñïîëüçîâàíèÿ êëèåíòàìè.
    -- Áîëåå òî÷íî äîñòóïíû òîëüêî äëÿ êëàññà NONE, êîòîðûé ÿâëÿåòñÿ ñòîêîì ãðàôà êëàññîâ
end

ãäå ñâîéñòâà â ýòî îáùåå íàçâàíèå ïîëåé äàííûõ è ìåòîäîâ. Òî åñòü àòðèáóòîâ (àíãë. attributes) è ïîäïðîãðàìì (àíãë. routines) â òåðìèíîëîãèè Eiffel. Ïîäïðîãðàììû â ïîäêëàññàõ (êëàññàõ íàñëåäíèêàõ) ìîãóò çàìåùàòü (ïåðåîïðåäåëÿòü) íàñëåäóåìûå òîëüêî ïðè êîíôîðìíîñòè (òî åñòü ñîâïàäåíèè) èõ ñèãíàòóð.

Åù¸ ïðèìåð:

class COMPLEX
  create
    make
  feature
    real_part, imag_part: REAL
  feature
    make(r, i: REAL)
      do
        real_part := r
        imag_part := i
      end
end

Îïèñàíèå ïåðåìåííîé âûãëÿäèò ñõîäíî ñ îïèñàíèåì ïåðåìåííûõ â Ïàñêàëü-ïîäîáíûõ ÿçûêàõ:

èäåíòèôèêàòîð_ïåðåìåííîé: ÒÈÏ

Íàïðèìåð:

 complex_num: COMPLEX

Èíèöèàëèçàöèÿ (ñîçäàíèå) îáúåêòà c âûçîâîì êîíñòðóêòîðà:

 create complex_num.make (2.4, â3.2)

Ðàíåå èñïîëüçîâàëñÿ íåñêîëüêî èíîé ñèíòàêñèñ, ïðè êîòîðîì ñëóæåáíîå ñëîâî create çàìåíÿëîñü íà äâîéíîé âîñêëèöàòåëüíûé çíàê !!:

 !! complex_num.make (2.4, â3.2)

 ÿçûêå Eiffel íåò äåñòðóêòîðîâ, íî åñòü àâòîìàòè÷åñêèé ñáîðùèê ìóñîðà. Êîãäà íà îáúåêò íå îñòàíåòñÿ ññûëîê, îí áóäåò óíè÷òîæåí ñáîðùèêîì ìóñîðà.

ßçûê Eiffel ïîääåðæèâàåò ìíîæåñòâåííîå íàñëåäîâàíèå (íåñêîëüêî ðàçäåëîâ inherit).

Àáñòðàêòíûå êëàññû îïðåäåëÿþòñÿ äîáàâëåíèåì çàðåçåðâèðîâàííîãî ñëîâà deferred («îòëîæåííûé»):

deferred class FIGURE
  -- òåëî êëàññà
end

«Îòëîæåííûå» ñâîéñòâà áóäóò îïðåäåëÿòüñÿ â êëàññàõ íàñëåäíèêàõ. Äëÿ òîãî, ÷òîáû ìîæíî áûëî ñîçäàòü îáúåêò êëàññà, îí íå äîëæåí ñîäåðæàòü íè îäíîãî «îòëîæåííîãî» ñâîéñòâà.

Ñàìûì õàðàêòåðíûì ñâîéñòâîì ÿçûêà Eiffel ÿâëÿþòñÿ âñòðîåííûå óòâåðæäåíèÿ äëÿ ñîçäàíèÿ ïðèíóäèòåëüíîãî êîíòðàêòà ìåæäó âûçûâàþùèì îïåðàòîðîì è âûçûâàåìûì êîäîì ïîäïðîãðàìì (ñì. òàêæå: Ïëàíêàëêþëü).

Âñå îáðàùåíèÿ ê ñâîéñòâàì îáúåêòîâ ïî óìîë÷àíèþ äèíàìè÷åñêèå, õîòÿ êîìïèëÿòîðû ìîãóò ðàçîáðàòüñÿ, ãäå äèíàìè÷åñêîå ñâÿçûâàíèå ìîæåò áûòü çàìåíåíî íà ñòàòè÷åñêîå è åñòåñòâåííî äåëàþò ýòî. Òàêàÿ îñîáåííîñòü ïîçâîëÿåò íå ââîäèòü ïîíÿòèå virtual («âèðòóàëüíûé»). Íàîáîðîò, ââîäèòñÿ ïîíÿòèå frozen («çàìîðîæåííîå»), òî åñòü «íåïåðåîïðåäåëÿåìîå» ñâîéñòâî.

ßçûê ðàçëè÷àåò íà óðîâíå îïèñàíèé äâà âèäà êëàññîâ ññûëî÷íûå è expanded («ñòðóêòóðíûå», «ðàçâ¸ðíóòûå»), ÷òî òàêæå ïðèìåíèìî ê îïèñàíèÿì ïåðåìåííûõ. Ýòî ïîçâîëÿåò ìèíèìèçèðîâàòü ðàçíèöó ìåæäó ññûëêîé íà îáúåêò è ñàìèì îáúåêòîì. Ðàçíèöà ýòà ïðîÿâëÿåòñÿ ïðè ïðèñâàèâàíèè, êîïèðîâàíèè è ñîçäàíèè îáúåêòîâ.

[ïðàâèòü] Ïðè÷èíû ñëàáîãî ðàñïðîñòðàíåíèÿ ÿçûêà

Êîìïèëÿòîðû ñ Eiffel îò àâòîðà ÿçûêà äîðîãè è íå òàê ðàñïðîñòðàíåíû, êàê êîìïèëÿòîðû C/C++, ÷òî, â ñâî¸ âðåìÿ, è îãðàíè÷èëî ðàñïðîñòðàíåíèå ýòîãî ÿçûêà, ñâîáîäíûõ/áåñïëàòíûõ àëüòåðíàòèâ äîëãîå âðåìÿ íå áûëî.

[ïðàâèòü] Ñòèëü îôîðìëåíèÿ ïðîãðàìì

ßçûê Eiffel ñïðîåêòèðîâàí ñ ìàêñèìàëüíûì óêëîíîì â ïðîñòîòó êîíñòðóêöèé ÿçûêà.

Òàê, â í¸ì îïðåäåëåíà ëèøü îäíà êîíñòðóêöèÿ äëÿ öèêëà.

from 
  íà÷àëüíàÿ èíèöèàëèçàöèÿ
until 
  óñëîâèå âûõîäà èç öèêëà
loop
  òåëî öèêëà
end

Ïðè ïðîãðàììèðîâàíèè íà Eiffel õîðîøèì òîíîì ñ÷èòàåòñÿ ïðèäåðæèâàòüñÿ îïðåäåë¸ííûõ ïðàâèë îôîðìëåíèÿ.

Áëàãîäàðÿ ýòîìó, èñõîäíèêè ÷èòàþòñÿ òàê, êàê åñëè áû ýòî áûëà äîêóìåíòàöèÿ. Äîïîëíèòåëüíûì ñòèìóëîì ñîáëþäàòü ïðàâèëà ÿâëÿåòñÿ ñòðîãîñòü ñàìèõ êîìïèëÿòîðîâ ê îôîðìëåíèþ. Ìíîãèå èç íèõ (â ÷àñòíîñòè SmartEiffel[2]) íå ïîçâîëÿþò íåïðàâèëüíî îôîðìëÿòü èñõîäíûå êîäû, íàõîäÿ ìíîãèå îòñòóïëåíèÿ îò ñòèëÿ, âûâîäÿ ïðåäóïðåæäåíèÿ èëè äàæå îòêàçûâàÿñü êîìïèëèðîâàòü.

Âîò íåêîòîðûå ðåêîìåíäàöèè ïî îôîðìëåíèþ èñõîäíûõ òåêñòîâ:

  • ñëóæåáíûå ñëîâà íàáèðàþòñÿ æèðíûì (àêòóàëüíî äëÿ ïå÷àòè è âûâîäà íà ñîâðåìåííûå ìîíèòîðû)
  • âñå èäåíòèôèêàòîðû â êóðñèâîì
  • â îòëè÷èå îò Cè-ïîäîáíûõ ÿçûêîâ, â Eiffel îòðèöàòåëüíî îòíîñÿòñÿ ê ñîêðàùåíèÿì. Âìåñòî drvMngr ïðèíÿòî ïèñàòü driver_manager
  • âñå êëàññû ïèøóòñÿ ïðîïèñíûìè áóêâàìè
class LIST
  • ïåðåìåííûå ïèøóòñÿ ñòðî÷íûìè áóêâàìè
count_of_sheeps: INTEGER
  • êîíñòàíòû âñåãäà íà÷èíàþòñÿ ñ ïðîïèñíîé
Gravity: REAL = 9.81
  • ðåêîìåíäóåòñÿ èñïîëüçîâàòü íåìîíîøèðèííûé øðèôò
  • â íà÷àëå êàæäîãî êëàññà æåëàòåëüíî âñòàâëÿòü èíôîðìàöèþ î í¸ì: êòî íàïèñàë, êîãäà, ôóíêöèîíàëüíîñòü êëàññà. Âñÿ ýòà èíôîðìàöèÿ çàïèñûâàåòñÿ â ñàìîì íà÷àëå ôàéëà ñ êëàññîì.
note
   description: "Îïèñàíèå ýòîãî êëàññà."
   author: "Âàñÿ Ïóïêèí"
class ÊËÀÑÑ
   -- òåëî êëàññà
end
  • ïîñëå íàçâàíèÿ êàæäîé ïðîöåäóðû íà ñëåäóþùåé ñòðîêå æåëàòåëüíî îïèñûâàòü ðåçóëüòàò å¸ äåéñòâèÿ:
feature
   IP: INTEGER
         -- IP àäðåñ ëîêàëüíîé ìàøèíû.
      do
         -- òåëî çàïðîñà
      end
  • îñîáåííîñòüþ Eiffel ÿâëÿåòñÿ íåîáÿçàòåëüíîñòü òî÷êè c çàïÿòîé «;» â êîíöå ñèíòàêñè÷åñêèõ êîíñòðóêöèé.

[ïðàâèòü] Ïðèìå÷àíèÿ

[ïðàâèòü] Ëèòåðàòóðà

  • Bertrand Meyer. Object-Oriented Software Construction. 2nd edition, Prentice Hall, 1997.
  • Bertrand Meyer. Eiffel: The Language
  • Invitation to Eiffel. From ISE.
  • Richard Paige. An Overview of Eiffel
  • Jean-Marc Jezequel. Object-Oriented Software Engineering with Eiffel

[ïðàâèòü] Ññûëêè


Ïðîñòðàíñòâà èì¸í

Âàðèàíòû
Ïðîñìîòðû
Äåéñòâèÿ