лекции (2008) (by Kravets) (укороченное) (1160827), страница 13
Текст из файла (страница 13)
 Ñ++ ëþáûå âðåìåííûå îáåêòû ñ÷èòàþòñÿ êîíñòàíòíûìè.Àäà-83 è Àäà ââîáùå. Òàì íà ñàìîì äåëå íå óêàçûâàåòñÿ ñïîñîá ïåðåäà÷è ïàðàìåòðîâ, à óêàçûâàåòñÿñåìàíòèêà, òî åñòü ïðè ïåðåäà÷å ïàðàìåòðîâ óêàçûâàåòñÿ îäíî èç êëþ÷åâûõ ñëîâ -in, out èëè inoutprocedure P(X: in T;y: out TT; z : inout TTT);Ïðè ýòîì êîìïèëÿòîð ñàì âûáèðàåò ñïîñîá ïåðåäàè÷ ïàðàìåòðîâ. Ïðè ýòîì â ñòàíäàðòå Àäà - 95 âåðíóëèñüê ñïîñîáó, êîòîðûé áûë ðåàëèçîâàí ïî÷òè âî âñåõ ßÏ. Âñå ßÏ ðåàëèçóþò ïåðåäà÷ó ëèáî ïî ññûëêå, ëèáî ïîçíà÷åíèþ.Îäíàêî, â íåêîòîðûõ ñëó÷àÿõ ïðîãðàììû íà ÿçûêå Àäà ðàáîòàëè ïî ðàçíîìó íà ðàçíûõ êîìïèëÿòîðàõ.Íàïðèìåð ðàññìîòðèì òàêóþ ïðîãðàììó.procedure P(x,y : out T) isbeginX:=...;raise ERROR;Y:=...;end P;P(A,A);Åñëè ïàðàìåòðû ïåðåäàþòñÿ ïî ññûëêå, òî çíà÷åíèå À ìåíÿåòñÿ, à åñëè ïî ðåçóëüòàòó - òî ìåíÿåòñÿ.
