лекции (2008) (by Kravets) (укороченное) (1160827), страница 18
Текст из файла (страница 18)
Åñëè âåðíóòüñÿ íàçàä, òî âìåñòîçàïðàøèâàèÿ ðåñóðñîâ ïîâòîðíî ìîæíî ðàññìîòðåòü î÷åðåäü ñëàáûõ ññûëîê è ïîïðîáîâàòü äîñòàòü îáúåêòû.Åñëè îáúåêò íåäîñòóïåí, òî ïðîñòî âåðíåòñÿ null.Èòàê, ìû ïîëó÷àåì ìåõàíèçì êåøèðîâàíèÿ ðåñóðñîâ.66Ïóíêò 4. Äîïîëíèòåëüíûå ïðîáëåìû, ñâÿçàííûå ñ òèïàìè.- êîïèðîâàíèå, ñðàâíåíèå- íåÿâíûå ïðåîáðàçîâàíèÿÏðîáëåìà êîïèðîâàíèÿ è ñðàâíåíèÿ îáúåêòà - ìîãóò îòëè÷àòüñÿ îò ñòàíäàðòíûõ îïåðàöèé êîïèðîâàíèÿèëè ñðàâíåíèÿ. Êàê ñðàâíèâàòü è ìîæíî ëè îãðàíè÷èòüñÿ ïðîñòûì ïî÷ëåííûì êîïèðîâàíèåì. Îòñþäà 2ïîíÿòèÿ - ãëóáîêîå êîïèðîâàíèå è ïîâåðõíîñòíîå êîïèðîâàíèå. Deep copy è shallow copy.Íà âîïðîñ î òîì, êàê èìåííî êîïèðîâàòü ìîæåò îòâåòèòü òîëüêî ïðîãðàììèñò.
 Ñ++ ñòàíäàðòíîå ïîâåðõíîñòíîå êîïèðîâàíèå.  äðóãèõ ÿçûêàõ ñòàíäàðòíîå ïðèñâàèâàíèå - ïîâåðõíîñòíîå êîïèðîâàíèå.  C#è Java åñòü ìåòîäû clone ().  îáîèõ ÿçûêàõ åñòü ñïåöèàëüíûé èíòåðôåéñ Icloneable.Ñ Ñ# â êëàññå Object åñòü ìåòîä MemberwiseClone (), ðåàëèçóþùèé ïîâåðõíîñòíîå ïî÷ëåííîå êîïèðîâàíèå, ÷òîá èçáåæàòü ýòîãî îáúåêò äîëæåí ðåàëèçîâûâàòü èíòåðôåéñ ICloneable, â êîòîðîì äîëæåí áûòü ìåòîäclone ().67Ëåêöèÿ 2527.11.2008Îñíîâíàÿ ïðîáëåìà ïîâåðõíîñòíîãî êîïèðîâàíèÿ - âîçìîæíîñòü ïîáî÷íîãî ýôôåêòà ïðè èçìåíåíèè êîïèèîáúåêòà. Òàêîé ïðîáëåìû â ïðèíöèïå íåò äëÿ òåõ îáúåêòîâ, êîòîðûå ÿâëÿþòñÿ êîíñòàíòíûìè.Ñîâðåìåííûå ßÏ ïîçâîëÿþò ïðîãðàììèñòó ðåøàòü ýòó ïðîáëåìó.
 Ñ++ ïî óìîë÷àíèþ èñïîëüçóåòñÿïîâåðõíîñòíîå êîïèðîâàíèÿ, íî ïðîãðàììèñò ìîæåò ïåðåîïðåäåëèòü êîíñòðóêòîð êîïèðîâàíèÿ. Âñå âîïðîñûêîïèðîâàíèÿ ðåøàþòñÿ òîëüêî íà óðîâíå êëàññà, òàê êàê êîíñòðóêòîð êîïèðîâàíèÿ è îïåðàòîð ïðèñâàèâàíèÿíå íàñëåäóþòñÿ.Íàïðèìåð ïóñòü åñòü êëàññ X, â êîòîðîì ïåðåîïðåäåëåíû îïåðàòîð ïðèñâàèâàíèÿ è êîíñòðóêòîð êîïèðîâàíèÿ.class X{X& operator= (const X&);X (const X&);};class Y:public X{int i;Z z;};Òåïåðü â êëàññå Y âûçûâàþòñÿ êîíñòðóêòîðû ïî óìîë÷àíèþ, åñëè íå áóäåò ÿâíî óêàçàííî âûçâàí êîíñòðóêòîðà, ïè ýòîì äëÿ êëàññà X, òàê êàê òàì íåò êîíñòðóêòîðà ïî óìîë÷àíèþ, òî âîçíèêíåò îøèáêà. Ñ# è Java âñå íåñêîëüêî èíà÷å. Ëþáàÿ îïåðàöèÿ ïðèñâàèâàíèÿ òàì - ïðèñâàèâàíèå ññûëêè. Ïðè ýòîìòàì ïðèñóòñòâóåò îïåðàöèÿ ïîáèòîâîå êîïèðîâàíèå, êîòîðàÿ âñåãäà ÿâëÿåòñÿ protected. Java ïðèñóòñòâóåò îïåðàöèÿ clone(), êîòîðàÿ âîçâðàùàåò êîïèþ îáúåêòà.protected Object clone (); C# åñòü èíòåðôåéñ èíòåðôåéñ Icloneable.
