лекции (2008) (by Kravets) (укороченное) (1160827), страница 11
Текст из файла (страница 11)
 îñòàëüíûõ ßÏ ýòî ÿâëÿåòñÿ ÷àñòüþ ñòàíäàðòíîé áèáëèîòåêè.Ìíîæåñòâà, òàáëèöû. Ïàñêàëå áûëî ïîíÿòèå ìíîæåñòâà, â ìîäóëå áûëî òàê æå ïîíÿòèå ìíîæåñòâà à òàê æå ïîíÿòèå bitset.Bitset áûë óäîáåí äëÿ ìàíèïóëÿöèè áèòàìè âíóòðè ñëîâà, ïðè ýòîì â Îáåðîíå îñòàëñÿ òîëüêî òèï äàííûõset (àáñòðàêöèÿ ïîíÿòèÿ ìíîæåñòâà).31Ëåêöèÿ 14.Îïèñàíèå ââîäà âûâîäà òðåáóåò íàëè÷èå ôóíêöèé ñ ïåðåìåííûì ÷èñëîì ïàðàìåòðîâ.
Êðèòåðèé ìîùíîñòèÿçûêà âîçìîæíîñòü íàïèñàòü íà íåì áèáëèîòåêó ââîäà âûâîäà äëÿ íåãî ñàìîãî.Ìíîæåñòâà, òàáëèöû è ïðî÷åå ðåàëèçóþòñÿ èìåííî ñòàíäàðòíîé áèáëèîòåêîé, òàê êàê íåò óíèâåðñàëüíîãîïðåäñòàâëåíèÿ òàêèõ îáúåêòîâ äëÿ âñåõ àðõèòåêòóð. Òà æå ñèòóàöèÿ è ñ àëãîðèòìàìè, íàïðèìåð àëãîðèòìàìèñîðòèðîâêè.Íåñêîëüêî äðóãàÿ ñèòóàöèÿ ñî ñòðîêàìè.  ïàñêàëå ñòðîêà óïàêîâàííûé ìàññèâ ñèìâîëîâ, â Ñ char * ,òî åñòü ìàññèâ ñèìâîëîâ, çàêàí÷èâàþùèéñÿ ñèìâîëîì ñ êîäîì 0. Äëÿ íèõ îïðåäåëåíû îïåðàöèè ñðàâíåíèÿ íàðàâåíñòâî è íà áîëüøå /ìåíüøå.
 ðàííèõ ÿçûêàõ ïðîãðàììèðîâàíèÿ ðàáîòà ñî ñòðîêàìè áûëà â ñòàíäàðòíîéáèáëèîòåêå, äàëåå ñ ðàçâèòèåì ßÏ ñòðîêè ñòàëè ïåðåõîäèòü â áàçèñ ßÏ. ÿçûêå Àäà åñòü òèï äàííûõ STRING íåîãðàíè÷åííûé ìàññèâ, òî åñòü ÷òîá îáúÿâèòü ñòðîêó òðåáóåòñÿóêàçàòü äèàïàçîí.Äëÿ ñòðîê åñòü íàáîð ÷àñòî âñòðå÷àþùèõñÿ îïåðàöèé, êîòîðûå ëåãêî ðåàëèçóþòñÿ íà ÿçûêå àäà. Íàïðèìåð ÷àñòü îïåðàöèé ðåàëèçóåòñÿ íà âûðåçêå ìàññèâîâ. Òàê æå åñòü íåïðèÿòíàÿ îïåðàöèÿ êîíêàòåíàöèÿ,(operator+).  ÿçûêå Àäà åñòü âîçìîæíîñòü ïåðåîïðåäåëåíèÿ îïåðàöèé, òî åñòü òèï STRING ðåàëèçîâàí êàêêëàññ ñòàíäàðòíîé áèáëèîòåêè, êàê ÷àñòíûé ñëó÷àé ìàññèâà.
