лекции (2008) (by Kravets) (1160829), страница 11
Текст из файла (страница 11)
Òà æå ñèòóàöèÿ è ñ àëãîðèòìàìè, íàïðèìåð àëãîðèòìàìè ñîðòèðîâêè.Íåñêîëüêî äðóãàÿ ñèòóàöèÿ ñî ñòðîêàìè.  ïàñêàëå ñòðîêà óïàêîâàííûé ìàññèâ ñèìâîëîâ, â Ñ char * , òî åñòü ìàññèâ ñèìâîëîâ, çàêàí÷èâàþùèéñÿ ñèìâîëîì ñ êîäîì 0. Äëÿ íèõ îïðåäåëåíû îïåðàöèè ñðàâíåíèÿíà ðàâåíñòâî è íà áîëüøå /ìåíüøå.  ðàííèõ ÿçûêàõ ïðîãðàììèðîâàíèÿðàáîòà ñî ñòðîêàìè áûëà â ñòàíäàðòíîé áèáëèîòåêå, äàëåå ñ ðàçâèòèåìßÏ ñòðîêè ñòàëè ïåðåõîäèòü â áàçèñ ßÏ. ÿçûêå Àäà åñòü òèï äàííûõ STRING íåîãðàíè÷åííûé ìàññèâ, òîåñòü ÷òîá îáúÿâèòü ñòðîêó òðåáóåòñÿ óêàçàòü äèàïàçîí.Äëÿ ñòðîê åñòü íàáîð ÷àñòî âñòðå÷àþùèõñÿ îïåðàöèé, êîòîðûå ëåãêîðåàëèçóþòñÿ íà ÿçûêå àäà. Íàïðèìåð ÷àñòü îïåðàöèé ðåàëèçóåòñÿ íàâûðåçêå ìàññèâîâ.
Òàê æå åñòü íåïðèÿòíàÿ îïåðàöèÿ êîíêàòåíàöèÿ,(operator+).  ÿçûêå Àäà åñòü âîçìîæíîñòü ïåðåîïðåäåëåíèÿ îïåðàöèé,òî åñòü òèï STRING ðåàëèçîâàí êàê êëàññ ñòàíäàðòíîé áèáëèîòåêè, êàê÷àñòíûé ñëó÷àé ìàññèâà. Îòëè÷èå áàçèñà ßÏ îò ñòàíäàðòíîé áèáëèîòåêèâ òîì, ÷òî áàçèñ ÿçûêà âñòðîåí â êîìïèëÿòîð, à ñòàíäàðòíàÿ áèáëèîòåêà ïðîñòî íàáîð äîêóìåíòîâ.Ñ++ - îäèí èç íåìíîãèõ ßÏ â êîòîðîì ñòðîêè íå âêëþ÷åíû â áàçèñÿçûêà, à åñòü ñòàíäàðòíûé áèáëèîòå÷íûé êëàññ std::string.  Ñ++ åñòüâîçìîæíîñòü ïåðåêðûòèÿ âñåõ îïåðàöèé, ÷òî ÿâëÿëîñü íåîáõîäèìûì òðåáîâàíèåì ê ðåàëèçàöèè ñòàíäàðòíîãî êëàññà.Íà ñàìîì äåëå, ñòðîêà î÷åíü ÷àñòíûé ñëó÷àé äèíàìè÷åñêîãî ìàññèâà, íî èç-çà ðàçëè÷èÿ â òðåáîâàíèÿõ ê ñòðîêàì è ê ìàññèâàì, ñòðîêàíå ðåàëèçîâàíà êàê std::vector<char>.  îñíîâíîì ê ñòðîêàì ïðèìåíèìûîïåðàöèè êîïèðîâàíèÿ è êîíêàòåíàöèè/âûðåçêè.
 Ñ++ åñòü òðè âèäà ìàññèâîâ std::vector, std::valarray, std::string.  Ñ++ âñå ýòî ìîãëîáûòü è áûëî ðåàëèçîâàíî èñêëþ÷èòåëüíî íà ìåõàíèçìå êëàññîâ. ÒÎ æåñàìîå íåëüçÿ òàê æå ñäåëàòü íà Java èëè Delphi. Òàê êàê òàì âñå ýòîðåàëèçóåòñÿ êîìïèëÿòîðîì. Àíàëîãè÷íî â ÿçûêå Ñ#, ïðè ýòîì ïðèìåðàñòàíäàðòíîãî êëàññà Java âñòðîåííûé â Java áèáëèîòåêó àðõèâàòîð.Òàêèì îáðàçîì ñåé÷àñ ñòàðàþòñÿ óïðîùàòü áàçèñ, âûíîñÿ âñå â ñòàíäàðòíóþ áèáëèîòåêó, èñêëþ÷åíèå ñòðîêè, òàê êàê äëÿ íèõ âàæíà ñêîðîñòü ðàáîòû.55Ïóíêò 5. Î åäèíñòâå ÑÒÄ.Ìàññèâû îïåðàöèÿ [] (èíäåêñàöèÿ)Ìîæåò áûòü ïåðåîïðåäåëåíà â Ñ++, Delphi (íåòðèâèàëüíî), C#(÷åðåçèíäåêñàòîð).Çàïèñè îïåðàöèÿ . (Äîñòóï ïî èìåíè ïîëÿ)Íåëüçÿ ïåðåîïðåäåëÿòü â Ñ++.
