лекции (2008) (by Kravets) (1160829), страница 13
Текст из файла (страница 13)
À äëÿ ïðîñòûõ òèïîâ äàííûõ îñòàåòñÿ òîëüêî 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, êîòîðûå ðåàëèçóþò ïåðåäà÷ó ïàðàìåòðîâïî ññûëêå.Òî åñòüvoid f(ref int a) {a = -1};// ïåðåäà÷à ïî ññûëêåint a = 0;69f(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);70Àíàëîãè÷íàÿ ïðîáëåìà áûëà â ÿçûêå 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 èçìåíèëèñü êàêâçãëÿäè íà ïðîãðàììèðîâàíèå, òàê è óñëîâèÿ, â êîòîðûõ äîëæíû áûëèðàáîòàòü ïðîãðàììû íà ýòîì ÿçûêå.-ðåôåðåíöèÿ-êîìïîçèöèÿ-íàñëåäîâàíèå-äåëåãèðîâàíèåÄåëåãèðîâàíèå ïîñëóæèëî ïðè÷èíîé ââåäåíèåÿ ïîäïðîãðàìíûõ òèïîâ.  ÿçûêå Îáåðîí îáðàáîò÷èê (handler) - àíàëîã ïîäïðîãðàìíîãî òèïà. Íåâîçìîæíî ïîëíîñòüþ ðåàëèçîâàòü ÎÎ ïîâåäåíèå áåç ïðîöåäóðíîãîòèïà.71Ëåêöèÿ 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;72pb = &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);}Òåïåðü ÷òîáû ïåðåäàòü â êëàññ íóæíóþ ôóíêöèþ, íóæíî óíàñëåäîâàòü êëàññ integral è ïåðåîïðåäåëèòü â íîâîì êëàññå ôóíêöèþ IF. Òàêîåðåøåíèå áûëî âûçâàíî òåì, ÷òî èç - çà ñîîáðàæåíèé áåçîïàñíîñòè ðàçðàáîò÷èêè java ïîëíîñòü îòêàçàëèñü îò âñåõ óêàçàòåëåé, â òîì ÷èñëå èóêàçàòåëåé íà ôóíêöèè.×òî æå êàñàåòñÿ ÿçûêà C#, òî òàì åñòü ïîíÿòèå delegate - ñïåöèàëèçèðîâàííîãî ôèóíêöèîíàëüíîãî òèïà äàííûõ, êîòîðûé ñâîäèòñÿ ê óêàçàòåëþ íà ôóíêöèè.public delegate void Operation(int);Äåëåãàòó ìîæíî ïðèñâàèâàòü íîâûå çàí÷åíèåÿ.public Operation dlgt;73class 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;Ïðè ýòîì ó ñîáûòèÿ îãðàíè÷åííû îïåðàöèè.Äëÿ áîëüøèíñòâà ßÏ åäèíèöåé èíêàïñóëÿöèè ÿâëÿåòñÿ òèï, îäíàêîýòî íå òàê â ñëó÷àå ñîáèòèé, òàê êàê â çàâèñèìîñòè îò îáúåêòà ðàçëè÷à74åòñÿ íàáîð îïåðàöèé (+= è -= èëè ñîçäàíèå ñîáûòèÿ (âûçîâ)).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 ++;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 ôóíêöèé.75Ëåêöèÿ 196.11.2008Ãëàâà 5. Ëîãè÷åñêèå ìîäóëè òðàäèöèîííûõ ßÏ.Îïðåäåëåíèå íîâûõ òèïîâ äàííûé ñ ïîìîùüþ ëîãè÷åñêèõ ìîäóëåé.Èíêàïñóëÿóöèÿ è ÀÒÄ.Ïóíêò 1. Ïîíÿòèå ËÌ.Ëîãè÷åñêèé ìîäóëü - ÿçûêîâàÿ êîíñòðóêöèÿ, îáúåäèíÿþùàÿ âçàèìîñâÿçàííûå ðåñóðñû â èìåíîâàííûé íàáîð, êîòîðûé ïîçâîëÿåò ñîãëàñîâàííî- èñïîëüçîâàòü- ðàñïîñòðàíÿòü- èçìåíÿòü- òðàíñëèðîâàòüýòè ðåñóðñûÏîíÿòèå ëîãè÷åñêîãî ìîäóëÿ òåñíî ñâÿçàííî ñ ïîíÿòèåì ôèçè÷åñêîãîìîäóëÿ.
Íî â îáùåì ñëó÷àå îíè íå ðàâíîçíà÷íû.Ãëàâíàÿ çàäà÷à ëîãè÷åñêîãî ìîäóëÿ â áîëüøèíñòâå òðàäèöèîííûõ ßÏ- ñâÿçàòü âî åëèíî ñòðóêòóðà äàííûõ è ñîîòâåñòâóþùèå ìíîæåñòâî îïåðàöèé, òî åñòü ñîçäàíèå íîâîãî òèïà äàííûõ.Ïîíÿòèå êëàññà (â Ñ++)- ìÿãêàÿ ýâîëþöèÿ ïîíÿòèå ñòðóêòóðû. Òåïåðü êëàññ ÿâëÿåòñÿ âçàèìîñâÿçàííûì íàáîðîì ðåñóðñîâ. Òàêèì îáðàçîì,êëàññ ÿâëÿåòñÿ êàê òèïîì äàííûõ, òàê è ëîãè÷åñêèì ìîäóëåì.Ïðè ýòîì îñíîâíîé çàäà÷å êëàññà âñå æå îñòàåòñÿ çàäà÷à ñîçäàíèÿíîâîãî òèïà. ÿçûêå Ôîðòðàí -âñå ïîäïðîãðàììû - ôèçè÷åñêèå ìîäóëè.Ëîãè÷åñêèå ìîäóëè â ñëó÷àÿõ Ì-2, Îáåðîí, Delphi Ìîäóëà - 2:- Ãëàâíûé ìîäóëü- Áèáëèîòå÷íûé ìîäóëü- Ëîêàëüíûå ìîäóëè.MODULE èìÿ;ÎáúÿâëåíèÿBEGINÎïåðàòîðûEND èìÿ.Áèáëèîòå÷íûå ìîäóëè:76DEFINITION MODULE M;Îáúÿâëåíèÿ;END M;- Ìîäóëü îïðåäåëåíèåÿ- îáúåêòû äàííûõ- òèïû äàííûõ- çàãîëîâêè ïðîöåäóð è ôóíêöèé- Ìîäóëü ðåàëèçàöèè:IMPLEMENTATION MODULE M;Îáúÿâëåíèÿ è ðåàëèçàöèèEND M.- ÎïðåäåëåíèÿDEFINITION MODULE STACK;CONST N = 256;TYPE Stack =RECORDTOP:INTEGERBODY:ARRAY [0..N] of REALEND;PROCEDURE INIT (VAR S:Stack);PROCEDURE POP (VAR S: Stack) : REAL;VAR Done : Boolean; ìîäóëå ðåàëèçàöèè äîëæíû áûòü ðåàëèçàöèè îáúÿâëåííûõ ôóíêöèé.Âñå ñòðóêòóðû äàííûõ, îáúÿâëåííûå â ìîäóëå ðåàëèçàöèè íå äîñòóïíûèçâíå..DEF => .SYM.MOD => .OBJDM=> unit => DFVIM77DM=> unit (unit stack)interface...implemenation...end (stack);Âçàèìîäåéñòâèå ìîäóëåé ìåæäó ñîáîé.Êàæäûé áèáëèîòå÷íûé ìîäóëü ýêñïîðòèðóå âñå èìåíà, êîòîðûå îáúÿâëåíèû â ìîäóëå îïðåäåëåíèÿ.Ìîäóëü âèäèìîñòè - èìÿ ëèáî âèäèìî, ëèáî íå âèäèìî.Âèäèìîñòü (âèäèìûå èìåíà) äåëÿòñÿ íà äâà êëàññà- ïîòåíöèàëüíàÿ âèäèìîñòü (òðåáóåò óòî÷íåíèÿ)- íåïîñðåäñòâåííàÿ âèäèìîñòü (ìîæåò áûòü èñïîëüçîâàííî áåç âñÿêèõóòî÷íåíèé)Èìååòñÿ ñïåöèàëüíàÿ êîíñòðóêöèÿ IMPORT, êîòîðàÿ èìååò 2 âèäà.