Läskunnig programmering
Literate programmering är ett programmeringsparadigm som introducerades 1984 av Donald Knuth där ett datorprogram ges som en förklaring av hur det fungerar på ett naturligt språk , till exempel engelska, varvat (inbäddat) med fragment av makron och traditionell källkod , varifrån kompilerbar källkod kan genereras. Tillvägagångssättet används rutinmässigt inom vetenskaplig beräkning och datavetenskap för reproducerbar forskning och öppen åtkomst . Läskunniga programmeringsverktyg används av miljontals programmerare idag.
Det läskunniga programmeringsparadigmet, som uttänkt av Donald Knuth, representerar ett steg bort från att skriva datorprogram på det sätt och den ordning som datorn påtvingar, och ger istället programmerare makron för att utveckla program i den ordning som krävs av logiken och flödet av deras tankar. Läskunniga program är skrivna som en utläggning av logik på ett mer naturligt språk där makron används för att dölja abstraktioner och traditionell källkod , mer som texten i en uppsats .
Literate programmering (LP)-verktyg används för att erhålla två representationer från en källfil: en som kan förstås av en kompilator eller tolk, den "trassliga" koden och en annan för att se som formaterad dokumentation , som sägs vara "vävd" från den läskunniga källa. Medan den första generationen av läskunniga programmeringsverktyg var datorspråkspecifika , är de senare språkagnostiska och existerar bortom de individuella programmeringsspråken.
Historia och filosofi
Läskunnig programmering introducerades först 1984 av Donald Knuth, som hade för avsikt att skapa program som var lämplig litteratur för människor. Han implementerade det vid Stanford University som en del av sin forskning om algoritmer och digital typografi . Implementeringen kallades " WEB " eftersom han trodde att det var ett av de få trebokstavsord på engelska som ännu inte hade tillämpats på datoranvändning. Det liknar dock den komplicerade karaktären hos mjukvara som är fint sammansatt av enkla material. Utövandet av läskunnig programmering har sett en viktig uppsving på 2010-talet med användningen av datoranteckningsböcker , särskilt inom datavetenskap .
Begrepp
Läskunnig programmering är att skriva ut programlogiken på ett mänskligt språk med inkluderade (separerade av en primitiv markering) kodsnuttar och makron. Makron i en läskunnig källfil är helt enkelt titelliknande eller förklarande fraser på ett mänskligt språk som beskriver mänskliga abstraktioner som skapas samtidigt som man löser programmeringsproblemet och gömmer bitar av kod eller makron på lägre nivå. Dessa makron liknar de algoritmer i pseudokod som vanligtvis används vid undervisning i datavetenskap . Dessa godtyckliga förklarande fraser blir exakta nya operatörer, skapade i farten av programmeraren, och bildar ett metaspråk ovanpå det underliggande programmeringsspråket.
En förprocessor används för att ersätta godtyckliga hierarkier, eller snarare "sammankopplade "webb" av makron", för att producera den kompilerbara källkoden med ett kommando ("tangle") och dokumentation med ett annat ("väv"). Förprocessorn ger också en förmåga att skriva ut innehållet i makron och lägga till redan skapade makron var som helst i texten i källfilen för läskunniga program, och därigenom avskaffa behovet av att komma ihåg de begränsningar som traditionella programmeringsspråk inför. eller för att avbryta tankeflödet.
Fördelar
Enligt Knuth ger läskunnig programmering program av högre kvalitet, eftersom det tvingar programmerare att uttryckligen ange tankarna bakom programmet, vilket gör dåligt genomtänkta designbeslut mer uppenbara. Knuth hävdar också att läskunnig programmering tillhandahåller ett förstklassigt dokumentationssystem, som inte är ett tillägg, utan odlas naturligt i processen för att exponera ens tankar under ett programs skapande. Den resulterande dokumentationen gör det möjligt för författaren att starta om sina egna tankeprocesser när som helst, och gör att andra programmerare lättare kan förstå programmets konstruktion. Detta skiljer sig från traditionell dokumentation, där en programmerare presenteras med källkod som följer en kompilatorpåtvingad ordning, och måste dechiffrera tankeprocessen bakom programmet från koden och dess tillhörande kommentarer. Metaspråksförmågan hos läskunnig programmering påstås också underlätta tänkandet, vilket ger en högre "fågelperspektiv" av koden och ökar antalet begrepp som sinnet framgångsrikt kan behålla och bearbeta. Tillämpligheten av konceptet för programmering i stor skala, den för kommersiella program, bevisas av en utgåva av TeX -kod som ett läskunnigt program.
Knuth hävdar också att läskunnig programmering kan leda till enkel portering av programvara till flera miljöer, och nämner även implementeringen av TeX som ett exempel.
Kontrast med dokumentationsgenerering
Läskunnig programmering missförstås mycket ofta för att endast hänvisa till formaterad dokumentation som produceras från en gemensam fil med både källkod och kommentarer – vilket korrekt kallas dokumentationsgenerering – eller till omfattande kommentarer som ingår i koden. Detta är motsatsen till läskunnig programmering: väldokumenterad kod eller dokumentation extraherad från kod följer kodens struktur, med dokumentation inbäddad i koden; medan i läskunnig programmering är kod inbäddad i dokumentationen, med koden som följer strukturen i dokumentationen.
Denna missuppfattning har lett till påståenden om att verktyg för att extrahera kommentarer, såsom Perl Plain Old Documentation eller Java Javadoc- system, är "läskunniga programmeringsverktyg". Men eftersom dessa verktyg inte implementerar "nätet av abstrakta begrepp" som gömmer sig bakom systemet med makron på naturliga språk, eller ger en möjlighet att ändra ordningen på källkoden från en maskinpålagd sekvens till en som är bekväm för det mänskliga sinnet , de kan inte riktigt kallas läskunniga programmeringsverktyg i den mening som Knuth avsåg.
Kritik
1986 bad Jon Bentley Knuth att visa konceptet med läskunnig programmering för sin kolumn Programmeringspärlor i ACM:s kommunikation genom att skriva ett program på WEB. Knuth skickade till honom ett program för ett problem som tidigare diskuterats i kolumnen (det med att sampla M slumptal i intervallet 1.. N ), och bad också om en "uppgift". Bentley gav honom problemet att hitta de K vanligaste orden från en textfil, för vilken Knuth skrev ett WEB-program som publicerades tillsammans med en recension av Douglas McIlroy från Bell Labs. McIlroy berömde det invecklade i Knuths lösning, hans val av datastruktur (en variant av Frank M. Liangs hashförsök ) och presentationen. Han kritiserade vissa stilfrågor, som det faktum att den centrala idén beskrevs sent i tidningen, användningen av magiska konstanter och frånvaron av ett diagram som åtföljer förklaringen av datastrukturen. McIlroy, använde också recensionen för att kritisera själva programmeringsuppgiften, och påpekade att i Unix (utvecklad på Bell Labs) hade det skrivits verktyg för textbehandling ( tr , sort , uniq och sed ) tidigare som var " häftklammer " , och en lösning som var enkel att implementera, felsöka och återanvända kunde erhållas genom att kombinera dessa verktyg i ett sex-rads skalskript . Som svar skrev Bentley att:
[McIlroy] beundrar utförandet av lösningen, men gör fel på problemet av tekniska skäl. (Det är naturligtvis mitt ansvar som problemfördelare; Knuth löste problemet han fick på grunder som är viktiga för de flesta ingenjörer - lönecheckarna från deras problemuppdragare.)
McIlroy erkände senare att hans kritik var orättvis, eftersom han kritiserade Knuths program på tekniska grunder, medan Knuths syfte bara var att demonstrera den läskunniga programmeringstekniken. 1987 Communications of the ACM en uppföljningsartikel som illustrerade läskunnig programmering med ett C-program som kombinerade Knuths konstnärliga tillvägagångssätt med McIlroys tekniska tillvägagångssätt, med en kritik av John Gilbert.
Arbetsflöde
Att implementera läskunnig programmering består av två steg:
- Vävning: Genererar ett omfattande dokument om programmet och dess underhåll.
- Tangling: Genererar maskinkörbar kod
Vävning och trassling görs på samma källa så att de överensstämmer med varandra.
Exempel
Ett klassiskt exempel på läskunnig programmering är den läskunniga implementeringen av standardprogrammet Unix wc
ordräkning. Knuth presenterade en CWEB- version av detta exempel i kapitel 12 i boken Literate Programming . Samma exempel skrevs senare om för programmeringsverktyget noweb literate. Detta exempel ger en bra illustration av de grundläggande delarna av läskunnig programmering.
Skapande av makron
Följande utdrag av programmet wc
literate visar hur godtyckliga beskrivande fraser på ett naturligt språk används i ett literate program för att skapa makron, som fungerar som nya "operatörer" i det literate programmeringsspråket, och döljer bitar av kod eller andra makron. Mark-up notationen består av dubbla vinkelparenteser (" <<...>>
") som indikerar makron, symbolen " @
" som indikerar slutet på kodavsnittet i en noweb-fil. Symbolen " <<*>>
" står för "roten", den översta noden som det läskunniga programmeringsverktyget kommer att börja expandera nätet av makron från. Egentligen kan man skriva ut den utökade källkoden från vilken sektion eller undersektion som helst (dvs. en kodbit betecknad som " << namn på biten>>=
", med likhetstecknet), så en läskunnig programfil kan innehålla flera filer med maskinens källkod.
Syftet med wc är att räkna rader , ord och / eller tecken i en lista med filer . _ _ Antalet rader i en fil är ........ / fler förklaringar / Här är alltså en översikt över filen wc . _ _ _ _ _ c som definieras av noweb - programmet wc . _ nw : <<*>>= << Header - filer som ska inkluderas >> << Definitioner >> << Globala variabler >> << Funktioner >> << Huvudprogrammet >> @ Vi måste inkludera standard I / O - definitioner , eftersom vi vill skicka formaterad utdata till stdout och stderr . _ << Header- filer att inkludera >>= #include <stdio.h> @
Upplösningen av bitarna kan göras var som helst i den läskunniga programtextfilen, inte nödvändigtvis i den ordning de är sekvenserade i den omslutande biten, utan som krävs av logiken som återspeglas i den förklarande texten som omsluter hela programmet.
Program som en webb
Makron är inte detsamma som "sektionsnamn" i standarddokumentation. Läskunniga programmeringsmakron döljer den verkliga koden bakom sig och kan användas i alla maskinspråksoperatörer på låg nivå, ofta i logiska operatorer som " if
", " while
" eller " case
". Detta kan ses i följande wc
literate program.
0
Den nuvarande biten , som räknar , var faktiskt en av de enklaste att skriva . _ _ Vi tittar på varje tecken och ändrar tillstånd om det börjar eller slutar ett ord . << Skanna fil >>= while ( 1 ) { << Fyll buffert om den är tom ; break i slutet av filen >> c = * ptr ++ ; if ( c > ' ' && c < 0177 ) { /* synliga ASCII-koder */ if ( ! in_word ) { word_count ++ ; in_word = 1 ; } fortsätt ; } if ( c == '\n' ) line_count ++ ; annars om ( c != ' ' && c != '\t' ) fortsätt ; in_word = ; /* c är nyrad, blanksteg eller tab */ } @
Makron står för vilken kodbit som helst eller andra makron, och är mer generella än top-down eller bottom-up "chunking", eller än subsectioning. Donald Knuth sa att när han insåg detta började han tänka på ett program som en väv av olika delar.
Den mänskliga logikens ordning, inte kompilatorns
I ett noweb literate program förutom den fria ordningen för deras exponering, kan bitarna bakom makron, när de en gång introducerades med " <<...>>= ", odlas
senare var som helst i filen genom att helt enkelt skriva " << namn på biten>>=
" och lägga till mer innehåll till den, som följande utdrag illustrerar ("pluss" läggs till av dokumentformateraren för läsbarhet och finns inte i koden).
Totalsummorna måste initieras till noll i början av programmet. Om vi gjorde dessa variabler lokala till main, skulle vi behöva göra denna initialisering explicit; C-globalerna nollställs dock automatiskt. (Eller snarare, ``statiskt nollställd.'' (Förstår det?) < >+= long tot_word_count, tot_line_count, tot_char_count; /* totalt antal ord, rader, tecken */ @
Uppteckning av tankegången
Dokumentationen för ett läskunnig program tas fram som en del av att skriva programmet. Istället för kommentarer som lämnas som sidoanteckningar till källkoden innehåller ett läskunnigt program förklaringar av begrepp på varje nivå, med begrepp på lägre nivå skjutna till sin lämpliga plats, vilket möjliggör bättre kommunikation av tankar. Utdragen av den läskunniga wc
ovan visar hur en förklaring av programmet och dess källkod är sammanvävda. Sådan utläggning av idéer skapar ett tankeflöde som är som ett litterärt verk. Knuth skrev en "roman" som förklarar koden för det interaktiva fiktionsspelet Colossal Cave Adventure .
Märkliga exempel
- Axiom , som har utvecklats från scratchpad, ett datoralgebrasystem utvecklat av IBM. Det utvecklas nu av Tim Daly, en av utvecklarna av scratchpad, Axiom är helt skrivet som ett läskunnigt program.
Läskunniga programmeringsmetoder
Den första publicerade läskunniga programmeringsmiljön var WEB , introducerad av Knuth 1981 för hans TeX- typsättningssystem; den använder Pascal som sitt underliggande programmeringsspråk och TeX för typsättning av dokumentationen. Den fullständiga kommenterade TeX-källkoden publicerades i Knuths TeX: The program , volym B av hans 5-volyms Computers and Typesetting . Knuth hade privat använt ett läskunnigt programmeringssystem kallat DOC så tidigt som 1979. Han inspirerades av Pierre-Arnoul de Marneffes idéer . Den kostnadsfria CWEB , skriven av Knuth och Silvio Levy, är WEB-anpassad för C och C++ , körs på de flesta operativsystem och kan producera TeX- och PDF -dokumentation.
Det finns flera andra implementeringar av det läskunniga programmeringskonceptet (många av dessa har inte makron och bryter därför mot principen om mänsklig logik , vilket gör dem till mer halvläskunniga verktyg):
namn | Språk som stöds | Skrivet i | Markup Language | Kommentarer |
---|---|---|---|---|
WEBB | Pascal | Pascal | TeX | Den första publicerade läskunniga programmeringsmiljön. |
CWEB | C++ och C | C | TeX | Är WEB anpassad för C och C++ . |
NoWEB | Några | C , AWK och Icon | LaTeX , TeX , HTML och troff | Det är välkänt för sin enkelhet och det möjliggör textformatering i HTML snarare än att gå igenom TeX-systemet. |
Läskunnig | Några | D | Prissänkning | Stöder TeX-ekvationer. Kompatibel med Vim ( literate.vim ) |
FunnelWeb | Några | C | HTML och TeX | Den har mer komplicerad uppmärkning, men har många fler flexibla alternativ |
NuWEB | Några | C++ | Latex | Den kan översätta en enda LP-källa till valfritt antal kodfiler. Den gör det i en enda åkallan; den har inga separata väv- och trasselkommandon. Den har inte utbyggbarheten som noweb |
pyWeb | Några | Pytonorm | ReStructuredText | Respekterar indrag som gör det användbart för språk som Python , även om du kan använda det för alla programmeringsspråk. |
Molly | Några | Perl | HTML | Syftar till att modernisera och skala den med "vikbar HTML" och "virtuella vyer" på kod. Den använder "noweb"-markering för läskunniga källfiler. |
Codnar | Rubin | Det är ett omvänt läskunnigt programmeringsverktyg tillgängligt som en Ruby Gem. Istället för att den maskinläsbara källkoden extraheras ur de läskunniga dokumentationskällorna, extraheras den läskunniga dokumentationen ur de vanliga maskinläsbara källkodsfilerna. | ||
Emacs org-läge | Några | Emacs Lisp | Oformatterad text | Kräver Babel, som tillåter inbäddning av block med källkod från flera programmeringsspråk i ett enda textdokument. Kodblock kan dela data med varandra, visa bilder inline eller tolkas till ren källkod med hjälp av noweb -referenssyntaxen. |
CoffeeScript | CoffeeScript | CoffeeScript , JavaScript | Prissänkning | CoffeeScript stöder ett "läskunnigt" läge, vilket gör att program kan kompileras från ett källdokument skrivet i Markdown med indragna kodblock. |
Lönn arbetsblad | Maple (programvara) | XML | Maple-kalkylblad är en plattforms-agnostisk programmeringsmiljö som kombinerar text och grafik med live-kod för symbolisk beräkning. "Lönnkalkylblad" . www.maplesoft.com . Hämtad 2020-05-30 . | |
Wolfram anteckningsböcker | Wolfram språk | Wolfram språk | Wolfram-anteckningsböcker är en plattforms-agnostisk programmeringsmetod som kombinerar text och grafik med live-kod. | |
Lekplatser | Swift (programmeringsspråk) | Ger en interaktiv programmeringsmiljö som utvärderar varje påstående och visar liveresultat när koden redigeras. Lekplatser tillåter också användaren att lägga till uppmärkningsspråk tillsammans med koden som tillhandahåller rubriker, inline-formatering och bilder. | ||
Jupyter Notebook , tidigare IPython Notebook | Python och alla med en Jupyter-kärna | JSON -format Specifikation för ipynb | Fungerar i formatet anteckningsböcker, som kombinerar rubriker, text (inklusive LaTeX), plotter etc. med den skrivna koden. | |
nbdev | Python och Jupyter Notebook |
nbdev är ett bibliotek som låter dig utveckla ett pythonbibliotek i Jupyter Notebooks, genom att lägga all din kod, tester och dokumentation på ett ställe. |
||
Julia (programmeringsspråk) | Stöder utvecklingsläget iJulia som inspirerades av iPython. | |||
Agda (programmeringsspråk) | Stöder en begränsad form av läskunnig programmering direkt. | |||
Eve programmeringsspråk | Program är i första hand prosa. Eve kombinerar varianter av Datalog och Markdown med en live grafisk utvecklingsmiljö | |||
R Markdown Notebooks (eller R Notebooks) | R , Python , Julia och SQL | PDF , Microsoft Word , LibreOffice och presentations- eller bildspelsformat plus interaktiva format som HTML-widgets | ||
Quarto | R , Python , Julia och Observable | PDF , Microsoft Word , LibreOffice och presentations- eller bildspelsformat plus interaktiva format som HTML-widgets | ||
Svep | R | |||
Stickr | R | LaTeX , PDF , LyX , HTML , Markdown , AsciiDoc och reStructuredText | ||
Codebraid | Pandoc , Rust , Julia , Python , R , Bash | Pytonorm | Prissänkning | |
Pweave | Pytonorm | |||
MATLAB Live Editor | MATLAB | Prissänkning | ||
Inweb | C , C++ , Inform 6 , Inform 7 | C , CWEB | TeX , HTML | Används för att skriva programmeringsspråket Inform sedan 2004. |
Merkurius | Pytonorm | Python , TypeScript | JSON- formatspecifikation för ipynb | Mercury förvandlar Jupyter Notebook till interaktiva beräkningsdokument. De kan publiceras som webbapplikationer , instrumentpaneler, rapporter, REST API eller bilder. Det körda dokumentet kan exporteras som fristående HTML- eller PDF- fil. Dokument kan schemaläggas för automatisk exekvering. Dokumentnärvaron och widgets styrs med YAML-huvudet i den första cellen i anteckningsboken. |
Märkbar | JavaScript | JavaScript , TypeScript | TeX ( KaTeX ), HTML | Lagrat i molnet med webbgränssnitt. Innehållet är publicerbart som webbplatser. Version kontrollerad; plattformen definierar sina egna versionskontrolloperationer. Kodceller kan organiseras ur funktion ; observerbara anteckningsböcker kommer att konstruera exekveringsgrafen (en DAG ) automatiskt. Ett rikt standardbibliotek implementerat med moderna funktioner i JavaScript . Celler från olika observerbara anteckningsböcker kan referera till varandra. Npm- bibliotek kan importeras i farten. |
Ganesha | JavaScript , TypeScript | JavaScript | Prissänkning | Gör det möjligt för Node.js att ladda läskunniga moduler, representerade av Markdown-filer som innehåller JavaScript- eller TypeScript-kod varvat med rikt formaterad prosa. Stöder paketering av läskunniga moduler för webbläsare när du använder paketeringsmodulerna Samlad eller Vite frontend. |
Andra användbara verktyg inkluderar:
- Leo -textredigeraren är en konturredigerare som stöder valfri noweb- och CWEB-uppmärkning. Författaren till Leo blandar två olika tillvägagångssätt: för det första är Leo en konturredigerare, som hjälper till med hantering av stora texter; för det andra införlivar Leo några av idéerna om läskunnig programmering, som i sin rena form (dvs hur det används av Knuth webbverktyg eller verktyg som "noweb") är möjligt endast med en viss grad av uppfinningsrikedom och användning av editorn på ett sätt som inte exakt föreställs av dess författare (i modifierade @rootnoder). Men detta och andra tillägg (@file noder) gör konturprogrammering och texthantering framgångsrik och enkel och på vissa sätt liknar läskunnig programmering.
- Haskell - programmeringsspråket har inbyggt stöd för semi-läserlig programmering. Kompilatorn/tolken stöder två filnamnstillägg:
.hs
och.lhs
; den senare står för literate Haskell.
- De läskunniga skripten kan vara fullständig LaTeX-källtext, samtidigt kan den kompileras, utan ändringar, eftersom tolken endast kompilerar texten i en kodmiljö, till exempel: % här text som beskriver funktionen:
0 \ begin { code } fakta = 1 faktum ( n + 1 ) = ( n + 1 ) * fakta n \end { kod } här mer text
- Koden kan också markeras i Richard Bird-stilen, och börjar varje rad med en större än symbol och ett mellanslag, före och avslutar kodstycket med tomma rader.
- LaTeX
lists
-paketet tillhandahåller enlstlisting
-miljö som kan användas för att försköna källkoden. Den kan användas för att definiera enkodmiljö
som ska användas inom Haskell för att skriva ut symbolerna på följande sätt: \newenvironment { code }{ \lstlistings [language=Haskell] }{ \endlstlistings } \begin { code } comp :: ( beta -> gamma ) -> ( alfa -> beta ) -> ( alfa -> gamma ) ( g ` comp ` f ) x = g ( f x ) \end { code }
- som kan konfigureras för att ge:
- paketet inte ger möjlighet att organisera bitar av kod, kan man dela upp LaTeX-källkoden i olika filer. Se listningsmanualen för en översikt.
- Web 68 Literate Programming-systemet använde Algol 68 som det underliggande programmeringsspråket, även om det inte fanns något i förprocessorns "tang" för att tvinga fram användningen av det språket.
- Anpassningsmekanismen för Text Encoding Initiative som möjliggör begränsning, modifiering eller förlängning av TEI -schemat gör det möjligt för användare att blanda prosadokumentation med fragment av schemaspecifikation i deras One Document Does-it-all- format. Från denna prosadokumentation kan scheman och processmodellpipelines genereras och Knuths Literate Programming-paradigm citeras som inspiration för detta sätt att arbeta.
Se även
- Dokumentationsgenerator – motsatsen till läskunnig programmering där dokumentation är inbäddad i och genererad från källkod
- Notebook-gränssnitt – virtuell notebook-miljö som används för läskunnig programmering
- Sweave and Knitr – exempel på användning av det "noweb"-liknande Literate Programming-verktyget i R-språket för att skapa dynamiska statistiska rapporter
- Självdokumenterande kod – källkod som lätt kan förstås utan dokumentation
Vidare läsning
- Sewell, Wayne (1989). "Weaving a Program: Literate Programming in WEB" . Van Nostrand Reinhold. ISBN 0-442-31946-0 .
- Knuth, Donald E. (1992). Läskunnig programmering . Kalifornien: Stanford University Center for the Study of Language and Information. ISBN 978-0-937073-80-3 .
- Guari, Eitan M. (1994). TeX & LaTeX: Ritning och läskunnig programmering . McGraw Hill. ISBN 0-07-911616-7 . (inkluderar programvara)
- Nørmark, Kurt (13 augusti 1998). "Lärande programmering – frågor och problem" . Universitetet i Aalborg .
- Schulte, Eric (januari 2012). "En flerspråkig datormiljö för läskunnig programmering och reproducerbar forskning" ( PDF) . Journal of Statistical Software . Vol. 46, nr. 3. doi : 10.18637/jss.v046.i03 .
- Mall, Daniel. "Litterat programmering" .
- Walsh, Norman (15 oktober 2002). Läskunnig programmering i XML . XML 2002. CiteSeerX 10.1.1.537.6728 . Arkiverad från originalet 2008-05-11.