Îòëè÷èå áàçèñà ßÏ îò ñòàíäàðòíîé áèáëèîòåêèâ òîì, ÷òî áàçèñ ÿçûêà âñòðîåí â êîìïèëÿòîð, à ñòàíäàðòíàÿ áèáëèîòåêà ïðîñòî íàáîð äîêóìåíòîâ.Ñ++ - îäèí èç íåìíîãèõ ßÏ â êîòîðîì ñòðîêè íå âêëþ÷åíû â áàçèñ ÿçûêà, à åñòü ñòàíäàðòíûé áèáëèîòå÷íûé êëàññ std::string.  Ñ++ åñòü âîçìîæíîñòü ïåðåêðûòèÿ âñåõ îïåðàöèé, ÷òî ÿâëÿëîñü íåîáõîäèìûìòðåáîâàíèåì ê ðåàëèçàöèè ñòàíäàðòíîãî êëàññà.Íà ñàìîì äåëå, ñòðîêà î÷åíü ÷àñòíûé ñëó÷àé äèíàìè÷åñêîãî ìàññèâà, íî èç-çà ðàçëè÷èÿ â òðåáîâàíèÿõê ñòðîêàì è ê ìàññèâàì, ñòðîêà íå ðåàëèçîâàíà êàê std::vector<char>.  îñíîâíîì ê ñòðîêàì ïðèìåíèìûîïåðàöèè êîïèðîâàíèÿ è êîíêàòåíàöèè/âûðåçêè.
 Ñ++ åñòü òðè âèäà ìàññèâîâ std::vector, std::valarray,std::string.  Ñ++ âñå ýòî ìîãëî áûòü è áûëî ðåàëèçîâàíî èñêëþ÷èòåëüíî íà ìåõàíèçìå êëàññîâ. ÒÎ æåñàìîå íåëüçÿ òàê æå ñäåëàòü íà Java èëè Delphi. Òàê êàê òàì âñå ýòî ðåàëèçóåòñÿ êîìïèëÿòîðîì. Àíàëîãè÷íîâ ÿçûêå Ñ#, ïðè ýòîì ïðèìåðà ñòàíäàðòíîãî êëàññà Java âñòðîåííûé â Java áèáëèîòåêó àðõèâàòîð.Òàêèì îáðàçîì ñåé÷àñ ñòàðàþòñÿ óïðîùàòü áàçèñ, âûíîñÿ âñå â ñòàíäàðòíóþ áèáëèîòåêó, èñêëþ÷åíèå ñòðîêè, òàê êàê äëÿ íèõ âàæíà ñêîðîñòü ðàáîòû.Ïóíêò 5. Î åäèíñòâå ÑÒÄ.Ìàññèâû îïåðàöèÿ [] (èíäåêñàöèÿ)Ìîæåò áûòü ïåðåîïðåäåëåíà â Ñ++, Delphi (íåòðèâèàëüíî), C#(÷åðåç èíäåêñàòîð).Çàïèñè îïåðàöèÿ . (Äîñòóï ïî èìåíè ïîëÿ)Íåëüçÿ ïåðåîïðåäåëÿòü â Ñ++.
