Avsiktlig programmering
Inom datorprogrammering är avsiktlig programmering ett programmeringsparadigm utvecklat av Charles Simonyi som kodar i programvarans källkod den exakta avsikt som programmerare (eller användare) har i åtanke när de utformar sitt arbete. Genom att använda lämplig abstraktionsnivå som programmeraren tänker på blir det lättare att skapa och underhålla datorprogram . Genom att separera oro för avsikter och hur de hanteras, blir programvaran mer modulär och möjliggör mer återanvändbar programvarukod.
Intentional Programming utvecklades av tidigare Microsofts chefsarkitekt Charles Simonyi , som ledde ett team inom Microsoft Research , som utvecklade paradigmet och byggde en integrerad utvecklingsmiljö (IDE) kallad IP (för Intentional Programming) som visade paradigmet. Microsoft bestämde sig för att inte produktisera paradigmet för avsiktlig programmering, eftersom Microsoft i början av 2000-talet rullade ut C# och .NET för att motverka Java-antagande. Charles Simonyi beslutade, med Microsofts godkännande, att ta sin idé från Microsoft och kommersialisera den själv. Han grundade företaget Intentional Software för att driva detta. Microsoft licensierade patenten för avsiktlig programmering Simonyi hade förvärvat när han var hos Microsoft, men ingen källkod, till Intentional Software.
En översikt över avsiktlig programmering som den utvecklades hos Microsoft Research ges i kapitel 11 i boken Generativ programmering: Metoder, verktyg och tillämpningar .
Utvecklingscykel
Som Simonyi föreställt sig, utvecklas en ny applikation via paradigmet för avsiktlig programmering enligt följande. En programmerare bygger en WYSIWYG -liknande miljö som stöder schemat och notationen av affärskunskap för en given problemdomän (som produktivitetstillämpningar eller livförsäkring). Användare använder sedan denna miljö för att fånga sina avsikter, som registreras på hög abstraktionsnivå. Miljön kan arbeta utifrån dessa avsikter och hjälpa användaren att skapa semantiskt rikare dokument som kan bearbetas och exekveras, liknande ett kalkylblad . Den registrerade kunskapen exekveras av en utvärderare eller sammanställs för att generera det slutliga programmet. Successiva ändringar görs endast på WYSIWYG-nivå. Till skillnad från ordbehandlare, kalkylblad eller presentationsprogram, har en Intentional-miljö mer stöd för struktur och semantik för de avsikter som ska uttryckas, och kan skapa interaktiva dokument som rikare fångar vad användaren försöker åstadkomma. Ett specialfall är när innehållet är programkod och miljön blir en intelligent IDE.
Separera källkodslagring och presentation
Nyckeln till fördelarna med avsiktlig programmering är att domänkoden som fångar intentionerna inte lagras i källkodstextfiler utan i en trädbaserad lagring (kan vara binär eller XML). Tätt integration av miljön med lagringsformatet för några av de trevligare funktionerna i databasnormalisering till källkoden . Redundans elimineras genom att ge varje definition en unik identitet och lagra namnen på variabler och operatorer på exakt ett ställe. Detta gör det lättare att särskilja deklarationer från referenser och miljön kan visa dem på olika sätt.
Whitespace i ett program lagras inte heller som en del av källkoden , och varje programmerare som arbetar med ett projekt kan välja en indragsvisning av källkoden. Mer radikala visualiseringar inkluderar att visa satslistor som kapslade rutor, redigera villkorliga uttryck som logiska grindar eller återrendera namn på kinesiska.
Systemet använder ett normaliserat språk för populära språk som C++ och Java , samtidigt som användarna av miljön kan blanda och matcha dessa med idéer från Eiffel och andra språk. Ofta nämns i samma sammanhang som språkorienterad programmering via domänspecifika språk och aspektorienterad programmering, IP utger sig för att ge några genombrott inom generativ programmering . Dessa tekniker tillåter utvecklare att utöka språkmiljön för att fånga domänspecifika konstruktioner utan att investera i att skriva en fullständig kompilator och redaktör för några nya språk.
Programmeringsexempel
Ett Java- program som skriver ut siffrorna från 1 till 10, med hjälp av en syntax för krulliga parenteser , kan se ut så här:
for ( int i = 1 ; i <= 10 ; i ++ ) { System . ut . println ( "talet är" + i ); }
Koden ovan innehåller en gemensam konstruktion för de flesta programmeringsspråk , den begränsade slingan, i detta fall representerad av for-
konstruktionen. Koden kommer, när den kompileras, länkas och körs, att loopa 10 gånger, vilket ökar värdet på i varje gång efter att den skrivits ut.
Men den här koden fångar inte programmerarens avsikter , nämligen att "skriva ut siffrorna 1 till 10". I det här enkla fallet kan en programmerare som uppmanas att underhålla koden förmodligen komma på vad den är avsedd att göra, men det är inte alltid så lätt. Slingor som sträcker sig över många rader eller sidor kan bli mycket svåra att förstå, särskilt om den ursprungliga programmeraren använder otydliga etiketter. Traditionellt var det enda sättet att indikera avsikten med koden att lägga till källkodskommentarer , men ofta läggs kommentarer inte till, eller är otydliga, eller går ur synk med källkoden de ursprungligen beskrev.
I avsiktliga programmeringssystem skulle ovanstående loop kunna representeras, på någon nivå, som något så självklart som " skriv ut siffrorna 1 till 10"
. Systemet skulle sedan använda avsikterna för att generera källkod, troligen något som liknar koden ovan. Den viktigaste skillnaden är att de avsiktliga programmeringssystemen upprätthåller den semantiska nivån, som källkoden saknar, och som dramatiskt kan underlätta läsbarheten i större program.
Även om de flesta språk innehåller mekanismer för att fånga vissa typer av abstraktion , tillåter IP, som Lisp-familjen av språk, tillägg av helt nya mekanismer. Således, om en utvecklare började med ett språk som C , skulle de kunna utöka språket med funktioner som de i C++ utan att vänta på att kompilatorutvecklarna ska lägga till dem. I analogi kan många mer kraftfulla uttrycksmekanismer användas av programmerare än bara klasser och procedurer .
Identitet
IP fokuserar på begreppet identitet . Eftersom de flesta programmeringsspråk representerar källkoden som vanlig text , definieras objekt av namn, och deras unika karaktär måste härledas av kompilatorn . Till exempel kan samma symboliska namn användas för att namnge olika variabler, procedurer eller till och med typer. I kod som sträcker sig över flera sidor – eller, för globalt synliga namn, flera filer – kan det bli mycket svårt att avgöra vilken symbol som refererar till vilket faktiska objekt. Om ett namn ändras måste koden där det används noggrant undersökas.
Däremot tilldelar alla definitioner i ett IP-system inte bara symboliska namn, utan också unika privata identifierare till objekt. Detta innebär att i IP-utvecklingsmiljön är varje referens till en variabel eller procedur inte bara ett namn – det är en länk till den ursprungliga enheten.
Den stora fördelen med detta är att om en entitet byter namn förblir alla referenser till den i programmet giltiga (känd som referensintegritet ). Detta betyder också att om samma namn används för unika definitioner i olika namnområden (som " .to_string()
"), kommer referenser med samma namn men olika identitet inte att bytas om, vilket ibland händer med sök/ersätt i nuvarande redigerare . Denna funktion gör det också enkelt att ha flerspråkiga versioner av programmet; den kan ha en uppsättning engelskspråkiga namn för alla definitioner samt en uppsättning japanskspråkiga namn som kan bytas in efter behag.
Att ha en unik identitet för varje definierat objekt i programmet gör det också enkelt att utföra automatiserade refaktoreringsuppgifter , samt förenkla kodincheckningar i versionssystem . Till exempel, i många nuvarande kodsamarbetssystem (t.ex. Git ), när två programmerare begår ändringar som konflikten (dvs om en programmerare byter namn på en funktion medan en annan ändrar en av raderna i den funktionen), kommer versionssystemet att tro att en programmerare skapade en ny funktion medan en annan modifierade en gammal funktion. I ett IP-versionssystem vet det att en programmerare bara ändrade ett namn medan en annan ändrade koden.
Detaljeringsnivåer
IP-system erbjuder också flera detaljnivåer, vilket gör att programmeraren kan "zooma in" eller ut. I exemplet ovan kunde programmeraren zooma ut för att få en nivå som skulle säga något i stil med:
< >
Således är IP-system självdokumenterande till stor del, vilket gör att programmeraren kan behålla en bra bild på hög nivå av programmet som helhet.
Liknande verk
Det finns projekt som utnyttjar liknande idéer för att skapa kod med högre abstraktionsnivå. Bland dem finns:
- Koncept programmering
-
Språkorienterad programmering (LOP)
- Domänspecifikt språk (DSL)
- Programförvandling
- Semantisk-orienterad programmering (SOP)
- Läskunnig programmering
- Modelldriven arkitektur (MDA)
- Mjukvarufabrik
- Metaprogrammering
- Lisp (programmeringsspråk)
Se även
- Automatisk programmering
- Objektdatabas
- Programmering genom demonstration
- Artefaktur
- Semantisk upplösningsträd
- Strukturredaktör
externa länkar
- Intentional Software - Charles Simonyis företag
- The Death Of Computer Languages, The Birth of Intentional Programming , en teknisk rapport av Charles Simonyi (1995)
- Intentional Programming - Innovation in the Legacy Age , ett föredrag av Charles Simonyi (1996)
- Edge.org-intervju med Charles Simonyi (intervjuare: John Brockman)
- Language Workbenches: Killer-appen för domänspecifika språk? – Martin Fowlers artikel om den allmänna klassen av verktyg som Intentional Programmering är ett exempel på.
- "Allt du kan göra, jag kan göra Meta" Arkiverad 2012-02-11 på Wayback Machine tisdag 9 januari 2007, Scott Rosenberg, Technology Review
- I väntan på dagen när alla skriver programvara, New York Times, 28 januari 2007
- Är programmering en form av kryptering? , av Charles Simonyi (2005)
- Lämpliga nivåer av abstraktion , av Charles Simonyi (2005)
- Informationsinnehållet i programmen , av Charles Simonyi (2005)
- Feature X anses skadligt , av Charles Simonyi (2005)
- Notationer och programmeringsspråk , av Charles Simonyi (2005)
- Personliga observationer från en utvecklare av Mark Edel (2005)
- Microsoft Researchs utbildningsvideo som introducerar deras avsiktliga programmeringssystem (ASF-format, cirka 1998, 20 megabyte)