Läskunnig programmering

Litteratur programmering av Donald Knuth är den framstående boken om 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:

  1. Vävning: Genererar ett omfattande dokument om programmet och dess underhåll.
  2. 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  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 PDF
Stickr R LaTeX , PDF , LyX , HTML , Markdown , AsciiDoc och reStructuredText
Codebraid Pandoc , Rust , Julia , Python , R , Bash Pytonorm Prissänkning
Pweave Pytonorm PDF
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 en lstlisting -miljö som kan användas för att försköna källkoden. Den kan användas för att definiera en kodmiljö 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

externa länkar