Êàê îïðåäåëèòü àðãóìåíò è âîçâðàùàåìîå çíà÷åíèå ýòîé îïåðàöèè? Ïîõîðîøåìó àðãóìåíòîì äîëæíî áûòü ñìåùåíèå îò íà÷àëà çàïèñè.  íåêîòîðûõ ÿçûêàõ äëÿ âñåõ îáúåêòîâîïðåäåëåíà îïåðàöèÿ []. Òî÷êà òîãäà òðàêòóåòñÿ êàê [¾name¿]. Òî åñòü òàêèì îáðàçîì áûëè îòîæäåñòâëåíûçàïèñè è ìàññèâû. Òàêèì îáðàçîì â Java-script obj [0] îáðàùåíèå ñàìîìó ïåðâîìó ÷ëåíó çàïèñè. ÷èñòî èíòåðïðåòèðóåìûõ ÿçûêàõ ìîæíî ïîçâîëèòü ìàññèâàì áûòü ïîëíîñòüþ äèíàìè÷åñêèìè. Òàêèìîáðàçîì ìîæíî äîáàâèòü íåêîòîðûå ñâîéñòâà çàïèñÿì, ÷òî óâåëè÷èò ãèáêîñòü ÿçûêà, íî çà ñ÷åò ãèáêîñòè èíàäåæíîñòè.Ãëàâà 3.Óïðàâëåíèÿ ïîñëåäîâàòåëüíîñòüþ äåéñòâèé.
Îïåðàòîðíûé áàçèñ ßÏ.Ôóíäàìåíòàëüíûå áàçèñíûå ïîíÿòèÿ äàííûå (ñîñòîÿíèÿ) è óïðàâëåíèå äàííûìè ( ïåðåõîäîì èç ñîñòîÿíèÿ â ñîñòîÿíèå). Òðàäèöèîííûå ßÏ îðèåíòèðîâàííû íà ïîòîê óïðàâëåíèÿ.Ýâîëþöèÿ ïîíÿòèÿ ïîòîêà óïðàâëåíèÿ. Òðàäèöèîííî ðàçëè÷àþò òðè óðîâíÿ ïîòîêà óïðàâëåíèÿ1.Âíóòðè âûðàæåíèÿ.2.Ìåæäó îïåðàòîðàìè.3.Ìåæäó ìîäóëÿìè.Íàä êàæäûì ÒÄ åñòü íàáîð îïåðàöèé.
Ïîòîê óïðàâëåíèÿ ïîðÿäîê âû÷èñëåíèÿ îïåðàöèé, îïðåäåëÿåòñÿïðèîðèòåòîì îïåðàöèé. Áîëåå èíòåðåñíûé âîïðîñ, êîãäà ïðèîðèòåòîâ íåò. Òî åñòü íàïðèìåð â a+b â êàêîìïîðÿäêå áóäóò âû÷èñëÿòüñÿ îïåðàíäû âûðàæåíèé. Áîëüøèíñòâî ßÏ ãîâîðÿò ÷òî åñëè ïðîãðàììà çàâèñèò îòïîðÿäêà âû÷èñëåíèÿ îïåðàíäîâ, òî òàêàÿ ïðîãðàììà íå ñ÷èòàåòñÿ ñòàíäàðòèçîâàííîé. Ýòî íå ðàñïðîñòðàíÿåòñÿ íà ëîãè÷åñêèå âûðàæåíèÿ. Íàïðèìåð:While (A[i] <> X) and (I < N) do Inc(I) end;Çäåñü îøèáêà âûõîä çàãðàíèöó èíäåêñà.32Åñëè êîìïèëÿòîð èìååò ïðàâî âû÷èñëÿòü âûðàæåíèå â ïðîèçâîëüíîì ïîðÿäêå, òî ïðîãðàììà ñòàíîâèòñÿìåíåå êðàñèâîé. Èíîãäà èìååò ñìûñë çàôèêñèðîâàòü ¾ëåíèâîñòü âû÷èñëåíèé¿.  Îïèñàíèè ÿçûêà Àäà ïðåäëàãàëîñü ââåñëè ëåíèâûå ëîãè÷åñêèå îïåðàöèè andthen orelse.
Íî â ðåçóëüòàòå ïðîñòî áûëà çàôèêñèðîâàíàëåíèâîñòü âû÷èñëåíèÿ âñåõ ëîãè÷åñêèõ âûðàæåíèé.Ïðîãðàììèðîâàíèå áåç ïîáî÷íûõ ýôôåêòîâ ïîçâîëèò ïîëíîñòüþ óñòðàíèòü ýòó ïðîáëåìû äëÿ àðèôìåòè÷åñêèõ âû÷èñëåíèé. Ïðè ýòîì â ôóíêöèîíàëüíûõ ßÏ ïîáî÷íûõ ýôôåêòîâ áûòü íå ìîæåò ïî îïðåäåëåíèþ.Ýâîëþöèÿ â íà÷àëà ïîä ïîòîêîì óïðàâëåíèÿ ïîäðàçóìåâàëè ïðîèçâîëüíóþ ïåðåäà÷ó óïðàâëåíèÿ âäðóãóþ òî÷êó ïðîãðàììû ïî îïåðàòîðó goto. Ñèòóàöèÿ ñòàëà ìåíÿòüñÿ êîãäà ñòàëè ïèñàòü áîëåå ñëîæíûåïðîãðàììû íàïðèìåð ÎÑ.  1967 ãîäó Äåéêñòðà îïóáëèêîâàë ñâîþ ñòàòüþ - ¾Î âðåäå îïåðàòîðà goto¿.
Ýòîáûëà ðåâîëþöèîííàÿ ñòàòüÿ. Äî ýòîãî ðàçðàáîò÷èêè ßÏ ñòàðàëèñü äàòü ïðîãðàììèñòàì êàê ìîæíî áîëüøåâîçìîæíîñòåé,ïðè ýòîì îñíîâíàÿ ìûñëü Äåéêñòðû - ïðîãðàììèðîâàíèÿ ñ ïîìîùüþ ìåíüøåãî êîëè÷åñòâàñðåäñòâ ìîæåò ñòàòü áîëåå îñìûñëåííûì è ïðîñòûì. Îí ââåë ïîíÿòèå ñòðóêòóðíîãî ïðîãðàììèðîâàíèÿ, òîåñòü ïðîãðàììèðîâàíèÿ íà îñíîâå áëîêîâ. Èäåÿ ïðîãðàììèðîâàíèÿ íå ïðîñòî èçîáðåòåíèÿ àëãîðèòìà èëèåãî çàïèñè, íî ñîáñòâåííî â ¾èçîáðåòåíèè¿. Ýòà ñòàòüÿ ïîëîæèëà íà÷àëî äèñöèïëèíå, íàçâàííîé Òåõíîëîãèåéïðîãðàììèðîâàíèÿ. 1968 ïîÿâèëàñü ñòàòüÿ ¾Çàìåòêè î ñòðóêòóðíîì ïðîãðàììèðîâàíèè¿, ñòàòüÿ î ïîäïðîãðàììàõ, êîòîðûéïðîèçâåë ðåâîëþöèþ â ïðîãðàììèðîâàíèè. Ëþáóþ îïåðàòîðíóþ ñõåìó ìîæíî ðåàëèçîâàòü ñ èñïîëüçîâàíèåîïåðàòîðàa;bwhile B do SÎñòàëüíûå ìîãóò áûòü ðåàëèçîâàíû íà áàçå ýòèõ àáñòðàêöèé.
Äàëåå âñå ÿçûêè âîñïðèíÿëè ýòè ïðèíöèïû ïðèíöèïû Ñòðóêòóðíîãî ïðîãðàììèðîâàíèÿ.Àëüòåðíàòèâû goto öèêëû, âåòâëåíèÿ.Äâóñòîðîííåå âåòâëåíèå if(<smth>) S1 else S2;Ïðîáëåìà if B then if B2 then S1 else S2;Òî åñòüif(B){if (B2) S1}else S2èëèif (B){if (B2) S1else S2}Ïî ñòàíäàðòó âåðíà âòîðàÿ ñòðóêòóðà. Äëÿ ïåðâîé íóæíî ââîäèòü äîï ñêîáêè. Ñ/Ñ++ Ñ#Java ïðèíÿëèòàêóþ èäåîëîãèþ. Àëüòåðíàòèâà ÿçûê Àäà, ìîäóëà-2, VB, Îáåðîí. Òàì îòêàçàëèñü îò ïîíÿòèÿ ñîñòàâíîãîîïåðàòîðà, òî åñòü òðåáóåòñÿ ÿâíûå òåðìèíàòîð êàæäîãî îïåðàòîðà.
<oper>...end<oper>.33Ëåêöèÿ 15.Îïåðàòîðíûé áàçèñ ßÏ.Îñíîâíàÿ ïðîáëåìà îïåðàòîðîâ âåòâëåíèÿ - ïðîáëåìà âëîæåííîñòè. Ïðàâèëà âëîæåííîñòè - ñì ïðîøëóþëåêöèþ. Ýòà ïðîáëåìà ÿâëÿåòñÿ ÷àñòíûì ñëó÷àåì ïðîáëåìû, êîòîðàÿ âîçíèêàå êîãäà ïî ñèíòàêñèñó òðåáóåòñÿîäèí îïåðàòîð, à ïî ñìûñëó - íåñêîëüêî. Äëÿ ýòîãî áûëî ââåäåíî ïîíÿòèå ñîñòàâíîãî îïåðàòîðà.Àëüòåðíàòèâíîå ðåøåíèå - çàìûêàíèå îïåðàòîðà. Òî åñòü ëþáîé îïåðàòîð, êîòîðûé ìîæåò ñîäåðæàòüäðóãèå îïåðàòîðû, òðåáóåò ÿâíîãî îáúÿâëåíèÿ êîíöà îïåðàòîðà.È òîãäà ïðîáëåìà âëîæåííîñòè ëåãêî ðåøàåòñÿ ïóòåì ÿâíîãî óêàçàíèÿ êîíöà îïåðàòîðà.Íàïðèìåðif B1 thenS11;S12;S13;endifÏîòîì ìíîãèå ßÏ ïåðåíÿëè ýòó ñòðóêòóðó, ðàçðàáîòàííóþ äëÿ Àëãîëà - 60.
Ïðè ýòîì, â ÿçûêå Àäà åòñëîâà end, òàì îáÿçàòåëüíî òðåáóåòñÿ ÿâíîå óêàçàíèå òîãî, ÷òî èìåííî çàêàí÷èâàåòñÿ. Íàïðèìåð, endif.Ìíîãîâàðèàíòíîå âåòâëåíèåÂî ìíîãèõ ÿçûêàì ìíîãîâàðèàíòíîå âåòâëåíèå âûïîëíÿåòñÿ çà ñ÷åò âëîæåííîñòè. Òî åñòü ìîæåò ìîäåëèðîâàòüñÿ ñ ïîìîùüþ ïîñëåäîâàòåëüíîñòè âîïðîñîâ.if B1 thenS1elseif B2 thenS2else//...Ïðè ýòîì âëîæåííûå ñòðóêòóðû êðàéíå ïëîõî âîñïðèíèìàþòñÿ ÷åëîâåêîì. Åìó ïðîùå âîñïðèíèìàò ñòðóêòóðû òèïàif B1 then S1;if B2 then S2;if B3 then S3;Ïîýòîìó îáû÷íî èñïîëüçóåòñÿ òàêàÿ çàïèñüif (B1)S1;else if (B2)S2;else if (B3)S3;elseÏðè ýòîì ÷òîá çàêîí÷èòü ïîäîáíóþ ñòðóêòóðó íà ÿçûêå Àäà, òðåáóåòñÿ íàïèñàòü îãðîìíîå êîëè÷åñòâîendif, ÷òî óñëîæíÿåò íàïèñàíè è ÷èòàáåëüíîñòü ïðîãðàììû. Òàêèì îáðàçîì, òðåáóåòñÿ îïåðàòîð âûáîðà.
Âÿçûêå Àäà åñòü ñïåööèàëüíûå îïåðàòîð elsif, â ÿçûêå ìîäóëà - 2 ELIFif B1 thenseq1elsif B2 thenseq2...elsif Bn thenseqnÐàññìîòðèì îòäåëüíî îäèí ÷àñòíûé ñëó÷àé - îïåðàòîð äèñêðåòíîãî âûáîðà (îïåðàòîð - ïåðåêëþ÷àòåëü).case Expr of//ñïèñîê âàðèàíòîâendÏðè ýòîì ïîâåäåíèå ïðîãðàììû, êîãäà Expr íå óäîâëÿòâîðÿåò íè îäíîìó âàðèàíòó íå îïðåäåëåíåí. Íî âî âñåõ34ðåàëèçàöèÿ îáû÷íî ñïåöèôèöèðóþò, ÷òî ïðîñòî íè÷åãî íå âûïîëíÿåòñÿ (ýêâèâåëåíòíî ïóñòîìó îïåðàòîðó,åñëè Expr íå èìååò ïîáî÷íûõ ýôôåêòîâ). ìîäóëà - 2 ñèíòàêñèñ íåñêîëüêî äðóãîéCASE EXPR OFñïèñîê âàðèàíòîâ ÷åðåç|{ELSEîïåðàòîðû }end ÿçûêå Àäàcase Expr ofwhen óñëîâèÿ => îïåðàòîðû//....{when other => îïåðàòîðû}end case; ÿçûêå Ñswitch (Expr) SÏðè ýòîì case 0:case 1:case 2: - ìåòêè ñ êîíñòàíòàìè. Åñëè îòûñêàëàñü ìåòêà ñ ñîîòâåñòâóþùèì çíå÷åíèåì êîíñòàíòû, ïåðåõîäèò ïåðåõîä ê ýòîé ìåòêå, íî íå âûáîð ñîîòâåñòâóþùåãî ôðàãìåíòà êîäà.
Òî åñòü,îñíîâíàÿ ïðîáëåìà òàêîãî îïåðàòîðà, çàáûòûå îïåðàòîðû break, èç - çà ÷åãî ïðîèñõîäÿò èíòåðåñíûå îøèáêèâ ïðîãðàììàõ.Èíòåðåñíîå ðåøåíèå áûëî ïðèíÿòî â ÿçûêå C#, òàì â ñëó÷àé îòñóòñòâèÿ break, êîìïèëÿòîð âûäàåò îøèáêó, òî åñòü ñåìàíòèêà îïåðàòîðà switch ýêâèâåëåòíà ñâîåìó àíàëîãó â Ïàñêàëå.Åñëè â ñïèñîê êîíñòàíò íå âõîäèò çíà÷åíèå Expr òî âûïîëíÿåòñÿ ìåòêà default, è åñëè åå íåò, òî ïîëó÷àåìïóñòîé îïåðàòîð.Îñòàëèñü åùå îïåàðòîðû öèêëà. Ñòðóêòóðà îïåðàòîðîâ öèêëà ñòàáèëèçèðîâàëàñü.