Udvidelig programmering - Extensible programming
Udvidelig programmering er et begreb, der bruges inden for datalogi til at beskrive en computerprogrammeringsstil, der fokuserer på mekanismer til at udvide programmeringssprog , kompilator og runtime -miljø . Udvidelige programmeringssprog, der understøtter denne programmeringsstil, var et aktivt arbejdsområde i 1960'erne, men bevægelsen blev marginaliseret i 1970'erne. Udvidelig programmering er blevet et emne for fornyet interesse i det 21. århundrede.
Historisk bevægelse
Det første papir, der normalt er forbundet med den udvidelige programmeringssprogsbevægelse, er M. Douglas McIlroys papir fra 1960 om makroer til programmeringssprog på højere niveau. En anden tidlig beskrivelse af udvidelsesprincippet forekommer i Brooker og Morris's papir fra 1960 om Compiler-Compiler . Bevægelsens højdepunkt var præget af to akademiske symposier, i 1969 og 1971. I 1975 var en undersøgelsesartikel om bevægelsen af Thomas A. Standish i det væsentlige post mortem. Den Forth programmeringssprog var en undtagelse, men det gik væsentligt ubemærket.
Karakter af den historiske bevægelse
Som typisk forestillet bestod et udvideligt programmeringssprog af et grundsprog, der leverer elementære computerfaciliteter og et metasprog, der er i stand til at ændre grundsproget. Et program bestod derefter af metasprogsmodifikationer og kode i det modificerede grundsprog.
Den mest fremtrædende sprogudvidelsesteknik, der blev brugt i bevægelsen, var makrodefinition. Grammatikmodifikation var også tæt forbundet med bevægelsen, hvilket resulterede i den endelige udvikling af adaptive grammatikformalismer . Den Lisp sprogsamfund holdt adskilt fra den Extensible sprogsamfund, tilsyneladende fordi, som en forsker bemærkede,
ethvert programmeringssprog, hvor programmer og data i det væsentlige kan udskiftes, kan betragtes som et udvideligt [sic] sprog. ... dette kan meget let ses af, at Lisp har været brugt som et udvideligt sprog i årevis.
På konferencen i 1969 blev Simula præsenteret som et udvideligt programmeringssprog.
Standish beskrev tre klasser af sprogudvidelse, som han kaldte parafrase , ortofraser og metafraser (ellers er omskrivning og metafrase oversættelsesbetingelser ).
- Parafrase definerer en facilitet ved at vise, hvordan den kan byttes til noget, der tidligere er defineret (eller skal defineres). Som eksempler nævner han makrodefinitioner, almindelige procedurdefinitioner, grammatiske udvidelser, datadefinitioner, operatørdefinitioner og kontrolstrukturudvidelser.
- Orthophrase tilføjer funktioner til et sprog, der ikke kunne opnås ved hjælp af grundsproget, f.eks. Tilføjelse af et i/o -system til et grundsprog, der tidligere ikke havde nogen i/o -primitiver. Udvidelser skal forstås som ortofase i forhold til et givet grundsprog, da en funktion, der ikke er defineret i basissproget, skal defineres i form af et andet sprog. Orthophrase svarer til den moderne forestilling om plug-ins .
- Metafrase ændrer fortolkningsreglerne, der bruges til allerede eksisterende udtryk. Det svarer til den moderne forestilling om refleksion .
Den historiske bevægelses død
Standish tilskrev fejlen i udvidelsesbevægelsen til vanskeligheden ved at programmere successive udvidelser. En almindelig programmør kan bygge en enkelt skal af makroer omkring et grundsprog, men hvis der skulle bygges en anden skal af makroer omkring det, skulle programmøren være fortrolig med både grundsproget og den første skal; en tredje skal ville kræve kendskab til basen og både den første og anden skal; og så videre. (Bemærk, at afskærmning af programmøren mod detaljer på lavere niveau er hensigten med abstraktionsbevægelsen , der erstattede forlængelsesbevægelsen.)
På trods af den tidligere præsentation af Simula som udvidelig synes Standishs undersøgelse i 1975 ikke at have inkluderet de nyere abstraktionsbaserede teknologier (selvom han brugte en meget generel definition af udvidelsesmuligheder, der teknisk set kunne have inkluderet dem). En historie med programmering af abstraktion fra 1978 fra opfindelsen af computeren til den (dengang) nutid nævnte ikke makroer og gav ingen antydning om, at bevægelsen med udvidelige sprog nogensinde havde fundet sted. Makroer blev foreløbigt optaget i abstraktionsbevægelsen i slutningen af 1980'erne (måske på grund af fremkomsten af hygiejniske makroer ) ved at blive givet pseudonymet syntaktiske abstraktioner .
Moderne bevægelse
I moderne forstand vil et system, der understøtter udvidelig programmering, give alle de funktioner, der er beskrevet nedenfor.
Udvidelig syntaks
Dette betyder ganske enkelt, at det eller de kildesprog, der skal kompileres, ikke må være lukkede, faste eller statiske. Det skal være muligt at tilføje nye søgeord, begreber og strukturer til kildesproget. Sprog, der tillader tilføjelse af konstruktioner med brugerdefineret syntaks, omfatter Camlp4 , OpenC ++ , Seed7 , Red , Rebol og Felix . Selvom det er acceptabelt, at nogle grundlæggende og iboende sproglige funktioner er uforanderlige, må systemet ikke udelukkende stole på disse sproglige funktioner. Det skal være muligt at tilføje nye.
Udvidelig kompiler
I udvidelig programmering er en compiler ikke et monolitisk program, der konverterer kildekodeindgang til binær eksekverbar output. Selve kompilatoren skal kunne udvides til det punkt, at det virkelig er en samling plugins, der hjælper med oversættelse af kildesprogsinput til noget . For eksempel understøtter en udvidelig compiler generering af objektkode, kodedokumentation, omformateret kildekode eller enhver anden ønsket output. Compilerens arkitektur skal gøre det muligt for brugerne at "komme ind" i kompilationsprocessen og levere alternative behandlingsopgaver ved hvert rimeligt trin i kompileringsprocessen.
For bare opgaven med at oversætte kildekode til noget, der kan udføres på en computer, bør en udvidelig kompiler:
- bruge en plug-in eller komponentarkitektur til næsten alle aspekter af dens funktion
- fastslå, hvilket sprog eller hvilken sprogvariant der kompileres, og find det relevante plug-in for at genkende og validere det sprog
- bruge formelle sprogspecifikationer til syntaktisk og strukturelt at validere vilkårlige kildesprog
- hjælpe med den semantiske validering af vilkårlige kildesprog ved at påberåbe sig en passende validering plug-in
- give brugerne mulighed for at vælge mellem forskellige slags kodegeneratorer, så den resulterende eksekverbare kan målrettes til forskellige processorer, operativsystemer, virtuelle maskiner eller andre udførelsesmiljøer.
- give faciliteter til fejlfremstilling og udvidelser til den
- tillade nye slags noder i det abstrakte syntakstræ (AST),
- tillade nye værdier i noder i AST,
- tillade nye slags kanter mellem noder,
- understøtte transformationen af input AST eller dele deraf med et eksternt "pass"
- understøtte oversættelsen af input AST eller dele deraf til en anden form ved hjælp af et eksternt "pass"
- hjælpe med informationsstrømmen mellem interne og eksterne passager, når de både transformerer og oversætter AST til nye AST'er eller andre repræsentationer
Udvidelig driftstid
Ved kørsel skal udvidelige programmeringssystemer tillade sprog at udvide det sæt operationer, det tillader. For eksempel, hvis systemet bruger en byte- kodetolker, skal det tillade, at nye byte-kodeværdier defineres. Som med udvidelig syntaks er det acceptabelt, at der er nogle (lille) sæt af grundlæggende eller iboende operationer, der er uforanderlige. Det skal dog være muligt at overbelaste eller forstærke disse iboende operationer, så ny eller yderligere adfærd kan understøttes.
Indhold adskilt fra formular
Udvidelige programmeringssystemer bør betragte programmer som data, der skal behandles. Disse programmer bør være fuldstændig blottet for enhver form for formateringsinformation. Den visuelle visning og redigering af programmer til brugere bør være en oversættelsesfunktion, der understøttes af den udvidelige kompilator, der oversætter programdata til former, der er mere egnede til visning eller redigering. Naturligvis bør dette være en tovejsoversættelse. Dette er vigtigt, fordi det skal være muligt let at behandle udvidelige programmer på forskellige måder. Det er uacceptabelt, at de eneste anvendelser af kildesprogsinput er redigering, visning og oversættelse til maskinkode. Den vilkårlige behandling af programmer letter ved at frakoble kildeindgangen fra specifikationer for, hvordan den skal behandles (formateret, gemt, vist, redigeret osv.).
Kildesprogsfejlfinding support
Udvidelige programmeringssystemer skal understøtte fejlfinding af programmer ved hjælp af konstruktionerne af det originale kildesprog uanset de udvidelser eller transformation, programmet har gennemgået for at gøre det eksekverbart. Især kan det ikke antages, at den eneste måde at vise runtime -data på er i strukturer eller arrays . Debuggeren eller mere korrekt 'programinspektør' skal gøre det muligt at vise runtime -data i formularer, der passer til kildesproget. For eksempel, hvis sproget understøtter en datastruktur for en forretningsproces eller arbejdsgang , skal det være muligt for debuggeren at vise denne datastruktur som et fiskebensdiagram eller en anden form, der leveres af et plugin.
Eksempler
- Camlp4
- Felix
- Nemerle
- Frø 7
- Rød (programmeringssprog)
- Rebol
- Ruby (programmeringssprog) (Metaprogrammering)
- IMP (programmeringssprog)
- OpenC ++
- XL (programmeringssprog)
- XML (programmeringssprog)
- Forth (programmeringssprog)
- Skema (programmeringssprog)
- Lisp (programmeringssprog)
- Lua
- Racket (programmeringssprog)
- PL/I
- Smalltalk (programmeringssprog)
Se også
- Kategori: Udvidelige programmeringssprog til syntaks
- Adaptiv grammatik
- Konceptprogrammering
- Dialektering
- Grammatikorienteret programmering
- Sprogorienteret programmering
- Homoiconicity
Referencer
eksterne links
Generel
- Greg Wilsons artikel i ACM -kø
- Slashdot diskussion
- Moderne udvidelige sprog - et papir fra Daniel Zingaro
Værktøjer
- MetaL - en udvidelig programmeringskompilator -motorimplementering
- XPS - eXtensible Programming System (under udvikling)
- MPS - JetBrains Metaprogrammeringssystem
Programmeringssprog med udvidelig syntaks
- OpenZz
- xtc - eXTensible C
- Engelsk-script
- Nemerle makroer
- Boo syntaktiske makroer
- Compiler til mellemformat fra Stanford University
- Seed7 - Det udvidelige programmeringssprog
- Katahdin - et programmeringssprog med syntaks og semantik, der kan ændres ved runtime
- π - et andet programmeringssprog med udvidelig syntaks, implementeret ved hjælp af en Earley -parser