SICP · Yr ail argraffiad · Scheme
1 Adeiladu Haniaethau â Gweithdrefnau
Gweithredoedd y meddwl, lle mae'n arfer ei rym dros syniadau syml, yw'r tair hyn yn bennaf: 1. Cyfuno sawl syniad syml yn un cyfansawdd, ac felly y gwneir pob syniad cymhleth. 2. Yr ail yw dod â dau syniad, boed yn syml neu'n gymhleth, ynghyd, a'u gosod ochr yn ochr er mwyn eu gweld ar unwaith, heb eu huno'n un, a thrwy hynny y mae'n cael ei holl syniadau am berthnasoedd. 3. Y drydedd yw eu gwahanu oddi wrth bob syniad arall sy'n cyd-fynd â hwy yn eu bodolaeth wirioneddol: gelwir hyn yn haniaethu, ac felly y gwneir ei holl syniadau cyffredinol.
—John Locke, An Essay Concerning Human Understanding (1690)
Rydym ar fin astudio'r syniad o broses gyfrifiadurol. Bodau haniaethol sy'n byw mewn cyfrifiaduron yw prosesau cyfrifiadurol. Wrth iddynt esblygu, mae prosesau'n trin pethau haniaethol eraill a elwir yn ddata. Cyfarwyddir esblygiad proses gan batrwm o reolau a elwir yn rhaglen. Mae pobl yn creu rhaglenni i gyfarwyddo prosesau. I bob pwrpas, rydym yn galw ysbrydion y cyfrifiadur â'n swynion.
Mae proses gyfrifiadurol yn wir yn debyg iawn i syniad dewin o ysbryd. Ni ellir ei gweld na'i chyffwrdd. Nid yw wedi'i chyfansoddi o fater o gwbl. Fodd bynnag, mae'n real iawn. Gall wneud gwaith deallusol. Gall ateb cwestiynau. Gall effeithio ar y byd drwy dalu arian mewn banc neu drwy reoli braich robot mewn ffatri. Mae'r rhaglenni a ddefnyddiwn i alw prosesau yn debyg i swynion dewin. Maent wedi'u cyfansoddi'n ofalus o fynegiadau symbolaidd mewn ieithoedd rhaglennu dirgel ac esoterig sy'n pennu'r tasgau yr ydym am i'n prosesau eu cyflawni.
Mae proses gyfrifiadurol, mewn cyfrifiadur sy'n gweithio'n gywir, yn gweithredu rhaglenni'n fanwl ac yn gywir. Felly, fel prentis y dewin, rhaid i raglenwyr newydd ddysgu deall a rhagweld canlyniadau eu swyno. Gall hyd yn oed gwallau bach (a elwir fel arfer yn fygiau neu'n fân ddiffygion) mewn rhaglenni gael canlyniadau cymhleth ac annisgwyl.
Yn ffodus, mae dysgu rhaglennu yn llawer llai peryglus na dysgu dewiniaeth, oherwydd bod yr ysbrydion yr ydym yn ymdrin â hwy wedi'u cyfyngu'n ddiogel, yn gyfleus inni. Fodd bynnag, mae rhaglennu yn y byd go iawn yn gofyn am ofal, arbenigedd, a doethineb. Gall byg bach mewn rhaglen dylunio drwy gymorth cyfrifiadur, er enghraifft, arwain at awyren neu argae yn chwalu'n drychinebus neu robot diwydiannol yn ei ddinistrio ei hun.
Mae gan feistri peirianneg meddalwedd y gallu i drefnu rhaglenni fel y gallant fod yn weddol sicr y bydd y prosesau a geir yn cyflawni'r tasgau a fwriadwyd. Gallant ddychmygu ymddygiad eu systemau ymlaen llaw. Gwyddant sut i strwythuro rhaglenni fel nad yw problemau annisgwyl yn arwain at ganlyniadau trychinebus, a phan fydd problemau'n codi, gallant ddadfygio eu rhaglenni. Mae systemau cyfrifiadurol sydd wedi'u dylunio'n dda, fel ceir neu adweithyddion niwclear sydd wedi'u dylunio'n dda, yn cael eu dylunio mewn modd modiwlaidd, fel y gellir llunio, disodli, a dadfygio'r rhannau ar wahân.
Rhaglennu yn Lisp
Mae angen iaith briodol arnom i ddisgrifio prosesau, a byddwn yn defnyddio'r iaith raglennu Lisp at y diben hwn. Yn union fel y mynegir ein meddyliau bob dydd fel arfer yn ein hiaith naturiol (megis Saesneg, Ffrangeg, neu Japaneeg), ac y mynegir disgrifiadau o ffenomenau meintiol mewn nodiant mathemategol, mynegir ein meddyliau gweithdrefnol yn Lisp. Dyfeisiwyd Lisp ddiwedd y 1950au fel ffurfiadaeth ar gyfer rhesymu am ddefnyddio rhai mathau o fynegiadau rhesymegol, a elwir yn hafaliadau dychweliad, fel model ar gyfer cyfrifiannu. John McCarthy a genhedlodd yr iaith ac mae'n seiliedig ar ei bapur “Recursive Functions of Symbolic Expressions and Their Computation by Machine” (McCarthy 1960).
Er iddi ddechrau fel ffurfiadaeth fathemategol, mae Lisp yn iaith raglennu ymarferol. Peiriant sy'n cyflawni prosesau a ddisgrifir yn yr iaith Lisp yw dehonglydd Lisp. Gweithredwyd y dehonglydd Lisp cyntaf gan McCarthy gyda chymorth cydweithwyr a myfyrwyr yng Ngrŵp Deallusrwydd Artiffisial Labordy Ymchwil Electroneg MIT ac yng Nghanolfan Gyfrifiannu MIT.1 Dyluniwyd Lisp, y mae ei enw yn acronym o LISt Processing, i ddarparu galluoedd trin symbolau ar gyfer mynd i'r afael â phroblemau rhaglennu megis differu ac integru mynegiadau algebraidd yn symbolaidd. At y diben hwn roedd yn cynnwys gwrthrychau data newydd o'r enw atomau a rhestrau, a oedd yn ei osod ar wahân i holl ieithoedd eraill y cyfnod mewn ffordd hynod drawiadol.
Nid cynnyrch ymdrech ddylunio gydlynol oedd Lisp. Yn hytrach, esblygodd yn anffurfiol mewn modd arbrofol mewn ymateb i anghenion defnyddwyr ac i ystyriaethau ymarferol ynghylch ei weithredu. Mae esblygiad anffurfiol Lisp wedi parhau drwy'r blynyddoedd, ac mae cymuned defnyddwyr Lisp yn draddodiadol wedi gwrthsefyll ymdrechion i gyhoeddi unrhyw ddiffiniad “swyddogol” o'r iaith. Mae'r esblygiad hwn, ynghyd â hyblygrwydd a cheinder y syniad cychwynnol, wedi galluogi Lisp, sef yr ail iaith hynaf sy'n cael ei defnyddio'n eang heddiw (dim ond Fortran sy'n hŷn), i addasu'n barhaus i gynnwys y syniadau mwyaf modern am ddylunio rhaglenni. Felly, erbyn hyn mae Lisp yn deulu o dafodieithoedd sydd, er eu bod yn rhannu'r rhan fwyaf o'r nodweddion gwreiddiol, yn gallu bod yn wahanol i'w gilydd mewn ffyrdd arwyddocaol. Scheme yw enw'r dafodiaith Lisp a ddefnyddir yn y llyfr hwn.2
Oherwydd ei natur arbrofol a'i bwyslais ar drin symbolau, roedd Lisp ar y dechrau yn aneffeithlon iawn ar gyfer cyfrifiadau rhifiadol, o leiaf o'i gymharu â Fortran. Dros y blynyddoedd, fodd bynnag, datblygwyd crynhowyr Lisp sy'n trosi rhaglenni'n god peiriant a all gyflawni cyfrifiadau rhifiadol yn weddol effeithlon. Ac ar gyfer cymwysiadau arbennig, defnyddiwyd Lisp yn effeithiol iawn.3 Er nad yw Lisp eto wedi goresgyn ei hen enw drwg fel iaith anobeithiol o aneffeithlon, defnyddir Lisp bellach mewn llawer o gymwysiadau lle nad effeithlonrwydd yw'r prif bryder. Er enghraifft, mae Lisp wedi dod yn un o'r ieithoedd a ffefrir ar gyfer ieithoedd cragen systemau gweithredu ac ar gyfer ieithoedd estyn golygyddion a systemau dylunio drwy gymorth cyfrifiadur.
Os nad yw Lisp yn iaith brif ffrwd, pam rydym yn ei defnyddio fel fframwaith ar gyfer ein trafodaeth ar raglennu? Oherwydd bod gan yr iaith nodweddion unigryw sy'n ei gwneud yn gyfrwng rhagorol ar gyfer astudio lluniadau rhaglennu a strwythurau data pwysig ac ar gyfer eu cysylltu â'r nodweddion ieithyddol sy'n eu cefnogi. Y fwyaf arwyddocaol o'r nodweddion hyn yw'r ffaith y gellir cynrychioli a thrin disgrifiadau Lisp o brosesau, a elwir yn weithdrefnau, eu hunain fel data Lisp. Pwysigrwydd hyn yw bod technegau dylunio rhaglenni grymus sy'n dibynnu ar y gallu i gymylu'r gwahaniaeth traddodiadol rhwng data “goddefol” a phrosesau “gweithredol”. Fel y darganfyddwn, mae hyblygrwydd Lisp wrth drin gweithdrefnau fel data yn ei gwneud yn un o'r ieithoedd mwyaf cyfleus sy'n bodoli ar gyfer archwilio'r technegau hyn. Mae'r gallu i gynrychioli gweithdrefnau fel data hefyd yn gwneud Lisp yn iaith ragorol ar gyfer ysgrifennu rhaglenni sy'n gorfod trin rhaglenni eraill fel data, megis y dehonglwyr a'r crynhowyr sy'n cefnogi ieithoedd cyfrifiadurol. Yn ychwanegol at yr ystyriaethau hyn, mae rhaglennu yn Lisp yn hwyl fawr.
Troednodiadau
1 Ymddangosodd y Lisp 1 Programmer’s Manual yn 1960 a chyhoeddwyd y Lisp 1.5 Programmer’s Manual (McCarthy et al. 1965) yn 1962. Disgrifir hanes cynnar Lisp yn McCarthy 1978.
2 Y ddwy dafodiaith yr ysgrifennwyd y rhan fwyaf o raglenni Lisp mawr y 1970au ynddynt yw MacLisp (Moon 1978; Pitman 1983), a ddatblygwyd ym Mhrosiect MIT MAC, ac Interlisp (Teitelman 1974), a ddatblygwyd yn Bolt Beranek and Newman Inc. ac yng Nghanolfan Ymchwil Xerox Palo Alto. Roedd Portable Standard Lisp (Hearn 1969; Griss 1981) yn dafodiaith Lisp a ddyluniwyd i fod yn hawdd ei throsglwyddo rhwng peiriannau gwahanol. Esgorodd MacLisp ar nifer o is-dafodieithoedd, megis Franz Lisp, a ddatblygwyd ym Mhrifysgol California yn Berkeley, a Zetalisp (Moon and Weinreb 1981), a oedd yn seiliedig ar brosesydd pwrpas arbennig a ddyluniwyd yn Labordy Deallusrwydd Artiffisial MIT i redeg Lisp yn effeithlon iawn. Dyfeisiwyd y dafodiaith Lisp a ddefnyddir yn y llyfr hwn, o'r enw Scheme (Steele and Sussman 1975), yn 1975 gan Guy Lewis Steele Jr. a Gerald Jay Sussman o Labordy Deallusrwydd Artiffisial MIT ac fe'i hailweithredwyd yn ddiweddarach i'w defnyddio mewn addysgu yn MIT. Daeth Scheme yn safon IEEE yn 1990 (IEEE 1990). Datblygwyd y dafodiaith Common Lisp (Steele 1982, Steele 1990) gan gymuned Lisp i gyfuno nodweddion o'r tafodieithoedd Lisp cynharach er mwyn creu safon ddiwydiannol ar gyfer Lisp. Daeth Common Lisp yn safon ANSI yn 1994 (ANSI 1994).
3 Un cymhwysiad arbennig o'r fath oedd cyfrifiad arloesol o bwysigrwydd gwyddonol—integru mudiant Cysawd yr Haul a estynnodd ganlyniadau blaenorol bron ddwy drefn maint, ac a ddangosodd fod dynameg Cysawd yr Haul yn anhrefnus. Gwnaed y cyfrifiad hwn yn bosibl gan algorithmau integru newydd, crynhoydd pwrpas arbennig, a chyfrifiadur pwrpas arbennig, pob un wedi'i weithredu gyda chymorth offer meddalwedd a ysgrifennwyd yn Lisp (Abelson et al. 1992; Sussman and Wisdom 1992).