лекции (2008) (by Kravets) (укороченное) (1160827), страница 12
Текст из файла (страница 12)
Ïðè ýòîì ïðèíöèïñòðóêòóðíîãî ïðîãðàììèðîâàíèÿ - ïðîãðàììèðîâàíèÿ â ïðèíöèïàõ óïðàâëÿþùèõ ñòðóêòóð. Ðàññìîòðìèñòàíäàðòíûé íàáîð öèêëîâ (íàïðèìåð ÿçûêà ïàñêàëü).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 (ïðèíöèì ìèíèìàëèçìà). Ýòà æå ñèòóàöèÿ ñîõðàíèëàñü â Îáåðîíåè Îáåðîíå - 2. äðóãèõ ÿçûêàõ ïðîãðàììèðîâàíèÿ ïîõîæàÿ ñèòóàöèÿ.
ßçûê Àäàwhile B loop....end loop;forloop .... end loop;Òàê æå òàì ïðèñóòñòâóåò îïåðàòîð exit, ïðè ýòîì òàì äîïóñòèìà âòîðàÿ ôîðìàwhen óñëîâèå => exit;È ýòî óñëîâèå ìîæíî ïîñòàâèòü â êîíöå öèêëà.Ðàññìîòðèÿ ÿçûê Ñ. Òàì ïðàêòè÷åñêè òîò æå íàáîð îïåðàòîðîâ.35while (B) Sdo S while (B);forÏðèñóòòâóþò òàê æå îïåðàòîðû break è continue (îñîáûå ñëó÷àè îïåðàòîðà goto).Ðàññìîòðìè òàê æå îïåðàòîð return - ÷àñòíûé ñëó÷àé îïåðàòîðà ïåðåäà÷è óïðàâëåíèÿ.
Äàëåå â ÿçûêå javaåñòü âîçìîæíîñòü âûõîäà ïî break ïî ìåòêå. Òî åñòü âûõîä ïî break <label> âûõäèò èç òîãî öèêëà, êîòîðûéïîìå÷åí ìåòêîé. Äðóãîé âàðèàíò - èñïîëüçîâàíèå èñêëþ÷åíèé (î÷åíü ïëîõî - íåëüçÿ òàê ïèñàòü).Áåç goto ìîæíî ïðîãðàììèðîâàòü, òàê êàê çà 13 ëåò îí òàê è íå ïîÿâèëñÿ â java.Ðàññîòðèì öèêë for, îí áûë èçîáðåòåí ñîçäàòåëÿìè ÿçûêà Àëãîë.
Öèêë for ïîÿâèëñÿ â Ïàñêàëå â âèäå forv:= e1 to e2 do S;Ïðè÷åì e1 è e2 âû÷èñëÿëèñü îäèí ðàç. Èíòåðåñíî, ÷òî â ÿçûêå ìîäóëà - 2 öèêë for áîëüøåñîîòâåñòâîâàë âàðèàíòó Àëãîëà, ÷åì Ïàñêàëÿ, òî åñòü òàì ïîçâîëÿëîñü çàäàâàòü øàã öèêëà.1988 - Îáåðîí - óáðàëè öèêë for.1993 - Íîâàÿ âåðñèÿ ÿçûêà Îáåðîí - 2. È â íåì ïîÿâèëèñü ìíîãîìåðíûå îòêðûòûå ìàññèâû, àíàëîãè âèðòóàëüíûõ ìåòîäîâ è âåðíóëè â îáåðîí öèêë for.Ðàññìîòðèì îòäåëüíî öèêë for.  Àäå îí èìååò âèäfor v in äèàïàçîí loopfor i in A'RANGE loop S:= S + A (i); end loop;Ïðè ýòîì ïåðåìåííàÿ i ëîêàëèçîâàííà âíóòðè öèêëà, è îïèñûâàòü åå íå òðåáóåòñÿ.
Ïîõîæå ñäåëàííî è â Ñ++for (int i = 0;...) ÿçûêå Ñ ñåìàíòèêà öèêëà for íåñêîëüêî äðóãîå, òàì ýòî ñàìûé ìîùíûé öèêë, êîòîðûé ìîæåò èñïîëüçîâàòüñÿ äëÿ ëþáûõ öåëåé.for (e1;e2;e3) ÿçûêàõ C# è java âñåãäà îñóùåñòâëÿåòñÿ êâàçèñòàòè÷åñêèé êîíòðîëü äàæå, åñëè ìû èäåì â öèêëå forïî ýëåìåíòàì ìàññèâà, ÷òî ìîæåò áûòü íå ýôôåêòèâíûì, ïîýòîìó â ÿçûêå C# ïîÿâèëàñü îñîáàÿ ôîðìà ýòîãîöèêëàforeach (T o in C) S;int []a ;foreach (int x in a) S+=x;Ãäå Ñ - ïðîèçâîëüíàÿ êîëëåêöèÿ (ïîääåðæèâàåò èíòåðôåéñ IEnumerable), ïðè ýòîì êîëëåêöèÿ íåëüçÿ ìîäèôèöèðîâàòü ñ ïîìîùüþ òàêîãî ïåðåáîðà.  ÿçûêå Java òàêîé öèêë ïîÿâèëñÿ òîëüêî â 2005 ãîäófor (T o:c)TimerTask cansel();collection<TimerTask> c;for (TimerTask t:c) t.cansel();36Ëåêöèÿ 16.Ãëàâà 4.Ïðîöåäóðíûå àáñòðàêöèè ßÏ.Ïðîöåäóðíûå àáñòðàêöèè ñ òî÷êè çðåíèÿ:- Ïîòîêà óïðàâëåíèÿ- Ïîòîêà äàííûõÏðîöåäóðíûå òèïû äàííûõ.Ïóíêò 1.
Ïåðåäà÷à óïðàâëåíèÿ â ÏÀ. Ïîäïðîãðàììû è ñîïðîãðàììû.Âñåãäà åñòü îäèí âõîä (îïåðàòîð Call) è îäèí âûõîä (Return). Îïåðàòð âîçâðàòà íå âî âñåõ ßÏ óñòü è ìîæåòáûòü â ñàìûõ ðàçíûõ ÷àñòÿõ ïðîãðàììè. Îïåðàòîð return - îáîáùåíèå îïåðàòîðà break. Òàêèì îáðàçîì, âñåîïåðàòîðû return èäóò â êîíåé ïðîöåäóðû. Ñ++ îïåðàòîð return - îïåðàòîð ïåðåõîäà íà ìåòêó. Òîëüêî â Ñ++ åñòü àâòîìàòè÷åñêèé âûçîâ äåñòðóêòîðîâ ëîêàëüíûõ îáúåêòîâ.Ïåðâûå áèáëèîòåêè áûëè ñîçäàííû íà ÿçûêå ôîðòðàí.  íåêîòîðûõ ßÏ áûëà âîçìîæíîñòü âûçûâàòü ïîäïðîãðàììû èç íåñêîëüêèõ âõîäîâ, òî åñòü ñóùåñòâîâàëî íåñêîëüêî âõîäîâ â ïðîöåäóðó. Òàê æå ó ïðîöåäóðûìîãëî ñóùåñòâîâàòü íåñêîëüêî âûõîäîâ, ïðè÷åì âîçâðàò îòïåðåëÿëñÿ ïðè âûçîâå.SUBROUTINE P (N, *)call P (N, 25)Êàê óæå ãîâîðèëîñü, áûëè ïîïûòêè îïðåäåëåèòü äîïîëíèòåëüíûå òî÷êè âõîäà è âûõîäà â ïðîöåäóðó, òîåñòü áûëà âîçìîæíîñòü âõîäèòü â ïðîöåäóðó íå ñ íà÷àëà, è âîçâðàùàòü óïðàâëåíèå íå â òî÷êó âûçîâà.
Ýòàêîíöåïöèÿ ñîâåðøåííî íå ïðèâèëàñü, òî åñòü âî âñåõ ñîâðåìåííûõ ßÏ ó ïîäïðîãðàììû èìååòñÿ îäíà òî÷êàâõîäà è îäíà òî÷êà âûõîäà.Ñ òî÷êè çðåíèå ïåðåäà÷è óïðàâëåíèÿ, ñóùåñòâóåò ÷åòêàÿ íåñèììåòðèÿ ìåæäó âûçûâàþùåé ïðîãðàììîâ èâûçâàííîé. Âûïîëíåíèé ïîäïðîãðàììû âñåãäà íà÷èíàåòñÿ ñ òî÷êè âõîäà è çàêàí÷èâàåòñÿ âîçâðàòîì â òî÷êóâûçîâà.
Òàêàÿ ñèñòåìà áûëà åùå â ÀËÃÎË - 60.Àëüòåðíàòèâíûé âàðèàíò - ñäåëàòü ïðîãðàììó ñèììåòðè÷íîé ïóòåì ïåðåõîäà îò ïîíÿòèÿ subroutine êcoroutine, òî åñòü åñòü íåñêîëüêî êàê áû ïàðàëëåëüíî ðàáîòàþùèõ ïîäïðîãðàìì. Òî åñòü ïðè ïîâòîðíîì âõîäåâ ïðîöåäóðó âõîä áóäåò â òó òî÷êó, èç êîòîðîé áûë âûõîä ïðè ïðîøëîì îáðàùåíèè ê ýòîé ïîäïðîãðàììå.Ýòî íåêîòîðûé àíàëîã ìåõàíèõìà ïàðàëëåëüíûõ ïðîöåññîâ.Òàêèì îáðàçîì îòñóòñòâóåò ïîíÿòèå âîçâðàòà (åñòü òîëüêî ïåðåäà÷à óïðàâëåíèÿ) è ïîíÿòèÿ ãëàâíîé ïðîãðàììû. ÿâíîì âèäåò òàêîå ïîíÿòèå åñòü òîëüêî â ÿçûêå ÌÎÄÓËÀ - 2. Òàì áûë ðåàëèçîâàí ìåõàíèçì êâàçèïàðàëëåëüíûõ ïðîöåññîâ. Ïîíÿòèå ïîäïðîãðàììû â ýòîì ßÏ:ADDRESSPROCEDURE TRANSFER (var cor1,cor2: ADRESS);Òàêèì îáðàçîì äëÿ êàæäîãî âûçîâà íåîáõîäèìî çàïîìèíàòü íå òîëüêî àäðåñ âîçâðàòà, íî è âñå ëîêàëüíûåïåðåìåííûå, òî åñòü ïðè îïåðàòîðå ïåðåõîäà íåîáõîäèìî âîññòàâíîâèòü âåñü ëîêàëüíûé êîíòåêñò äëÿ âûçûâàåìîé ïðîöåäóðû è ñîõðàíèòü åãî äëÿ âûçûâàþùåé.
Òàê æå òðåáóåòñÿ íåêîòîðàÿ ïðîöåäóðà èíèöèàëèçàöèèêîíòåêñòà äëÿ ïåðâîãî âûçîâà ñîïðîãðàììû. Äëÿ ýòîãî èñïîëüçóåòñÿprocedure NEWPROCESS (p: PROC, VAR cor: ADDRESS; N : INTEGER);Ãäå òðåòèé ïàðàìåòð - ðàçìåð ïàìÿòè äÿë ñîõðàíåíèé êîíòåêñòà. Òî åñòü ýòî äîâîëüíî íåçêîóðîâíåíûéâûçîâ. Òàêèì îáðàçîì, íå óäàëîñü ñîçäàòü äîñòàòî÷íî ïðîñòîé âûñîêîóðîâíåâûé ìåõàíèçì ñîçäàíèÿ ñîïðîãðàìì.Òàê æå áûëà ïðîöåäóðà iotransfer, îäíèì èç àðãóìåíòîâ êîòîðîé áûë íîìåð íåêîòîðîãî ïðåðûâàíèÿ, ñêîòîðûì áûë ñâÿçàí âûçîâ ïðîäåðóðû.Îäíàêî, â ñîâðåìåííûõ ßÏ îòñóòñòâóåò òàêàÿ êîíöåïöèÿ.
ÎÍà áûëà çàìåíåíà êîíöåïöèåé ïàðàëëåëüíîãîïðîöåññà. Ïðè ýòîì îñòàåòñÿ âîïðîñ î âêëþ÷åíèè ýòîãî ìåõàíèçìà èìååíî â áàçèñ ßÏ. Òîãäà âîçíèêàåò ìíîæåñòâî ïðîáëåì ñâÿçàííûõ ñ ïðîèçâîäèòåëüíîñòüþ, ïðè ðàáîòå ñî ñðåäñòâàìè ïàðàðëëåëèçìà óæå èìåþùèìèñÿâ ñèñòåìå. òàêîé ïðîáëåìîé ñòîëêíóëèñü è ñîçäàòåëè ÿçûêà Java, íî îíè ââåëè ïîíÿòèå ïàðàëëåëüíûõ ïðîãðàììíà óðîâíå JVM. Áîëåå òîãî âîçìîæåí âûçîâ ðîäíûõ âûçîâîâ ÎÑ ñ ïîìîùüþ JNI.Ìåõàíèçì ïåðåäà÷è äàííûõ â ïîäïðîãðàììû.Âàðèàíò ïåðåäà÷è äàííûõ â ñîïðîãðàììû - ãëîáàëüíûå ïåðåìåííûå.37Åñòü òðè òèïà ïåðåäà÷è äàííûõ.1. Âîçâðàò èç ôóíêöèè.2.
Ïåðåäà÷à ïàðàìåòðîâ.3. Ãëîáàëüíû ïåðåìåííûå.Ìû áóäåì ðàññìàòðèâàòü âòîðîé ïóíêò.Ñóùåñòâóå äâå âåùè in-out ñåìàíòèêà ïåðåäà÷è ïàðàìåòðîâ ñïîñîáû èëè ìåõàíèçìû ïåðåäà÷è ïàðàìåòðîâ.CALLER CALLEIn ->OUT <In_Out <-> íàì íóæíî è âõîäíîå çíà÷åíèå, è îíî áóäåò ìåíÿòüñÿ.Ìåõàíèçì ïåðåäà÷è ïàðàìåòðâî - ðåàëèçàöèÿ (íèçêîóðîâíåâàÿ). Ñåìàíòèêà - ïåðåäà÷à ïàðàìåòðîâ ñ òî÷êèçðåíèÿ ßÏ, íå âíèêàÿ â ñïîñîáû ðåàëèçàöèè. Òàêèì îáðàçîì, â ßÏ âûñîêîãî óðîâíÿ ïðèíÿòî ãîâîðèòü èìåííîî ñåìàíòèêå, íî íå î ðåàëèçàöèè.Ñïîñîá ÿçûêà Àäà - êàæäûé ïàðàìåòð èìîã èìåòü îäèí èç òðåõ ñïåöèôèêàòîðîâ - in, out, inout.function ABS(D : In REAL) return REAL;procedure (A : in ARR; MAX : out REAL; IND: out integer);procedure swap (x,y :inout T);-Ïðè ýòîì â ñîâðåìåííûõ ßÏ ôèêñèðóåòñÿ èìåííî ìåõàíèçì ïåðåäà÷è ïàðàìåòðîâ.ïî çíà÷åíèåè.ïî ðåçóëüòàòó.ïî çíà÷åíèþ / ðåçóëüòàòó.ïî èìåíè.ïî ññûëêå.Ïðè ïåðåäà÷è ïàðàìåòðîâ âîçíèêàåò 2 ñóùüíîñòè - ôîðìàëüíûé è ôàêòè÷åíñêèé ïàðàìåòð.
Ïðè ïåðåäà÷èïàðàìåòðîâ âî ìîìåíò âûçîâà ôóíêöèè ïðîèñõîäèò ñâÿçûâàíèå ôîðìàëüíûõ ïàðàìåòðîâ ñ ôàêòè÷åñêèìè.Åñòü 2 ìîìåíòà ñâÿçûâàíèÿ - ìîìåíò âûçîâà è ìîìåíò âîçâðàòà.Ñâÿçûâàíèå ïî ññûëêå - â ìîìåíò âûçîâà, è ñâÿçü íå ðàçðûâàåòñÿ äî ìîìåíòà âûõîäà. Ïîä ôîðìàëüíûìè ïàðàìåòðàìè âñåãäà ïîíèìàþòñÿ íåêîòîðûå ïåðåìåííûå, êîòîðûå ïî÷òè ýêâèâàëåíòû ëîêàëüíûì ïåðåìåííûì. Ñàìûé ïðîñòîé ñïîñîá èõ ðàñïîëîæåíèÿ - ðàñïîëîæåíèå íà ðåãèñòðàõ ïðîöåññîðà èëè ñòåêå. Ïðèïåðåäà÷è ïàðàìåòðîâ ÷åðåç ñòåê ñòàíîâèòñÿ âîçìîæíûì ìåõàíèçì ðåêóðñèâíûõ âûçâîâ.
Òî åñòü â Ôîðòðàíåïàðàìåòðû ðàñïîëàãàëèñü â ñåãìåíòå äàííûõ, ÷òî èñêëþ÷àëî âîçìîæíîñòü âûçîâà ðåêóðñèâíûõ ôóíêöèé.Ïåðåäà÷à ïî çíà÷åíèþ - êîïèðîâàíèÿ ôàêòè÷åñêîãî ïàðàìåòðà â ôîðìàëüíûå ïðè âûçîâå (íàïðèìåð çàïèñü ïàðàìåòðîâ â ñòåê).  òàêèõ ÿçûêàõ êàê Ñ è Java âñå ïåðåäàåòñÿ ïî çíà÷åíèþ.Ñâÿçûâàíèå ïî ðåçóëüòàòó - â ôàêòè÷åñêèé ïàðàìåòð êîïèðóåòñÿ çíà÷åíèå ôîðìàëüíîãî ïàðàìåòðà ïðèâîçâðàòå.
Òàêîé ñïîñîá ðåàëèçîâàí â âñåõ ßÏ ïðè âîçâðàòå èç ôóíêöèè.Ñâÿçûâàíèå ïî ðåçóëüòàòó - êîïèðîâàíèå ôàêòè÷åñêîãî â ôîðìàëüíûé ïðè âûçîâå è îáðàòíîå êîïèðîâàíèåïðè âîçâðàòå.Ñàìûé ïðîñòîé ñïîñîá ðåàëèçàöèè - ïåðåäà÷à ïî çíà÷åíèþ, îñîáåííî åñëè â àïïàðàòóðå ðåàëèçîâàí àïïàðàòíûé ñòåê. Ýòèõ òðåõ îïåðàöèé äîñòàòî÷íî äëÿ ðåàëèçàöèè âñåõ ñåìàíòèê ïåðåäà÷è ïàðàìåòðîâ, íî ñòî÷êè çðåíèÿ ýôôåêòèâíîñòè èõ íå äîñòàòî÷íî.Ïåðåäà÷à ïî ññûëêå - ïåðåäà÷à àäðåñà ïî çíà÷åíèþ.Ðàññìîòðìè ïîñëåäíèé ñïîñîá ïåðåäà÷è ïàðàìåòðîâ - ïî èìåíè. Òàêîé ñïîñîá ýêâèâàëåíòåí òîìó ÷òîñîîòâåñòâóþùèé ôàêòè÷åñêèé ïàðàìåòð ïîäñòàâëÿåòñÿ íà ìåñòî ñîîòâåñòâóþùåãî ôîðìàëüíîãî ïàðàìåòðà.Òî åñòü ýòî íåêîòîðûé àíàëîã ìàêðîïîäñòàíîâîê.
Òàêèì îáðàçîì â ÀËÃÎË-60 ïðè âûçîâå P(A[i]) çíà÷åíèåA[i] ìîæåò èçìåíèòüñÿ åñëè ìåíÿåòñÿ çíà÷åíèå i.Ðàññìîòðìè ïðîöåäóðó swap íà àëãîëå.procedure swap (a,b);integer a,b;begininteger tmp;tmp = a;a = b;b = tmp;end;38Òàêàÿ ðåàëèçàöèÿ íå ðàáîòàåò. Íàïðèìåðarray 1..N o integer;i := 1;swap (A[i], i); áóäåò ðàáîòàòü.swap (i ,A [i]); íå çàðàáîòàåò.Èìåííî èç - çà òàêîãî ìåõàíèçìà ïåðåäà÷è ïàðàìåòðîâ ÀËÃÎË - 60 íå ñìîã ñòàòü ïðîìûøëåííûì ßÏ.Òî åñòü äëÿ êàæäîãî âûçîâà òðåáîâàëîñü ïî èìåíè ïåðåìåííîé îïðåäåëèòü åå àäðåñ.39Ëåêöèÿ 1728.10.2008In/Out ñåìàíòèêà è ñïîñîáû ïåðåäà÷è ïàðàìåòðîâ ñ ïðîøëîé ëåêöèè.Ïî÷òè âî âñåõ ßÏ ðåàëèçîâàí ñïîñîá ïåðåäà÷è äàííûõ ïî çíà÷åíèþ. Â Ñ òîëüêî ïî çíà÷åíèþ, â Ñ++ ïîÿâèëàñü âîçìîæíîñòü ïåðåäàâàòü ïî ññûëêå.Pascal, Modula - 2, Oberon - ïî çíà÷åíèþ è ïî ññûëêå (ïàðàìåòðû ïåðåìåííûå).
In ãàðàíòèðóåò ÷òî îáúåêòíå èçìåíèòñÿ, ïðè ýòîì ïðè ïåðåäà÷å ïî ññûëêå îáúåêò ìîæåò èçìåíèòüñÿ. Âèðò ïîñ÷èòàë çàùèòó îò ïîäîáíîãîèçëèøíåé, õîòÿ â ÿçûêå Ñ++ òàêàÿ çàùèòà åñòü - êîíñòàíòíàÿ ññûëêà.Åñëè îáúåêò îïèñàí ñ ìîäèôèêàòîðîì const, òî îí ïîëó÷èâ çíà÷åíèå íå ìîæåò èçìåíèòü åãî. Òî åñòüîí ïîñòîÿíåí â ïðåäåëàõ íåêîòîðîãî áëîêà. Òî åñòü åñëè íå êîíñòàíòíîìó îáúåêó ñîïîñòàâëåííà êîíñòàíòíàÿ ññûëêà, òî ýòî çíà÷èò ÷òî â ïðåäåëàõ áëîêà, â êîòîðîì îïðåäåëåíà ññûëêà äàííûé îáúåêò íå ìåíÿåòñÿ(ïåðåäà÷à â ôóíêöèþ êîíñòàíòíîé ññûëêè). Ñ++ T& - ïåðåäà÷à îáúåêòîâ out/inout, äëÿ in ñëåäóåò èñïîëüçîâàòü const T&. Ïðè ýòîì T - ïåðåäà÷àïî çíà÷åíèþ.