Literate programming: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
FrescoBot (discussione | contributi)
Atarubot (discussione | contributi)
template cita "xxxx"; fix formato data; rinomina/fix nomi parametri
Riga 6:
 
== Storia e filosofia ==
Il literate programming fu introdotto per la prima volta da Knuth nel 1984. L'intenzione principale dietro questo approccio era di trattare un programma come letteratura comprensibile agli esseri umani. Questo approccio è stato implementato presso l'[[Università di Stanford]] come parte della ricerca sugli [[Algoritmo|algoritmi]] e sulla [[tipografia]] digitale. Questa implementazione fu chiamata " [[WEB (linguaggio)|WEB]] " da Knuth poiché credeva che fosse una delle poche parole inglesi di tre lettere che non erano già state applicate al computer.<ref>{{Cita web|url=http://www.literateprogramming.com/knuthweb.pdf|titolo=Literate Programming|sito=archive.computerhistory.org|accesso=3 giugno 2019-06-03|lingua=en}}</ref> Tuttavia, ricorda effettivamente la natura complicata del software delicatamente assemblato da materiali semplici.<ref name="TCJ_LP" />
 
== Concetto ==
Riga 16:
Secondo Knuth, il literate programming<ref name="Knuth">{{Cita web|url=https://www.informit.com/articles/article.aspx?p=1193856|titolo=Interview with Donald Knuth|data=25 aprile 2008|citazione=Yet to me, literate programming is certainly the most important thing that came out of the [[TeX]] project. Not only has it enabled me to write and maintain programs faster and more reliably than ever before, and been one of my greatest sources of joy since the 1980s-it has actually been indispensable at times. Some of my major programs, such as the MMIX meta-simulator, could not have been written with any other methodology that I've ever heard of. The complexity was simply too daunting for my limited brain to handle; without literate programming, the whole enterprise would have flopped miserably.... Literate programming is what you need to rise above the ordinary level of achievement.|accesso=4 gennaio 2009}}</ref><ref>{{Cita|Knuth}}. {{Citazione|Another surprising thing that I learned while using WEB was that traditional programming languages had been causing me to write inferior programs, although I hadn't realized what I was doing. My original idea was that WEB would be merely a tool for documentation, but I actually found that my WEB programs were better than the programs I had been writing in other languages.}}</ref> fornisce programmi di qualità superiore, poiché obbliga i programmatori a dichiarare esplicitamente i pensieri alla base del programma, rendendo più ovvie le decisioni di progettazione scarsamente ponderate. Knuth afferma anche che il literate programming fornisce un sistema di documentazione di prim'ordine, che non è un componente aggiuntivo, ma è "cresciuto" naturalmente nel processo di esposizione dei propri pensieri durante la creazione di un programma.<ref>{{Cita|Knuth}}. {{Citazione|Thus the WEB language allows a person to express programs in a ''"stream of consciousness" order''. TANGLE is able to scramble everything up into the arrangement that a PASCAL compiler demands. This feature of WEB is perhaps its greatest asset; it makes a WEB-written program much more readable than the same program written purely in PASCAL, even if the latter program is well commented. And the fact that there's no need to be hung up on the question of top-down versus bottom-up, since a programmer can now ''view a large program as a web, to be explored in a '''psychologically correct order''' is perhaps the greatest lesson'' I have learned from my recent experiences.}}</ref> La documentazione risultante consente all'autore di riavviare i propri processi di pensiero in qualsiasi momento successivo, e consente ad altri programmatori di comprendere più facilmente la costruzione del programma. Ciò differisce dalla documentazione tradizionale, in cui a un programmatore viene presentato un codice sorgente che segue un ordine imposto dal compilatore e da cui deve decifrare il processo di pensiero dietro il programma dal codice e dai commenti associati. Le capacità meta-linguistiche del literate programming si sostiene anche che facilitino il ragionamento, offrendo una "visione a volo d'uccello" del codice e aumentando il numero di concetti che la mente può conservare ed elaborare con successo. L'applicabilità del concetto alla programmazione su larga scala, quella dei programmi di livello commerciale, è dimostrata da una edizione del codice [[TeX]] come literate program.<ref name="Knuth" />
 
Knuth afferma inoltre che il Literate Programming può portare ad un facile porting di un dato software su più ambienti, e cita persino l'implementazione di TeX come esempio.<ref>{{Cita web|url=http://archive.computerhistory.org/resources/text/Oral_History/Knuth_Don_1/Knuth_Don.oral_history.2007.102658053_all.pdf|titolo="Oral History of Donald Knuth"- an Interview with Ed Feigenbaum|sito=archive.computerhistory.org|accesso=7 dicembre 2018-12-07|lingua=en}}</ref>
 
=== Contrasto con il classico processo di generazione della documentazione ===
Riga 119:
* [[Axiom]], che si è evoluto da scratchpad, un sistema di calcolo algebrico per computer sviluppato da IBM. Ora è sviluppato da Tim Daly, uno degli sviluppatori di scratchpad, Axiom è totalmente scritto come literate program.
* noweb è indipendente dal linguaggio di programmazione del codice sorgente. È noto per la sua semplicità, data la necessità di utilizzare solo due convenzioni di markup del testo e due invocazioni di strumenti e consente la formattazione del testo in HTML anziché passare attraverso il sistema TeX.
* ''Literate'' è un "moderno sistema di literate programming". Come noweb, funziona con qualsiasi linguaggio di programmazione, ma produce HTML con evidenziazione della sintassi e cerca di conservare tutti i vantaggi di CWEB, incluso l'output formattato come CWEB. Altri notevoli vantaggi rispetto agli strumenti precedenti includono l'essere basato su Markdown e la generazione di codice "aggrovigliato" ben formattato.<ref>{{Cita web|autore=Zachary Yedidia|data=2019-07-24 luglio 2019|titolo=A literate programming tool for any language|lingua=en|accesso=2019-07-30 luglio 2019|sito=GitHub|url=https://github.com/zyedidia/Literate}}</ref>
* FunnelWeb è un altro strumento LP in grado di produrre output HTML. Ha un markup più complicato (con "@" che sfugge a qualsiasi comando FunnelWeb), ma ha molte opzioni flessibili. Come noweb, è indipendente dal linguaggio di programmazione del codice sorgente.<ref>{{Cita web|url=http://www.ross.net/funnelweb/|urlmorto=sì|urlarchivio=https://web.archive.org/web/20190604103010/http://www.ross.net/funnelweb/|sito=FunnelWeb|titolo=The FunnelWeb Literate Programming Tool|lingua=en}}</ref>
* Nuweb può tradurre una singola fonte LP in un numero qualsiasi di file di codice in qualsiasi combinazione di linguaggi insieme alla documentazione in [[LaTeX]]. Lo fa in una sola invocazione; non ha comandi di trama e groviglio separati. Non ha l'estensibilità di noweb, ma può usare il pacchetto listings di LaTeX per fornire una stampa ben formattata ed il pacchetto hyperref per fornire collegamenti ipertestuali nell'output PDF. Dispone inoltre di ampie funzionalità di indicizzazione e riferimenti incrociati, inclusi riferimenti incrociati dal codice generato alla documentazione, sia come commenti generati automaticamente sia come stringhe che il codice può utilizzare per segnalare/fare rapporto del proprio comportamento. Vimes è un type-checker per la [[notazione Z]] che mostra l'uso di nuweb in un'applicazione pratica. Circa 15.000 righe di sorgenti nuweb sono tradotte in quasi 15.000 righe di codice C / C ++ e oltre 460 pagine di documentazione.<ref>{{Cita web|url=http://nuweb.sourceforge.net/|titolo=The nuweb system for Literate Programming|sito=nuweb.sourceforge.net|lingua=en|accesso=2019-07-30 luglio 2019}}</ref>
* [https://github.com/slott56/py-web-tool pyWeb] è uno strumento di literate programming che ha la sintassi per le macro simili a CWEB, ma utilizza [[ReStructuredText]] invece di [[TeX]] per il markup e rispetta l'indentazione, cosa che lo rende utilizzabile per linguaggi come [[Python]], sebbene sia possibile utilizzarlo per qualsiasi linguaggio di programmazione.
* Molly è uno strumento LP scritto in [[Perl]], che mira a modernizzare e ridimensionare il literate programming per mezzo di "HTML pieghevole (folding)" e "viste virtuali" sul codice. Utilizza il markup "noweb" per i file di origine literate.<ref>{{Cita web|data=2019-02-13 febbraio 2019|titolo=A literate programming "weaver" which can run as CGI to produce folding HTML-formatted documentation and runs with "noweb" tools of Norman Ramsey: unixtechie/Literate-Molly|sito=GitHub|lingua=en|accesso=2019-07-30 luglio 2019|url=https://github.com/unixtechie/Literate-Molly}}</ref>
* Codnar è uno strumento di literate programming inverso disponibile come [[RubyGems|Ruby Gem]]. Invece di estrarre il codice sorgente leggibile dal compilatore dalle fonti di documentazione, la documentazione literate viene estratta dai normali file di codice sorgente leggibili dalla macchina. Questo consente a questi file di codice sorgente di essere modificati e mantenuti come al solito. L'approccio è simile a quello utilizzato dai più diffusi strumenti di documentazione [[Application programming interface|API]], come [[Javadoc|JavaDoc]]. Tali strumenti, tuttavia, generano documentazione di riferimento API, mentre Codnar genera una narrazione lineare che descrive il codice, simile a quella creata dai classici strumenti LP. Codnar può coesistere con gli strumenti di documentazione API, consentendo sia un manuale di riferimento che una narrazione lineare generabili dallo stesso set di file di codice sorgente.<ref>{{Cita web|autore=Oren Ben-Kiki|data=2019-06-21 giugno 2019|sito=GitHub|titolo=Code Narrator: an inverse literate programming tool. - orenbenkiki/codnar|lingua=en|accesso=2019-07-30 luglio 2019|url=https://github.com/orenbenkiki/codnar}}</ref>
* L' editor di testo Leo è un outlining editor che supporta opzionalmente i markup noweb e CWEB L'autore di Leo mescola due approcci diversi: in primo luogo, Leo è un outlining editor, cosa che aiuta nella gestione di testi di grandi dimensioni; in secondo luogo, Leo incorpora alcune delle idee del literate programming, che nella sua forma pura (cioè il modo in cui viene utilizzato dallo strumento Web di Knuth o strumenti come "noweb") è possibile solo con un certo grado di inventiva e l'uso dell'editor in un modo non esattamente previsto dal suo autore (in nodi @root modificati). Tuttavia, questa e altre estensioni (nodi @file) rendono la programmazione della struttura e la gestione del testo efficaci e facilmente gestibili ed in qualche modo simili al literate programming.<ref>{{Cita web|url=http://leoeditor.com/|titolo=Leo's Home Page|autore=Edward K. Ream|lingua=en|data=2 settembre 2008|accesso=3 aprile 2015}}</ref>
* Il [[Haskell (linguaggio)|linguaggio di]] programmazione [[Haskell (linguaggio)|Haskell]] ha il supporto nativo per un semi-literate programming. Il compilatore/interprete supporta due estensioni di file: <code>.hs</code> e <code>.lhs</code> ; quest'ultimo sta per literate Haskell.
Riga 158:
: Sebbene il pacchetto non fornisca i mezzi per organizzare blocchi di codice, è possibile dividere il codice sorgente LaTeX in diversi file. Vedere il [http://mirrors.ctan.org/macros/latex/contrib/listings/listings.pdf manuale di listings] per una panoramica.
 
* Il sistema di programmazione letterata Web 68 utilizzava Algol 68 come linguaggio di programmazione sottostante, sebbene non ci fosse nulla nel pre-processore "tang" che forzasse ad utilizzare quel linguaggio.<ref>{{Cita web|url=http://www.poenikatu.co.uk/html/Web68man.html|titolo=Web 68: Literate programming with Algol 68|autore=Sian Mountbatten|accesso=1º gennaio 2013|lingua=en}}</ref>
* [[Emacs]] org-mode per il literate programming tramite Babel,<ref>{{Cita web|url=https://orgmode.org/worg/org-contrib/babel/intro.html|titolo=Babel: Introduction|sito=orgmode.org|lingua=en|accesso=2019-07-30 luglio 2019}}</ref> che consente di incorporare blocchi di codice sorgente da più linguaggi di programmazione<ref>{{Cita web|url=https://orgmode.org/worg/org-contrib/babel/languages.html#langs|titolo=Babel Languages|lingua=en|accesso=2019-07-30 luglio 2019}}</ref> in un unico documento di testo. I blocchi di codice possono condividere dati tra loro, visualizzare immagini in linea o essere parsati in puro codice sorgente utilizzando la sintassi di riferimento noweb.<ref>{{Cita web|url=https://orgmode.org/worg/org-contrib/babel/intro.html#literate-programming|titolo=Babel: Introduction - Literate Programming|sito=orgmode.org|lingua=en|accesso=2019-07-30 luglio 2019}}</ref>
* [[CoffeeScript]] supporta una modalità "literate", che consente di compilare programmi da un documento di origine scritto in [[Markdown]] con blocchi di codice indentati.<ref>{{Cita web|url=https://coffeescript.org/#literate|titolo=Literate CoffeeScript|autore=Jeremy Ashkenas|accesso=13 novembre 2014|lingua=en}}</ref>
* I [[Mathematica|notebook Wolfram]] sono un metodo di programmazione literate indipendente dalla piattaforma che combina testo e grafica con codice live.<ref>{{Cita libro|url=https://books.google.com/books?id=JTYPKxug49IC&pg=PA157&lpg=PA157&dq=%22Stephen+Wolfram%22+%22Literate+programming%22&source=bl&ots=C7RhOB4uR5&sig=_i5FMOR-d_BVsiwk7BD-C2Hye-8&hl=en&sa=X&ved=0CB0Q6AEwAGoVChMIhomzxbqGyQIVBcRjCh02pge6#v=onepage&q=%22Stephen%20Wolfram%22%20%22Literate%20programming%22&f=false|titolo=Milestones in Computer Science and Information Technology|autore=Edwin D. Reilly|p=157}}</ref><ref>{{Cita web|url=https://www.wolfram.com/notebooks/|titolo=Wolfram Notebooks|sito=www.wolfram.com|lingua=en|accesso=2018-11-28 novembre 2018}}</ref>
* [[Swift (linguaggio di programmazione)]], creato da [[Apple|Apple Inc.]], può essere modificato in [https://developer.apple.com/library/prerelease/ios/recipes/Playground_Help/Chapters/AboutPlaygrounds.html Playgrounds] che fornisce un ambiente di programmazione interattivo che valuta ogni istruzione e visualizza i risultati in tempo reale durante la modifica del codice. I playgrounds consentono inoltre all'utente di aggiungere del [[linguaggio Markup]] insieme al codice che fornisce intestazioni, formattazione in linea ed immagini.<ref>{{Cita web|url=https://developer.apple.com/library/ios/documentation/Xcode/Reference/xcode_markup_formatting_ref/index.html#//apple_ref/doc/uid/TP40016497-CH2-SW1|titolo=Markup Formatting Reference: Markup Overview|sito=developer.apple.com|lingua=en|accesso=2015-11-15 novembre 2015}}</ref>
* Jupyter Notebook, precedentemente IPython Notebook, funziona nel formato dei notebooks, che combina intestazioni, testo (incluso LaTeX), grafici, ecc. con il codice scritto.
* [[Julia (linguaggio di programmazione)]] supporta la modalità di sviluppo iJulia che è stata ispirata da iPython.
* Agda (linguaggio di programmazione) supporta una forma limitata di literate programming pronta all'uso.<ref>{{Cita web|url=http://wiki.portal.chalmers.se/agda/pmwiki.php?n=Main.LiterateAgda|titolo=Literate Agda|sito=Agda Wiki|lingua=en|accesso=2017-03-26 marzo 2017}}</ref>
* [http://witheve.com I programmi nel linguaggio di programmazione Eve] sono principalmente in prosa.<ref>{{Cita web|url=http://docs.witheve.com/handbook/literate-programming/|lingua=en|titolo=Eve and Literate Progamming|sito=Eve Handbook|accesso=2017-05-25 maggio 2017}}</ref> Eve combina varianti di [[Datalog]] e [[Markdown]] con un ambiente di sviluppo grafico live.
* Simile ai quaderni Jupyter, i quaderni [https://bookdown.org/yihui/rmarkdown/notebook.html R] sono un metodo di literate programming che consente l'interazione diretta con [[R (software)|R]] (anche il supporto per Python, SQL e Bash sono esplicitamente menzionati) generando un documento riproducibile con output di qualità da pubblicazione.
* Il meccanismo di personalizzazione della [[Text Encoding Initiative]] che consente il vincolo, la modifica o l'estensione dello schema [[Text Encoding Initiative|TEI]] consente agli utenti di mescolare la documentazione in prosa con frammenti delle specifiche dello schema nel loro formato [[Text Encoding Initiative|One Document Does-it-all]]. Da questa documentazione in prosa, è possibile generare schemi e processi di elaborazione del modello e il paradigma del literate programming di Knuth viene citato come fonte d'ispirazione per questo metodologia di lavoro.<ref>{{Cita web|url=http://www.tei-c.org/release/doc/tei-p5-doc/en/html/USE.html#IMGD|titolo=TEI Guidelines|sito=TEI Consortium|lingua=en|accesso=2018-08-23 agosto 2018}}</ref>
 
== Fonti ==
Riga 174:
 
== Bibliografia ==
* {{Cita pubblicazione|autore=Donald E. Knuth|anno=1984|titolo=Literate Programming|rivista=The Computer Journal|editore=British Computer Society|volume=27|numero=2|pp=97-111|accesso=4 gennaio 2009|doi=10.1093/comjnl/27.2.97|url=http://www.literateprogramming.com/knuthweb.pdf|refcid=Knuth}}
* {{cita news|autore=Wayne Sewell|titolo=Weaving a Program: Literate Programming in WEB|pubblicazione=Van Nostrand Reinhold|anno=1989|isbn=0-442-31946-0 }}
* {{cita libro|autore=Donald Knuth|titolo=Literate Programming|anno=1992|editore=Stanford University - Center for the Study of Language and Information|isbn=978-0-937073-80-3}}
* {{cita libro|autore=Eitan M. Guari|titolo=TeX & LaTeX: Drawing and Literate Programming|publishereditore=McGraw Hill|anno=1994|isbn=0-07-911616-7 }} (include software)
* {{cita web|autore=Kurt Nørmark|url=http://www.cs.aau.dk/~normark/litpro/issues-and-problems.html|titolo=Literate Programming – Issues and Problems|editore=Università di Aalborg|data=13 agosto 1998|lingua=en}}
* {{cita pubblicazione|autore=Eric Schulte|url=https://www.jstatsoft.org/article/view/v046i03/v46i03.pdf|titolo=A Multi-Language Computing Environment for Literate Programming and Reproducible Research|rivista=Journal of Statistical Software|data=gennaio 2012|volume=46|numero=3|lingua=en}}