Hva gjorde Lisp spesiell

«Det beste programmeringsspråket som noen gang er laget«
- Alan Kay, "på Lisp"

Hva gjorde Lisp spesiell

Da McCarthy utviklet Lisp på slutten av 1950-tallet, var det radikalt forskjellig fra eksisterende språk, hvorav det viktigste var Fortran.

Lisp introduserte ni nye ideer:

1. Betingelser. Betingede utsagn er hvis-så-eller-konstruksjoner. Nå tar vi dem for gitt. De var oppfunnet McCarthy under utviklingen av Lisp. (Fortran hadde på den tiden bare goto-uttalelser, tett koblet til en greninstruksjon om den underliggende maskinvaren.) McCarthy, mens han var i Algol-komiteen, bidro med betingelser til Algol, hvorfra de spredte seg til andre språk.

2. En funksjonstype. I Lisp er funksjoner førsteklasses objekter - de er en datatype, akkurat som tall, strenger osv., og har en bokstavelig representasjon, kan lagres i variabler, kan sendes som argumenter osv.

3. Rekursjon. Rekursjon eksisterte selvfølgelig som et matematisk konsept før Lisp, men Lisp var det første programmeringsspråket som støttet det. (Dette er kanskje underforstått i å lage funksjoner som førsteklasses objekter.)

4. Et nytt konsept med variabler. I Lisp er alle variabler effektive pekere. Verdier er hva typene har, ikke variabler, og å tilordne eller binde variabler betyr å kopiere pekere, ikke hva de peker på.

5. Søppelsamling.

6. Programmer satt sammen av uttrykk. Lisp-programmer er trær av uttrykk, som hver returnerer en verdi. (Noen Lisp-uttrykk kan returnere flere verdier.) Dette står i kontrast til Fortran og mange andre vellykkede språk som skiller mellom "uttrykk" og "utsagn."

Det var naturlig å ha denne distinksjonen i Fortran fordi språket var linjeorientert (ikke overraskende for et språk hvis inndataformat var et hullkort). Du kunne ikke ha nestede utsagn. Og så lenge du trengte matematiske uttrykk for å fungere, var det ingen vits i å la noe annet returnere en verdi fordi det kanskje ikke var noe som ventet på å bli returnert.

Restriksjonene ble opphevet med bruken av blokkstrukturerte språk, men da var det for sent. Skillet mellom uttrykk og utsagn er allerede etablert. Den gikk fra Fortran til Algol og videre til deres etterkommere.

Når et språk er laget utelukkende av uttrykk, kan du komponere uttrykk slik du vil. Du kan skrive enten (ved å bruke syntaksen Arc)

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

eller

(= x (if foo 1 2))

7. En symboltype. Tegn er forskjellige fra strenger, i så fall kan du sjekke for likhet ved å sammenligne pekere.

8. En notasjon for kode ved hjelp av symboltrær.

9. Hele språket er alltid tilgjengelig. Det er ingen åpenbar forskjell mellom lesetid, kompileringstid og kjøretid. Du kan kompilere eller kjøre kode mens du leser, eller lese eller kjøre kode mens du kompilerer, eller lese eller kompilere kode mens den kjører.

Å kjøre kode mens du leser lar brukere omprogrammere Lisps syntaks; kjørende kode ved kompilering er grunnlaget for makroer; runtime compilation er grunnlaget for å bruke Lisp som utvidelsesspråk i programmer som Emacs; og til slutt lar kjøretidslesing programmer kommunisere ved hjelp av s-uttrykk, en idé som nylig ble gjenoppfunnet i XML.

Konklusjon

Da Lisp først ble oppfunnet, var disse ideene langt unna konvensjonell programmeringspraksis diktert av maskinvaren som var tilgjengelig på slutten av 1950-tallet.

Over tid utviklet standardspråket, legemliggjort av suksessen til populære språk, gradvis mot Lisp. Punkt 1-5 er nå allment akseptert. Punkt 6 begynner å dukke opp i mainstream. Python har klausul 7 i en eller annen form, selv om det ikke er noen passende syntaks. Punkt 8, som (med punkt 9) gjør makroer mulig i Lisp, er fortsatt bare i Lisp, sannsynligvis fordi (a) det krever disse parentesene eller noe like dårlig, og (b) hvis du legger til denne siste økningen i kraft, kan du ikke lenger hevder å ha oppfunnet et nytt språk, men bare å ha utviklet en ny dialekt av Lisp; -)

Selv om dette er nyttig for moderne programmerere, er det rart å beskrive Lisp med tanke på forskjellen fra de tilfeldige teknikkene som brukes på andre språk. Dette var kanskje ikke hva McCarthy tenkte. Lisp ble ikke designet for å rette Fortrans feil; det fremsto mer som et biprodukt av å prøve aksiomatisere beregninger.

Kilde: www.habr.com

Legg til en kommentar