SICP · Yr ail argraffiad · Scheme
Rhagymadrodd i'r Argraffiad Cyntaf
Mae cyfrifiadur yn debyg i ffidil. Gallwch ddychmygu dechreuwr yn rhoi cynnig ar ffonograff yn gyntaf ac yna ar ffidil. Mae'r olaf, meddai, yn swnio'n ofnadwy. Dyna'r ddadl yr ydym wedi'i chlywed gan ein dyneiddwyr a'r rhan fwyaf o'n cyfrifiadurwyr. Mae rhaglenni cyfrifiadurol yn dda, meddent, at ddibenion penodol, ond nid ydynt yn hyblyg. Nid yw ffidil na theipiadur ychwaith, nes ichi ddysgu sut i'w ddefnyddio.
—Marvin Minsky, Why Programming Is a Good Medium for Expressing Poorly-Understood and Sloppily-Formulated Ideas
“The Structure and Interpretation of Computer Programs” yw'r pwnc lefel mynediad mewn cyfrifiadureg yn Sefydliad Technoleg Massachusetts. Mae'n ofynnol i bob myfyriwr yn MIT sy'n prifio mewn peirianneg drydanol neu gyfrifiadureg ei astudio, fel chwarter y “cwricwlwm craidd cyffredin”, sydd hefyd yn cynnwys dau bwnc ar gylchedau a systemau llinol a phwnc ar ddylunio systemau digidol. Rydym wedi bod yn ymwneud â datblygu'r pwnc hwn ers 1978, ac wedi addysgu'r deunydd hwn ar ei ffurf bresennol ers hydref 1980 i rhwng 600 a 700 o fyfyrwyr bob blwyddyn. Ychydig iawn o hyfforddiant ffurfiol blaenorol mewn cyfrifiannu, os o gwbl, sydd gan y rhan fwyaf o'r myfyrwyr hyn, er bod llawer wedi chwarae â chyfrifiaduron ychydig a bod gan rai brofiad helaeth o raglennu neu ddylunio caledwedd.
Mae ein cynllun ar gyfer y pwnc cyfrifiadureg rhagarweiniol hwn yn adlewyrchu dau brif bryder. Yn gyntaf, rydym am sefydlu'r syniad nad ffordd o gael cyfrifiadur i gyflawni gweithrediadau yn unig yw iaith gyfrifiadurol, ond cyfrwng ffurfiol newydd ar gyfer mynegi syniadau am fethodoleg. Felly, rhaid ysgrifennu rhaglenni i bobl eu darllen, a dim ond yn ail i beiriannau eu gweithredu. Yn ail, credwn nad cystrawen lluniadau ieithoedd rhaglennu penodol yw'r deunydd hanfodol y dylai pwnc ar y lefel hon ymdrin ag ef, nac algorithmau clyfar ar gyfer cyfrifo ffwythiannau penodol yn effeithlon, na hyd yn oed ddadansoddiad mathemategol algorithmau a sylfeini cyfrifiadura, ond y technegau a ddefnyddir i reoli cymhlethdod deallusol systemau meddalwedd mawr.
Ein nod yw y dylai myfyrwyr sy'n cwblhau'r pwnc hwn fod â theimlad da am elfennau arddull ac estheteg rhaglennu. Dylent feistroli'r prif dechnegau ar gyfer rheoli cymhlethdod mewn system fawr. Dylent allu darllen rhaglen 50 tudalen o hyd, os yw wedi'i hysgrifennu mewn arddull ragorol. Dylent wybod beth i beidio â'i ddarllen, a beth nad oes angen iddynt ei ddeall ar unrhyw adeg. Dylent deimlo'n hyderus wrth addasu rhaglen, gan gadw ysbryd ac arddull yr awdur gwreiddiol.
Nid yw'r sgiliau hyn yn unigryw i raglennu cyfrifiadurol o bell ffordd. Mae'r technegau a addysgwn ac a ddefnyddiwn yn gyffredin i holl ddylunio peirianyddol. Rheolwn gymhlethdod drwy adeiladu haniaethau sy'n cuddio manylion pan fo hynny'n briodol. Rheolwn gymhlethdod drwy sefydlu rhyngwynebau confensiynol sy'n ein galluogi i lunio systemau drwy gyfuno darnau safonol, y'u deellir yn dda, mewn ffordd “cymysgu a chyfateb”. Rheolwn gymhlethdod drwy sefydlu ieithoedd newydd ar gyfer disgrifio dyluniad, pob un yn pwysleisio agweddau penodol ar y dyluniad ac yn rhoi llai o bwyslais ar eraill.
Yn sail i'n dull o ymdrin â'r pwnc hwn mae ein hargyhoeddiad nad gwyddor yw “cyfrifiadureg” ac nad oes a wnelo ei harwyddocâd fawr â chyfrifiaduron. Chwyldro yn y ffordd yr ydym yn meddwl ac yn y ffordd yr ydym yn mynegi'r hyn a feddyliwn yw'r chwyldro cyfrifiadurol. Hanfod y newid hwn yw ymddangosiad yr hyn y gellid ei alw orau yn epistemoleg weithdrefnol—astudio strwythur gwybodaeth o safbwynt gorchmynnol, yn wahanol i'r safbwynt mwy datganiadol a gymerir gan bynciau mathemategol clasurol. Mae mathemateg yn darparu fframwaith ar gyfer ymdrin yn fanwl gywir â syniadau am “beth sydd”. Mae cyfrifiannu yn darparu fframwaith ar gyfer ymdrin yn fanwl gywir â syniadau am “sut i”.
Wrth addysgu ein deunydd defnyddiwn dafodiaith o'r iaith raglennu Lisp. Nid ydym byth yn addysgu'r iaith yn ffurfiol, oherwydd nid oes rhaid inni. Dim ond ei defnyddio a wnawn, ac mae'r myfyrwyr yn ei dysgu mewn ychydig ddyddiau. Dyma un fantais fawr i ieithoedd tebyg i Lisp: ychydig iawn o ffyrdd sydd ganddynt o ffurfio mynegiadau cyfansawdd, a bron dim strwythur cystrawennol. Gellir ymdrin â'r holl briodweddau ffurfiol mewn awr, fel rheolau gwyddbwyll. Ar ôl amser byr anghofiwn am fanylion cystrawennol yr iaith (oherwydd nad oes rhai) a mynd ymlaen â'r materion gwirioneddol—penderfynu beth rydym am ei gyfrifo, sut y byddwn yn rhannu problemau'n rannau y gellir eu trin, a sut y byddwn yn gweithio ar y rhannau. Mantais arall Lisp yw ei fod yn cefnogi (ond nid yn gorfodi) mwy o'r strategaethau ar raddfa fawr ar gyfer rhannu rhaglenni'n fodiwlau nag unrhyw iaith arall a wyddom. Gallwn greu haniaethau gweithdrefnol a haniaethau data, gallwn ddefnyddio ffwythiannau trefn uwch i ddal patrymau defnydd cyffredin, gallwn fodelu cyflwr lleol drwy ddefnyddio aseinio a newid data, gallwn gysylltu rhannau rhaglen â ffrydiau a gwerthuso gohiriedig, a gallwn weithredu ieithoedd mewnosodedig yn rhwydd. Mae hyn i gyd wedi'i ymgorffori mewn amgylchedd rhyngweithiol â chymorth rhagorol ar gyfer dylunio, llunio, profi, a dadfygio rhaglenni fesul cam. Diolchwn i bob cenhedlaeth o ddewiniaid Lisp, gan ddechrau â John McCarthy, sydd wedi llunio offeryn gwych o rym a cheinder digynsail.
Mae Scheme, y dafodiaith Lisp a ddefnyddiwn, yn ymgais i ddod â grym a cheinder Lisp ac Algol ynghyd. O Lisp cymerwn y grym metaieithyddol sy'n deillio o'r gystrawen syml, cynrychioliad unffurf rhaglenni fel gwrthrychau data, a'r data a ddyrannir ar domen ac y cesglir eu sbwriel. O Algol cymerwn gwmpas geiriadurol a strwythur blociau, sy'n roddion gan arloeswyr dylunio ieithoedd rhaglennu a oedd ar bwyllgor Algol. Dymunwn gydnabod John Reynolds a Peter Landin am eu mewnwelediadau i'r berthynas rhwng calcwlws λ Church a strwythur ieithoedd rhaglennu. Cydnabyddwn hefyd ein dyled i'r mathemategwyr a archwiliodd y diriogaeth hon ddegawdau cyn i gyfrifiaduron ymddangos. Mae'r arloeswyr hyn yn cynnwys Alonzo Church, Barkley Rosser, Stephen Kleene, a Haskell Curry.