А.В. Столяров - Оформление программного кода (1108519), страница 20
Текст из файла (страница 20)
Îáùèé ïðèíöèï îôîðìëåíèÿ êîäà íà ÿçûêå àññåìáëåðà äîâîëüíî ïðîñò. Ñëåäóåò ìûñëåííî ðàçäåëèòü ãîðèçîíòàëüíîå ïðîñòðàíñòâî ýêðàíà íà äâå ÷àñòè: îáëàñòü ìåòîêè îáëàñòü êîìàíä (îïåðàòîðîâ). ×àñòî âûäåëÿþò òàêæå îáëàñòü êîììåíòàðèåâ. Êîä ïèøåòñÿ ¾â ñòîëáèê¿ ïðèìåðíî òàê:xor ebx, ebxxor ecx, ecxlp:mov bl, [esi+ecx]cmp bl, 0je lpquitpush ebxinc ecxjmp lplpquit: jecxz donemov edi, esilp2:pop ebxmov [edi], blinc ediloop lp2done:;;;;;;;;;;;;;;zero ebxzero ecxanother byte from the stringis the string over?end the loop if sonext indexrepeat the loopfinish if the string is emptypoint to the buffer's beginget a charstore the charnext addressrepeat ecx timesÅñëè ìåòêà íå ïîìåùàåòñÿ â îòâåä¼ííîå äëÿ ìåòîê ïðîñòðàíñòâî, å¼ ðàñïîëàãàþò íà îòäåëüíîé ñòðîêå:fill_memory:jecxz fm_qfm_lp: mov [edi], alinc ediloop fm_lpfm_q:retÎáû÷íî ïðè ðàáîòå íà ÿçûêå àññåìáëåðà ïîä ìåòêè âûäåëÿþò ñòîëáåö øèðèíîé â îäíó òàáóëÿöèþ è, åñòåñòâåííî, èìåííî ñèìâîë òàáóëÿöèè(à íå ïðîáåëû!) ñòàâÿò ïåðåä êàæäîé êîìàíäîé (â òîì ÷èñëå è ïîñëåìåòîê).
Íåêîòîðûå ïðîãðàììèñòû ïðåäïî÷èòàþò îòäàòü ïîä ìåòêè äâåòàáóëÿöèè; ýòî ïîçâîëÿåò èñïîëüçîâàòü áîëåå äëèííûå ìåòêè áåç âûäåëåíèÿ äëÿ íèõ îòäåëüíûõ ñòðîê:fill_memory:fm_lp:fm_q:jecxz fm_qmov [edi], alinc ediloop fm_lpret89Äîâîëüíî ÷àñòî ìîæíî âñòðåòèòü ñòèëü îôîðìëåíèÿ, ïðåäïîëàãàþùèé îòäåëüíóþ êîëîíêó äëÿ îáîçíà÷åíèÿ êîìàíäû. Âûãëÿäèò ýòî ïðèìåðíî òàê:fill_memory:fm_lp:fm_q:jecxzmovincloopretfm_q[edi], aledifm_lpÊ ñîæàëåíèþ, ýòîò ñòèëü ¾ëîìàåòñÿ¿ ïðè èñïîëüçîâàíèè, íàïðèìåð, ìàêðîñîâ ñ èìåíàìè äëèííåå ñåìè ñèìâîëîâ, ïîñêîëüêó èìÿ òàêîãî ìàêðîñàïðè ìàêðîâûçîâå ñëåäóåò çàïèñàòü, ÷òî âïîëíå åñòåñòâåííî, â êîëîíêóêîìàíäû, íî ïðîñòðàíñòâà â ýòîé êîëîíêå íå õâàòàåò.
Âïðî÷åì, äëÿ ìàêðîñîâ ìîæíî ñäåëàòü èñêëþ÷åíèå èç ïðàâèë.Êàê ìîæíî çàìåòèòü, íèêàêèå ñòðóêòóðíûå îòñòóïû çäåñü íå èñïîëüçóþòñÿ, ÷òî ìîæíî äîâîëüíî ëåãêî îáúÿñíèòü: ïðîãðàììà íà ÿçûêå àññåìáëåðà ïðåäñòàâëÿåò ñîáîé ïðîîáðàç ñîäåðæèìîãî îïåðàòèâíîé ïàìÿòè, êîòîðàÿ, ñîãëàñíî ïðèíöèïàì ôîí Íåéìàíà, ëèíåéíà è îäíîðîäíà.Äëÿ âûäåëåíèÿ óïðàâëÿþùèõ êîíñòðóêöèé îñòàþòñÿ òîëüêî êîììåíòàðèè, è óæ èõ ñëåäóåò èñïîëüçîâàòü ¾íà âñþ êàòóøêó¿, åñëè òîëüêî âû íåõîòèòå â êîíå÷íîì ðåçóëüòàòå ïîëó÷èòü òåêñò, â êîòîðîì ñàìè íèêîãäàíå ðàçáåð¼òåñü.3.2. Ëèñï è åãî äèàëåêòûßçûê Ëèñï çíàìåíèò ñâîèì ñèíòàêñèñîì, à òî÷íåå ïîëíûì îòñóòñòâèåì òàêîâîãî.
Ïðîãðàììà ñîñòîèò èç ñïèñêîâ, êàê, ñîáñòâåííî, è áîëüøàÿ ÷àñòü âîçìîæíûõ äàííûõ, íó à ñïèñîê â Ëèñïå ýòî îòêðûâàþùàÿ êðóãëàÿ ñêîáêà, ïðîèçâîëüíîå êîëè÷åñòâî ýëåìåíòîâ ÷åðåç ïðîáåëè çàêðûâàþùàÿ êðóãëàÿ ñêîáêà; ýëåìåíòàìè ìîãóò áûòü êàê àòîìàðíûåâûðàæåíèÿ ëþáîãî òèïà, òàê è, â ñâîþ î÷åðåäü, ñïèñêè, è òàê íà ïðîèçâîëüíóþ ãëóáèíó. Òàêèå ãåòåðîãåííûå ñòðóêòóðû äàííûõ íàçûâàþòñÿS-âûðàæåíèÿìè.Êîíå÷íî, ïðè ñîçäàíèè ïðîãðàìì íà Ëèñïå ïðèõîäèòñÿ ïðèìåíÿòüñòðóêòóðíûå îòñòóïû, èíà÷å, ïîæàëóé, â ýòèõ ñêîïëåíèÿõ ñêîáîê ðàçîáðàòüñÿ áûëî áû ñîâåðøåííî íåâîçìîæíî. Ïðè ýòîì âûçûâàåò íåêîòîðîåóäèâëåíèå ñòèëü îòñòóïîâ, ¾èñòîðè÷åñêè ñëîæèâøèéñÿ¿ âîêðóã Ëèñïà.Ðàññìîòðèì äëÿ ïðèìåðà òèïè÷íóþ ôóíêöèþ íà Ëèñïå:(defun isomorphic (tree1 tree2)(cond ((atom tree1) (atom tree2))((atom tree2) NIL)(t (and (isomorphic (car tree1) (car tree2))(isomorphic (cdr tree1) (cdr tree2))))))90Îáðàùàþò íà ñåáÿ âíèìàíèå äâà âàæíûõ ìîìåíòà.
Âî-ïåðâûõ, ðàçìåð îòñòóïà ÿâíî ¾ïëàâàåò¿: ôîðìà cond ñäâèíóòà îòíîñèòåëüíî îáúåìëþùåéôîðìû íà ñåìü ïðîáåëîâ, îòäåëüíûå ïðåäëîæåíèÿ ýòîãî cond'à ñäâèíóòû óæå íà øåñòü ïðîáåëîâ, à âòîðîé àðãóìåíò and ñäâèíóò íà âîñåìüïðîáåëîâ ïðàâåå ïðåäûäóùåãî óðîâíÿ îòñòóïà. Îáóñëîâëåíî ýòî ãëàâåíñòâóþùèì ïîäõîäîì ê ôîðìàòèðîâàíèþ ñïèñêà: åñëè ñïèñîê óìåùàåòñÿâ ñòðîêó, òî åãî çàïèñûâàþò íà îäíîé ñòðîêå, åñëè æå îí íå óìåùàåòñÿ,òî íà îäíîé ñòðîêå ïèøóò åãî íà÷àëî ïåðâûé ýëåìåíò, êîòîðûé ÷àùåïðåäñòàâëÿåò ñîáîé èìÿ ôóíêöèè èëè ôîðìû, è âòîðîé ýëåìåíò, òî åñòüïåðâûé àðãóìåíò ôóíêöèè èëè ôîðìû; îñòàëüíûå àðãóìåíòû ðàñïîëàãàþò ïîä ïåðâûì ¾â ñòîëáèê¿1 .
Åñëè ïåðâûé àðãóìåíò íå ïîìåñòèëñÿâ ñòðîêó, åãî ðàçáèâàþò àíàëîãè÷íûì îáðàçîì, ïðè÷¼ì åãî íà÷àëî íàñëåäóþùóþ ñòðîêó íå ïåðåíîñÿò (èìåííî òàê â ïðèâåä¼ííîì ïðèìåðå ïîëó÷èëîñü ñ âûçîâîì and ïîñëå ñèìâîëà t).  ðåçóëüòàòå ðàçìåð ñäâèãàîïðåäåëÿåòñÿ äëèíîé èìåíè ñèìâîëà, ñòîÿùåãî â ôîðìå ïåðâûì: ñëîâîdefun âìåñòå ñî ñêîáêîé è ïðîáåëîì äà¼ò ñåìü ñèìâîëîâ (îòñþäà ñåìüïðîáåëîâ íà ïåðâîì óðîâíå îòñòóïà), cond âìåñòå ñî ñêîáêîé è ïðîáåëîìäà¼ò øåñòü ñèìâîëîâ ýòî ðàçìåð âòîðîãî óðîâíÿ îòñòóïà, íó à t, and,äâå ñêîáêè è äâà ïðîáåëà ýòî èñêîìûå âîñåìü ïðîáåëîâ íà òðåòüåìóðîâíå.Âòîðàÿ õàðàêòåðíàÿ îñîáåííîñòü, ïîêàçàííàÿ â ïðèìåðå ýòî ãðóïïàèç øåñòè çàêðûâàþùèõ ñêîáîê â êîíöå.
Ïî÷åìó ïîêëîííèêè Ëèñïà ïðåäïî÷èòàþò çàêðûâàòü âëîæåííûå ñïèñêè èìåííî òàêèì âîò îáðàçîì, íåâïîëíå ïîíÿòíî, âåäü ñêîáêè ïðèõîäèòñÿ ñ÷èòàòü, îíè ñëèâàþòñÿ äðóãñ äðóãîì, î÷åâèäíî ñòàíîâÿñü èñòî÷íèêîì òðóäíîîáíàðóæèìûõ îøèáîê.Òåì íå ìåíåå, òàêîé ñòèëü íàñòîëüêî ïîïóëÿðåí, ÷òî ñóùåñòâóþò äàæåäèàëåêòû Ëèñïà, â êîòîðûõ åñòü ñïåöèàëüíûé ñèìâîë, îáîçíà÷àþùèé¾ñòîëüêî çàêðûâàþùèõ ñêîáîê, ñêîëüêî åñòü íåçàêðûòûõ ñïèñêîâ¿; òàê,â äèàëåêòå muLISP ìîæíî áûëî çàïèñàòü íàø ïðèìåð ñëåäóþùèì îáðàçîì:(defun isomorphic (lambda (tree1(cond ((atom tree1) (atom((atom tree2) NIL)(t (and (isomorphic(isomorphictree2)tree2))(car tree1) (car tree2))(cdr tree1) (cdr tree2]Âîçìîæíîñòü çàêðûòü ñðàçó âñå îòêðûòûå ñêîáêè óäîáíà ëèøü íà ïåðâûéâçãëÿä: èñïîëüçóÿ å¼, ìû ñàìè ñåáÿ ëèøàåì ñðåäñòâà ïðîâåðêè êîððåêòíîñòè ñòðóêòóðû íàøåãî ñïèñêà.1 Ôîðìà defun ïðåäñòàâëÿåò ñîáîé îäíî èç íåñêîëüêèõ èñêëþ÷åíèé èç îáùåãî ïðàâèëà: çäåñü ñòàðàþòñÿ íà îäíîé ñòðîêå ðàçìåñòèòü ñàìî èìÿ ôîðìû, çàòåì èìÿ ôóíêöèèè ñïèñîê ïàðàìåòðîâ, à òåëî ôóíêöèè îáû÷íî ñíîñÿò íà ñëåäóþùóþ ñòðîêó, äàæå åñëèîíî óìåñòèëîñü áû â îäíîé ñòðîêå ñ ¾çàãîëîâêîì¿.91Ìåæäó òåì, íèêòî íå ìåøàåò ïèñàòü íà Ëèñïå ¾ïî-ïàñêàëåâñêè¿, ñïîñòîÿííûì ðàçìåðîì îòñòóïà è ðàñïîëîæåíèåì çàêðûâàþùåé ñêîáêèòî÷íî ïîä íà÷àëîì ñîîòâåòñòâóþùåé êîíñòðóêöèè; íóæíî òîëüêî ðàçðûâàòü ñïèñîê, íå ïîìåñòèâøèéñÿ â ñòðîêó, íå ïîñëå âòîðîãî ýëåìåíòà, àïîñëå ïåðâîãî.
Âûãëÿäåòü ýòî áóäåò ïðèìåðíî òàê (çäåñü ìû ïðèìåíÿåìîòñòóï íà òðè ïðîáåëà):(defun isomorphic (tree1 tree2)(cond((atom tree1) (atom tree2))((atom tree2) NIL)(t(and(isomorphic (car tree1) (car tree2))(isomorphic (cdr tree1) (cdr tree2))))))Êîíå÷íî, òàêîé êîä çàíèìàåò áîëüøå ñòðîê, íî ýòî îêóïàåòñÿ ÿñíîñòüþåãî ñòðóêòóðû.  ÷àñòíîñòè, ðàñïîëîæåíèå íåñêîëüêèõ èäóùèõ ïîäðÿäçàêðûâàþùèõ êðóãëûõ ñêîáîê âäîëü äèàãîíàëè ýêðàíà ïîêàçûâàåò, ÷òîáàëàíñ ñêîáîê, ñêîðåå âñåãî, ñîáëþä¼í, òîãäà êàê íàðóøåíèå òàêîãî ðàñïîëîæåíèÿ îäíîçíà÷íî ñâèäåòåëüñòâóåò î òîì, ÷òî ãäå-òî ìû ñî ñêîáêàìèçàïóòàëèñü. áîëüøèíñòâå ñëó÷àåâ ñèíòàêñè÷åñêàÿ ñòðóêòóðà â Ëèñïå ýòî ïðîñòî ñïèñîê, êîòîðûé íà÷èíàåòñÿ è çàêàí÷èâàåòñÿ ñêîáêîé, òàê ÷òî îòêðûâàþùóþ è çàêðûâàþùóþ êðóãëûå ñêîáêè ïðèõîäèòñÿ ðàñïîëàãàòü òî÷íî äðóã íàä äðóãîì (êîíå÷íî, åñëè îíè íå îñòàëèñü íà îäíîé ñòðîêå).Èç ýòîãî ïðàâèëà åñòü íåñêîëüêî èñêëþ÷åíèé, ñâÿçàííûõ ñ ñîêðàù¼ííîé çàïèñüþ êâîòèðîâàíèÿ (àïîñòðîô), ôóíêöèîíàëüíîãî êâîòèðîâàíèÿ(êîìáèíàöèÿ ¾#'¿), ñ ñèíòàêñèñîì âåêòîðà (ñèìâîë ¾#¿), ïîëóêâîòèðîâàíèåì (semiquotation) è åãî ñîñòàâëÿþùèìè, êîòîðûå èñïîëüçóþòñÿ âìàêðîñàõ, è òàê äàëåå.
Âî âñåõ ýòèõ ñëó÷àÿõ ïåðåä îòêðûâàþùåé ñêîáêîéîêàçûâàåòñÿ îäèí èëè äâà ñèìâîëà, çàäàþùèõ èíîé ñìûñë âñåé êîíñòðóêöèè; ïðè ýòîì ïîëó÷àåòñÿ, ÷òî îòêðûâàþùàÿ ñêîáêà íå ïåðâûé ñèìâîëêîíñòðóêöèè, íî çàêðûâàþùàÿ ïî-ïðåæíåìó ïîñëåäíèé ñèìâîë. Åñòåñòâåííî, åñëè òàêàÿ êîíñòðóêöèÿ îêàçàëàñü ðàçíåñåíà íà íåñêîëüêî ñòðîê,ñëåäóåò ðàñïîëàãàòü çàêðûâàþùóþ ñêîáêó òî÷íî ïîä íà÷àëîì êîíñòðóêöèè, à íå ïîä îòêðûâàþùåé ñêîáêîé:92(mapcar#'(lambda (str elem)(list ('rec str elem 'endrec)))listcycled-labels) ýòîì ïðèìåðå òàêæå âèäíî, ÷òî lambda-ñïèñîê ïðåäñòàâëÿåò ñîáîé åù¼îäíî èñêëþ÷åíèå èç ïðàâèë åãî îôîðìëåíèå íàïîìèíàåò îôîðìëåíèåôîðìû defun; èñòî÷íèê òàêîãî èñêëþ÷åíèÿ âïîëíå ïîíÿòåí, âåäü lambdañïèñîê ýòî áåçûìÿííàÿ ôóíêöèÿ, à äëÿ ôóíêöèè íàì ïðèâû÷íåå âèäåòüçàãîëîâîê, â êîòîðûé âêëþ÷¼í ñïèñîê ïàðàìåòðîâ.Åù¼ îäèí âàæíûé îñîáûé ñëó÷àé, çàñëóæèâàþùèé âíèìàíèÿ ýòîôîðìà let, à òàêæå âñåâîçìîæíûå let*, letrec, funlet, macrolet è ò.
ï.Åñëè ñïèñîê ëîêàëüíûõ ïåðåìåííûõ, ââîäèìûõ ñ ïîìîùüþ let, óìåùàåòñÿ íà îäíîé ñòðîêå ñ ñàìèì ñëîâîì let, ñëåäóåò òàì åãî è îñòàâèòü:(let ((s 0) (p 1))(mapcar#'(lambda (x) (setq s (+ s x)) (setq p (* p x)))lst))Ñèòóàöèÿ ðåçêî îñëîæíÿåòñÿ, åñëè ïåðâûé ýëåìåíò ôîðìû let ïðèõîäèòñÿ ðàñïîëîæèòü íà íåñêîëüêèõ ñòðîêàõ, à òàêîå òðåáóåòñÿ î÷åíü ÷àñòî äîñòàòî÷íî â îäíîì èç èíèöèàëèçàòîðîâ ïîÿâèòüñÿ ñëîæíîìó âûðàæåíèþ. ¾Ïðàâèëüíîãî¿ ðåøåíèÿ äëÿ ýòîé ñèòóàöèè ïðîñòî íåò, âñå ñóùåñòâóþùèå âàðèàíòû òàê èëè èíà÷å îêàçûâàþòñÿ ïëîõè. Ïðîãðàììèñòû âòàêèõ ñëó÷àÿõ èçîáðåòàþò ñàìûå ðàçíîîáðàçíûå êîíñòðóêöèè, íàïðèìåð:(let ((seq (build-sequencer 0))(colset '(red orange yellow green blue violet))(ls nil))(setq ls (mapcar #'list seq colset the-list))(store ls)(reverse ls))Íåäîñòàòêè òàêîãî ôîðìàòèðîâàíèÿ (ê ñîæàëåíèþ, òðàäèöèîííîãî äëÿËèñïà) ìû óæå îòìå÷àëè âûøå.