Literate programming: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Creata dalla traduzione della pagina "Literate programming"
 
Nessun oggetto della modifica
Riga 1:
 
[[File:Literate_Programming_book_cover.jpg|miniatura| ''Literate Programming'' di [[Donald Knuth]] è il libro con cui ha inizialmente diffuso i concetti primari del literate programming ]]
 
'''Il Literate programming''' è un [[paradigma di programmazione]] introdotto da [[Donald Knuth]] in cui un [[Programma (informatica)|programma per computer]] viene fornito come una spiegazione della sua logica in un linguaggio naturale, come l'inglese, intervallata da [[Snippet|frammenti]] di [[Macro (informatica)|macro]] e [[codice sorgente]] tradizionale, da cui può essere generato codice sorgente [[Compilatore|compilabile]]. <ref name="TCJ_LP">{{note label|TCJ_LP||v}}{{note label|TCJ_LP||w}}{{note label|TCJ_LP||x}}{{note label|TCJ_LP||y}}{{note label|TCJ_LP||z}}{{Cita pubblicazione|autore=Knuth|nome=Donald E.|linkautore=Donald Knuth|anno=1984|titolo=Literate Programming|rivista=[[The Computer Journal]]|editore=[[British Computer Society]]|volume=27|numero=2|pp=97–111|accesso=January 4, 2009|doi=10.1093/comjnl/27.2.97|url=http://www.literateprogramming.com/knuthweb.pdf}}</ref>
 
Riga 42:
 
