Det som gjorde Lisp speciell

«Det bästa programmeringsspråket som någonsin skapats«
— Alan Kay, "på Lisp"

Det som gjorde Lisp speciell

När McCarthy utvecklade Lisp i slutet av 1950-talet skilde det sig radikalt från befintliga språk, varav det viktigaste var Fortran.

Lisp presenterade nio nya idéer:

1. Villkor. Villkorsangivelser är om-då-annan konstruktioner. Nu tar vi dem för givna. De var uppfunnit McCarthy under utvecklingen av Lisp. (Fortran hade vid den tiden bara goto-uttalanden, nära kopplade till en greninstruktion om den underliggande hårdvaran.) McCarthy, medan han var i Algol-kommittén, bidrog med villkor till Algol, varifrån de spreds till andra språk.

2. En funktionstyp. I Lisp är funktioner förstklassiga objekt - de är en datatyp, precis som siffror, strängar etc., och har en bokstavlig representation, kan lagras i variabler, kan skickas som argument osv.

3. Rekursion. Rekursion fanns förstås som ett matematiskt begrepp före Lisp, men Lisp var det första programmeringsspråket som stödde det. (Detta är kanske underförstått i att skapa funktioner som förstklassiga objekt.)

4. Ett nytt koncept av variabler. I Lisp är alla variabler effektiva pekare. Värden är vilka typer som har, inte variabler, och att tilldela eller binda variabler innebär att man kopierar pekare, inte vad de pekar på.

5. Skräp samling.

6. Program sammansatta av uttryck. Lisp-program är träd av uttryck, som vart och ett returnerar ett värde. (Vissa Lisp-uttryck kan returnera flera värden.) Detta står i kontrast till Fortran och många andra framgångsrika språk som skiljer mellan "uttryck" och "påståenden."

Det var naturligt att ha denna distinktion i Fortran eftersom språket var linjeorienterat (inte överraskande för ett språk vars inmatningsformat var ett hålkort). Du kunde inte ha kapslade påståenden. Och så länge du behövde matematiska uttryck för att fungera, var det ingen idé att låta något annat returnera ett värde eftersom det kanske inte fanns något som väntade på att bli returnerat.

Restriktionerna hävdes med tillkomsten av blockstrukturerade språk, men då var det för sent. Skillnaden mellan uttryck och påståenden har redan fastställts. Den gick från Fortran till Algol och sedan till deras ättlingar.

När ett språk helt består av uttryck kan du komponera uttryck hur du vill. Du kan skriva antingen (med hjälp av syntaxen Arc)

(if foo (= x 1) (= x 2))

eller

(= x (if foo 1 2))

7. En symboltyp. Tecken skiljer sig från strängar, i så fall kan du kontrollera likheten genom att jämföra pekare.

8. En notation för kod med hjälp av symbolträd.

9. Hela språket är alltid tillgängligt. Det finns ingen uppenbar skillnad mellan lästid, kompileringstid och körtid. Du kan kompilera eller köra kod medan du läser, eller läsa eller köra kod medan du kompilerar, eller läsa eller kompilera kod medan den körs.

Att köra kod under läsning låter användare programmera om Lisps syntax; kör kod vid kompilering är grunden för makron; runtime kompilering är grunden för att använda Lisp som ett tilläggsspråk i program som Emacs; och slutligen, körtidsläsning tillåter program att kommunicera med hjälp av s-expressions, en idé som nyligen återuppfanns i XML.

Slutsats

När Lisp först uppfanns, var dessa idéer långt ifrån konventionella programmeringsmetoder som dikterades av den hårdvara som fanns tillgänglig i slutet av 1950-talet.

Med tiden utvecklades standardspråket, förkroppsligat av framgången med populära språk, gradvis mot Lisp. Punkterna 1-5 är nu allmänt accepterade. Punkt 6 börjar dyka upp i mainstream. I Python finns det en klausul 7 i någon form, även om det inte finns någon lämplig syntax. Punkt 8, som (med punkt 9) gör makron möjliga i Lisp, finns fortfarande bara i Lisp, förmodligen för att (a) det kräver de parenteserna eller något lika dåligt, och (b) om du lägger till den här senaste ökningen i kraft kan du inte längre anspråk på att ha uppfunnit ett nytt språk, utan bara att ha utvecklat en ny dialekt av Lisp; -)

Även om detta är användbart för moderna programmerare, är det konstigt att beskriva Lisp i termer av dess skillnad från de slumpmässiga tekniker som används på andra språk. Detta kanske inte var vad McCarthy tänkte. Lisp var inte designad för att korrigera Fortrans fel; det framstod mer som en biprodukt av att försöka axiomatisera beräkningar.

Källa: will.com

Lägg en kommentar