SICP · Yr ail argraffiad · Scheme
4 Haniaethu metaieithyddol
… Mewn geiriau y mae’r hud—Abracadabra, Agor Sesame, a’r gweddill—ond nid yw geiriau hud un stori yn hudol yn y nesaf. Yr hud go iawn yw deall pa eiriau sy’n gweithio, a phryd, ac at ba ddiben; y gamp yw dysgu’r gamp.
… Ac mae’r geiriau hynny wedi’u gwneud o lythrennau ein gwyddor: rhyw ddau ddwsin o sgribladau y gallwn eu llunio â’r ysgrifbin. Dyma’r allwedd! A’r trysor hefyd, pe gallem ond gael gafael arno! Mae fel petai—fel petai’r allwedd i’r trysor yn drysor ei hun!
—John Barth, Chimera
Wrth astudio dylunio rhaglenni, rydym wedi gweld bod rhaglenwyr medrus yn rheoli cymhlethdod eu dyluniadau drwy’r un technegau cyffredinol â dylunwyr pob system gymhleth. Maent yn cyfuno elfennau cyntefig i ffurfio gwrthrychau cyfansawdd, yn haniaethu gwrthrychau cyfansawdd i ffurfio blociau adeiladu ar lefel uwch, ac yn cadw modiwlaredd drwy fabwysiadu golygon priodol ar strwythur systemau ar raddfa fawr. Wrth ddangos y technegau hyn, rydym wedi defnyddio Lisp yn iaith ar gyfer disgrifio prosesau ac ar gyfer adeiladu gwrthrychau data a phrosesau cyfrifiadurol i fodelu ffenomenau cymhleth yn y byd go iawn. Fodd bynnag, wrth wynebu problemau cynyddol gymhleth, cawn nad yw Lisp, nac yn wir unrhyw iaith raglennu sefydlog, yn ddigonol i’n hanghenion. Rhaid inni droi’n gyson at ieithoedd newydd er mwyn mynegi ein syniadau’n fwy effeithiol. Mae sefydlu ieithoedd newydd yn strategaeth bwerus ar gyfer rheoli cymhlethdod mewn dylunio peirianyddol; yn aml gallwn wella ein gallu i ymdrin â phroblem gymhleth drwy fabwysiadu iaith newydd sy’n ein galluogi i ddisgrifio’r broblem, ac felly i feddwl amdani, mewn ffordd wahanol, gan ddefnyddio elfennau cyntefig, dulliau cyfuno a dulliau haniaethu sy’n arbennig o addas i’r broblem dan sylw.205
Mae gan raglennu lu o ieithoedd. Ceir ieithoedd ffisegol, megis ieithoedd peiriant cyfrifiaduron penodol. Mae’r ieithoedd hyn yn ymwneud â chynrychioli data a rheolaeth yn nhermau didau storio unigol a chyfarwyddiadau peiriant cyntefig. Gwaith rhaglennydd iaith peiriant yw defnyddio’r caledwedd sydd ar gael i adeiladu systemau a rhaglenni cyfleustodau ar gyfer gweithredu cyfrifiannau yn effeithlon o fewn cyfyngiadau adnoddau. Mae ieithoedd lefel uchel, a adeiladir ar sylfaen iaith peiriant, yn cuddio materion sy’n ymwneud â chynrychioli data fel casgliadau o ddidau a chynrychioli rhaglenni fel dilyniannau o gyfarwyddiadau cyntefig. Mae gan yr ieithoedd hyn ddulliau cyfuno a haniaethu, megis diffinio gweithdrefnau, sy’n briodol i drefniadaeth systemau ar raddfa fwy.
Mae haniaethu metaieithyddol—sefydlu ieithoedd newydd—yn chwarae rhan bwysig ym mhob cangen o ddylunio peirianyddol. Mae’n arbennig o bwysig i raglennu cyfrifiaduron, oherwydd mewn rhaglennu gallwn nid yn unig lunio ieithoedd newydd ond hefyd weithredu’r ieithoedd hynny drwy adeiladu gwerthusyddion. Gweithdrefn yw gwerthusydd (neu ddehonglydd) iaith raglennu sydd, pan gaiff ei chymhwyso i fynegiad yn yr iaith, yn cyflawni’r gweithrediadau sy’n ofynnol i werthuso’r mynegiad hwnnw.
Nid gor-ddweud yw ystyried mai dyma’r syniad mwyaf sylfaenol mewn rhaglennu:
Dim ond rhaglen arall yw’r gwerthusydd, sy’n pennu ystyr mynegiadau mewn iaith raglennu.
Mae deall y pwynt hwn yn newid y ffordd yr ydym yn ein gweld ein hunain fel rhaglenwyr. Dechreuwn ein gweld ein hunain yn ddylunwyr ieithoedd, yn hytrach na dim ond yn ddefnyddwyr ieithoedd a ddyluniwyd gan eraill.
Yn wir, gallwn ystyried bron unrhyw raglen yn werthusydd rhyw iaith. Er enghraifft, mae’r system trin polynomialau yn 2.5.3 yn ymgorffori rheolau rhifyddeg polynomialau ac yn eu gweithredu drwy weithrediadau ar ddata sydd wedi’u strwythuro’n restrau. Os ychwanegwn weithdrefnau i ddarllen ac argraffu mynegiadau polynomial at y system hon, mae gennym graidd iaith bwrpasol ar gyfer ymdrin â phroblemau mewn mathemateg symbolaidd. Mae’r efelychydd rhesymeg ddigidol yn 3.3.4 a’r lledaenydd cyfyngiadau yn 3.3.5 yn ieithoedd dilys ynddynt eu hunain, pob un â’i elfennau cyntefig, ei dulliau cyfuno a’i dulliau haniaethu ei hun. O’r safbwynt hwn, mae’r dechnoleg ar gyfer ymdopi â systemau cyfrifiadurol mawr yn uno â’r dechnoleg ar gyfer adeiladu ieithoedd cyfrifiadurol newydd, ac nid yw cyfrifiadureg ei hun yn ddim mwy, na dim llai, na’r ddisgyblaeth o adeiladu ieithoedd disgrifiadol priodol.
Dechreuwn yn awr ar daith drwy’r dechnoleg sy’n sefydlu ieithoedd yn nhermau ieithoedd eraill. Yn y bennod hon defnyddiwn Lisp yn sylfaen, gan weithredu gwerthusyddion fel gweithdrefnau Lisp. Mae Lisp yn arbennig o addas i’r dasg hon oherwydd ei gallu i gynrychioli a thrin mynegiadau symbolaidd. Cymerwn y cam cyntaf tuag at ddeall sut y gweithredir ieithoedd drwy adeiladu gwerthusydd ar gyfer Lisp ei hun. Bydd yr iaith a weithredir gan ein gwerthusydd yn is-set o’r dafodiaith Scheme o Lisp a ddefnyddiwn yn y llyfr hwn. Er bod y gwerthusydd a ddisgrifir yn y bennod hon wedi’i ysgrifennu ar gyfer tafodiaith benodol o Lisp, mae ynddo strwythur hanfodol gwerthusydd ar gyfer unrhyw iaith sy’n seiliedig ar fynegiadau ac a ddyluniwyd ar gyfer ysgrifennu rhaglenni i beiriant dilyniannol. (Yn wir, mae’r rhan fwyaf o brosesyddion iaith yn cynnwys gwerthusydd “Lisp” bach yn ddwfn ynddynt.) Symleiddiwyd y gwerthusydd er mwyn dangos a thrafod y syniadau, a hepgorwyd rhai nodweddion y byddai’n bwysig eu cynnwys mewn system Lisp o ansawdd cynhyrchu. Serch hynny, mae’r gwerthusydd syml hwn yn ddigonol i redeg y rhan fwyaf o’r rhaglenni yn y llyfr hwn.206
Mantais bwysig darparu’r gwerthusydd fel rhaglen Lisp y gallwn ei harchwilio yw y gallwn weithredu rheolau gwerthuso amgen drwy eu disgrifio fel addasiadau i raglen y gwerthusydd. Un man lle gallwn ddefnyddio’r gallu hwn yn effeithiol yw cael rheolaeth ychwanegol dros y ffyrdd y mae modelau cyfrifiadurol yn ymgorffori’r syniad o amser, a oedd mor ganolog i’r drafodaeth ym Mhennod 3. Yno, lliniarwyd rhai o gymhlethdodau cyflwr ac aseiniad drwy ddefnyddio ffrydiau i wahanu cynrychiolaeth amser yn y byd oddi wrth amser yn y cyfrifiadur. Fodd bynnag, roedd ein rhaglenni ffrydiau weithiau’n drwsgl, oherwydd eu bod wedi’u cyfyngu gan werthuso trefn gymhwysol Scheme. Yn 4.2, newidiwn yr iaith sylfaenol i ganiatáu dull mwy cain, drwy addasu’r gwerthusydd i ddarparu gwerthuso trefn arferol.
Mae Adran 4.3 yn gweithredu newid ieithyddol mwy uchelgeisiol, lle mae gan fynegiadau lawer o werthoedd yn lle un gwerth yn unig. Yn yr iaith hon ar gyfer cyfrifiannu an-benderfyniaethol, mae’n naturiol mynegi prosesau sy’n cynhyrchu pob gwerth posibl i fynegiadau ac yna’n chwilio am y gwerthoedd hynny sy’n bodloni cyfyngiadau penodol. Yn nhermau modelau cyfrifiannu ac amser, mae hyn fel peri i amser ganghennu’n set o “ddyfodolau posibl” ac yna chwilio am linellau amser priodol. Gyda’n gwerthusydd an-benderfyniaethol, mecanwaith sylfaenol yr iaith sy’n trin cadw golwg ar werthoedd lluosog a chyflawni chwiliadau yn awtomatig.
Yn 4.4 gweithredwn iaith rhaglennu rhesymegol lle mynegir gwybodaeth yn nhermau perthnasoedd, yn hytrach nag yn nhermau cyfrifiannau â mewnbynnau ac allbynnau. Er bod hyn yn gwneud yr iaith yn dra gwahanol i Lisp, ac yn wir i unrhyw iaith gonfensiynol, gwelwn fod y gwerthusydd rhaglennu rhesymegol yn rhannu strwythur hanfodol y gwerthusydd Lisp.
Troednodiadau
205 Mae’r un syniad yn treiddio drwy beirianneg gyfan. Er enghraifft, mae peirianwyr trydanol yn defnyddio llawer o ieithoedd gwahanol i ddisgrifio cylchedau. Dwy o’r rhain yw iaith rhwydweithiau trydanol ac iaith systemau trydanol. Mae iaith y rhwydweithiau yn pwysleisio modelu dyfeisiau’n ffisegol yn nhermau elfennau trydanol arwahanol. Gwrthrychau cyntefig iaith y rhwydweithiau yw cydrannau trydanol cyntefig megis gwrthyddion, cynwysyddion, anwythyddion a thransistorau, a nodweddir yn nhermau newidynnau ffisegol o’r enw foltedd a cherrynt. Wrth ddisgrifio cylchedau yn iaith y rhwydweithiau, mae’r peiriannydd yn ymwneud â nodweddion ffisegol dyluniad. Mewn cyferbyniad, gwrthrychau cyntefig iaith y systemau yw modiwlau prosesu signalau megis hidlyddion a mwyhaduron. Dim ond ymddygiad swyddogaethol y modiwlau sy’n berthnasol, a thrinnir signalau heb ystyried eu gwireddu’n ffisegol fel folteddau a cheryntau. Adeiledir iaith y systemau ar iaith y rhwydweithiau, yn yr ystyr bod elfennau systemau prosesu signalau wedi’u hadeiladu o rwydweithiau trydanol. Yma, fodd bynnag, y mater yw trefniadaeth dyfeisiau trydanol ar raddfa fawr i ddatrys problem gymhwysol benodol; tybir bod y rhannau’n bosibl yn ffisegol. Mae’r casgliad haenog hwn o ieithoedd yn enghraifft arall o’r dechneg dylunio haenedig a ddangoswyd gan iaith y lluniau yn 2.2.4.
206 Y nodweddion pwysicaf y mae ein gwerthusydd yn eu hepgor yw mecanweithiau ar gyfer trin gwallau a chefnogi dadfygio. Am drafodaeth fwy helaeth ar werthusyddion, gweler Friedman et al. 1992, sy’n cyflwyno ieithoedd rhaglennu drwy ddilyniant o werthusyddion wedi’u hysgrifennu yn Scheme.