Eiffel
| Êëàññ ÿçûêà: | |
|---|---|
| Ïîÿâèëñÿ â: | |
| Àâòîð(û): |
Bertrand Meyer |
| Òèïèçàöèÿ äàííûõ: | |
| Îñíîâíûå ðåàëèçàöèè: |
EiffelStudio[1], SmartEiffel[2], Visual Eiffel[3], Gobo Eiffel[4], The Eiffel Compiler tecomp[5] |
| Èñïûòàë âëèÿíèå: | |
| Ïîâëèÿë íà: |
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
[ïðàâèòü] Ññûëêè
- http://www.elj.com/
- http://www.cetus-links.org/oo_eiffel.html
- http://www.eiffel.com/
- news://comp.lang.eiffel/
- Äîêóìåíòàöèÿ Ýéôåëü íà ðóññêîì
Äëÿ óëó÷øåíèÿ ýòîé ñòàòüè æåëàòåëüíî?:
|
| Îñíîâíûå ÿçûêè ïðîãðàììèðîâàíèÿ (ñðàâíåíèå IDE èñòîðèÿ õðîíîëîãèÿ) | |
|---|---|
| Èñïîëüçóåìûå â ðàçðàáîòêå |
Àäà APL ßçûê àññåìáëåðà ActionScript ABAP/4 AutoIt AWK Áåéñèê Ñè Êîáîë C++ C# Cω Clarion Clojure ColdFusion Common Lisp D dBase Delphi Eiffel Erlang Euphoria F# Ôîðò Ôîðòðàí Gambas Go Groovy HAL/S Haskell Icon Java JavaScript Limbo Lua Object Pascal Objective-C OCaml Oz Parser Ïàñêàëü Perl PHP PowerBASIC Python ÏË/1 Ïðîëîã Ruby Scala Scheme Smalltalk SQL PL/SQL Tcl Vala Visual Basic (.NET) |
| Àêàäåìè÷åñêèå | |
| IEC 61131-3 | |
| Ïðî÷èå | |
| Ýçîòåðè÷åñêèå | |
| Âèçóàëüíûå | |
| Ñòàíäàðòû Ecma International | |
|---|---|