лекции (2008) (by Kravets) (укороченное) (1160827), страница 19
Текст из файла (страница 19)
Òî åñòü íåîáõîäèìî äóáëèðîâàòü êîíòåêñò.Ñîâåðøåííîé äðóãàÿ ñèòóàöèÿ ïðè ðàçäåëüíîé çàâèñèìîé òðàíñëÿöèè.  ýòîì ñëó÷àå êîìïèëÿòîð íåòîëüêî âûäàåò îáúåêòíûé êîä, íî è êëàäåò íåêîòîðûå äàííûå â òðàíñëÿöèîííóþ áèáëèîòåêó.Òàêèì îáðàçîì, òî ÷òî ñîñòàâëÿåò îáúåêòíûé ìîäóëü - ýòî ïðîãðàììíàÿ áèáëèîòåêà, à òðàíñëÿöèîííàÿáèáëèîòåêà - ýòî íåêîòîðûé àíàëîã òàáëèöû èìåí.Òî åñòü äàæå åñëè ïðèñóòñòâóåò åäèíàÿ áèáëèîòåêà, òî îíà âñå ðàâíî îáû÷íî äåëèòñÿ íà 2 ÷àñòè - òðàíñëÿöèîííóþ è ïðîãðàììíóþ áèáëèîòåêó. ïî÷òè âñåõ ñîâðåìåííûõ ßÏ (C#, Delphi, Java) èñïîëüçóåòñÿ èìåííî òàêîé âàðèàíò, òî åñòü èìååòñÿòåíäåíöèÿ ê îáúåäèíåíèþ òðàíñëÿöèîííîé è ïðîãðàììíîé áèáëèîòåêè.
Äëÿ ýòèõ ÿçûêîâ õàðàêòåðíî ïîíÿòèåðåôëåêñèè - ïîëó÷åíèå èíôîðìàöèè î òèïå íà ýòàïå âûïîëíåíèÿ. Íàïðèìåð, ïîëó÷åíèÿ òèïà ïåðåìåííîé ïîåå èìåíè, òî åñòü ïî÷òè âåñü èñõîäíûé êîä íàõîäèò îòðàæåíèå â ðåçóëüòèðóþùåì îáúåêòíîì ôàéëå.Ïðè íåçàâèñèìîé ðàçäåëüíîé òðàíñëÿöèè âîçìîæíî áîëüøîå ÷èñëî îøèáîê, ïîðîæäàåìûõ ìåæìîäóëüíûìè ñâÿçÿìè.
 Ñ/Ñ++ òðåáóåòñÿ äóáëèðîâàíèå êîäà, ÷òî ìîæåò ïîðîæäàòü îøèáêè. Äëÿ óïðîùåíèÿ åùåñîçäàòåëÿìè ÿçûêà áûëà ïðèäóìàíà òåõíèêà íà îñíîâå çàãîëîâî÷íûõ ôàéëîâ, ãäå îïèñûâàþòñÿ extern èìåíà,ïðîòîòèïû ôóíêöèé, òèïû.Òàêèì îáðàçîì, íà Ñ/Ñ++ íå ðåêîìåíäóåòñÿ îïèñûâàòü âíåøíèå èìåíà êàê extern, âìåñòî ýòîãî òðåáóåòñÿâêëþ÷àòü çàãîëîâî÷íûé ôàéë, ãäå îïèñàí äàííûõ ïðîòîòèï.Ïðè ýòîì, åñëè ìîäóëþ òðåáóþòñÿ èìåíà èç íåñêîëüêèõ ìîäóëåé, òî îí äîëæåí âêëþ÷èòü íåñêîëüêîçàãîëîâî÷íûõ ôàéëîâ. Îòñþäà âîçíèêàåò ïðîáëåìà ïîâòîðíîãî âêëþ÷åíèÿ, ÷òî ìîæåò âûçâàòü ïðîáëåìû ñîáúÿâëåíèåì òèïîâ.Òàêèì îáðàçîì, íåîáõîäèìî èñïîëüçîâàòü "ñòðàæ âêëþ÷åíèÿ":# ifndef __M_H__# dene __M_H__....# endif×òî ãàðàíòèðóåò, ÷òî èíôîðìàöèÿ èç äàííîãî ôàéëà áóäåò âêëþ÷åíà òîëüêî 1 ðàç.Òàêèì îáðàçîì îáúåìêîäà, êîòîðûé ïîäàåòñÿ òðàíñëÿòîðó âîçðàñòàåò â 10 - 20 ðàç çà ñ÷åò âêëþ÷åíèÿ çàãîëîâî÷íûõ ôàéëîâ.Òàêàÿ òåõíîëîãèÿ ôàêòè÷åñêè çàèìñòâóåò òî, ÷òî èñïîëüçóþò ïðîãðàììèñòû â áîëåå ðàçâèòûõ ßÏ.Îäíîñòîðîííåå è äâóñòîðîííåå ñâÿçûâàíèå.EK - êëèåíò (èñïîëüçóåò ñ ïîìîùüþ ïðåäëîæåíèÿ èìïîðòà) → EK - ñåðâèñ.Delphi, Modula - 2 - ìîäóëü îïðåäåëåíèÿ è ìîäóëü îïèñàíèÿ.DEFINITION MODULE,IMPLEMENTATION MODULE.Oberon - 2 åäèíûé ìîäóëü. ýòèõ ÿçûêàõ ëîãè÷åñêèé ìîäóëü ñîâïàäàåò ñ åäèíèöåé êîìïèëÿöèè.Uses ïî÷òè ýêâèâàëåíòíî ïðåäëîæåíèþ # include â Ñ.Òàê êàê ýòî èñêëþ÷èòåëüíî äâóñòîðîííÿÿ ñâÿçü, òî ñåðâåð íè÷åãî íå çíàåò î êëèåíòå, áîëåå òîãî, êîëüöåâûåññûëêè çàïðåùåíû.unit M1interfaceuses M2;unit M2interfaceuses M1;Ïðè ýòîì òàêàÿ âåùü àáñîëþòíî êîððåêòíà.unit M1interfaceuses M2;73unit M2interfaceimplementationuses M1;Òàê êàê uses òðåáóåò òðàíñëÿöèè òîëüêî èíòåðôåéñà.
Òî åñò ÿâíî âèäíî ÷òî ó êàæäîãî ìîäóëÿ èìååòñÿ2 åäèíèöû òðàíñëÿöèè - èíòåðôåéñ è îïðåäåëåíèå, ïðè÷åì îíè ìîãóò äàæå òðàíñëèðîâàòüñÿ ðàçäåëüíî äðóãîò äðóãà.Òàêèì îáðàçîâ îñíîâíîé ñîñòàâ áèáëèîòåêè - íåçàâèñèìûå áèáëèîòåêè îáùåãî íàçíà÷åíèÿ. Ïðè ýòîì âîçíèêàåò îãðîìíûé ñïèñîê uses (äî 2 - 3 ñòðî÷åê).Ðàññìîòðèì ÿçûê Àäà- îäíîñòîðîííå ñâÿçè- äâóñòîðîííèå ñâÿçèÀäà ïîääåðæèâàåò äâà âèäà òðàíñëÿöèè, òî åñòü ìîæíî òðàíñëèðîâàòü âñå öåëèêîì, à ìîæíî ïî ÷àñòÿì.Åñòü 2 âèäà ìîäóëåé - ïåðâè÷íûå, êîòîðûé òðåáóþòñÿ äëÿ òðàíñëÿöèè äðóãèõ ìîäóëåé è âòîðè÷íûå, êîòîðûåíóæíû ñàìè ïî ñåáå.
Òàêèì îáðàçîì, ïåðâè÷íûå åäèíèöû êàê áû ñîîáùàþò êîíòåêñò.  êà÷åñòâå ïåðâè÷íîéåäèíèöû ìîæåò, íàïðèìåð âûñòóïàòü ïðîöåäóðà.Âñå ÷òî îïèñàíî â ìîäóëå ñïåöèôèêàöèè ïåðâè÷íîãî ìîäóëÿ ÿâëÿåòñÿ ýêñïîðòîì.óêàçàíèå êîíòåêñòàWITH ñïèñîê_ïåðâè÷íûõ_ÅÊuse ñïèñîê; {íå îáÿçàòåëåí}òåêñò åäèíèöû êîìïèëÿöèè.Òàêèì îáðàçîì, îäíîñòîðîííåå ñâÿçûâàíèå â ÿçûêå àäà ïðàêòè÷åñêè íå îòëè÷àåòñÿ îò îäíîñòîðîííåãîñâÿçûâàíèå â äðóãèõ ßÏ. Ïðè ýòîì ñïåöèôèêàöèÿ ïàêåòà ìîæåò áûòü ïåðâè÷íûì ëîãè÷åñêèì ìîäóëåì, à åãîîïèñàíèå - âòîðè÷íûì.package outer is....package Iner is....end Inner;procedure P(X: T1; Y:T2);end Outer;Ïåðâè÷íîé åäèíèöåé êîìïèëÿöèè ÿâëÿåòñÿ îïðåäåëåíèå ïàêåòà Outer. Òåëî ïàêåòà ÿâëÿåòñÿ âòîðè÷íîéåäèíèöåé êîìïèëÿöèè.package body Outer ispackage bodu Inner isd separate;procedure P(X:T1;Y:T2) is separate;end Outer;Òàêèì îáðàçîì, ïðîöåäóðà P è âíóòðåííèé ïàêåò îïðåäåëåíû âíå ýòîãî ìîäóëÿ.
Ðàññìîòðèì îñòàâøèåñÿ2 ìîäóëÿ (ñ ïðîöåäóðîé P è ñ âíóòðåííèì ïàêåòîì).WITH Outer;use Outer;package body Inner is....end Inner;{Error.Bad definition}Òåïåðü íàïèøåì ïðàâèëüíûé âàðèàíò.separate Outer.Inner;package body Inner is....end Inner;{Correct.Correct definition}74separate Outerprocedure O(X:T1;Y:T2) is....end P;Óïðàâëåíèå ïðîñòðàíñòâàìè èìåí. ÿçûêå Àäà íåò ïîíÿòèÿ áèáëèîòåêè, òî åñòü íåëüçÿ óêàçàòü ÷òî ýòîò íàáîð ìîäóëåé ÿâëÿåòñÿ åäèíèöåéäèñòðèáóöèè.
Âñå ýòî äåëàåòñÿ âíåøíèìè ñðåäñòâàìè.Ýòà ïðîáëåìà áûëà ðåøåíà â ÿçûêå Java.  Ñ++ åäèíèöåé êîìïèëÿöèè ÿâëÿåòñÿ ôàéë, â êîòîðîì ìîæåòáûòü âñå ÷òî óãîäíî.  Java åäèíèöåé êîìïèëÿöèè òîæå ÿâëÿåòñÿ ôàéë, íî â îòëè÷èè îò Ñ/Ñ++ êàæäûéôàéë äîëæåí ñîäåðæàòü â ñåáå ïåðâûì äåëîì ïðåäëîæåíèå package, óêàçûâàþùåå ê êàêîìó ïàêåòó ïðèíàäëåæèò äàííûé ôàéë.package mine;public class Outer{public static int main (String [] args){//....}}Òàêèì îáðàçîì, ïàêåò ñëóæèò äëÿ óêàçàíèå êîíòåêñòà òðàíñëÿöèè è åäèíèöû äèñòðèáóöèè îäíîâðåìåííî.Import <èìÿ ïàêåòà> äåëàåò âñå èìåíà èç ïàêåòà âèäèìûìè. Áîëåå òîãî, ìîæíî è íå èìïîðòèðîâàòü ïàêåò,åñëè äëÿ äîñòóïà ê èìåíè ýòîãî ïàêåòà ÿâíî çàäàòü ïîëíîå èìÿ ïàêåòà.Áîëåå ìîùíîå ñðåäñòâî ÿçûêà Java - ïðîñòðàíñòâà èìåí.75Ëåêöèÿ 289.12.2008Ïðîñòðàíñòâà èìåí Ñ++ åñòü 2 ñòèëÿ - ñòàðûé ñòèëü (äëÿ ñîâìåñòèìîñòè ñî ñòàðûìè ïðîãðàììàìè) è íîâûé ñòèëü (íàîñíîâå ïðîñòðàíñòâà èìåí).Òî åñòü âîçìîæíî èñïîëüçîâàòü êàê ñòàðûé ñòèëü ïðîãðàììèðîâàíèÿ <stdio.h>, òàê è íîâûé ñòèëüstd::iostream.È Ñ++ è C# ïîääåðæèâàþò âëîæåííîñòü ïðîñòðàíñòâ èìåí.
Ïðè ýòîì â C# ñëåäóþùèå îáúÿâëåíèÿýêâèâàëåíòíûnamespace N{....namespace Ninner{....}}namespace N{}namespace N.Ninner{} Ñ/Ñ++/C# åäèíèöåé êîìïèëÿöèè ÿâëÿåòñÿ ôàéë,íî åäèíèöåé êîíòåêñòà â C# ÿâëÿåòñÿ èìåííî ïðîñòðàíñòâî èìåí.  Ñ++ âñå îñëîæíÿåòñÿ òåì, ÷òî òðåáóåòñÿ âêëþ÷åíèå çàãîëîâî÷íûõ ôàéëîâ.Ïîñëå âêëþ÷åíèÿ çàãîëîâî÷íîãî ôàéëà ê îáúåêòàì èç ïðîñòðàíñòâà èìåí ìîæíî îáðàùàòüñÿ ÷åðåç êâàëèôèêàòîð (óòî÷íåíèå), òî åñòü std::cout ¾ i;  Ñ# íå òðåáóåòñÿ ïîäêëþ÷åíèÿ çàãîëîâî÷íûõ ôàéëîâ, òî åñòüîáðàùåíèå ê îáúåêòàì íåêîòîðîãî ïðîñòðàíñòâà èìåí èäåò ïðîñòî ïî èìåíè ïðîñòðàíñòâà èìåí.System.Windows.Forms.Îòñþäà âîçíèêàåò ïîíÿòèå åäèíèöû äèñòðèáóöèè (ñáîðêè). Ïîõîæàÿ ñèòóàöèÿ â Java (åäèíèöà êîìïèëÿöèè - ôàéë, åäèíèöà äèñòðèáóöèè è êîíòåêñòà - ïàêåò).
Áîëåå òîãî, ïðîñòðàíñòâà èìåí ðåàëüíî âëîæåíû äðóãâ äðóãà, òîãäà êàê ïàêåòû íåò. Òî åñòü èåðàðõè÷åñêèé ïîèñê èìåíè ïðîèçâîäèòñÿ òîëüêî â ñëó÷àå ïðîñòðàíñòâà èìåí.Åñëè ìû èìïîðòèðóåì ïàêåò â Java (import P1.* èëè import P1.x).  java ïîÿâèëñÿ ñòàòè÷åñêèé èìïîðò(static import Math.*) ÷òî ïîçâîëÿåò îáðàùàòüñÿ ê ÷ëåíàì äàííîãî ïàêåòà áåç ÿâíîãî óêàçàíèÿ åãî èìåíè. Òîåñòüx = exp (i);Âñå ïðîñòðàíñòâà èìåí îòêðûòû ñíèçó, òî åñòü ê íèì ìîæíî äîáàâëÿòü êîíòåêñò.  C# òàê æå ìîæíîñäåëàòü èìåíà èç ïðîñòðàíñòâà èìåí âèäèìûìè áåç óòî÷íåíèÿ.using Sistem.Windows.FormsÏðè÷åì èìåíà èç òåêóùåãî ïðîñòðàíñòâà èìåí ïåðåêðûâàþò èìåíà èç èìïîðòèðóåìûõ ïðîñòðàíñòâ èìåí.Åñëè æå 2 èìïîðòèðóåìûõ èìåíè êîíôëèêòóþò, òî èìÿ ñòàíîâèòñÿ íåâèäèìûì.Òàêæå ïîÿâëÿåòñÿ êâàëèôèêàòîð äîñòóïà äëÿ êëàññà â ïðîñòðàíñòâå èìåí.namespace N1{class X;};namespace N2{class Y;};N1::X a;N2::Y b;f (a, b);Äàæå åñëè íåò äèðåêòèâû using (îíà íå ðåêîìåíäóåòñÿ), òî âîïðîñ â òîì, ãäå èñêàòü ôóíêöèþ f - N1èëè N2.Åñëè f íå íàéäåíà â òåêóùåì ïðîñòðàíñòâå èìåí, òî ïîèñê áóäåò ïðîäîëæåí è â ïðîñòðàíñòâàõ èìåíàðãóìåíòîâ, åñëè áóäåò íàéäåí íå îäèí âàðèàíò ôóíêöèè f, òî áóäåò âûäàíà îøèáêà.Òàêîå ïðàâèëî äëÿ èìåí ôóíêöèé òðåáóåòñÿ äëÿ òîãî, ÷òîáû ñòàëî âîçìîæíûì ïåðåêðûòèå èìåí èìåíñòàíäàðòíûõ îïåðàöèé.76Îáúåêòíî - îðèåíòèðîâàííûå ÿçûêè ïðîãðàììèðîâàíèÿ.Âûäåëÿþò ÎÎßÏ è ïðîñòî îáúåêòíûå.
ÎÎßÏ äîëæíû ïîääåðæèâàòü 3 ñâîéñòâà - èíêàïñóëÿöèþ, íàñëåäîâàíèÿ è äèíàìè÷åñêèé ïîëèìîðôèçì.ÍàñëåäîâàíèåÁàçîâûé êëàññ → ïðîèçâîäíûé êëàññ. Ïðîèçâîäíûé êëàññ íàñëåäóåò âñå äàííûå áàçîâîãî êëàññà. C#, Java,DelphiÑ++, Oberon, Aga 95Ñ òî÷êè çðåíèÿ íàñëåäîâàíèÿ, ó ÿçûêîâ ïåðâîé ãðóïïû âñÿ èåðàðõèÿ íàñëåäîâàíèÿ íà÷èíàåòñÿ ñ êëàññàObject, òî åñòü âñå îáúåêòû òàê èëè èíà÷å èìåþò êëàññ Object â êà÷åñòâå áàçîâîãî. ÿçûêàõ âòîðîé ãðóïïû ëþáîé êëàññ ìîæåò ñòàòü êîðíåì äåðåâà íàñëåäîâàíèÿ.C++:class Derived: public Base{îáúåêòû íîâûõ ÷ëåíîâ.};Ïðè ýòîì Ñ++ åäèíñòâåííûé ßÏ, êîòîðûé ïîääåðæèâàåò ìîäèôèêàöèþ ïðàâ äîñòóïà. Ïðèâàòíîå íàñëåäîâàíèå íàèáîëåå ÷àñòî èñïîëüçóåòñÿ ïðè ðåàëèçàöèè èíòåðôåéñîâ.C#:class Derived: Base{îáúåêòû íîâûõ ÷ëåíîâ.};Ìîäèôèêàòîð äîñòóïà çàïðåùåí.
 C# çàïðåùåíî ìíîæåñòâåííîå íàñëåäîâàíèå, íî ìîæíî íàñëåäîâàòü ìíîæåñòâî èíòåðôåéñîâ. Íàñòîÿùåå ìíîæåñòâåííîå íàñëåäîâàíèå ðåàëèçîâàíî òîëüêî â Ñ++ (èç òåõ ßÏ, êîòîðûå ðàññìàòðèâàþòñÿ â êóðñå)Java:class Derived extends Base implements i1, i2{îáúåêòû íîâûõ ÷ëåíîâ.};Ïðè ýòîì, åñëè íå óêàçàí áàçîâûé êëàññ, òî â C# è Java êëàññ ñòàíîâèòñÿ ïîòîìêîì êëàññà Object.Delphi:class Derived class (Base);Oberon:TYPE BASE = RECORDEND;TYPE DERIVED = RECORD (BASE)END;ßçûê Àäà.type base is tagged record....end;type Derived is new Base with record....end;type Derived is new Base with null record;Âòîðàÿ çàïèñü - åñëè íå òðåáóåòñÿ äîáàâëÿòü íîâûå ÷ëåíû äàííûõ.Âñå ÿçûêè ïîçâîëÿþò ëèíåéíî ðàñïðåäåëÿòü ïàìÿòü,èñêëþ÷åíèå - smalltalk.
Òàì îáúåêò ïîäêëàññà ìîæåòáûòü îòäåëåí îò ÷àñòè ñóïåðêëàññà. Òàêèì îáðàçîì, ïîÿâëÿåòñÿ âîçìîæíîñòü âàðüèðîâàòü íàáîð ìåòîäîâ âûïîëíåíèÿ âî âðåìÿ âûïîëíåíèÿ. Ýòî äàåò ÿçûêó îãðîìíóþ ãèáêîñòü, íî ñèëüíî çàìåäëÿåò ðàáîòó ïðîãðàììû,òàê êàê ïðè êàæäîì îáðàùåíèè ê ìåòîäó êëàññà òðåáóåòñÿ ïîèñê ïî âñåé öåïî÷êå íàñëåäîâàíèÿ.77òè.Òàêèì îáðàçîì, âñå ÿçûêè ïðîìûøëåííîãî ïðîãðàììèðîâàíèÿ ðåàëèçóþò ëèíåéíîå ðàñïðåäåëåíèå ïàìÿ-Âñå ôóíêöèè êëàññà ñóùåñòâóþò â åäèíñòâåííîì ýêçåìïëÿðå. Ïðè íàñëåäîâàíèè êàæäûé êëàññ - ñâîÿîáëàñòü äåéñòâèÿ, òî åñòüclass X{void f();};class Y:public X{int f;};Òî åñòü â êëàññàõ X è Y èìåíà ìîãóò ñîâïàäàòü.