Êàê îïðåäåëèòü àðãóìåíò è âîçâðàùàåìîå çíà÷åíèå ýòîé îïåðàöèè? Ïî õîðîøåìó àðãóìåíòîì äîëæíî áûòüñìåùåíèå îò íà÷àëà çàïèñè.  íåêîòîðûõ ÿçûêàõ äëÿ âñåõ îáúåêòîâ îïðåäåëåíà îïåðàöèÿ []. Òî÷êà òîãäà òðàêòóåòñÿ êàê [¾name¿]. Òî åñòü òàêèìîáðàçîì áûëè îòîæäåñòâëåíû çàïèñè è ìàññèâû. Òàêèì îáðàçîì â Javascript obj [0] îáðàùåíèå ñàìîìó ïåðâîìó ÷ëåíó çàïèñè. ÷èñòî èíòåðïðåòèðóåìûõ ÿçûêàõ ìîæíî ïîçâîëèòü ìàññèâàì áûòüïîëíîñòüþ äèíàìè÷åñêèìè.
Òàêèì îáðàçîì ìîæíî äîáàâèòü íåêîòîðûåñâîéñòâà çàïèñÿì, ÷òî óâåëè÷èò ãèáêîñòü ÿçûêà, íî çà ñ÷åò ãèáêîñòè èíàäåæíîñòè.Ãëàâà 3.Óïðàâëåíèÿ ïîñëåäîâàòåëüíîñòüþ äåéñòâèé. Îïåðàòîðíûé áàçèñ ßÏ.Ôóíäàìåíòàëüíûå áàçèñíûå ïîíÿòèÿ äàííûå (ñîñòîÿíèÿ) è óïðàâëåíèå äàííûìè ( ïåðåõîäîì èç ñîñòîÿíèÿ â ñîñòîÿíèå). ÒðàäèöèîííûåßÏ îðèåíòèðîâàííû íà ïîòîê óïðàâëåíèÿ.Ýâîëþöèÿ ïîíÿòèÿ ïîòîêà óïðàâëåíèÿ. Òðàäèöèîííî ðàçëè÷àþò òðèóðîâíÿ ïîòîêà óïðàâëåíèÿ1.Âíóòðè âûðàæåíèÿ.2.Ìåæäó îïåðàòîðàìè.3.Ìåæäó ìîäóëÿìè.Íàä êàæäûì ÒÄ åñòü íàáîð îïåðàöèé.
Ïîòîê óïðàâëåíèÿ ïîðÿäîêâû÷èñëåíèÿ îïåðàöèé, îïðåäåëÿåòñÿ ïðèîðèòåòîì îïåðàöèé. Áîëåå èíòåðåñíûé âîïðîñ, êîãäà ïðèîðèòåòîâ íåò. Òî åñòü íàïðèìåð â a+b â êàêîìïîðÿäêå áóäóò âû÷èñëÿòüñÿ îïåðàíäû âûðàæåíèé. Áîëüøèíñòâî ßÏ ãîâîðÿò ÷òî åñëè ïðîãðàììà çàâèñèò îò ïîðÿäêà âû÷èñëåíèÿ îïåðàíäîâ, òîòàêàÿ ïðîãðàììà íå ñ÷èòàåòñÿ ñòàíäàðòèçîâàííîé. Ýòî íå ðàñïðîñòðàíÿåòñÿ íà ëîãè÷åñêèå âûðàæåíèÿ. Íàïðèìåð:While (A[i] <> X) and (I < N) do Inc(I) end;Çäåñü îøèáêà âûõîä çàãðàíèöó èíäåêñà.Åñëè êîìïèëÿòîð èìååò ïðàâî âû÷èñëÿòü âûðàæåíèå â ïðîèçâîëüíîìïîðÿäêå, òî ïðîãðàììà ñòàíîâèòñÿ ìåíåå êðàñèâîé.
Èíîãäà èìååò ñìûñë56çàôèêñèðîâàòü ¾ëåíèâîñòü âû÷èñëåíèé¿.  Îïèñàíèè ÿçûêà Àäà ïðåäëàãàëîñü ââåñëè ëåíèâûå ëîãè÷åñêèå îïåðàöèè 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 S257èëèif (B){if (B2) S1else S2}Ïî ñòàíäàðòó âåðíà âòîðàÿ ñòðóêòóðà. Äëÿ ïåðâîé íóæíî ââîäèòüäîï ñêîáêè. Ñ/Ñ++ Ñ#Java ïðèíÿëè òàêóþ èäåîëîãèþ. Àëüòåðíàòèâà ÿçûê Àäà, ìîäóëà-2, VB, Îáåðîí. Òàì îòêàçàëèñü îò ïîíÿòèÿ ñîñòàâíîãî îïåðàòîðà, òî åñòü òðåáóåòñÿ ÿâíûå òåðìèíàòîð êàæäîãî îïåðàòîðà.<oper>...end<oper>.58Ëåêöèÿ 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;59Ïîýòîìó îáû÷íî èñïîëüçóåòñÿ òàêàÿ çàïèñü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 íå óäîâëÿòâîðÿåò íè îäíîìóâàðèàíòó íå îïðåäåëåíåí.
Íî âî âñåõ ðåàëèçàöèÿ îáû÷íî ñïåöèôèöèðóþò, ÷òî ïðîñòî íè÷åãî íå âûïîëíÿåòñÿ (ýêâèâåëåíòíî ïóñòîìó îïåðàòîðó,åñëè Expr íå èìååò ïîáî÷íûõ ýôôåêòîâ). ìîäóëà - 2 ñèíòàêñèñ íåñêîëüêî äðóãîéCASE EXPR OFñïèñîê âàðèàíòîâ ÷åðåç|{ELSEîïåðàòîðû }end ÿçûêå Àäàcase Expr of60when óñëîâèÿ => îïåðàòîðû//....{when other => îïåðàòîðû}end case; ÿçûêå Ñswitch (Expr) SÏðè ýòîì case 0:case 1:case 2: - ìåòêè ñ êîíñòàíòàìè.
Åñëè îòûñêàëàñü ìåòêà ñ ñîîòâåñòâóþùèì çíå÷åíèåì êîíñòàíòû, ïåðåõîäèò ïåðåõîäê ýòîé ìåòêå, íî íå âûáîð ñîîòâåñòâóþùåãî ôðàãìåíòà êîäà. Òî åñòü,îñíîâíàÿ ïðîáëåìà òàêîãî îïåðàòîðà, çàáûòûå îïåðàòîðû break, èç - çà÷åãî ïðîèñõîäÿò èíòåðåñíûå îøèáêè â ïðîãðàììàõ.Èíòåðåñíîå ðåøåíèå áûëî ïðèíÿòî â ÿçûêå C#, òàì â ñëó÷àé îòñóòñòâèÿ break, êîìïèëÿòîð âûäàåò îøèáêó, òî åñòü ñåìàíòèêà îïåðàòîðàswitch ýêâèâåëåòíà ñâîåìó àíàëîãó â Ïàñêàëå.Åñëè â ñïèñîê êîíñòàíò íå âõîäèò çíà÷åíèå Expr òî âûïîëíÿåòñÿ ìåòêà default, è åñëè åå íåò, òî ïîëó÷àåì ïóñòîé îïåðàòîð.Îñòàëèñü åùå îïåàðòîðû öèêëà. Ñòðóêòóðà îïåðàòîðîâ öèêëà ñòàáèëèçèðîâàëàñü.
Ïðè ýòîì ïðèíöèï ñòðóêòóðíîãî ïðîãðàììèðîâàíèÿ - ïðîãðàììèðîâàíèÿ â ïðèíöèïàõ óïðàâëÿþùèõ ñòðóêòóð. Ðàññìîòðìè ñòàíäàðòíûé íàáîð öèêëîâ (íàïðèìåð ÿçûêà ïàñêàëü).while B do S;repeat S1;..SN; until B;forÏðè ýòîì â 1974 ãîäó - "Ñòðóêòóðíîå ïðîãðàììèðîâàíèÿ ñ îïåðàòîðîì goto"Èäåÿ ñòàòüè - ïñòðóêòóðà ïðîãðàììû äîëæíà ñîîòâåñòâîâàòü ñòðóêòóðåàëãîðèòìà. Òî åñòü ìîæíî ñòðóêòóðíî ïðîãðàììèðîâàòü äàæå íà Ôîðòðàíå, èñïîëüçóþ ëèøü òîëüêî goto.
Òî åñòü ìíîãèå çàäà÷è äàæå áîëååóäîáíû ñ èñïîëüçîâàíèåì goto.Àíàëîãè÷íî â Ìîäóëà - 2WHILE B DO ... END;REPEAT ... UNTIL B;LOOP ... END;Òðåòèé îïåðàòîð èìååò ñìûñë ëèáî â ïàðàëëåëüíîì ïðîãðàììèðîâàíèè, ëèáî âìåñòå ñ îïåðàòîðîì EXIT - àíàëîã break òîëüêî äëÿ îïåðàòîðàLOOP (ïðèíöèì ìèíèìàëèçìà). Ýòà æå ñèòóàöèÿ ñîõðàíèëàñü â Îáåðîíå61è Îáåðîíå - 2. äðóãèõ ÿçûêàõ ïðîãðàììèðîâàíèÿ ïîõîæàÿ ñèòóàöèÿ. ßçûê Àäàwhile B loop....end loop;forloop ....