Observera! Detta är enbart en översättning av mig, och jag påstår mig inte vara varken upphovsman eller äga någon som helst rättigheter till denna infolet. Jag ber även om ursäkt om min översättning inte är den bästa. Förhoppningsvis gör jag ingen Ohlmark i alla fall. Hela originaltexten kan återfinnas på http://www.paulgraham.com/avg.html och hela är värd att läsa.
Huvudfokus med denna översättning är att presentera blub-paradoxen som återfinns någonstans mitt i, men av respekt ville jag ta med så mycket som möjligt av originalartikeln, så det blev hela subsektionen. Here goes:
Vad är så bra med Lisp? Och om det är så bra, varför används det inte av alla? Det låter som retoriska frågor, men faktum är att de har simpla svar. Lisp är inte bra bara på grund av någon magisk egenskap som bara somliga kan se, utan för att det helt enkelt är det kraftfullaste språket som finns. Och anledningen att inte alla använder det är att programmeringsspråk inte enbart är teknologier, utan även vanor. Och vanans makt är stark. Dessa påståenden kräver förklaring.
Jag börjar med ett chockande kontroversiellt påstående: programmeringsspråk är olika kraftfulla.
Det är åtminstone mycket få som skulle säga emot att högnivåspråk är kraftfullare än maskinkod. De flesta programmerare idag är överens om att man inte skriver ett program i maskinkod, vanligtvis. Det man istället gör är att skriva i ett högnivåspråk, och att låta kompilatorn översätta koden till maskinkod. Det konceptet är till och med inbyggt i hårdvaran nu: sedan 80-talet har processorinstruktioner varit designade för kompilatorer, och inte människor.
Alla vet att det är ett misstag att skriva ett helt program för hand i maskinkod. Vad som är ovanligare är vetskapen om att det finns en mer generell princip här: om du kan välja mellan flera språk, så är det alltid ett misstag att programmera i något annat än det kraftfullaste. (Om förutsättningarna är lika oavsett språk.)
Det finns många undantag till denna regel. Om du skriver ett program som är tänkt att arbeta väldigt nära något annat program, kan det vara bra om båda programmen är skrivna i samma språk. Om du skriver ett program som bara ska göra något simpelt, som att genomföra en svår uträkning eller liknande, kanske du till och med klarar dig bättre med ett mindre abstrakt språk, speciellt då dessa tenderar att vara lite snabbare. Och om du skriver ett litet fulhakksprogram kan du lika gärna använda vilket språk som helst som har bäst bibliotek för det du vill åstadkomma. Men generellt vill du använda det kraftfullaste (någorlunda effektiva) språket för tillämpningsmjukvara [engelska ordet var »application software«, övers. anm.]. Att använda något annat språk är ett misstag av precis samma sort som att programmera i maskinkod, om än lite mindre grovt.
Du vet att maskinkod är mycket lågnivå. Men, i daglig interaktion brukar högnivåspråk behandlas lika. De är inte lika. Rent teknisktt betyder termen »högnivåspråk« inget definitivt. Det finns ingen linje som delar maskinspråk på ena sidan och högnivåspråk på andra sidan. Språk hamnar längsmed en oavbruten följd graderade efter hur abstrakta de är. Det mest kraftfulla språket återfinns på ena sidan, och på andra sidan finns maskinspråken, som även de är olika kraftfulla.
Betänk Cobol. Cobol är ett högnivåspråk, i betydelsen att det kompileras till maskinkod. Skulle någon seriöst argumentera för att Cobol är lika kraftfullt som till exempel Python? Det är förmodligen närmare maskinnivå än Python.
Eller vad sägs om Perl 4? Mellan Perl 4 och Perl 5 lades lexical closures till. De flesta Perl-programmerarna är överens om att Perl 5 är kraftfullare än Perl 4. Men så fort du har accepterat det, har du också accepterat att ett högnivåspråk kan vara kraftfullare än ett annat. Och oundvikligt följs att du borde använda kraftfullaste du kan.
Denna idé följs väldigt sällan igenom hela vägen, dock. Efter en viss ålder brukar programmerare väldigt sällan byta språk frivilligt. De tenderar att anse att vilket språk de än råkar använda är bra nog.
Programmerare blir väldigt fästa vid sitt favoritspråk, och jag vill inte såra någons känslor, så jag kommer att förklara min poäng med hjälp av ett hypotetiskt språk jag kallar Blub. Blub hamnar precis i mitten av abstraktföljden. Det är inte det kraftfullaste språket, men det är kraftfullare än Cobol eller maskinspråk.
Och faktum är att vår hypotetiske Blub-programmerare inte skulle använda någon av dem. Självklart tänker han inte programmera i maskinspråk. Det är det man har kompilatorer för. Och om Cobol, så vet han inte ens hur någon kan få något gjort i det. Det har ju inte ens x (någon Blub-feature).
Så länge den hypotetiske Blub-programmerare tittar nedför spektrat, vet han att han tittar ned. Språk som är mindre kraftfulla än Blub är uppenbart mindre kraftfulla, för de saknar features han är van vid. Men när vår hypotetiske Blub-programmerare tittar åt andra hållet, uppför kraftfullhets-spektrat, inser han inte att han tittar uppåt. Det han ser är bara konstiga språk. Antagligen tänker han dem som lika kraftfulla som Blub, men med allt detta konstiga extra inslängt också. Blub är bra nog för honom, för han tänker i Blub.
Om vi byter synvinkel till den av en programmerare som använder något av språket högre upp i spektrat, så ser vi att han i sin tur ser ned på Blub. Hur kan du få något gjort i Blub? Det har ju inte ens y.
Av denna framläggning kan man dra slutsatsen att de enda programmerarna som kan see alla skillnader i kraftfullhet mellan olika språk är de som förstår det kraftfullaste. (Det kan vara detta Eric Raymond menade med att Lisp gör dig till en bättre programmerare.) Du kan inte lita på andras åsikt, på grund av Blub-paradoxen: de är nöjda med vilket språk de än råkar köra, för det bestämmer hur de tänker om språk.
Jag känner till detta från min egen erfarenhet, när jag var i gymnasieåldern och programmerade i Basic. Det språket stödde inte ens rekursion. Det är svårt att föreställa sig att skriva program utan rekursion, men jag saknade det inte då. Jag tänkte i Basic. Och jag var grym på det. Mästare över allt jag kunde se.
De fem språken som Eric Raymond rekommenderar för hackers [Python, Java, C, Perl, Lisp, övers. anm.] hamnar på olika punkter i kraftfullhetsspektrat. Var de hamnar relativt till varandra är ett känsligt ämne. Vad jag säger är att jag tycker att Lisp hamnar högst upp. Och för att stödja detta påstående nämner jag en sak jag saknar när jag ser på de andra fyra språken. Hur kan man få något gjort i dem när de saknar macros?
Många språk har något som kallas macros. Men Lisps macros är unika. Och, tro det eller ej, men det de gör är relaterat till alla parenteser. De som designade Lisp lade inte in alla parenteser bara för att vara annorlunda. För en Blub-programmerare ser Lisp-kod konstig ut. Men parenteserna är där av en anledning. De är ett bevis på en grundläggande skillnad mellan Lisp och andra språk.
Lisp-kod är gjort på Lisp data objects. Och inte i den simpla meningen att källkoden består av tecken, och att strängar är en av datatyperna som stöds av språket. Lisp-kod, efter att det har tolkats av tolken, består av datastrukturer som du kan färdas genom.
Om du förstår hur kompilatorer fungerar: vad som egentligen händer är inte att Lisp har en konstig syntax, utan snarare att Lisp inte har någon syntax. Du skriver program i de parse trees som normalt genereras i kompilatorn när andra språk tolkas. Men dessa parse trees är fullt tillgängliga för dina program. Du kan skriva program som modifierar dem. Inom Lisp kallas dessa program för macros. De är program som skriver program.
Program som skriver program? När skulle du över huvud taget vilja göra det? Inte så ofta, om du tänker i Cobol. Hela tiden, om du tänker i Lisp. Det skulle vara bekvämt om jag här kunde ge ett exempel på ett kraftfullt macro och säga, titta! vad sägs om det där? Men om jag gjorde det skulle det bara se ut att vara rappakalja för någon som inte kan Lisp; det finns inte tillräckligt med plats här för att förklara allt du behöver veta för att förstå vad jag menade. I Ansi Common Lisp [bok av förf., övers. anm.] försökte jag gå så snabbt fram som möjligt, och inte ens då kom jag till macros förrän på sida 160.
Men jag tror att jag kan ge någon sorts argument som skulle kunna vara övertygande. Källkoden till Viaweb editor bestod förmodligen av ungefär 20-25% macros. Macros är svårare att skriva än vanliga Lisp-funktioner, och det är ansett att vara dålig stil att använda dem när de inte behövs. Så, varje macro i den koden är där för att det måste vara det. Vad det betyder är att åtminstone 20-25% av koden i programmet gör saker du inte på ett enkelt sätt skulle kunna göra i något annat språk. Hur skeptisk än Blub-programmeraren kan tänkas vara inställd till mina påståenden om Lisps mystiska krafter borde detta göra honom nyfiken. Vi skrev inte den koden för vårt eget nöje. Vi var ett litet nystartat företag som programmerade så bra vi bara kunde för att sätta en teknisk barriär mellan oss och våra konkurrenter.
En misstänksam person skulle kunna börja undra om det finns någon relation här. En stor del av vår kod gjorde saker som är svåra att göra i andra språk. Mjukvaran vi skrev gjorde saker som våra konkurrenters mjukvaror inte kunde göra. Kanske finns det en koppling. Jag uppmuntrar dig att följa den tanken vidare. Det kan finnas mer om den där gamla mannen på kryckor än vad det ser ut som.