Òî åñòü äëÿ òîãî, ÷òîá ðàçðåøèòü êëîíèðîâàíèå îáúåêòà,òðåáóåòñÿ óíàñëåäîâàòü ýòîò èíòåðôåéñ è îïðåäåëèòü publick Object clone ();Òóò âîçíèêàåò íåñêîëüêî ïðîáëåì, íàïðèìåð åñëè êîëëåêöèÿ ÿâëÿåòñÿ êëîíèðóåìîé, òî äîáàâëåíèå ê íåéëþáîãî íå êëîíèðóåìîãî îáúåêòà äåëàåò åå íå êëîíèðóåìîé.Áîëåå ïðåäïî÷òèòåëüíûì ÿâëÿåòñÿ ïîäõîä ÿçûêà Java. Îí îñíîâàí íà ïîíÿòèè èíòåðôåéñà - ìàðêåðà. Java ýòî èíòåðôåéñ, ó êîòîðîãî âîîáùå íåò íèêàêèõ ìåòîäîâ.  Java åñòü ïîíÿòèå ðåôëåêöèè, òî åñòüâîçìîæíîñòè ïîëó÷åíèÿ èíôîðìàöèè î îáúåêòå íà îñíîâå åãî êîäà. Òàì ïðèñóòñòâóåò èíòåðôåéñ - ìàðêåðIcloneable. Òî åñòü êëàññ, êîòîðûå ðåàëèçóåò òàêîé èíòåðôåéñ, îáÿçóåòñÿ ðåàëèçîâàòü èíòåðôåéñ ãëóáîêîãîêëîíèðîâàíèÿ. Ñ++ åñòü 3 ñòðàòåãèè êëîíèðîâàíèÿ- ãëóáîêîå- ïîâåðõíîñòíîå- ïðèâàòíîå Java åñòü 4 âàðèàíòà.1.êëàññ ðåàëèçóåò èíòåðôåéñ Icloneable, òî åñòü êëàññ äîëæåí ðåàëèçîâàòüPublic Object clone ();Åñëè êëàññ íå ïîääåðæèâàåò ýòîò èíòåðôåéñ, òî åñòü åñëè âûçûâàåòñÿ íåäîïóñòèìàÿ êîíñòðóêöèÿ êîïèðîâàíèÿ, òî âûáðàñûâàåòñÿ èñêëþ÷åíèå.2.
Êëàññ çàïðåùàåò êëîíèðîâàíèå, òî åñòü îí ðåàëèçóåò public ìåòîä clone, êîòîðûé âûáðàñûâàåò èñêëþ÷åíèå cloneNotSupported.3. Óñëîâíàÿ ïîääåðæêà êëîíèðîâàíèÿ. Êëàññ ÿâíî ðåàëèçóåò èíòåðôåéñ Icloneable, íî ìåòîä clone ïîääåðæèâàåò ãëóáîêîå êîïèðîâàíèÿ îáúåêòîâ êëàññ, íî íå ïîä îáúåêòîâ, òî åñòü ïðè ïîïûòêå ãëóáîêîé êîïèèêîïèðîâàíèÿ ïîä îáúåêòà, êîòîðûé íå ïîääåðæèâàåò èíòåðôåéñ Icloneable âûáðàñûâàåòñÿ èñêëþ÷åíèå.4.Íåÿâíàÿ ïîääåðæêà. Êëàññ íå ðåàëèçóåò èíòåðôåéñ, íî ðåàëèçóåò protected Object clone (), êîòîðàÿ âîçâðàùàåò ïîáèòîâóþ êîïèþ, òî åñòü ïîääåðæêà äàåòñÿ òîëüêî ïðîèçâîäíûì êëàññàì.Òàê æå íà Java ìîæíî âûðàçèòü çàïðåò êëîíèðîâàíèÿ êàê íàñëåäîâàíèå îïåðàöèè clone îò êëàññà Object.Îïåðàöèÿ ñðàâíåíèÿ Ñ++ ïî óìîë÷àíèþ ñðàâíèâàòü îáúåêòû íåëüçÿ, äëÿ ñðàâíåíèÿ íåîáõîäèìî ïåðåîïðåäåëÿòü îïåðàöèþñðàâíåíèÿ.68 Java è C#, åñòü ìåòîäûC#: bool Equals (Object);Java: bool equals (Object);Ïóñòü åñòü 2 îáúåêòà, a è ba, b;a.Equals (b)Åñëè b == null, òî ïîëó÷èì false, íî åñòü a - null, òî áóäåò îøèáêà.
Ïîýòîìó ïðèñóòñòâóåò ñòàòè÷åñêàÿôóíêöèÿ ñðàâíåíèÿ îò äâóõ ïàðàìåòðîâ.Äëÿ ñòðîê ïðîáëåìà ñðàâíåíèÿ åùå áîëåå ñëîæíà, òàê êàê òðåáóåòñÿ ñîðòèðîâêà ñòðîê â àëôàâèòíîìïîðÿäêå.69Ëåêöèÿ 262.12.2008Ïåðåãðóçêà îïåðàòîðîâ. Íåÿâíûå ïðåîáðàçîâàíèÿ.int i;double d;d = i;i = d;Âòîðàÿ ñòðî÷êà ýêâèâàëåíòíà i = (int)d;Ïî÷òè âî âñåõ ÿçûêàõ åñòü ðàñøèðÿþùèå íåÿâíûå ïðåîáðàçîâàíèÿ. Ñóæàþùèå òîëüêî â Ñ. Ïðè ýòîìåäèíñòâåííûõ ßÏ â êîòîðîì çàïðåùåíû íåÿâíûå ïðåîáðàçîâàíèÿ - ÿçûê Àäà.Ñîâðåìåííûå ßÏ êàê ïðàâèëî äîïóñêàþò íåÿâíûå ïðåîáðàçîâàíèÿ ìåæäó áàçîâûìè òèïàìè.
Íî âîïðîñ îïîëüçîâàòåëüñêèõ íåÿâíûõ ïðåîáðàçîâàíèÿõ íå ñòîëü î÷åâèäåí. "Ñ ñ êëàññàìè"íå áûëî ïîëüçîâàòåëüñêèõ íåÿâíûõ ïðåîáðàçîâàíèé, íî ïîòîì îíè ïîÿâèëèñü â Ñ++. Delphi è Java çàïðåùåíû ïîëüçîâàòåëüñêèå íåÿâíûå ïðåîáðàçîâàíèÿ.  Ñ++ è C# ìîæíî ïåðåãðóæàòüñòàíäàðòíûå îïåðàöèè, â Delphi è Java - íåò.Íåÿâíûå ïðåîáðàçîâàíèÿËþáîå íåÿâíîå ïðåîáðàçîâàíèå - ýòî ïîòåðÿ èíôîðìàöèè èëè íåíàäåæíîñòü. Áîëåå òîãî, ñåìàíòèêà íåÿâíîãî ïðåîáðàçîâàíèÿ êîìïèëÿòîðà ìîæåò îòëè÷àòüñÿ îò òîé, êîòîðóþ ïðåäïîëàãàë ïîëüçîâàòåëü.A = B × exp(−k × i)/DÍà Fortran òàêîå âûðàæåíèå çàïèñûâàòüñÿ ïðîñòî, êîãäà êàê íà Ñ, òðåáóåòñÿ îïðåäåëèòü âñå îïåðàöèèäëÿ ðàáîòû ñ êîìïëåêñíûìè ÷èñëàìè.A = mult (B, Div (cexp ( mult (-k, i)), D));Ïðè÷åì íà ÿçûêå Ñ ýòà ôîðìóëà íå îòêîìïèëèðóåòñÿ, òàê êàê òðåáóåòñÿ ïðåîáðàçîâàíèå îò integer êcomplex.
Íà Ñ++ òðåáóåòñÿ ëèáî íàïèñàòü ïîëüçîâàòåëüñêèå ïðåîáðàçîâàíèÿ â òèï complex, ëèáî ïåðåãðóçèòüîïåðàöèþ äëÿ âñåõ ÷èñëîâûõ òèïîâ.Òàêèì îáðàçîì, ÿñíî ÷òî áåç íåÿâíûõ ïðåîáðàçîâàíèé òðåáóåòñÿ 162 îïåðàöèé äëÿ âñåõ âîçìîæíûé âàðèàíòîâ âûçîâà Div. Äëÿ ðåøåíèÿ äàííîé ïðîáëåìû â Ñ++ áûë ââåäåí ìåõàíèçì íåÿâíûõ ïðåîáðàçîâàíèé èïîíÿòèå êîíñòðóêòîðà ïðåîáðàçîâàíèÿ.complex(double)Òîãäà îïðåäåëåíèå îïåðàòîðà ìîãëî âûãëÿäåòü òàê.const complex operator+(const complex&, const complex &);Àíàëîãè÷íî äëÿ ñòðîê string (const char *);Äàëåå â Ñ++ ïîÿâèëñÿ îïåðàòîð ïðåîáðàçîâàíèÿ. operator(T)() - îïðåäåëåíèå íåÿâíîãî ïðåîáðàçîâàíèÿèç êëàññà X â òèï T.
Íàïðèìåðoperator(const char*)() constÍî òóò âîçíèêàåò ïðîáëåìàclass Vector{int * body;int size;public:vector (int sz){body = new int [size = sz];}~vector() {...}};//....Vector v(20);v = 3;v = Vector (3);Ïîñëåäíèå äâå ñòðî÷êè ìîãóò áûòü ýêâèâàëåíòíû. Íî òàêàÿ ñåìàíòèêà ðåàëèçóåòñÿ çà ñ÷åò íåÿâíîãîâûçîâà êîíñòðóêòîðà, ÷òî ìîãëî íå îæèäàòüñÿ.
Äëÿ ðåøåíèÿ ýòîé ïðîáëåìû áûëî ââåäåíî êëþ÷åâîå ñëîâîexplisit. C# åñòü è êëþ÷åâîå ñëîâî implisit è explisit, êîòîðûå ìîãóò ñòîÿòü ïåðåä îïðåäåëåíèåì êàæäîãî îïåðàòîðà ïðåîáðàçîâàíèÿ, ïðè÷åì â îòëè÷èè îò Ñ++ ïî óìîë÷àíèþ ïðåîáðàçîâàíèå ÿâíîå.70ßâíîå ïðåîáðàçîâàíèå äîëæíî âûçûâàòüñÿ ïðîãðàììèñòîì ÿâíî.T t; X x;t = x;Òîãäà êîìïèëÿòîð àâòîìàòè÷åñêè âñòàâèò t = x.operator(T)(), åñëè òàêàÿ îïåðàöèÿ îïðåäåëåíà ïðîãðàììèñòîì.Ñîçäàòåëè Delphi è Java îòêàçàëèñü îò íåÿâíûõ ïðåîáðàçîâàíèé âîîáùå, à â C# âñå îïåðàöèè ïðåîáðàçîâàíèÿ - ñòàòè÷åñêèå ôóíêöèè êëàññà.class X{public implisit operator(Y)(X x){...}// X -> YÏðè ýòîì  C# X è Y - òîëüêî ïîëüçîâàòåëüñêèå êëàññû, ôóíêöèÿ äîëæíà áûòü ñòàòè÷åñêîé è áûòü÷ëåíîì êëàññà X èëè Y.Àíàëîãè÷íàÿ ïðîáëåìà ñ ïåðåêðûòèåì ñòàíäàðòíûõ îïåðàöèé.
Ïîýòîìó êëàññ string âñòðîåííûé â Delphi.Àíàëîãè÷íî â Java, òî åñòü òàì âîçìîæíà òàêàÿ çàïèñü.String s;s + i;Ïðè÷åì åñëè i - íå ñòðîêà, òî áóäåò âûçâàíî íåÿâíîå ïðåîáðàçîâàíèå i ê ñòðîêå. Òî åñòü íåêîòîðûå êëàññûäîëæíû áûòü âñòðîåííûìè, òî åñòü ïîääåðæèâàòüñÿ êîìïèëÿòîðîì.  Ñ++ æå ýòîãî íå òðåáóåòñÿ.  C#íåëüçÿ ïåðåêðûâàòü îïåðàöèè () è [], íî âçàìåí òàì ïðèñóòñòâóåò îñîáàÿ êîíñòðóêöèÿ - èíäåêñàòîð.class X{int this[string x]{}};Òåïåðü âîçìîæíî ïèñàòüX x;x ["sss"];Ñâîéñòâà (property)Ñâîéñòâî - ýòî ñïåöèàëüíûé ÷ëåí êëàññà, êîòîðûé ïðè èñïîëüçîâàíèè âûãëÿäèò êàê ÷ëåí äàííûõ, à ïðèðåàëèçàöèè - êàê ïàðà ôóíêöèé - get è set.Ñâîéñòâàìè îáëàäàþò C# è Delphi.  C++, Java è òàê äàëåå, ÿâíûõ ñâîéñòâ íåò, íî òàì ìîæíî îïðåäåëèòüôóíêöèè äîñòóïà äëÿ äîñòóïà ê ïîëÿì äàííûõ.Delphi:type X = classproperty p: integer read accessor write accessor;type X = classprivateFlenghth : integer;property length:integerread Flength write Flength;a.Length = 1; ÷òåíèå áóäåò èç FLength.type figure = classprivate a, b : integer;Farea:integer;property Area: integer read Farea; {äîñòóï íà çàïèñü îãðàíè÷åí}Áîëåå òîãîtype figure = classprivate a, b : integer;property Area: integer read GetArea;property width: integet read b write SetWidth;private procedure SetWidth (X:integer);71Àâòîãåíåðèðóåìûå ñâîéñòâà.class Point{public int x;public int y;public Point (int x, int y){this.x = x; this.y = y;}Ýòî ìîæíî çàìåíèòü (â C# 3.0) íàclass Point{public int x {get, set};public int y {get, set};È òåïåðü ìîæíî íàïèñàòüPoint p = new Point (x = 0; y = 0);Ìíîãèå èç òîãî, ÷òî áûëî äîáàâëåíî â C# 3.0 èìååò ñìûñë òîëüêî äëÿ ðàáîòû ñ SQL çàïðîñàìè.Äëÿ àâòîðåàëèçóåìûé ñâîéñòâ ìîæíî ïèñàòü òàê, public int y privete get, set, òî åñòü äîñòóï íà ÷òåíèåçàêðûâàåòñÿ.Ãëàâà 7.
Ðàçäåëüíàÿ òðàíñëÿöèÿ.Ðàçäåëåíèå ïðîãðàììû íà ìîäóëè.Âèäû òðàíñëÿöèè1. Öåëüíàÿ òðàíñëÿöèÿ (Pascal)Âî ïåðâûõ îòñóòñòâóåò âîçìîæíîñòü ðàçáèåíèÿ íà ìîäóëè. Äàëåå, âñå áèáëèîòåêè äîëæíû ïîäàâàòüñÿ íàâõîä âìåñòå ñ ñàìîé ïðîãðàììîé. Ñîâåðøåííîé íå ïîäõîäèò äëÿ ïðîìûøëåííîãî ïðîãðàììèðîâàíèÿ.2. Ïîøàãîâàÿ òðàíñëÿöèÿ.(Basic)3. Ðàçäåëüíàÿ òðàíñëÿöèÿ - ðàçäåëüíàÿ íåçàâèñèìàÿ è ðàçäåëüíàÿ çàâèñèìàÿ. Ïðîãðàììà òðàíñëèðóåòñÿ ïî÷àñòÿì, ïîÿâëÿåòñÿ ïîíÿòèå åäèíèöû òðàíñëÿöèè. ðàçäåëüíàÿ íåçàâèñèìàÿ - òðàíñëÿöèÿ èñõîäíîãî êîäà åäèíèöû òðàíñëÿöèè â îáúåêòíûé ôàéëðàçäåëüíàÿ çàâèñèìàÿ - òðàíñëÿöèÿ èñõîäíîãî êîäà åäèíèöû òðàíñëÿöèè ñ èñïîëüçîâàíèåì íàáîðà îòòðàíñëèðîâàííûõ ðàíåå áèáëèîòåê.Ïîÿâëÿåòñÿ ïîíÿòèå êîíòåêñòà òðàíñëÿöèè.Îí ñóùåñòâóåò âñåãäà (íàïðèìåð ñòàíäàðòíûå èìåíà).
 ñëó÷àå íåçàâèñèìîé òðàíñëÿöèè êîíòåêñò áåðåòñÿ èç åäèíèöû òðàíñëÿöèè. Ïðèìåðû òàêèõ ÿçûêîâ - Fortran,Assembler, C / C++.72Ëåêöèÿ 274.12.2008Ïðè ðàçäåëüíîé òðàíñëÿöèè âîçíèêàåò ïîíÿòèå ìîäóëÿ êîìïèëÿöèè (ôèçè÷åñêîãî ìîäóëÿ).Òðàíñëÿòîðó íà âõîä ïîäàåòñÿ åäèíèöà êîìïèëÿöèè è íà âûõîäå ïîëó÷àåì îáúåêòíûé ìîäóëü. Îòñþäàâîçíèêàåì ïîíÿòèå êîíòåêñòà òðàíñëÿöèè.  ÿçûêàõ ñ ðàçäåëüíîé òðàíñëÿöèåé âåñü êîíòåêñò áåðåòñÿ èçåäèíèöû òðàíñëÿöèè, òî åñòü íåîáõîäèì ìåõàíèçì óêàçàíèÿ êîíòåêñòà òðàíñëÿöèè. Äëÿ ýòîãî íå äîñòàòî÷íîäèðåêòèâû extern.