=== Creazione di macro ===
Il frammento seguente del literate program <code>wc</code> <ref name="noweb-wc">{{Cita web|url=https://www.cs.tufts.edu/~nr/noweb/examples/wc.html|titolo=An Example of noweb|cognome=Ramsey|nome=Norman|data=May 13, 2008|accesso=January 4, 2009}}</ref> mostra come frasi descrittive arbitrarie in un linguaggio naturale vengono utilizzate per creare macro, che fungono da nuovi "operatori" nel linguaggio di programmazione literate e nascondono blocchi di codice o altre macro. La notazione di markup è composta da parentesi quadre (" <code><<...>></code> ") che indicano le macro, il simbolo " <code>@</code> " che indica la fine della sezione di codice in un file noweb. Il simbolo " <code><<*>></code> " sta per "radice", nodo più in alto dal quale lo strumento di programmazione alfabetico inizierà a espandere la rete di macro. In realtà, scrivere il codice sorgente espanso può essere fatto da qualsiasi sezione o sottosezione (cioè un pezzo di codice designato come " <code><<name of the chunk>>=</code> ", con il segno uguale), quindi un file di un literate program può contenere diversi file con codice sorgente.
<source lang="c">
The purpose of wc is to count lines, words, and/or characters in a list of files. The
number of lines in a file is ......../more explanations/
Riga 60 ⟶ 61:
#include <stdio.h>
@
</source>
</source> Il dipanarsi dei blocchi può essere eseguito in qualsiasi posizione nel file di testo del programma letterato, non necessariamente nell'ordine in cui sono sequenziati nel blocco racchiudente, ma come richiesto dalla logica riflessa nel testo esplicativo che avvolge l'intero programma.
Il dipanarsi dei blocchi può essere eseguito in qualsiasi posizione nel file di testo del programma letterato, non necessariamente nell'ordine in cui sono sequenziati nel blocco racchiudente, ma come richiesto dalla logica riflessa nel testo esplicativo che avvolge l'intero programma.
 
=== Programma come Web: le macro non sono solo nomi di sezioni ===
Le macro non corrispondono ai "nomi di sezione" nella documentazione standard. Le macro nel literate programming possono nascondere dietro di sé qualsiasi blocco di codice ed essere utilizzate all'interno di qualsiasi operatore di linguaggio macchina di basso livello, spesso all'interno di operatori logici come " <code>if</code> ", " <code>while</code> " o " <code>case</code> ". Ciò è illustrato dal seguente frammento del literate program <code>wc</code> . <ref name="noweb-wc">{{Cita web|url=https://www.cs.tufts.edu/~nr/noweb/examples/wc.html|titolo=An Example of noweb|cognome=Ramsey|nome=Norman|data=May 13, 2008|accesso=January 4, 2009}}</ref>

<source lang="c">
The present chunk, which does the counting, was actually one of
the simplest to write. We look at each character and change state if it begins or ends
Riga 86 ⟶ 90:
}
@
</source>
</source> In effetti, le macro possono rappresentare qualsiasi frammento arbitrario di codice o altre macro e sono quindi più generali di una frammentazione top-down o bottom-up o di una sorta di sottosezionamento. Knuth dice che quando ha realizzato questo, ha iniziato a pensare a un programma come a una ''rete'' di varie parti. <ref name="TCJ_LP">{{note label|TCJ_LP||v}}{{note label|TCJ_LP||w}}{{note label|TCJ_LP||x}}{{note label|TCJ_LP||y}}{{note label|TCJ_LP||z}}{{Cita pubblicazione|autore=Knuth|nome=Donald E.|linkautore=Donald Knuth|anno=1984|titolo=Literate Programming|rivista=[[The Computer Journal]]|editore=[[British Computer Society]]|volume=27|numero=2|pp=97–111|accesso=January 4, 2009|doi=10.1093/comjnl/27.2.97|url=http://www.literateprogramming.com/knuthweb.pdf}}</ref>
 
In effetti, le macro possono rappresentare qualsiasi frammento arbitrario di codice o altre macro e sono quindi più generali di una frammentazione top-down o bottom-up o di una sorta di sottosezionamento. Knuth dice che quando ha realizzato questo, ha iniziato a pensare a un programma come a una ''rete'' di varie parti. <ref name="TCJ_LP">{{note label|TCJ_LP||v}}{{note label|TCJ_LP||w}}{{note label|TCJ_LP||x}}{{note label|TCJ_LP||y}}{{note label|TCJ_LP||z}}{{Cita pubblicazione|autore=Knuth|nome=Donald E.|linkautore=Donald Knuth|anno=1984|titolo=Literate Programming|rivista=[[The Computer Journal]]|editore=[[British Computer Society]]|volume=27|numero=2|pp=97–111|accesso=January 4, 2009|doi=10.1093/comjnl/27.2.97|url=http://www.literateprogramming.com/knuthweb.pdf}}</ref>
 
=== Ordine della logica umana, non quello del compilatore ===
In un literate program noweb oltre all'ordine libero della loro esposizione, i blocchi dietro le macro, una volta introdotti con " <code><<...>>=</code> ", possono essere sviluppati successivamente in qualsiasi posto nel file semplicemente scrivendo " <code><<name of the chunk>>=</code> "e aggiungendo più contenuto ad esso, come illustra il seguente frammento (" più" viene aggiunto dal formatter del documento per la leggibilità e non è nel codice). <ref name="noweb-wc">{{Cita web|url=https://www.cs.tufts.edu/~nr/noweb/examples/wc.html|titolo=An Example of noweb|cognome=Ramsey|nome=Norman|data=May 13, 2008|accesso=January 4, 2009}}</ref>

<source lang="text"> The grand totals must be initialized to zero at the beginning of the program.
If we made these variables local to main, we would have to do this initialization
explicitly; however, C globals are automatically zeroed. (Or rather,``statically
Riga 147 ⟶ 155:
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mi><mi> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mi><mi> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mi><mi> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mi><mo> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mo><mo stretchy="false"> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mo><mi> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mi><mo stretchy="false"> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mo><mi> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mi><mo stretchy="false"> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mo><mo stretchy="false"> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mo><mo stretchy="false"> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mo><mi> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mi><mo stretchy="false"> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mo><mi> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mi><mo stretchy="false"> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mo><mo stretchy="false"> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mo><mo stretchy="false"> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mo><mi> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mi><mo stretchy="false"> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mo><mi> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mi><mo stretchy="false"> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mo></mtd></mtr><mtr><mtd><mo stretchy="false"> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mo><mi> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mi><mi> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mi><mo> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mo><mi> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mi><mo stretchy="false"> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mo><mi> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mi><mo> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mo><mi> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mi><mo stretchy="false"> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mo><mi> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mi><mi> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mi><mo stretchy="false"> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </mo></mtd></mtr></mtable></mrow></mstyle></mrow> </math><math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> <math>
\begin{align}
&comp :: (\beta \to \gamma) \to (\alpha \to \beta) \to (\alpha \to \gamma)\\
&(g \operatorname{comp} f) x = g(f x)
\end{align}
</math> </img><span></span>
: Sebbene il pacchetto non fornisca i mezzi per organizzare blocchi di codice, è possibile dividere il codice sorgente LaTeX in diversi file. Vedi il [http://mirrors.ctan.org/macros/latex/contrib/listings/listings.pdf manuale di listings] per una panoramica.
 
Riga 348 ⟶ 176:
 
== Fonti ==
{{Reflist|40em}}
 
== Bibliografia ==
{{refbegin}}
* {{cite news |first=Wayne |last=Sewell |title = Weaving a Program: Literate Programming in WEB |publisher=Van Nostrand Reinhold |year=1989 |isbn=0-442-31946-0 }}
* {{cite book |first=Donald E. |last=Knuth |author-link=Donald Knuth |title=Literate Programming |publisher=[[Stanford University]] Center for the Study of Language and Information |___location=California |year=1992 |isbn=978-0-937073-80-3 }}
* {{cite book |first=Eitan M. |last=Guari |title = TeX & LaTeX: Drawing and Literate Programming |publisher=McGraw Hill |year=1994 |isbn=0-07-911616-7 }} (includes software)
* {{cite web |first=Kurt |last=Nørmark |url = http://www.cs.aau.dk/~normark/litpro/issues-and-problems.html |title = Literate Programming – Issues and Problems |publisher=[[University of Aalborg]] |date=August 13, 1998 }}
* {{cite news |first=Eric |last=Schulte |url = https://www.jstatsoft.org/article/view/v046i03/v46i03.pdf |title = A Multi-Language Computing Environment for Literate Programming and Reproducible Research |publisher=Journal of Statistical Software |date=January 2012 |volume=46 |issue=3 }}
{{refend}}
 
{{-}}
{{Donald Knuth navbox}}