Òàêèìîáðàçîì, íîðìàëüíàÿ ïðîãðàììà âåäåò ñåáÿ ïî ðàçíîìó â çàâèñèìîñòè îò êîìïèëÿòîðà.Java - ïåðåäà÷à ïî çíà÷åíèþ, íî èç-çà ðåôåðåíöèàëüíîé ñåìàíòèêè îáúåêòîâ - ôàêòè÷åñêàÿ ïåðåäà÷à ïîçíà÷åíèþ òîëüêî ïðîñòûõ òèïîâ äàíííûõ. Âñå îñòàëüíûå îáúåêòû (â òîì ÷èñëå è ìàññèâû) - ïî ññûëêå. Òàêèìîáðàçîì äëÿ âñåõ ïðîñòûõ îáúåêòîâ - in-ñåìàíòèêà, äëÿ âñåõ îñòàëüíûõ - inout ñåìàíòèêà. Java åñòü êëþ÷åâîå ñëîâî nal - àíàëîã â äàííîì êîíòåêñòå ìîäèôèêàòîðà const.
À äëÿ ïðîñòûõ òèïîâäàííûõ îñòàåòñÿ òîëüêî in ñåìàíòèêà. Ðàñìîòðèì ïîíÿòèå ïîáî÷íîãî ýôôåêòà ôóíêöèè. Ïîáî÷íé ýôôåêòîçíà÷àåò, ÷òî ôóíêöèÿ ìîæåò ìåíÿòü ëèáî êàêèå - òî ãëîáàëüíûå îáúåêòû è/èëè ìåíÿåò ñâîè ôàêòè÷åñêèåïàðàìåòðû. Òàêèì îáðàçîì, îñíîâíàÿ çàäà÷à ïðîöåäóðû - èìååííî ïîáî÷íûå ýôôåêòû, êîãäà êàê ôóíêöèÿïî õîðîøîìå íå äîëæíà èìåòü îíûõ.Ãëîáàëüíàÿ ïåðåìåííàÿ - ïðèçíàê äóðíîãî äèçàéíà ïðîãðàììû â ñîâðåìåííîì ïîíèìàíèè.function F(x: T) return T; { in }procedure FF(x: inout T): return T; { inout } íå âîøëî â îêîí÷àòåëüíûþ âåðñèþ Àäàprocedure P(x: out T; r: inout T); Java äëÿ êàæäîãî ïðîñòîãî òèïà äàííûõ ñóùåñòâóåò êëàññ - îáåðòêà â ïàêåòå java.lang.int a;Integer v = a;f(v); //inoutÂñå ÷òî íàõîäèòñÿ â ïàêåòå java.lang - âñòðîåíî â êîìïèëÿòîð.Ðàññìîòðìè ÿçûê Ñ#.
Äëÿ íåãî áûëè êðàéíå àêòóàëüíû âîïðîñû ýôôåêòèâíîñòè. Âñå ïàðàìåòðû òàì ïåðåäàþòñÿ ïî çíà÷åíèþ ïî óìîë÷àíèþ, òî åñòü ïåðåäà÷à ïîëíîñòüþ àíàëîãè÷íà Java. Íî åñòü äâà îòäåëüíûõìîæäèôèêàòîðà - ref è out, êîòîðûå ðåàëèçóþò ïåðåäà÷ó ïàðàìåòðîâ ïî ññûëêå.Òî åñòü40void f(ref int a) {a = -1};// ïåðåäà÷à ïî ññûëêåint a = 0;f(ref a);{a == -1}Îäíàêî çäåñü òðåáóåòñÿ ïåðåäà÷à èíèöèàëèçèðîâàííîé ïåðåìåííîé. Äëÿ ïåðåäà÷è íå èíèöèàëèçèðîâàííîéïåðåìåííîé èñïîëüçóåòñÿ ìîäèôèêàòîð out. ÿçûêå Delphiprocedure P ([var] a: X);Ñïèñîê àðãóìåíòîâ ïåðåìåííîé äëèíûprintf (const char *, ...);va_listva_startva_nextva_endÍåäîñòàòîê - íåíàäåæíîñòü. Òî åñòü íåò âîçìîæíîñòè êîíòðîëèðîâàòü êîëè÷åñòâî ïåðåäàííûõ ôóíêöèèàðãóìåíòîâ.CString.format (const char *, ...);Íåñìîòðÿ íà òî ÷òî â Ñ++ ñóùåñòâóåò ñâîé ìåõàíèçì ââîäà - âûâîäà, ìíîãèå äî ñèõ ïîð èñïîëüçóþò Ñ-øíûéprintf èç-çà åãî óäîáñòâà. ÿçûêå îáåðîí èëè ìîäóëà-2 íåò ñïèñêîâ ïåðåìåííîé äëèíû, òî åñòü îïåðàöèè âûâîäà íàìíîãî ìåíååóäîáíû, ÷åì â Ñ.printf ("Count = %d i); // CInOut.WriteString ("Count = ");InOut.WriteInt (i); ìîäóëà - 2 Ñ++ îñòàëèñü ñèøíûå ìàêðîñû äëÿ ñïèñêîâ àðãóìåíòîâ ïåðåìåííîé äëèíû. Java è Ñ# ïðîáëåìà îáåñïå÷åíèÿ íàäåæíîñòè áûëà ðåøåíà.
 ýòèõ ÿçûêàõ ðåàëèçàöèÿ îïèðàëàñü íàòî, ÷òî âñå îáúåêòû èìåëè îáùåãî ïðåäêà - êëàññ Object. Òàêèì îáðàçîì, ñïèñîê ïåðåìåííîé äëèíû - ìàññèâîáúåêòîâ òèïà object.void f(params int[] integer);Òàêèì îáðàçîì, write (String format, params Object[] objs);Íàäåæíîñòü îáåñïå÷èâàåòñÿ íà óðîâíå âûïîëíåíèÿ, ïóòåì êîíòðîëÿ ïàðàìåòðîâ.Ñëåäóåò ðàçëè÷àòü îáúÿâëåíèÿvoid f(params int [] elements);void f(int [] integers);Àíàëîãè÷íàÿ ïðîáëåìà áûëà â ÿçûêå java, ïðè÷åì ñîçäàòåëè ÿçûêà íå õîòåëè ðàñøèðÿòü ÿçûê, ââîäÿíîâûå êëþ÷åâûå ñëîâà. Âìåñòî ýòîãî îíè ïðîñòî ñèíòàêñè÷åñêè ðàñøèðèëè ÿçûê.
