лекции (2008) (by Kravets), страница 10
Описание файла
PDF-файл из архива "лекции (2008) (by Kravets)", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 10 страницы из PDF
 Ñ# è Java åñòü ñïåöèàëüíûå êëàññû äëÿ ñîçäàíèå ñòðîê StringBuilder. Âî âðåìÿ ðàáîòû ñîñòðîêàìè, íàïðèìåð âî âðåìÿ ñîçäàíèÿ íîâîé ñòðîêè, òðåáóåòñÿ ÷àñòîåèçìåíåíèå ðàçìåðà âûäåëåííîé ïàìÿòè, ÷òî ïðèâîäèò ê îãðîìíîé ôðàãìåíòàöèè ïàìÿòè.StringBuilder áîëåå îïòèìàëüíûì îáðàçîì ðàñïðåäåëÿåò ïàìÿòü ïîäñòðîêè, ïîëüçóÿñü òåì, ÷òî âî âðåìÿ åãî ðàáîòû êîëè÷åñòâî òðåáóåìîéïàìÿòè ìîæåò òîëüêî óâåëè÷èâàòüñÿ.
Òî åñòü òàêèå ìàññèâû ðåàëüíîÿâëÿþòñÿ êâàçèñòàòè÷åñêèìè. Àäå åñòü ïîíÿòèå äèíàìè÷åñêîãî ìàññèâà, ôàêòè÷åñêè íå ïîõîæåãîíà ñâîé àíàëîã â C# èëè Java.procedure P(N:integer) isA:array (1..N) of real;begin...end; äàííîì ïðèìåðå ïðîèñõîäèò íåêîòîðîå îòñòóïëåíèå îò ïðàâèë ÿçûêà Àäà, òàê êàê ãðàíèöû ìàññèâà íå çàäàíû ñòàòè÷åñêè. Ïðè ýòîì ãðàíèöû ìàññèâà ÿâëÿþòñÿ àòðèáóòàìè èìåííî êîíêðåòíîãî îáúåêòà, à íåâñåãî òèïà.Òåïåðü íåìíîãî ïðî ìíîãîìåðíûå ìàññèâû è îïåðàöèþ âûðåçêè (slice).Ñðåç ìàññèâà íåêîòîðûé äèàïàçîí åãî ýëåìåíòîâ. Òàêàÿ îïåðàöèÿåñòü â PL/I, Fortran 90, Ada.A:Array (1..10) of T;A(2..5); Âûðåçêè îäíîé äëèíû ìîãóò áûòü ñîâìåñòèìû ìåæäó ñîáîé.
Âñîâðåìåííûõ ÿçûêàõ ïðîãðàììèðîâàíèÿ îïåðàöèÿ copy(i,j) àíàëîãâûðåçêè.A(2..5,1..3) òàêèì îáðàçîì âûðåçêè óæå íå âñåãäà ìîãóò ðàñïîëàãàòüñÿâ ïàìÿòè íåïðåðûâíî.47Äëÿ ðåàëèçàöèè ìíîãîìåðíûõ ìàññèâîâ ÷àùå âñåãî ïðèìåíÿåòñÿ ñëåäóþùèé ñïîñîá. Ìíîãîìåðíûé ìàññèâ ýòî ïðîñòî íåïðåðûâíàÿ ïîñëåäîâàòåëüíîñòü ìàññèâîâ ìåíüøåé ðàçìåðíîñòè.Type T2 = array [1..N] of T1;T1 = array [1..M] of T;X[i][j] X[i,j];Àíàëîãè÷íîType T2 = array [1..N,1..M] of T;ßçûê Ñ/Ñ++;int i[3][3];//i ≡ int**Åäèíñòâåííîå èñêëþ÷åíèå ÿçûê ôîðòðàí òàì ìàññèâ ðàñïîëàãàåòñÿ íå ïî ñòðîêàì, à ïî ñòîëáöàì. Ïðè ýòîì âî âñåõ îñòàëüíûõ ÿçûêàõ ïî ñòðîêàì.Ñòóïåí÷àòûå ìàññèâû åñòü â Java, ìîãóò ìîäåëèðîâàòüñÿ â Ñ (ññûëêàìè).Äâóìåðíûé ìàññèâ ÿçûêà Java òðàêòóåòñÿ êàê ìàññèâ ìàññèâîâ èëèêàê ìàññèâ óêàçàòåëåé/ññûëîê. Ñ# åñòü 2 âàðèàíòà îáúÿâëåíèÿ.int [,] = new int [3,5];È êëàññè÷åñêîå îáúÿâëåíèå (ìàññèâ ìàññèâîâ).
Òîãäà ïîëó÷àåì ñòóïåí÷àòûé ìàññèâ. Java:int [][]X = new int[][3];Äàëåå èíèöèàëèçàöèÿ êàæäîãî èç 3-õ ýëåìåíòîâ ìàññèâà.for (int i=0; i < 3; i++)x[i] = new int [i+1];int [N]x = {{1,2,3}, new int [5],{0}};ßâíàÿ èíèöèàëèçàöèÿ.48Ïóíêò 2. Çàïèñè.Ñîâðåìåííîå ïîíÿòèå çàïèñè ïðàêòè÷åñêè íå èçìåíåííàÿ çàïèñüÿçûêà Pascal.type R = recordx,y:T;i,j: real;end;Òî åñòü åñëè ìàññèâ DxDxDx..xD; òî çàïèñü ýòî äåêàðòîâî ïðîèçâåäåíèå ðàçíîòèïíûõ ýëåìåíòîâ.
Îñíîâíàÿ îïåðàöèÿ äîñòóï ïî èìåíèïîëÿ.ßçûê Ñ: struct tags{int i,j;};Àäà:record//ïîëÿ çàïèñè.end record; ñîâðåìåííûõ ÿçûêàõ ïðîãðàììèðîâàíèÿ ïîíÿòèå çàïèñè ïðåâðàòèëîñü â ïîíÿòèå êëàññà.Oberon:RECORDïîñëåäîâàòåëüíîñòü ïîëåéEND;Çàïèñü ñ âàðèàíòàìè <=> union //Ñ. ≡ îáúåäèíåíèå Ñ/Ñ++ ≡ ïàðàìåòðèçîâàííûå çàïèñè (Àäà).Îáúåäèíåíèå òèïîâ.Òðàäèöèîííûå ßÏ êàæäîìó îáúåêòó äàííûõ ñîîòâåòñòâóåò åäèíñòâåííûé òèï äàííûõ. ÎÎßÏ âñå îáúåêòû îòíîñÿòñÿ ê íåêîòîðîìóêëàññó îáúåêòîâ.int i = 0;object o = i;//êîððåêòíî â Ñ#ßíóñ ïðîáëåìà ðàçëè÷íûå îáúåêòû ìîãóò âûñòóïàòü â ðàçíûõ ðîëÿõ, òî åñòü êàæäûé îáúåêò ìîæåò èìåòü íåñêîëüêî ðîëåé / òèïîâ. ßð÷åâñåãî ýòà ïðîáëåìà ïðîÿâèëà ñåáÿ ïðè ïðîåêòèðîâàíèè ïîëüçîâàòåëüñêèõèíòåðôåéñîâ. Íàïðèìåð îêíî ìîæåò ñîäåðæàòü â ñåáå íåêîòîðûé íàáîðýëåìåíòîâ, çàâèñÿùèé îò êîíêðåòíîãî îêíà.49recordïîñòîÿííàÿ ÷àñòü.âàðèàíòíàÿ ÷àñòü.end;ïîñòîÿííàÿ ÷àñòü ïîñëåäîâàòåëüíîñòü îáúÿâëåíèÿ ïåðåìåííûõ.âàðèàíòíàÿ ÷àñòü-ðàçìå÷åííîå ðàñïðåäåëåíèå.ïîëå, ãäå åñòü äèñêðèìèíàíò, îïðåäåëÿþùèé âèä ïîëÿ.-íå ðàçìå÷åííîå ðàñïðåäåëåíèå.type event = recordT:time;case Evtype:ETEventKBEvent: (scancode : integer,up:Boolean);MouseEvent :(....); end:Âàðèàíòíàÿ ÷àñòü âñå ïåðåìåííûå ðàñïîëàãàþòñÿ ñ îäíîãî è òîãîæå àäðåñà.
Íå ðàçìå÷åííîå ðàñïðåäåëåíèå îòñóòñòâóåò ïîëÿ äèñêðèìèíàíòà.type BitCell = recordcase Boolean oftrue:(i:integer)false:(bits:packed array [1..48] of Boolean)end;X:BitCell;X.i= 249;X.bits [48] := 1;union íå èíêðèìèíèðîâàííîå îáúåäèíåíèå áåç ïîñòîÿííîé ÷àñòè.50Ëåêöèÿ 13.Èòàê, îáúåäèíåíèå òèïà ñèíòàêñè÷åñêè îáîáùåíèå ïîíÿòèå çàïèñèèëè ñòðóêòóðû. Íàëè÷èå îáúåäèíåíèé ãîâîðèò ÷òî òðàäèöèîííàÿ ñèñòåìà òèïîâ èìååò íåêîòîðóþ ¾óùåðáíîñòü¿. Ñóùåñòâóåò èíêðèìèíèðîâàííûå îáúåäèíåíèÿ â íèõ ó êàæäîãî ïîëÿ åñòü îïðåäåëåííîå çíà÷åíèå äèñêðèìèíàíò, ïî êîòîðîìó îïðåäåëÿåòñÿ òèï ïîëÿ. Îáúåäèíåíèå òèïîâðåàëèçîâàíî òàê, ÷òî âñå ýëåìåíòû íà÷èíàþòñÿ ñ îäíîãî è òîãî æå àäðåñàâ ïàìÿòè.Ïàñêàëü, Modula-2 èìåþò ïî÷òè ýêâèâàëåíòíûå îáúåäèíåíèÿ òèïîâ.ÀÄÀ âñå îáúåäèíåíèÿ ðàçëè÷íû. Ñ òîëüêî ÷èñòûå íå ðàçìå÷åííûåîáúåäèíåíèÿ.Îïèñàíèå îáúåäèíåíèé ïðåäûäóùàÿ ëåêöèÿ.Ðàçëè÷èÿ â îáúÿâëåíèå ìàëû.
Ïðè ýòîì ðàçëè÷èÿ â îáúÿâëåíèè âûçâàíû ðàçëè÷èÿìè â îïåðàòîðå âûáîðà (switch) â ñîîòâåòñòâóþùèõ ßÏ.Äèñêðèìèíàíò ìîæåò áûòü 2-õ âèäîâ:1.èìÿ: òèï.2.òèï.Ïðè ýòîì ïåðâûé ñïîñîá â ðàçìå÷åííûõ è âòîðîé â íå ðàçìå÷åííûõ. Âÿçûêå Ñ ðàçìåð îáúåäèíåíèÿ ðàçìåð ìàêñèìàëüíîãî ýëåìåíòà.  Ïàñêàëå ñóùåñòâóåò è äðóãîé ñèíòàêñèñ.NEW (P, t1, t2, t3 ...);Ðàñïðåäåëåíèå ïàìÿòü ïîä çàïèñü ñ âàðèàíòàìè, ïðè÷åì âûäåëåíèå ïàìÿòè èäåò ïî òèïó äàííîãî âàðèàíòà t1. Ïðè ýòîì ïîñëåäîâàòåëüíîñòütn èäåò êîãäà åñòü n âëîæåííûõ ïîä-çàïèñåé. Ïðè ýòîì îáúåäèíåíèå òèïîâ íåñåò â ñåáå ïðîáëåìû ñâÿçàííûå ñ íåíàäåæíîñòüþ.
Åñëè çàïèñü íåðàçìå÷åííàÿ, òî íàäåæíîñòü êðàéíå ìàëà, åñëè æå çàïèñü ðàçìå÷åíà, òîèçìåíèâ äèñêðèìèíàíò ìû ìîæåì ñäåëàòü äàëüíåéøèé êîä ïîëíîñòüþíåðàáî÷èì.ßçûê Àäà.type varrec (D:DT) is recordïîñòîÿííàÿ ÷àñòü.case D:DT ofwhen v1 => âàðèàíò 1;when v2|v3 => âàðèàíò 2;when others => âàðèàíò6;end record;type stack (N:integer) isrecord51top : Integer range 1..N = 1;body : array (Integer range 1..N) of real;end record;X:stack (50);type PVARREC isaccess VARREC;p:PVARREC;p= new VARREC (v1); //îáÿçàòåëüíî ÿâíî óêàçàòü ïàðàìåòð. ÎÎÏ è ÷èñòûõ ÎÎßÏ íóæäà â çàïèñè ñ âàðèàíòàìè îòïàäàåò. Îíèîñòàþòñÿ òîëüêî äëÿ ñîâìåñòèìîñòè ñî ñòàðûì êîäîì.
Òî åñòü ïîñòîÿííàÿ÷àñòü base êëàññ. Âàðèàíòíàÿ ÷àñòü êëàññû ïîòîìêè. Ñóùåñòâóåòâàðèàíò íàñëåäîâàíèå ñ ïîëåì òèïà, íî ïðèâîäèò ê âñåì ïðîáëåìàì ñíåíàäåæíîñòüþ, êîòîðûå åñòü ïðè èñïîëüçîâàíèè îáúåäèíåíèé.Âàæíà äèíàìè÷åñêàÿ îáðàáîòêà ìåòîäîâ.  èäåàëå äëÿ ìîäèôèêàöèèíåêîòîðîãî êëàññà ïðè èñïîëüçîâàíèè äèíàìè÷åñêîãî ñâÿçûâàíèÿ òðåáóåòñÿ òîëüêî èñõîäíèêè ñàìîãî êëàññà.Èòàê çàïèñü ñ âàðèàíòàìè ñåé÷àñ (èç - çà ÎÎÏ) ìîæíî ñ÷èòàòü óñòàðåâøåé.
Ïîíÿòèå çàïèñè îáîáùàåòñÿ ïîíÿòèåì êëàññà. Òî åñòü äîáàâëÿþòñÿ ôóíêöèè ÷ëåíû, êîòîðûì íåÿâíî ïåðåäàåòñÿ àäðåñ çàïèñè.  Ñ++ñòðóêòóðà ñòàëà êëàññîì. Îòëè÷èå ìåæäó ñòðóêòóðîé è êëàññîì â äîñòóïå ïî óìîë÷àíèþ. Ñîâìåñòèìîñòü Ñ++ è Ñ îáðàçåö õîðîøåé ñîâìåñòèìîñòè ñ ïðîøëûìè âåðñèÿìè. Ïðè ýòîì áûëî ðåøåíî ìíîæåñòâî ïðîáëåì (íàïðèìåð ïðîáëåìà ñ èìåíîâàíèåì ñòðóêòóð â Ñ). Ïðè ýòîì Ñ++ñèëüíî óñëîæíèëñÿ. Ó òåãîâ ñòðóêòóð â Ñ èìååòñÿ îñîáîå ïðîñòðàíñòâîèìåí, ïðè ýòîì Ñ++ íå ìîã ýòîãî äîïóñòèòü.Îñíîâíàÿ ïðîáëåìà ñî ñòðóêòóðàìè çàãîëîâî÷íûå ôàéëû UNIX íàïèñàííûå íà Ñ, â êîòîðûõ àêòèâíî èñïîëüçóþòñÿ ñòðóêòóðû.Ïðèìåðstruct C{struct B{}b;}struct B b;C::b == b;Ñòðàóñòðóï óòâåðäèë ÷òî ñòðóêòóðû â Ñ++ ïî÷òè ïîëíîñòüþ àíàëî52ãè÷åí êëàññàì, ïðè ýòîì åñëè åñòü êîíôëèêò ñ ñóùåñòâóþùèìè èìåíàìè,òî îí äîïóñòèì, ïðè ýòîì äîñòóï ê ñòðóêòóðå äàëåå âîçìîæåí òîëüêî ÷åðåç ìîäèôèêàòîð struct. Delphi âîïðîñ áûë ðåøåí ïðîùå åñòürecord...end;Êîòîðûå ÿâëÿþòñÿ àíàëîãàìè çàïèñåé ÿçûêà ïàñêàëü.
È åñòüobject...end;Àíàëîãè êëàññîâ.Äëÿ java.  íåì íåò çàïèñåé â èõ îáû÷íîì ñìûñëå, íî åñòü êëàññû.Îòäåëüíî ðàññìîòðèì ÿçûê Ñ#. Struct â Ñ# ýòî íå ñîâñåì òî, ÷òîåñòü â Java. Èì òðåáîâàëàñü ñòðóêòóðà, êàê ïðîñòî ïîñëåäîâàòåëüíîñòüîáúåêòîâ ïîñëåäîâàòåëüíî ðàçìåùåííûõ â ïàìÿòè. Íàïðèìåð:class Point{public int x;public int y;};void DrawLine (Point[] points);Òî åñòü ïåðåäàåòñÿ ìàññèâ óêàçàòåëåé íà îáúåêòû êëàññà. Äëÿ ïåðåäà÷è òðåáóåòñÿ ñîçäàòü ìàññèâ, ïîòîì óíè÷òîæèòü ìàññèâ, ÷òî òðåáóåòîãðîìíûõ çàòðàò ïàìÿòè. Ïðè ýòîì ýòîò ìàññèâ òðåáóåòñÿ òîëüêî äëÿõðàíåíèÿ òî÷åê, òî åñòü íå îïòèìàëüíî èñïîëüçîâàòü êëàññû ïðîñòî êàêêîíòåéíåðû äëÿ îáúåêòîâ.
Ïîýòîìó áûëî ââåäåíî ïîíÿòèå ñòðóêòóðû,ñèíòàêñèñ îáúÿâëåíèÿ ñòðóêòóðû è êëàññà àíàëîãè÷åí, ïðè ýòîì íåò íèêàêèõ îòëè÷èè îò êëàññ (â òîì ÷èñëå è ïðàâà äîñòóïà), êðîìå òîãî ÷òîñòðóêòóðà íå èìååò ðåôåðåíöèàëüíîñòè, òî åñòü îòíîñèòñÿ ê òèïàì çíà÷åíèé è ðàçìåùàåòñÿ íå â äèíàìè÷åñêîé ïàìÿòè. Òî åñòüpoint[] points = new point[1000]; Òî â ñëó÷àå ñòðóêòóðû ýòî áóäåò èìåííîìàññèâ îáúåêòîâ íî íå óêàçàòåëåé. Ïðè ýòîì ðàñïðåäåëåíèå ïàìÿòè èäåòîäíèì êóñêîì. Ñ# íå ñóùåñòâóåò ãëîáàëüíîé ïåðåìåííûõ, çà èñêëþ÷åíèåì èõíåêîòîðûõ àíàëîãîâ ñòàòè÷åñêèõ ÷ëåíîâ êëàññà. Òàê æå íåò ãëîáàëüíûõ ôóíêöèé. Äëÿ òàêèõ ñòðóêòóð îïðåäåëåíû îïåðàöèè ðàçâåðòêè /çàâåðòûâàíèÿ â êëàññû, ÷òî ïîçâîëÿåò ðàáîòàòü ñ íèìè êàê ñ îáû÷íûìèêëàññàìè.Point p1 = o[1];//íåëüçÿ53Point p1 = point(o[1]);// íîðìàëüíîÏðè ýòîì äëÿ ñòðóêòóð íåëüçÿ ïåðåãðóæàòü êîíñòðóêòîð óìîë÷àíèÿ.Ïðè ñîçäàíèè ìàññèâà âñåãäà çàïóñêàåòñÿ êîíñòðóêòîð ïî óìîë÷àíèþäëÿ ñòðóêòóð.
Äëÿ îáúåêòîâ êëàññà òàêîé ïðîáëåìû íåò, òàê êàê òàììîæíî ÿâíî âûçâàòü êîíñòðóêòîð.Äðóãèå òèïû äàííûõ.Ïî èäåå èõ íåò. Åäèíñòâåííûé ßÏ êîòîðûé èìååò äîï òèïû Ïàñêàëü, â êîòîðîì åñòü âñòðîåííûå òèïû è îïåðàöèè ââîäà âûâîäà. Âîñòàëüíûõ ßÏ ýòî ÿâëÿåòñÿ ÷àñòüþ ñòàíäàðòíîé áèáëèîòåêè.Ìíîæåñòâà, òàáëèöû. Ïàñêàëå áûëî ïîíÿòèå ìíîæåñòâà, â ìîäóëå áûëî òàê æå ïîíÿòèå ìíîæåñòâà à òàê æå ïîíÿòèå bitset. Bitset áûë óäîáåí äëÿ ìàíèïóëÿöèè áèòàìè âíóòðè ñëîâà, ïðè ýòîì â Îáåðîíå îñòàëñÿ òîëüêî òèï äàííûõ set(àáñòðàêöèÿ ïîíÿòèÿ ìíîæåñòâà).54Ëåêöèÿ 14.Îïèñàíèå ââîäà âûâîäà òðåáóåò íàëè÷èå ôóíêöèé ñ ïåðåìåííûì ÷èñëîì ïàðàìåòðîâ. Êðèòåðèé ìîùíîñòè ÿçûêà âîçìîæíîñòü íàïèñàòü íàíåì áèáëèîòåêó ââîäà âûâîäà äëÿ íåãî ñàìîãî.Ìíîæåñòâà, òàáëèöû è ïðî÷åå ðåàëèçóþòñÿ èìåííî ñòàíäàðòíîé áèáëèîòåêîé, òàê êàê íåò óíèâåðñàëüíîãî ïðåäñòàâëåíèÿ òàêèõ îáúåêòîâ äëÿâñåõ àðõèòåêòóð.