Homoikonicitet

Homoiconicity ( homoiconicity , eng.  homoiconicity , eng.  homoiconic , från grekiska ὁμός  - lika, identisk + "ikonicitet" - likhetsförhållandet mellan tecknet och objektet som detta tecken pekar på (se semiotik ) - i sin tur, från jfr - Grekiska εἰκόνα  - "bild", "bild") är en egenskap hos vissa programmeringsspråk där programmets struktur liknar dess syntax , och därför kan den interna representationen av programmet bestämmas genom att läsa textuppmärkningen [ 1] . Om ett språk är homoikoniskt betyder det att programmets text har samma struktur som dess abstrakta syntaxträd (det vill säga AST och syntax är isomorfa ). Detta gör att all kod på språket kan nås och behandlas som data med samma representation.

I ett homoikoniskt språk är den primära representationen av program också en datastruktur i den primitiva typen av själva språket. Detta gör metaprogrammering enklare än i ett språk utan denna egenskap, eftersom kod kan ses som data : reflektion i språket (bestämmer strukturen för ett program vid körning ) baseras på en enda, homogen struktur, och det finns inget behov av att hantera flera olika konstruktioner som uppstår i komplexa syntaktiska strukturer. Med andra ord är homoikonicitet när källkoden för ett program är skriven som en grundläggande datastruktur och programmeringsspråket vet hur det ska komma åt den.

Ett typiskt exempel är programmeringsspråket Lisp , som utformats för att vara enkelt för listmanipulering, och där strukturen ges som S-uttryck , som har formen av kapslade listor. Lisp-program skrivs som listor; resultatet är att programmet kan komma åt sina egna funktioner medan det körs, samt programmera om sig själv i farten. Homoikoniska språk tenderar att inkludera fullt stöd för syntaktiska makron , vilket gör att programmeraren kan uttrycka programmeringstransformationer på ett kortfattat sätt. Exempel på sådana programmeringsspråk är Clojure (en modern dialekt av Lisp), Rebol och Refal .

Historik

Termen nämndes först i en artikel från 1960 av Doug McIlroy [2] , som i sin tur refererades till i en artikel från 1965 av Calvin Moores och Peter Deutsch , där egenskapen presenterades som nyckeln till TRAC- programmeringen språk de utvecklade [3] .

Alan Kay använde och kan ha populariserat termen "homoiconicity", och använde den i sin doktorsavhandling om respektive egenskaper hos Lisp och TRAC-språket [4] , och noterade läsbarhetskostnaderna för program i detta tillvägagångssätt: "program skrivna i de ser ut som kungen Burna-Buriashs brev till sumererna tryckt i babylonisk kilskrift" .

Tillämpningar, fördelar och nackdelar

En av fördelarna med att vara homoikonisk är att det tenderar att bli lättare att utöka språket med nya koncept, eftersom data som representerar kod kan skickas mellan meta- och basskikten i ett program. Det abstrakta syntaxträdet för en funktion kan konstrueras och modifieras som en metalllagerdatastruktur och sedan exekveras . Det kan vara mycket lättare att ta reda på hur man manipulerar koden, eftersom den kan vara mer förståelig som enkel data (eftersom formatet på ett språk är detsamma som dess dataformat).

Enkelheten som tillåter detta är också en nackdel: åtminstone i fallet med Lisp-liknande listorienterade språk kan detta bli av med många av de visuella ledtrådarna som hjälper människor att visuellt analysera språkets konstruktioner, och detta kan leda till en ökning i inlärningskurvan för språket [5] . Se även uppsatsen "The Curse of Lisp" [6] för en beskrivning av bristerna.

En typisk demonstration av homoikonicitet är den metacirkulära kalkylatorn .

Exempel

Homoikoniska programmeringsspråk:

I von Neumann arkitektursystem ( inklusive de allra flesta moderna datorer) har maskinkod också denna egenskap, med en datatyp av byte i minnet.

Homoikonicitet i Lisp

Lisp använder S-uttryck som en extern representation av data och kod. S-uttryck kan läsas med en primitiv funktion READsom returnerar de grundläggande Lisp-typerna: listor, tecken, siffror, strängar. En primitiv Lisp-funktion EVALanvänder denna kod, representerad som Lisp-data, för att utvärdera biverkningar och returnera resultatet.

Ett exempel på data i Lisp är en lista som använder olika typer av data: (under)listor, tecken, strängar och heltal:

(( :namn "john" :ålder 20 ) ( :namn "mary" :ålder 18 ) ( :namn "alice" :ålder 22 ))

Lisp-kod. I exemplet används listor, symboler och siffror:

( * ( sin 1.1 ) ( cos 2.03 )) ; i infix: sin(1.1)*cos(2.03)

Skapa ett sådant uttryck med en primitiv funktion LISToch tilldela resultatet till en variabel expression:

( setf uttryck ( lista '* ( lista ' sin 1.1 ) ( lista ' cos 2.03 )) ) -> ( * ( SIN 1.1 ) ( COS 2.03 )) ; Lisp återkommer och skriver ut resultatet ( tredje uttrycket ) ; det tredje elementet i uttrycket -> ( COS 2.03 )

Ersätt termen COSmed SIN:

( setf ( första ( tredje uttrycket )) 'SIN ) ; Uttrycket är nu (* (SIN 1.1) (SIN 2.03)).

Kör uttryck:

( eval expression ) -> 0,7988834

Skriv ut detta uttryck till en sträng:

( print-to-string expression ) -> "(* (SIN 1.1) (SIN 2.03))"

Subtrahera ett uttryck från en sträng:

( läs från-sträng "(* (SIN 1.1) (SIN 2.03))" ) -> ( * ( SIN 1.1 ) ( SIN 2.03 )) ; returnerar en lista med listor, siffror och symboler

Se även

Anteckningar

  1. David A. Wheeler. Läsbara Lisp S-uttryck . Hämtad 21 november 2016. Arkiverad från originalet 29 januari 2022.
  2. Douglas McIlroy (1960) Macro Instruction Extensions of Compiler Languages
  3. CN Mooers, L.P. Deutsch (1965) TRAC, A Text-Handling Language
  4. Alan Kay (1969) The Reactive Engine , doktorsavhandling Arkiverad 15 september 2018 på Wayback Machine (tillgänglig 20061229)
  5. 1 2 3 Homoikoniska språk Arkiverad 2 februari 2013 på Wayback Machine , i true Blue -bloggen på Oracle
  6. The Lisp Curse Arkiverad 16 maj 2022 på Wayback Machine , på Winestock Webdesign
  7. 1 2 3 4 5 6 7 8 9 10 11 Homoikoniska språk . Hämtad 20 november 2016. Arkiverad från originalet 23 april 2013.
  8. Metaprogrammering i Julia (nedlänk) . Hämtad 20 november 2016. Arkiverad från originalet 4 maj 2013. 
  9. Shapiro, Ehud Y.; Sterling, Leon. Konsten att prolog: avancerade  programmeringstekniker . - Cambridge, Mass: MIT Press , 1994. - ISBN 0-262-19338-8 .
  10. S. Ramsay och B. Pytlik-Zillig, Code-Generation Techniques for XML Collections Interoperability Arkiverad 3 mars 2016 på Wayback Machine , Digital Humanities 2012 konferenshandlingar.
  11. Språkanteckningar för programmeringsspråksexperter  (nedlänk)