Òî åñòüvoid f(int ... integers){ for (int i:integers) {..} }Íà ýòîì çàêîí÷èì ñ ïåðåäà÷åé ïàðàìåòðîâ.Ïóíêò 3. Ïîäïðîãðàìíûå òèïû äàííûõTYPE PROCINT = PROCEDURE (INTEGER);VAR P: PROCINT;TYPE F = PROCEDURE (REAL):REAL;PROC PP = PROCEDURE (VAR T);V:= const {êîíñòàíòû - èìåíà ïðîöåäóð}P(5); Ñ/Ñ++ èìååòñÿ ìåõàíèçì óêàçàòåëåé íà ôóíêöèþ.  Àäà - 95 ïîÿâèëñÿ êàê ïîäïðîãðàìíûé òèï, òàêè ïîäïðîãðàìíûå ïåðåìåííûå. Êîãäà êàê â Àäà 85 èõ íå áûëî.
Çà âðåìÿ ñ Àäà 83 äî Àäà 95 èçìåíèëèñü êàêâçãëÿäè íà ïðîãðàììèðîâàíèå, òàê è óñëîâèÿ, â êîòîðûõ äîëæíû áûëè ðàáîòàòü ïðîãðàììû íà ýòîì ÿçûêå.41-ðåôåðåíöèÿ-êîìïîçèöèÿ-íàñëåäîâàíèå-äåëåãèðîâàíèåÄåëåãèðîâàíèå ïîñëóæèëî ïðè÷èíîé ââåäåíèåÿ ïîäïðîãðàìíûõ òèïîâ.
 ÿçûêå Îáåðîí îáðàáîò÷èê (handler)- àíàëîã ïîäïðîãðàìíîãî òèïà. Íåâîçìîæíî ïîëíîñòüþ ðåàëèçîâàòü ÎÎ ïîâåäåíèå áåç ïðîöåäóðíîãî òèïà.42Ëåêöèÿ 18.30.10.2008Ðàññìîòðìè ðåàëèçàöèþ ïîäïðîãðàìíûõ òèïîâ äàííûõ.1. Ïîäïðîãðàììû - óêàçàòåëè (CALL P). Ïðèìåðû ÿçûêîâ - Ñ, Ñ++, Îáåðîí, Ìîäóëà-2, Ïàñêàëü (Delphi),Ada-95.M-2, Oberon, Delphi: type PRCI = procedure (integer).Íàä îáúåêòàìè òàêîãî òèïà åñòü òîëüêî äâå îïåðàöèè - ïðèñâàèâàíèå è âûçîâ.  Àäà - 83 íå áûëî ïîäïðîãðàìíîãî òèïà, îí ïîÿâèëñÿ ëèøü â Àäà - 95. Àäà - 95 áûë ââåäåí ïîäïðîãðàìíûé òèï äàííûõ, êîòîðûé îïèñûâàëñÿ àíàëîãè÷íî óêàçàòåëþ.type PRCI is access procedure PRCi (i : in integer);procedure FCALL (p: PRCi) isbeginP(0);end FCALL;Ïîÿâëÿåòñÿ ñïåöèàëüíàÿ ðàçíîâèäíîñòü ôîðìàëüíûõ ïàðàìåòðîâà, êîòîðûå ÿâíî ïåðåäàâàëèñü ïî ññûëêå.Òàêèì îáðàçîì ïîïûòêà èñïîëüçîâàòü çàäàíèå ñåìàíòèêè, à íå ñïîñîáà ïåðåäà÷è ïðîâàëèëàñü.Îòäåëüíî ðàññìîòðèì Ñ++ è Delphi.
 ýòèõ ÿçûêàõ åñòü ïîíÿòèå êëàññà, ÷òî äàáàâëÿåò ê ïîíÿòèþ ïðîöåäóðû èëè ôóíêöèè ïîíÿòèå ìåòîäà êëàññà, òî åñòü ïðîöåäóðû èëè ôóíêöèè, êîòîðîé íåÿâíî ïåðåäàåòñÿîáúåêò êëàññà (this â C++, self â Delphi).void foo (int);typedef void (*footype)(int)footype f;f = foo;(*f)(0);f(0);class Bar{void foo (int);int i;};Òàêèì îáðàçîì, ïîÿâëÿåòñÿ ïîíÿòèå óêàçàòåëÿ íà ÷ëåí êëàññà.int Bar::*pb;pb = Bar::i;//îøèáêàBar b;pb = &b.i;//óêàçàòåëü íà ÷ëåí êëàññà òèïà inttypedef void (Bar::*)foom(int);foom f;f = Bar::foo;Îïåðàöèè .* èëè ->*type MEMPRC = procedure (integer) of Bar;Îòäåëüíî ðàññìîòðìè C# è java.  ÿçûêå java ïîíÿòèå ôóíêöèîíàëüíîãî òèïà îòñóòñòâóåò, òî åñòü ïåðåäàâàòü ôóíêöèè êàê ïàðàìåòðû íåëüçÿ.
