SICP · Yr ail argraffiad · Scheme
2 Adeiladu Haniaethau â Data
Deuwn yn awr at gam tyngedfennol haniaethu mathemategol: anghofiwn beth mae’r symbolau’n ei gynrychioli. … Nid oes angen i [y mathemategydd] fod yn segur; mae llawer o weithrediadau y gall eu cyflawni â’r symbolau hyn, heb orfod edrych byth ar y pethau y maent yn eu cynrychioli.
—Hermann Weyl, The Mathematical Way of Thinking
Canolbwyntiasom ym Mhennod 1 ar brosesau cyfrifiadurol ac ar rôl gweithdrefnau wrth ddylunio rhaglenni. Gwelsom sut i ddefnyddio data cyntefig (rhifau) a gweithrediadau cyntefig (gweithrediadau rhifyddol), sut i gyfuno gweithdrefnau i ffurfio gweithdrefnau cyfansawdd drwy gyfansoddi, mynegiadau amodol, a defnyddio paramedrau, a sut i haniaethu gweithdrefnau drwy ddefnyddio define. Gwelsom y gellir ystyried gweithdrefn yn batrwm ar gyfer esblygiad lleol proses, a dosbarthasom rai patrymau cyffredin ar gyfer prosesau fel y’u hymgorfforir mewn gweithdrefnau, rhesymu amdanynt, a chyflawni dadansoddiadau algorithmig syml ohonynt. Gwelsom hefyd fod gweithdrefnau trefn uwch yn cynyddu grym ein hiaith drwy ein galluogi i drin dulliau cyfrifo cyffredinol, a thrwy hynny resymu yn eu termau. Dyma lawer o hanfod rhaglennu.
Yn y bennod hon byddwn yn edrych ar ddata mwy cymhleth. Mae’r holl weithdrefnau ym mhennod 1 yn gweithredu ar ddata rhifiadol syml, ac nid yw data syml yn ddigonol ar gyfer llawer o’r problemau yr hoffem fynd i’r afael â hwy drwy gyfrifo. Fel arfer dylunnir rhaglenni i fodelu ffenomenau cymhleth, ac yn amlach na pheidio rhaid adeiladu gwrthrychau cyfrifiadurol sydd â sawl rhan er mwyn modelu ffenomenau’r byd go iawn sydd â sawl agwedd. Felly, er mai adeiladu haniaethau drwy gyfuno gweithdrefnau i ffurfio gweithdrefnau cyfansawdd oedd ein prif bwnc ym mhennod 1, trown yn y bennod hon at agwedd allweddol arall ar unrhyw iaith raglennu: y moddion y mae’n eu darparu ar gyfer adeiladu haniaethau drwy gyfuno gwrthrychau data i ffurfio data cyfansawdd.
Pam y mae arnom eisiau data cyfansawdd mewn iaith raglennu? Am yr un rhesymau ag yr ydym eisiau gweithdrefnau cyfansawdd: i godi’r lefel gysyniadol y gallwn ddylunio ein rhaglenni arni, i gynyddu modiwlaredd ein dyluniadau, ac i wella gallu mynegiannol ein hiaith. Yn union fel y mae’r gallu i ddiffinio gweithdrefnau yn ein galluogi i ymdrin â phrosesau ar lefel gysyniadol uwch na gweithrediadau cyntefig yr iaith, mae’r gallu i adeiladu gwrthrychau data cyfansawdd yn ein galluogi i ymdrin â data ar lefel gysyniadol uwch na gwrthrychau data cyntefig yr iaith.
Ystyriwch y dasg o ddylunio system i gyflawni rhifyddeg â rhifau cymarebol. Gallem ddychmygu gweithrediad add-rat sy’n cymryd dau rif cymarebol ac yn cynhyrchu eu swm. Yn nhermau data syml, gellir ystyried rhif cymarebol yn ddau gyfanrif: rhifiadur ac enwadur. Felly, gallem ddylunio rhaglen lle byddai pob rhif cymarebol yn cael ei gynrychioli gan ddau gyfanrif (rhifiadur ac enwadur), a lle byddai add-rat yn cael ei weithredu gan ddwy weithdrefn (un yn cynhyrchu rhifiadur y swm ac un yn cynhyrchu’r enwadur). Ond byddai hyn yn lletchwith, oherwydd byddai angen wedyn gadw golwg yn benodol ar ba rifiaduron sy’n cyfateb i ba enwaduron. Mewn system a fwriedir i gyflawni llawer o weithrediadau ar lawer o rifau cymarebol, byddai manylion cadw cofnodion o’r fath yn llenwi’r rhaglenni â chymhlethdod sylweddol, heb sôn am yr hyn y byddent yn ei wneud i’n meddyliau. Byddai’n llawer gwell pe gallem “ludo ynghyd” rifiadur ac enwadur i ffurfio pâr— gwrthrych data cyfansawdd—y gallai ein rhaglenni ei drin mewn modd a fyddai’n gyson ag ystyried rhif cymarebol yn un uned gysyniadol.
Mae defnyddio data cyfansawdd hefyd yn ein galluogi i gynyddu modiwlaredd ein rhaglenni. Os gallwn drin rhifau cymarebol yn uniongyrchol fel gwrthrychau yn eu hawl eu hunain, gallwn wahanu’r rhan o’n rhaglen sy’n ymdrin â rhifau cymarebol ynddynt eu hunain oddi wrth fanylion sut y gellir cynrychioli rhifau cymarebol fel parau o gyfanrifau. Mae’r dechneg gyffredinol o ynysu’r rhannau o raglen sy’n ymdrin â sut y cynrychiolir gwrthrychau data oddi wrth y rhannau o raglen sy’n ymdrin â sut y defnyddir gwrthrychau data yn fethodoleg ddylunio rymus o’r enw haniaethu data. Gwelwn sut mae haniaethu data yn gwneud rhaglenni’n llawer haws eu dylunio, eu cynnal, a’u haddasu.
Mae defnyddio data cyfansawdd yn arwain at gynnydd gwirioneddol yng ngallu mynegiannol ein hiaith raglennu. Ystyriwch y syniad o ffurfio “cyfuniad llinol”
(define (linear-combination a b x y)
(+ (* a x) (* b y)))Ond tybiwch nad rhifau’n unig sydd o ddiddordeb inni. Tybiwch yr hoffem fynegi, yn nhermau gweithdrefnau, y syniad y gellir ffurfio cyfuniadau llinol pryd bynnag y diffinnir adio a lluosi—ar gyfer rhifau cymarebol, rhifau cymhlyg, polynomialau, neu beth bynnag. Gallem fynegi hyn fel gweithdrefn o’r ffurf
(define (linear-combination a b x y)
(add (mul a x) (mul b y)))lle nad y gweithdrefnau cyntefig + a * yw add ac mul, ond pethau mwy cymhleth a fydd yn cyflawni’r gweithrediadau priodol ar gyfer pa fathau bynnag o ddata a basiwyd gennym fel yr argiau a, b, x, a y. Y pwynt allweddol yw mai’r unig beth y dylai fod angen i linear-combination ei wybod am a, b, x, a y yw y bydd y gweithdrefnau add ac mul yn cyflawni’r triniaethau priodol. O safbwynt y weithdrefn linear-combination, mae’n amherthnasol beth yw a, b, x, a y, ac yn fwy amherthnasol fyth sut y digwydd eu bod yn cael eu cynrychioli yn nhermau data mwy cyntefig. Mae’r un enghraifft hon yn dangos pam mae’n bwysig bod ein hiaith raglennu’n darparu’r gallu i drin gwrthrychau cyfansawdd yn uniongyrchol: Heb hyn, ni all gweithdrefn fel linear-combination basio ei hargiau ymlaen i add ac mul heb orfod gwybod eu strwythur manwl.67
Dechreuwn y bennod hon drwy weithredu’r system rhifyddeg rhifau cymarebol a grybwyllwyd uchod. Bydd hon yn ffurfio cefndir ein trafodaeth am ddata cyfansawdd a haniaethu data. Fel gyda gweithdrefnau cyfansawdd, y prif fater i fynd i’r afael ag ef yw haniaethu fel techneg ar gyfer ymdopi â chymhlethdod, a gwelwn sut mae haniaethu data yn ein galluogi i godi rhwystrau haniaethu addas rhwng gwahanol rannau o raglen.
Gwelwn mai’r allwedd i ffurfio data cyfansawdd yw y dylai iaith raglennu ddarparu rhyw fath o “lud” fel y gellir cyfuno gwrthrychau data i ffurfio gwrthrychau data mwy cymhleth. Mae llawer o fathau posibl o lud. Yn wir, darganfyddwn sut i ffurfio data cyfansawdd heb ddefnyddio unrhyw weithrediadau “data” arbennig o gwbl, dim ond gweithdrefnau. Bydd hyn yn niwlio ymhellach y gwahaniaeth rhwng “gweithdrefn” a “data,” a oedd eisoes yn mynd yn fregus tua diwedd pennod 1. Byddwn hefyd yn archwilio rhai technegau confensiynol ar gyfer cynrychioli dilyniannau a choed. Un syniad allweddol wrth ymdrin â data cyfansawdd yw’r syniad o briodwedd cau—y dylai’r glud a ddefnyddiwn i gyfuno gwrthrychau data ganiatáu inni gyfuno gwrthrychau data cyfansawdd yn ogystal â gwrthrychau data cyntefig. Syniad allweddol arall yw y gall gwrthrychau data cyfansawdd wasanaethu fel rhyngwynebau confensiynol ar gyfer cyfuno modiwlau rhaglen mewn gwahanol gyfuniadau. Darluniwn rai o’r syniadau hyn drwy gyflwyno iaith graffeg syml sy’n defnyddio’r briodwedd cau.
Byddwn wedyn yn ehangu gallu cynrychioliadol ein hiaith drwy gyflwyno mynegiadau symbolaidd—data y gall eu rhannau elfennol fod yn symbolau mympwyol yn hytrach na rhifau’n unig. Archwiliwn wahanol ddewisiadau ar gyfer cynrychioli setiau o wrthrychau. Cawn weld, yn union fel y gellir cyfrifo ffwythiant rhifiadol penodol drwy lawer o brosesau cyfrifiadurol gwahanol, fod llawer o ffyrdd o gynrychioli strwythur data penodol yn nhermau gwrthrychau symlach, a gall y dewis o gynrychioliad gael effaith sylweddol ar ofynion amser a gofod y prosesau sy’n trin y data. Byddwn yn ymchwilio i’r syniadau hyn yng nghyd-destun differu symbolaidd, cynrychioli setiau, ac amgodio gwybodaeth.
Nesaf, awn i’r afael â’r broblem o weithio â data y gall gwahanol rannau o raglen eu cynrychioli’n wahanol. Mae hyn yn arwain at yr angen i weithredu gweithrediadau generig, y mae’n rhaid iddynt drin llawer o wahanol fathau o ddata. Mae cynnal modiwlaredd ym mhresenoldeb gweithrediadau generig yn gofyn am rwystrau haniaethu mwy grymus nag y gellir eu codi drwy haniaethu data syml yn unig. Yn benodol, cyflwynwn raglennu a gyfarwyddir gan ddata fel techneg sy’n caniatáu dylunio cynrychioliadau data unigol ar wahân ac yna eu cyfuno drwy ychwanegu (h.y., heb eu haddasu). I ddangos grym y dull hwn o ddylunio systemau, terfynwn y bennod drwy gymhwyso’r hyn a ddysgasom i weithredu pecyn ar gyfer cyflawni rhifyddeg symbolaidd ar bolynomialau, lle gall cyfernodau’r polynomialau fod yn gyfanrifau, yn rhifau cymarebol, yn rhifau cymhlyg, a hyd yn oed yn bolynomialau eraill.
Troednodiadau
67 Mae’r gallu i drin gweithdrefnau’n uniongyrchol yn darparu cynnydd cyfatebol yng ngallu mynegiannol iaith raglennu. Er enghraifft, yn 1.3.1 cyflwynasom y weithdrefn sum, sy’n cymryd gweithdrefn term fel arg ac yn cyfrifo swm gwerthoedd term dros ryw gyfwng penodedig. Er mwyn diffinio sum, mae’n hanfodol ein bod yn gallu sôn am weithdrefn fel term fel endid yn ei hawl ei hun, heb ystyried sut y gellid mynegi term â gweithrediadau mwy cyntefig. Yn wir, pe na bai gennym y syniad o “weithdrefn,” mae’n amheus a fyddem byth hyd yn oed yn meddwl am y posibilrwydd o ddiffinio gweithrediad fel sum. At hynny, o ran cyflawni’r symio, mae manylion sut y gellir adeiladu term o weithrediadau mwy cyntefig yn amherthnasol.