лекции (2008) (by Kravets) (1160829), страница 12
Текст из файла (страница 12)
end loop;Òàê æå òàì ïðèñóòñòâóåò îïåðàòîð exit, ïðè ýòîì òàì äîïóñòèìà âòîðàÿôîðìàwhen óñëîâèå => exit;È ýòî óñëîâèå ìîæíî ïîñòàâèòü â êîíöå öèêëà.Ðàññìîòðèÿ ÿçûê Ñ. Òàì ïðàêòè÷åñêè òîò æå íàáîð îïåðàòîðîâ.while (B) Sdo S while (B);forÏðèñóòòâóþò òàê æå îïåðàòîðû break è continue (îñîáûå ñëó÷àè îïåðàòîðà goto).Ðàññìîòðìè òàê æå îïåðàòîð return - ÷àñòíûé ñëó÷àé îïåðàòîðà ïåðåäà÷è óïðàâëåíèÿ. Äàëåå â ÿçûêå java åñòü âîçìîæíîñòü âûõîäà ïî breakïî ìåòêå. Òî åñòü âûõîä ïî break <label> âûõäèò èç òîãî öèêëà, êîòîðûéïîìå÷åí ìåòêîé.
Äðóãîé âàðèàíò - èñïîëüçîâàíèå èñêëþ÷åíèé (î÷åíüïëîõî - íåëüçÿ òàê ïèñàòü).Áåç goto ìîæíî ïðîãðàììèðîâàòü, òàê êàê çà 13 ëåò îí òàê è íå ïîÿâèëñÿ â java.Ðàññîòðèì öèêë for, îí áûë èçîáðåòåí ñîçäàòåëÿìè ÿçûêà Àëãîë.Öèêë for ïîÿâèëñÿ â Ïàñêàëå â âèäå for v:= 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;62Ïðè ýòîì ïåðåìåííàÿ 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();63Ëåêöèÿ 16.Ãëàâà 4.Ïðîöåäóðíûå àáñòðàêöèè ßÏ.Ïðîöåäóðíûå àáñòðàêöèè ñ òî÷êè çðåíèÿ:- Ïîòîêà óïðàâëåíèÿ- Ïîòîêà äàííûõÏðîöåäóðíûå òèïû äàííûõ.Ïóíêò 1. Ïåðåäà÷à óïðàâëåíèÿ â ÏÀ.
Ïîäïðîãðàììû è ñîïðîãðàììû.Âñåãäà åñòü îäèí âõîä (îïåðàòîð Call) è îäèí âûõîä (Return). Îïåðàòðâîçâðàòà íå âî âñåõ ßÏ óñòü è ìîæåò áûòü â ñàìûõ ðàçíûõ ÷àñòÿõ ïðîãðàììè. Îïåðàòîð return - îáîáùåíèå îïåðàòîðà break. Òàêèì îáðàçîì,âñå îïåðàòîðû return èäóò â êîíåé ïðîöåäóðû. Ñ++ îïåðàòîð return - îïåðàòîð ïåðåõîäà íà ìåòêó. Òîëüêî â Ñ++åñòü àâòîìàòè÷åñêèé âûçîâ äåñòðóêòîðîâ ëîêàëüíûõ îáúåêòîâ.Ïåðâûå áèáëèîòåêè áûëè ñîçäàííû íà ÿçûêå ôîðòðàí.  íåêîòîðûõßÏ áûëà âîçìîæíîñòü âûçûâàòü ïîäïðîãðàììû èç íåñêîëüêèõ âõîäîâ,òî åñòü ñóùåñòâîâàëî íåñêîëüêî âõîäîâ â ïðîöåäóðó.
Òàê æå ó ïðîöåäóðû ìîãëî ñóùåñòâîâàòü íåñêîëüêî âûõîäîâ, ïðè÷åì âîçâðàò îòïåðåëÿëñÿïðè âûçîâå.SUBROUTINE P (N, *)call P (N, 25)Êàê óæå ãîâîðèëîñü, áûëè ïîïûòêè îïðåäåëåèòü äîïîëíèòåëüíûå òî÷êè âõîäà è âûõîäà â ïðîöåäóðó, òî åñòü áûëà âîçìîæíîñòü âõîäèòü âïðîöåäóðó íå ñ íà÷àëà, è âîçâðàùàòü óïðàâëåíèå íå â òî÷êó âûçîâà. Ýòàêîíöåïöèÿ ñîâåðøåííî íå ïðèâèëàñü, òî åñòü âî âñåõ ñîâðåìåííûõ ßÏ óïîäïðîãðàììû èìååòñÿ îäíà òî÷êà âõîäà è îäíà òî÷êà âûõîäà.Ñ òî÷êè çðåíèå ïåðåäà÷è óïðàâëåíèÿ, ñóùåñòâóåò ÷åòêàÿ íåñèììåòðèÿ ìåæäó âûçûâàþùåé ïðîãðàììîâ è âûçâàííîé. Âûïîëíåíèé ïîäïðîãðàììû âñåãäà íà÷èíàåòñÿ ñ òî÷êè âõîäà è çàêàí÷èâàåòñÿ âîçâðàòîì âòî÷êó âûçîâà.
Òàêàÿ ñèñòåìà áûëà åùå â ÀËÃÎË - 60.Àëüòåðíàòèâíûé âàðèàíò - ñäåëàòü ïðîãðàììó ñèììåòðè÷íîé ïóòåìïåðåõîäà îò ïîíÿòèÿ subroutine ê coroutine, òî åñòü åñòü íåñêîëüêî êàêáû ïàðàëëåëüíî ðàáîòàþùèõ ïîäïðîãðàìì. Òî åñòü ïðè ïîâòîðíîì âõîäåâ ïðîöåäóðó âõîä áóäåò â òó òî÷êó, èç êîòîðîé áûë âûõîä ïðè ïðîøëîìîáðàùåíèè ê ýòîé ïîäïðîãðàììå. Ýòî íåêîòîðûé àíàëîã ìåõàíèõìà ïàðàëëåëüíûõ ïðîöåññîâ.64Òàêèì îáðàçîì îòñóòñòâóåò ïîíÿòèå âîçâðàòà (åñòü òîëüêî ïåðåäà÷àóïðàâëåíèÿ) è ïîíÿòèÿ ãëàâíîé ïðîãðàììû. ÿâíîì âèäåò òàêîå ïîíÿòèå åñòü òîëüêî â ÿçûêå ÌÎÄÓËÀ - 2. Òàìáûë ðåàëèçîâàí ìåõàíèçì êâàçèïàðàëëåëüíûõ ïðîöåññîâ. Ïîíÿòèå ïîäïðîãðàììû â ýòîì ßÏ:ADDRESSPROCEDURE TRANSFER (var cor1,cor2: ADRESS);Òàêèì îáðàçîì äëÿ êàæäîãî âûçîâà íåîáõîäèìî çàïîìèíàòü íå òîëüêî àäðåñ âîçâðàòà, íî è âñå ëîêàëüíûå ïåðåìåííûå, òî åñòü ïðè îïåðàòîðåïåðåõîäà íåîáõîäèìî âîññòàâíîâèòü âåñü ëîêàëüíûé êîíòåêñò äëÿ âûçûâàåìîé ïðîöåäóðû è ñîõðàíèòü åãî äëÿ âûçûâàþùåé.
Òàê æå òðåáóåòñÿíåêîòîðàÿ ïðîöåäóðà èíèöèàëèçàöèè êîíòåêñòà äëÿ ïåðâîãî âûçîâà ñîïðîãðàììû. Äëÿ ýòîãî èñïîëüçóåòñÿprocedure NEWPROCESS (p: PROC, VAR cor: ADDRESS; N : INTEGER);Ãäå òðåòèé ïàðàìåòð - ðàçìåð ïàìÿòè äÿë ñîõðàíåíèé êîíòåêñòà. Òîåñòü ýòî äîâîëüíî íåçêîóðîâíåíûé âûçîâ. Òàêèì îáðàçîì, íå óäàëîñüñîçäàòü äîñòàòî÷íî ïðîñòîé âûñîêîóðîâíåâûé ìåõàíèçì ñîçäàíèÿ ñîïðîãðàìì.Òàê æå áûëà ïðîöåäóðà iotransfer, îäíèì èç àðãóìåíòîâ êîòîðîé áûëíîìåð íåêîòîðîãî ïðåðûâàíèÿ, ñ êîòîðûì áûë ñâÿçàí âûçîâ ïðîäåðóðû.Îäíàêî, â ñîâðåìåííûõ ßÏ îòñóòñòâóåò òàêàÿ êîíöåïöèÿ. ÎÍà áûëàçàìåíåíà êîíöåïöèåé ïàðàëëåëüíîãî ïðîöåññà.
Ïðè ýòîì îñòàåòñÿ âîïðîñî âêëþ÷åíèè ýòîãî ìåõàíèçìà èìååíî â áàçèñ ßÏ. Òîãäà âîçíèêàåò ìíîæåñòâî ïðîáëåì ñâÿçàííûõ ñ ïðîèçâîäèòåëüíîñòüþ, ïðè ðàáîòå ñî ñðåäñòâàìè ïàðàðëëåëèçìà óæå èìåþùèìèñÿ â ñèñòåìå. òàêîé ïðîáëåìîé ñòîëêíóëèñü è ñîçäàòåëè ÿçûêà Java, íî îíè ââåëèïîíÿòèå ïàðàëëåëüíûõ ïðîãðàìì íà óðîâíå JVM. Áîëåå òîãî âîçìîæåíâûçîâ ðîäíûõ âûçîâîâ ÎÑ ñ ïîìîùüþ JNI.Ìåõàíèçì ïåðåäà÷è äàííûõ â ïîäïðîãðàììû.Âàðèàíò ïåðåäà÷è äàííûõ â ñîïðîãðàììû - ãëîáàëüíûå ïåðåìåííûå.Åñòü òðè òèïà ïåðåäà÷è äàííûõ.1.
Âîçâðàò èç ôóíêöèè.2. Ïåðåäà÷à ïàðàìåòðîâ.3. Ãëîáàëüíû ïåðåìåííûå.Ìû áóäåì ðàññìàòðèâàòü âòîðîé ïóíêò.Ñóùåñòâóå äâå âåùè in-out ñåìàíòèêà ïåðåäà÷è ïàðàìåòðîâ65 ñïîñîáû èëè ìåõàíèçìû ïåðåäà÷è ïàðàìåòðîâ.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 âñå ïåðåäàåòñÿ ïî çíà÷åíèþ.66Ñâÿçûâàíèå ïî ðåçóëüòàòó - â ôàêòè÷åñêèé ïàðàìåòð êîïèðóåòñÿ çíà÷åíèå ôîðìàëüíîãî ïàðàìåòðà ïðè âîçâðàòå.
Òàêîé ñïîñîá ðåàëèçîâàí ââñåõ ßÏ ïðè âîçâðàòå èç ôóíêöèè.Ñâÿçûâàíèå ïî ðåçóëüòàòó - êîïèðîâàíèå ôàêòè÷åñêîãî â ôîðìàëüíûé ïðè âûçîâå è îáðàòíîå êîïèðîâàíèå ïðè âîçâðàòå.Ñàìûé ïðîñòîé ñïîñîá ðåàëèçàöèè - ïåðåäà÷à ïî çíà÷åíèþ, îñîáåííîåñëè â àïïàðàòóðå ðåàëèçîâàí àïïàðàòíûé ñòåê. Ýòèõ òðåõ îïåðàöèé äîñòàòî÷íî äëÿ ðåàëèçàöèè âñåõ ñåìàíòèê ïåðåäà÷è ïàðàìåòðîâ, íî ñ òî÷êèçðåíèÿ ýôôåêòèâíîñòè èõ íå äîñòàòî÷íî.Ïåðåäà÷à ïî ññûëêå - ïåðåäà÷à àäðåñà ïî çíà÷åíèþ.Ðàññìîòðìè ïîñëåäíèé ñïîñîá ïåðåäà÷è ïàðàìåòðîâ - ïî èìåíè.
Òàêîéñïîñîá ýêâèâàëåíòåí òîìó ÷òî ñîîòâåñòâóþùèé ôàêòè÷åñêèé ïàðàìåòðïîäñòàâëÿåòñÿ íà ìåñòî ñîîòâåñòâóþùåãî ôîðìàëüíîãî ïàðàìåòðà. Òîåñòü ýòî íåêîòîðûé àíàëîã ìàêðîïîäñòàíîâîê. Òàêèì îáðàçîì â ÀËÃÎË60 ïðè âûçîâå P(A[i]) çíà÷åíèå A[i] ìîæåò èçìåíèòüñÿ åñëè ìåíÿåòñÿ çíà÷åíèå i.Ðàññìîòðìè ïðîöåäóðó swap íà àëãîëå.procedure swap (a,b);integer a,b;begininteger tmp;tmp = a;a = b;b = tmp;end;Òàêàÿ ðåàëèçàöèÿ íå ðàáîòàåò.
Íàïðèìåðarray 1..N o integer;i := 1;swap (A[i], i); áóäåò ðàáîòàòü.swap (i ,A [i]); íå çàðàáîòàåò.Èìåííî èç - çà òàêîãî ìåõàíèçìà ïåðåäà÷è ïàðàìåòðîâ ÀËÃÎË - 60 íåñìîã ñòàòü ïðîìûøëåííûì ßÏ. Òî åñòü äëÿ êàæäîãî âûçîâà òðåáîâàëîñüïî èìåíè ïåðåìåííîé îïðåäåëèòü åå àäðåñ.67Ëåêöèÿ 1728.10.2008In/Out ñåìàíòèêà è ñïîñîáû ïåðåäà÷è ïàðàìåòðîâ ñ ïðîøëîé ëåêöèè.Ïî÷òè âî âñåõ ßÏ ðåàëèçîâàí ñïîñîá ïåðåäà÷è äàííûõ ïî çíà÷åíèþ. ÂÑ òîëüêî ïî çíà÷åíèþ, â Ñ++ ïîÿâèëàñü âîçìîæíîñòü ïåðåäàâàòü ïîññûëêå.Pascal, Modula - 2, Oberon - ïî çíà÷åíèþ è ïî ññûëêå (ïàðàìåòðûïåðåìåííûå). In ãàðàíòèðóåò ÷òî îáúåêò íå èçìåíèòñÿ, ïðè ýòîì ïðè ïåðåäà÷å ïî ññûëêå îáúåêò ìîæåò èçìåíèòüñÿ. Âèðò ïîñ÷èòàë çàùèòó îòïîäîáíîãî èçëèøíåé, õîòÿ â ÿçûêå Ñ++ òàêàÿ çàùèòà åñòü - êîíñòàíòíàÿññûëêà.Åñëè îáúåêò îïèñàí ñ ìîäèôèêàòîðîì const, òî îí ïîëó÷èâ çíà÷åíèå íå ìîæåò èçìåíèòü åãî. Òî åñòü îí ïîñòîÿíåí â ïðåäåëàõ íåêîòîðîãîáëîêà.
Òî åñòü åñëè íå êîíñòàíòíîìó îáúåêó ñîïîñòàâëåííà êîíñòàíòíàÿññûëêà, òî ýòî çíà÷èò ÷òî â ïðåäåëàõ áëîêà, â êîòîðîì îïðåäåëåíà ññûëêàäàííûé îáúåêò íå ìåíÿåòñÿ (ïåðåäà÷à â ôóíêöèþ êîíñòàíòíîé ññûëêè). Ñ++ T& - ïåðåäà÷à îáúåêòîâ out/inout, äëÿ in ñëåäóåò èñïîëüçîâàòü const T&. Ïðè ýòîì T - ïåðåäà÷à ïî çíà÷åíèþ.  Ñ++ ëþáûåâðåìåííûå îáåêòû ñ÷èòàþòñÿ êîíñòàíòíûìè.Àäà-83 è Àäà ââîáùå. Òàì íà ñàìîì äåëå íå óêàçûâàåòñÿ ñïîñîá ïåðåäà÷è ïàðàìåòðîâ, à óêàçûâàåòñÿ ñåìàíòèêà, òî åñòü ïðè ïåðåäà÷å ïàðàìåòðîâ óêàçûâàåòñÿ îäíî èç êëþ÷åâûõ ñëîâ -in, out èëè inoutprocedure P(X: in T;y: out TT; z : inout TTT);Ïðè ýòîì êîìïèëÿòîð ñàì âûáèðàåò ñïîñîá ïåðåäàè÷ ïàðàìåòðîâ.
Ïðèýòîì â ñòàíäàðòå Àäà - 95 âåðíóëèñü ê ñïîñîáó, êîòîðûé áûë ðåàëèçîâàíïî÷òè âî âñåõ ßÏ. Âñå ßÏ ðåàëèçóþò ïåðåäà÷ó ëèáî ïî ññûëêå, ëèáî ïîçíà÷åíèþ.Îäíàêî, â íåêîòîðûõ ñëó÷àÿõ ïðîãðàììû íà ÿçûêå Àäà ðàáîòàëè ïîðàçíîìó íà ðàçíûõ êîìïèëÿòîðàõ.Íàïðèìåð ðàññìîòðèì òàêóþ ïðîãðàììó.procedure P(x,y : out T) isbeginX:=...;raise ERROR;Y:=...;end P;68P(A,A);Åñëè ïàðàìåòðû ïåðåäàþòñÿ ïî ññûëêå, òî çíà÷åíèå À ìåíÿåòñÿ, àåñëè ïî ðåçóëüòàòó - òî ìåíÿåòñÿ. Òàêèì îáðàçîì, íîðìàëüíàÿ ïðîãðàììàâåäåò ñåáÿ ïî ðàçíîìó â çàâèñèìîñòè îò êîìïèëÿòîðà.Java - ïåðåäà÷à ïî çíà÷åíèþ, íî èç-çà ðåôåðåíöèàëüíîé ñåìàíòèêèîáúåêòîâ - ôàêòè÷åñêàÿ ïåðåäà÷à ïî çíà÷åíèþ òîëüêî ïðîñòûõ òèïîâäàíííûõ. Âñå îñòàëüíûå îáúåêòû (â òîì ÷èñëå è ìàññèâû) - ïî ññûëêå. Òàêèì îáðàçîì äëÿ âñåõ ïðîñòûõ îáúåêòîâ - in-ñåìàíòèêà, äëÿ âñåõîñòàëüíûõ - inout ñåìàíòèêà. Java åñòü êëþ÷åâîå ñëîâî nal - àíàëîã â äàííîì êîíòåêñòå ìîäèôèêàòîðà const.