Ïðè ýòîì â java ìîæíî ðåàëèçîâàòü ïîäîáíûé ìåõàíèçì íà îñíîâåíàñëåäîâàíèÿ.Ðàññìîòðèì ïðèìåð - ïðîöåäóðó èíòåãðèðîâàíèÿ, òî åñòü âû÷èñëåíèÿ îïðåäåëåííîãî èíòåãðàëà f(x)typedef doube (*FI)(double);double Integer (double a, double b, double eps, IF f); ÿçûêå java âñå íåñêîëüêî èíà÷å, ïîäîáíàÿ ðåàëèçàöèÿ âîçìîæíà òîëüêî ñ ïîìîùüþ êëàññîâ.class integral{public double IF (double) ..public double integrate (double a, double b, double eps);}43Òåïåðü ÷òîáû ïåðåäàòü â êëàññ íóæíóþ ôóíêöèþ, íóæíî óíàñëåäîâàòü êëàññ integral è ïåðåîïðåäåëèòüâ íîâîì êëàññå ôóíêöèþ IF. Òàêîå ðåøåíèå áûëî âûçâàíî òåì, ÷òî èç - çà ñîîáðàæåíèé áåçîïàñíîñòè ðàçðàáîò÷èêè java ïîëíîñòü îòêàçàëèñü îò âñåõ óêàçàòåëåé, â òîì ÷èñëå è óêàçàòåëåé íà ôóíêöèè.×òî æå êàñàåòñÿ ÿçûêà C#, òî òàì åñòü ïîíÿòèå delegate - ñïåöèàëèçèðîâàííîãî ôèóíêöèîíàëüíîãî òèïàäàííûõ, êîòîðûé ñâîäèòñÿ ê óêàçàòåëþ íà ôóíêöèè.public delegate void Operation(int);Äåëåãàòó ìîæíî ïðèñâàèâàòü íîâûå çàí÷åíèåÿ.public Operation dlgt;class Bar{public Foo (int x) {..}public static void Foo2 (int i) {...}};Bar b;dlgt = new Operation (b.Foo);Òåïåðü dlgt (0) == b.Foo (0);Ïðè ýòîì ìîæíî íàïèñàòü è òàê:dlgt = new Operation (Bar.Foo2);// òåïåðü óêàçûâàåò íà ñòàòè÷åñêóþ ôóíêöèþ.Áîëåå òîãî äëÿ äåëåãàòîâ îïðåäåëåíèà îïåðàöèÿ += è -=, ñîçäàþùèå öåïî÷êè îïåðàöèé.dlgt += new Operation (b.Foo);dlgt += new Operation (Bar.Foo2);dlgt += new Operation (new X().b);Òî åñòü ìû ïðèâÿçûâåì ê äåëåãàòó ôóíêöèþ îò íîâîãî êëàññà, îïðåäåëåííîãî ïðè âûçîâå.Ïðè âûçîâå dlgt (0), áóäóò ïðèìåíåíû âñå ýòè îïåðàöèè â òîì ïîðÿäêå, â êîòîðîì îíè áûëè çàäàíû.
Âñåêëàññû delegate ïðîèñõîäÿò îò êëàññàSystem.Delegate {static Delegate Combine (Delegate rst, Delegate second);static Delegate Remove (Delegate rst, Delegate second);static Delegate GetInvocationList (Delegation smth); }Ïîíÿòèå ñîáûòèÿ.subcribe - æåëàíèå ïîëó÷àòü óâåäîìëåíèå î òîì ÷òî ïðîèçîøëî ñîáûòèå.distribute - ãåíåðàöèÿ ñîáûòèÿ.Ïðèìåð îáðàòíîãî - òàéìåð èëè ïî÷òîâàÿ ñèñòåìà.EventSource - åìó ïðèíàäëåæèò ïåðåìåííàÿ äèëàãàòñêîãî òèïà, à EventConsumer - ïîäïèñ÷èê, îí èñïîëüçóåò+= è -=.Ñîáûòèÿ - ÷àñòíûå ñëó÷àè äåëåãàòîâ, òî åñòü Event - ÷àñòíûé ñëó÷àé ýêçàìïëÿðà äåëåãàòà.public event Operation;Ïðè ýòîì ó ñîáûòèÿ îãðàíè÷åííû îïåðàöèè.Äëÿ áîëüøèíñòâà ßÏ åäèíèöåé èíêàïñóëÿöèè ÿâëÿåòñÿ òèï, îäíàêî ýòî íå òàê â ñëó÷àå ñîáèòèé, òàê êàêâ çàâèñèìîñòè îò îáúåêòà ðàçëè÷àåòñÿ íàáîð îïåðàöèé (+= è -= èëè ñîçäàíèå ñîáûòèÿ (âûçîâ)).Operation op;public delegate int Operation2(int x, int y);Operation2 op;op = delegate (int x, int y){return x+y}int i;op = delegate (int x, int y){return x + y + i};Oper0 o;public Delegate[] Create(){Oper0 [] ops = new Oper0 [3];int i = 0;for (int k = 0; k < 3; k ++) ops [k] = delegate ()return i ++;44}return ops;Àíîíèìíûé äåëåãàò ìîæåò çàõâàòûâàòü íå òîëüêî ëîêàëüíûå ïåðåìåííûå, íî è íàïðèìåð ñâîé êîíòåêñò- êëàññ.
Òî åñòü ñóùåñòâóåò âîçìîæíîñòü ðåàëèçàöèè ñâÿçûâàíèÿ.class Binder{private Operation2 d;private int arg;public Buiner (Operation2 a, int x)del = a, arg = xpublic Operation1 Get_Bind (){return delegate(int a){return d (a, arg)}}}Âñå ýòî ÿâëÿåòñÿ àíàëîãîì çàìûêàíèÿ è Lambda ôóíêöèé.45Ëåêöèÿ 196.11.2008Ãëàâà 5. Ëîãè÷åñêèå ìîäóëè òðàäèöèîííûõ ßÏ.Îïðåäåëåíèå íîâûõ òèïîâ äàííûé ñ ïîìîùüþ ëîãè÷åñêèõ ìîäóëåé.Èíêàïñóëÿóöèÿ è ÀÒÄ.Ïóíêò 1.
Ïîíÿòèå ËÌ.Ëîãè÷åñêèé ìîäóëü - ÿçûêîâàÿ êîíñòðóêöèÿ, îáúåäèíÿþùàÿ âçàèìîñâÿçàííûå ðåñóðñû â èìåíîâàííûé íàáîð,êîòîðûé ïîçâîëÿåò ñîãëàñîâàííî- èñïîëüçîâàòü- ðàñïîñòðàíÿòü- èçìåíÿòü- òðàíñëèðîâàòüýòè ðåñóðñûÏîíÿòèå ëîãè÷åñêîãî ìîäóëÿ òåñíî ñâÿçàííî ñ ïîíÿòèåì ôèçè÷åñêîãî ìîäóëÿ. Íî â îáùåì ñëó÷àå îíè íåðàâíîçíà÷íû.Ãëàâíàÿ çàäà÷à ëîãè÷åñêîãî ìîäóëÿ â áîëüøèíñòâå òðàäèöèîííûõ ßÏ - ñâÿçàòü âî åëèíî ñòðóêòóðà äàííûõ è ñîîòâåñòâóþùèå ìíîæåñòâî îïåðàöèé, òî åñòü ñîçäàíèå íîâîãî òèïà äàííûõ.Ïîíÿòèå êëàññà (â Ñ++)- ìÿãêàÿ ýâîëþöèÿ ïîíÿòèå ñòðóêòóðû. Òåïåðü êëàññ ÿâëÿåòñÿ âçàèìîñâÿçàííûìíàáîðîì ðåñóðñîâ.
Òàêèì îáðàçîì, êëàññ ÿâëÿåòñÿ êàê òèïîì äàííûõ, òàê è ëîãè÷åñêèì ìîäóëåì.Ïðè ýòîì îñíîâíîé çàäà÷å êëàññà âñå æå îñòàåòñÿ çàäà÷à ñîçäàíèÿ íîâîãî òèïà. ÿçûêå Ôîðòðàí -âñå ïîäïðîãðàììû - ôèçè÷åñêèå ìîäóëè.Ëîãè÷åñêèå ìîäóëè â ñëó÷àÿõ Ì-2, Îáåðîí, Delphi Ìîäóëà - 2:- Ãëàâíûé ìîäóëü- Áèáëèîòå÷íûé ìîäóëü- Ëîêàëüíûå ìîäóëè.MODULE èìÿ;ÎáúÿâëåíèÿBEGINÎïåðàòîðûEND èìÿ.Áèáëèîòå÷íûå ìîäóëè:DEFINITION MODULE M;Îáúÿâëåíèÿ;END M;- Ìîäóëü îïðåäåëåíèåÿ- îáúåêòû äàííûõ- òèïû äàííûõ- çàãîëîâêè ïðîöåäóð è ôóíêöèé- Ìîäóëü ðåàëèçàöèè:IMPLEMENTATION MODULE M;Îáúÿâëåíèÿ è ðåàëèçàöèèEND M.- ÎïðåäåëåíèÿDEFINITION MODULE STACK;CONST N = 256;TYPE Stack =RECORDTOP:INTEGERBODY:ARRAY [0..N] of REAL46END;PROCEDURE INIT (VAR S:Stack);PROCEDURE POP (VAR S: Stack) : REAL;VAR Done : Boolean; ìîäóëå ðåàëèçàöèè äîëæíû áûòü ðåàëèçàöèè îáúÿâëåííûõ ôóíêöèé.