лекции (2008) (by Kravets) (1160829), страница 19
Текст из файла (страница 19)
Äëÿ ðåøåíèÿ ýòîé ïðîáëåìû áûëî ââåäåíî êëþ÷åâîå ñëîâîexplisit. C# åñòü è êëþ÷åâîå ñëîâî implisit è explisit, êîòîðûå ìîãóò ñòîÿòü ïåðåä îïðåäåëåíèåì êàæäîãî îïåðàòîðà ïðåîáðàçîâàíèÿ, ïðè÷åì âîòëè÷èè îò Ñ++ ïî óìîë÷àíèþ ïðåîáðàçîâàíèå ÿâíîå.ßâíîå ïðåîáðàçîâàíèå äîëæíî âûçûâàòüñÿ ïðîãðàììèñòîì ÿâíî.T t; X x;t = x;Òîãäà êîìïèëÿòîð àâòîìàòè÷åñêè âñòàâèò t = x.operator(T)(), åñëèòàêàÿ îïåðàöèÿ îïðåäåëåíà ïðîãðàììèñòîì.Ñîçäàòåëè Delphi è Java îòêàçàëèñü îò íåÿâíûõ ïðåîáðàçîâàíèé âîîáùå, à â C# âñå îïåðàöèè ïðåîáðàçîâàíèÿ - ñòàòè÷åñêèå ôóíêöèè êëàññà.class X{public implisit operator(Y)(X x){...}// X -> YÏðè ýòîì  C# X è Y - òîëüêî ïîëüçîâàòåëüñêèå êëàññû, ôóíêöèÿäîëæíà áûòü ñòàòè÷åñêîé è áûòü ÷ëåíîì êëàññà X èëè Y.116Àíàëîãè÷íàÿ ïðîáëåìà ñ ïåðåêðûòèåì ñòàíäàðòíûõ îïåðàöèé.
Ïîýòîìó êëàññ string âñòðîåííûé â Delphi. Àíàëîãè÷íî â Java, òî åñòü òàìâîçìîæíà òàêàÿ çàïèñü.String s;s + i;Ïðè÷åì åñëè i - íå ñòðîêà, òî áóäåò âûçâàíî íåÿâíîå ïðåîáðàçîâàíèå iê ñòðîêå. Òî åñòü íåêîòîðûå êëàññû äîëæíû áûòü âñòðîåííûìè, òî åñòüïîääåðæèâàòüñÿ êîìïèëÿòîðîì.  Ñ++ æå ýòîãî íå òðåáóåòñÿ.  C#íåëüçÿ ïåðåêðûâàòü îïåðàöèè () è [], íî âçàìåí òàì ïðèñóòñòâóåò îñîáàÿêîíñòðóêöèÿ - èíäåêñàòîð.class X{int this[string x]{}};Òåïåðü âîçìîæíî ïèñàòüX x;x ["sss"];Ñâîéñòâà (property)Ñâîéñòâî - ýòî ñïåöèàëüíûé ÷ëåí êëàññà, êîòîðûé ïðè èñïîëüçîâàíèèâûãëÿäèò êàê ÷ëåí äàííûõ, à ïðè ðåàëèçàöèè - êàê ïàðà ôóíêöèé - getè set.Ñâîéñòâàìè îáëàäàþò C# è Delphi.
 C++, Java è òàê äàëåå, ÿâíûõñâîéñòâ íåò, íî òàì ìîæíî îïðåäåëèòü ôóíêöèè äîñòóïà äëÿ äîñòóïà êïîëÿì äàííûõ.Delphi:type X = classproperty p: integer read accessor write accessor;type X = classprivateFlenghth : integer;property length:integerread Flength write Flength;a.Length = 1; ÷òåíèå áóäåò èç FLength.117type figure = classprivate a, b : integer;Farea:integer;property Area: integer read Farea; {äîñòóï íà çàïèñü îãðàíè÷åí}Áîëåå òîãîtype figure = classprivate a, b : integer;property Area: integer read GetArea;property width: integet read b write SetWidth;private procedure SetWidth (X:integer);Àâòîãåíåðèðóåìûå ñâîéñòâà.class Point{public int x;public int y;public Point (int x, int y){this.x = x; this.y = y;}Ýòî ìîæíî çàìåíèòü (â C# 3.0) íàclass Point{public int x {get, set};public int y {get, set};È òåïåðü ìîæíî íàïèñàòüPoint p = new Point (x = 0; y = 0);Ìíîãèå èç òîãî, ÷òî áûëî äîáàâëåíî â C# 3.0 èìååò ñìûñë òîëüêîäëÿ ðàáîòû ñ SQL çàïðîñàìè.Äëÿ àâòîðåàëèçóåìûé ñâîéñòâ ìîæíî ïèñàòü òàê, public int y priveteget, set, òî åñòü äîñòóï íà ÷òåíèå çàêðûâàåòñÿ.Ãëàâà 7.
Ðàçäåëüíàÿ òðàíñëÿöèÿ.Ðàçäåëåíèå ïðîãðàììû íà ìîäóëè.Âèäû òðàíñëÿöèè1. Öåëüíàÿ òðàíñëÿöèÿ (Pascal)Âî ïåðâûõ îòñóòñòâóåò âîçìîæíîñòü ðàçáèåíèÿ íà ìîäóëè. Äàëåå, âñåáèáëèîòåêè äîëæíû ïîäàâàòüñÿ íà âõîä âìåñòå ñ ñàìîé ïðîãðàììîé. Ñîâåðøåííîé íå ïîäõîäèò äëÿ ïðîìûøëåííîãî ïðîãðàììèðîâàíèÿ.1182. Ïîøàãîâàÿ òðàíñëÿöèÿ.(Basic)3. Ðàçäåëüíàÿ òðàíñëÿöèÿ - ðàçäåëüíàÿ íåçàâèñèìàÿ è ðàçäåëüíàÿ çàâèñèìàÿ. Ïðîãðàììà òðàíñëèðóåòñÿ ïî ÷àñòÿì, ïîÿâëÿåòñÿ ïîíÿòèå åäèíèöû òðàíñëÿöèè.
ðàçäåëüíàÿ íåçàâèñèìàÿ - òðàíñëÿöèÿ èñõîäíîãî êîäàåäèíèöû òðàíñëÿöèè â îáúåêòíûé ôàéëðàçäåëüíàÿ çàâèñèìàÿ - òðàíñëÿöèÿ èñõîäíîãî êîäà åäèíèöû òðàíñëÿöèèñ èñïîëüçîâàíèåì íàáîðà îòòðàíñëèðîâàííûõ ðàíåå áèáëèîòåê.Ïîÿâëÿåòñÿ ïîíÿòèå êîíòåêñòà òðàíñëÿöèè.Îí ñóùåñòâóåò âñåãäà (íàïðèìåð ñòàíäàðòíûå èìåíà).  ñëó÷àå íåçàâèñèìîé òðàíñëÿöèè êîíòåêñòáåðåòñÿ èç åäèíèöû òðàíñëÿöèè. Ïðèìåðû òàêèõ ÿçûêîâ - Fortran, Assembler,C / C++.119Ëåêöèÿ 274.12.2008Ïðè ðàçäåëüíîé òðàíñëÿöèè âîçíèêàåò ïîíÿòèå ìîäóëÿ êîìïèëÿöèè(ôèçè÷åñêîãî ìîäóëÿ).Òðàíñëÿòîðó íà âõîä ïîäàåòñÿ åäèíèöà êîìïèëÿöèè è íà âûõîäå ïîëó÷àåì îáúåêòíûé ìîäóëü.
Îòñþäà âîçíèêàåì ïîíÿòèå êîíòåêñòà òðàíñëÿöèè.  ÿçûêàõ ñ ðàçäåëüíîé òðàíñëÿöèåé âåñü êîíòåêñò áåðåòñÿ èçåäèíèöû òðàíñëÿöèè, òî åñòü íåîáõîäèì ìåõàíèçì óêàçàíèÿ êîíòåêñòàòðàíñëÿöèè. Äëÿ ýòîãî íå äîñòàòî÷íî äèðåêòèâû extern. Òî åñòü íåîáõîäèìî äóáëèðîâàòü êîíòåêñò.Ñîâåðøåííîé äðóãàÿ ñèòóàöèÿ ïðè ðàçäåëüíîé çàâèñèìîé òðàíñëÿöèè.  ýòîì ñëó÷àå êîìïèëÿòîð íå òîëüêî âûäàåò îáúåêòíûé êîä, íî èêëàäåò íåêîòîðûå äàííûå â òðàíñëÿöèîííóþ áèáëèîòåêó.Òàêèì îáðàçîì, òî ÷òî ñîñòàâëÿåò îáúåêòíûé ìîäóëü - ýòî ïðîãðàììíàÿ áèáëèîòåêà, à òðàíñëÿöèîííàÿ áèáëèîòåêà - ýòî íåêîòîðûé àíàëîãòàáëèöû èìåí.Òî åñòü äàæå åñëè ïðèñóòñòâóåò åäèíàÿ áèáëèîòåêà, òî îíà âñå ðàâíîîáû÷íî äåëèòñÿ íà 2 ÷àñòè - òðàíñëÿöèîííóþ è ïðîãðàììíóþ áèáëèîòåêó. ïî÷òè âñåõ ñîâðåìåííûõ ßÏ (C#, Delphi, Java) èñïîëüçóåòñÿ èìåííî òàêîé âàðèàíò, òî åñòü èìååòñÿ òåíäåíöèÿ ê îáúåäèíåíèþ òðàíñëÿöèîííîé è ïðîãðàììíîé áèáëèîòåêè.
Äëÿ ýòèõ ÿçûêîâ õàðàêòåðíî ïîíÿòèåðåôëåêñèè - ïîëó÷åíèå èíôîðìàöèè î òèïå íà ýòàïå âûïîëíåíèÿ. Íàïðèìåð, ïîëó÷åíèÿ òèïà ïåðåìåííîé ïî åå èìåíè, òî åñòü ïî÷òè âåñüèñõîäíûé êîä íàõîäèò îòðàæåíèå â ðåçóëüòèðóþùåì îáúåêòíîì ôàéëå.Ïðè íåçàâèñèìîé ðàçäåëüíîé òðàíñëÿöèè âîçìîæíî áîëüøîå ÷èñëîîøèáîê, ïîðîæäàåìûõ ìåæìîäóëüíûìè ñâÿçÿìè.  Ñ/Ñ++ òðåáóåòñÿäóáëèðîâàíèå êîäà, ÷òî ìîæåò ïîðîæäàòü îøèáêè. Äëÿ óïðîùåíèÿ åùåñîçäàòåëÿìè ÿçûêà áûëà ïðèäóìàíà òåõíèêà íà îñíîâå çàãîëîâî÷íûõôàéëîâ, ãäå îïèñûâàþòñÿ extern èìåíà, ïðîòîòèïû ôóíêöèé, òèïû.Òàêèì îáðàçîì, íà Ñ/Ñ++ íå ðåêîìåíäóåòñÿ îïèñûâàòü âíåøíèå èìåíà êàê extern, âìåñòî ýòîãî òðåáóåòñÿ âêëþ÷àòü çàãîëîâî÷íûé ôàéë, ãäåîïèñàí äàííûõ ïðîòîòèï.Ïðè ýòîì, åñëè ìîäóëþ òðåáóþòñÿ èìåíà èç íåñêîëüêèõ ìîäóëåé, òîîí äîëæåí âêëþ÷èòü íåñêîëüêî çàãîëîâî÷íûõ ôàéëîâ. Îòñþäà âîçíèêàåò ïðîáëåìà ïîâòîðíîãî âêëþ÷åíèÿ, ÷òî ìîæåò âûçâàòü ïðîáëåìû ñîáúÿâëåíèåì òèïîâ.Òàêèì îáðàçîì, íåîáõîäèìî èñïîëüçîâàòü "ñòðàæ âêëþ÷åíèÿ":# ifndef __M_H__# dene __M_H__120....# endif×òî ãàðàíòèðóåò, ÷òî èíôîðìàöèÿ èç äàííîãî ôàéëà áóäåò âêëþ÷åíàòîëüêî 1 ðàç.Òàêèì îáðàçîì îáúåì êîäà, êîòîðûé ïîäàåòñÿ òðàíñëÿòîðóâîçðàñòàåò â 10 - 20 ðàç çà ñ÷åò âêëþ÷åíèÿ çàãîëîâî÷íûõ ôàéëîâ.Òàêàÿ òåõíîëîãèÿ ôàêòè÷åñêè çàèìñòâóåò òî, ÷òî èñïîëüçóþò ïðîãðàììèñòû â áîëåå ðàçâèòûõ ßÏ.Îäíîñòîðîííåå è äâóñòîðîííåå ñâÿçûâàíèå.EK - êëèåíò (èñïîëüçóåò ñ ïîìîùüþ ïðåäëîæåíèÿ èìïîðòà) → EK - ñåðâèñ.Delphi, Modula - 2 - ìîäóëü îïðåäåëåíèÿ è ìîäóëü îïèñàíèÿ.DEFINITION MODULE,IMPLEMENTATION MODULE.Oberon - 2 åäèíûé ìîäóëü. ýòèõ ÿçûêàõ ëîãè÷åñêèé ìîäóëü ñîâïàäàåò ñ åäèíèöåé êîìïèëÿöèè.Uses ïî÷òè ýêâèâàëåíòíî ïðåäëîæåíèþ # include â Ñ.Òàê êàê ýòî èñêëþ÷èòåëüíî äâóñòîðîííÿÿ ñâÿçü, òî ñåðâåð íè÷åãî íåçíàåò î êëèåíòå, áîëåå òîãî, êîëüöåâûå ññûëêè çàïðåùåíû.unit M1interfaceuses M2;unit M2interfaceuses M1;Ïðè ýòîì òàêàÿ âåùü àáñîëþòíî êîððåêòíà.unit M1interfaceuses M2;unit M2interfaceimplementationuses M1;Òàê êàê uses òðåáóåò òðàíñëÿöèè òîëüêî èíòåðôåéñà.
Òî åñò ÿâíî âèäíî ÷òî ó êàæäîãî ìîäóëÿ èìååòñÿ 2 åäèíèöû òðàíñëÿöèè - èíòåðôåéñ è121îïðåäåëåíèå, ïðè÷åì îíè ìîãóò äàæå òðàíñëèðîâàòüñÿ ðàçäåëüíî äðóãîò äðóãà.Òàêèì îáðàçîâ îñíîâíîé ñîñòàâ áèáëèîòåêè - íåçàâèñèìûå áèáëèîòåêèîáùåãî íàçíà÷åíèÿ. Ïðè ýòîì âîçíèêàåò îãðîìíûé ñïèñîê uses (äî 2 - 3ñòðî÷åê).Ðàññìîòðèì ÿçûê Àäà- îäíîñòîðîííå ñâÿçè- äâóñòîðîííèå ñâÿçèÀäà ïîääåðæèâàåò äâà âèäà òðàíñëÿöèè, òî åñòü ìîæíî òðàíñëèðîâàòü âñå öåëèêîì, à ìîæíî ïî ÷àñòÿì. Åñòü 2 âèäà ìîäóëåé - ïåðâè÷íûå,êîòîðûé òðåáóþòñÿ äëÿ òðàíñëÿöèè äðóãèõ ìîäóëåé è âòîðè÷íûå, êîòîðûå íóæíû ñàìè ïî ñåáå.
Òàêèì îáðàçîì, ïåðâè÷íûå åäèíèöû êàê áûñîîáùàþò êîíòåêñò.  êà÷åñòâå ïåðâè÷íîé åäèíèöû ìîæåò, íàïðèìåð âûñòóïàòü ïðîöåäóðà.Âñå ÷òî îïèñàíî â ìîäóëå ñïåöèôèêàöèè ïåðâè÷íîãî ìîäóëÿ ÿâëÿåòñÿýêñïîðòîì.óêàçàíèå êîíòåêñòàWITH ñïèñîê_ïåðâè÷íûõ_ÅÊuse ñïèñîê; {íå îáÿçàòåëåí}òåêñò åäèíèöû êîìïèëÿöèè.Òàêèì îáðàçîì, îäíîñòîðîííåå ñâÿçûâàíèå â ÿçûêå àäà ïðàêòè÷åñêèíå îòëè÷àåòñÿ îò îäíîñòîðîííåãî ñâÿçûâàíèå â äðóãèõ ßÏ. Ïðè ýòîìñïåöèôèêàöèÿ ïàêåòà ìîæåò áûòü ïåðâè÷íûì ëîãè÷åñêèì ìîäóëåì, à åãîîïèñàíèå - âòîðè÷íûì.package outer is....package Iner is....end Inner;procedure P(X: T1; Y:T2);end Outer;Ïåðâè÷íîé åäèíèöåé êîìïèëÿöèè ÿâëÿåòñÿ îïðåäåëåíèå ïàêåòà Outer.Òåëî ïàêåòà ÿâëÿåòñÿ âòîðè÷íîé åäèíèöåé êîìïèëÿöèè.package body Outer is122package bodu Inner isd separate;procedure P(X:T1;Y:T2) is separate;end Outer;Òàêèì îáðàçîì, ïðîöåäóðà P è âíóòðåííèé ïàêåò îïðåäåëåíû âíå ýòîãî ìîäóëÿ.
Ðàññìîòðèì îñòàâøèåñÿ 2 ìîäóëÿ (ñ ïðîöåäóðîé P è ñ âíóòðåííèì ïàêåòîì).WITH Outer;use Outer;package body Inner is....end Inner;{Error.Bad definition}Òåïåðü íàïèøåì ïðàâèëüíûé âàðèàíò.separate Outer.Inner;package body Inner is....end Inner;{Correct.Correct definition}separate Outerprocedure O(X:T1;Y:T2) is....end P;Óïðàâëåíèå ïðîñòðàíñòâàìè èìåí. ÿçûêå Àäà íåò ïîíÿòèÿ áèáëèîòåêè, òî åñòü íåëüçÿ óêàçàòü ÷òîýòîò íàáîð ìîäóëåé ÿâëÿåòñÿ åäèíèöåé äèñòðèáóöèè. Âñå ýòî äåëàåòñÿâíåøíèìè ñðåäñòâàìè.Ýòà ïðîáëåìà áûëà ðåøåíà â ÿçûêå Java.  Ñ++ åäèíèöåé êîìïèëÿöèè ÿâëÿåòñÿ ôàéë, â êîòîðîì ìîæåò áûòü âñå ÷òî óãîäíî.  Java åäèíèöåé êîìïèëÿöèè òîæå ÿâëÿåòñÿ ôàéë, íî â îòëè÷èè îò Ñ/Ñ++ êàæäûéôàéë äîëæåí ñîäåðæàòü â ñåáå ïåðâûì äåëîì ïðåäëîæåíèå package, óêàçûâàþùåå ê êàêîìó ïàêåòó ïðèíàäëåæèò äàííûé ôàéë.123package mine;public class Outer{public static int main (String [] args){//....}}Òàêèì îáðàçîì, ïàêåò ñëóæèò äëÿ óêàçàíèå êîíòåêñòà òðàíñëÿöèèè åäèíèöû äèñòðèáóöèè îäíîâðåìåííî.