Programmazione alfabetica, metodologia di progettazione buona / cattiva


10

Di recente ho trovato il concetto di programmazione alfabetica . E l'ho trovato piuttosto intrigante. Eppure non mi sono mai imbattuto in affermazioni secondo cui è un cattivo modo di strutturare un programma. Sembra che non abbia coperto molti posti. Nemmeno qui potrei trovare domande in merito.

La mia domanda non riguarda i suoi difetti o le modalità di gestione della documentazione. Considero la documentazione un effetto collaterale di ciò che significherebbe per il flusso della programmazione alfabetica. So che il progetto è stato originariamente destinato per una facile documentazione, così come il concetto di avanti sequenza di svolgimento.

Il concetto di dividere il problema in piccoli problemi basati su frasi sembra essere davvero una brillante idea. Faciliterà quindi la comprensione del flusso del programma.

Una conseguenza del metodo di progettazione letterale è anche che il numero di funzioni richieste sarà limitato all'immaginazione del programmatore. Invece di definire una funzione per un determinato compito, potrebbe essere creata come un scrapmetodo letterato. Ciò produrrebbe l'inserimento automatico del codice, anziché una compilazione di funzioni separate e il conseguente requisito di una fase di ottimizzazione della compilazione interprocedurale per ottenere la velocità equivalente. Infatti, il primo tentativo di Donald E. Knuth ha mostrato un tempo di esecuzione inferiore, proprio per questo fatto. So che i compilatori possono fare molto di tutto ciò, tuttavia questa non è una mia preoccupazione.

Quindi vorrei avere un feedback sul perché si dovrebbe considerare questa una metodologia di progettazione cattiva / buona?


2
Zeroth, ho creato il tag di programmazione alfabetica e ho aggiunto un riepilogo basato sull'articolo di Wikipedia. Aiuta a espandere il tag wiki con le informazioni pertinenti.
yannis,

@YannisRizos Lo aggiungerò qui, non ho i privilegi di modifica.
zeroth,

1
Beh, nemmeno io :) Ho aggiunto alcune risorse (l'articolo di Wikipedia e i link nella tua domanda), appariranno quando la modifica sarà rivista e accettata da colleghi (?!). È un approccio intrigante, e poiché lo stai già esplorando, torna e migliora il tag wiki ogni volta che trovi qualcosa che ritieni valga la pena menzionare lì.
yannis,

1
Consiglierei all'autore del sito di Literate Programming di visitare il sito UX stackexchange - i colori sono davvero pessimi per la lettura.
Danny Varod,

1
Cordiali saluti, c'è anche un literate-programmingtag su StackOverflow. C'è più contenuto lì, anche se ancora non molto.
Ross Patterson,

Risposte:


9

Ciò produrrebbe l'inserimento automatico del codice, anziché una compilazione di funzioni separate e il conseguente requisito di una fase di ottimizzazione della compilazione interproceduale per ottenere la velocità equivalente

Questo è irrilevante. È stato per decenni. Puoi rimuoverlo dalla domanda, dal momento che con i compilatori moderni non ha senso sovvertire i loro ottimizzatori.

Quindi vorrei avere un feedback sul perché si dovrebbe considerare questa una metodologia di progettazione cattiva / buona?

Non esiste un aspetto negativo nella programmazione alfabetica. (Mi aspetto dozzine di -1 voti per quel sentimento.) Come praticante, non ho mai visto alcun problema.

Ci sono alcuni argomenti contro i quali tutti equivalgono a "la programmazione in un linguaggio di livello superiore viene sovvertita modificando il codice risultante". Giusto. Allo stesso modo, la programmazione in C ++ viene sovvertita modificando il .ofile che viene prodotto. È vero, ma irrilevante.

Scrivere programmi colti significa semplicemente combinare design di alto livello e dettagliato (a livello di codice) in un unico documento, scritto con un set di strumenti adatto che produce file compatibili con i compilatori e file adatti alle persone.

Quando Knuth inventò la programmazione alfabetica, i linguaggi OO tradizionali non esistevano. Pertanto, gran parte del web originale e degli strumenti di intreccio gli hanno permesso di creare definizioni di classe per tipi di dati astratti.

Gran parte di questo è irrilevante al giorno d'oggi. Gli strumenti di programmazione alfabetica possono essere piuttosto semplici se sono focalizzati su linguaggi di programmazione moderni, di alto livello orientati agli oggetti (o funzionali). Vi è meno necessità di soluzioni alternative elaborate a causa delle limitazioni di C (o Pascal o Assembler).

L'approccio alla scrittura di programmi alfabetici non è diverso dall'approccio alla scrittura di programmi analfabeti. Richiede ancora un'attenta progettazione, test unitari e una codifica accurata. L'unico lavoro extra è scrivere spiegazioni oltre a scrivere codice.

Solo per questo motivo - la necessità di scrivere spiegazioni coerenti - la programmazione alfabetica è difficile per alcuni programmatori. Esistono numerosi programmatori che hanno successo (il loro codice supera tutti i test unitari, è pulito e di facile comprensione) ma sembra che non riescano a scrivere una frase coerente nella loro lingua madre. Non so perché questo è vero.

Esistono molti programmatori che sembrano avere un successo solo marginale e quindi solo per caso. (Ci sono abbastanza cattive domande in Stack Overflow che indicano che molti programmatori hanno difficoltà a cogliere anche i fondamenti.) Per i programmatori che fanno domande in gran parte incoerenti di stack, sappiamo che non possono davvero fare un buon lavoro di programmazione alfabetica, perché possono fare un buon lavoro di programmazione.


7
Un gran numero di programmatori sono a malapena coerenti quando spiegano qualcosa in qualsiasi mezzo, formale o informale, sia che si tratti di una programmazione alfabetica, di scrivere commenti o persino di un'e-mail. È una meraviglia che il software funzioni affatto :)
Andres F.

3

L'aspetto più importante della programmazione alfabetica (o anche solo un buon commento) per me non è tanto che fornisce documentazione, ma piuttosto afferma l'intento del programmatore. Conoscendo l'intento dichiarato, puoi immediatamente giudicare se il codice che lo segue fa davvero quello che dovrebbe. Senza intento, devi iniziare dal presupposto che il codice sia corretto e quindi dimostrarlo giusto o sbagliato per induzione - che è più faticoso e richiede tempo in quanto spesso richiede di familiarizzare anche con tutto il codice circostante.

Quindi l'intento dichiarato spesso consente ad altri che non hanno familiarità con il codice di saltare rapidamente e trovare errori senza dover conoscere il contesto più ampio che lo circonda.

E, naturalmente, ti aiuta a imparare più velocemente il flusso e la progettazione di base del codice, poiché l'inglese semplice è spesso più intuitivo dell'aritmetica del puntatore per la maggior parte delle persone.


1

Anche se piuttosto nuovo nel concetto di programmazione dei rifiuti (ed è quindi probabile che mi manchi completamente la barca), sembra molto in linea con il concetto di DSL .

L'idea alla base di una DSL è quella di distillare un dominio di problemi in una grammatica semplice e orientata al linguaggio naturale che può essere utilizzata per creare algoritmi per risolvere tali problemi.

Per me, quella stessa idea, o almeno la sua base fondamentale, è la stessa o almeno strettamente correlata alla programmazione alfabetica.

Nel mondo groovy, ad esempio, c'è una forte spinta a utilizzare i DSL più regolarmente e a creare nuovi DSL per risolvere problemi comuni. Questa spinta proviene da entrambi gli strumenti all'interno del linguaggio (easy builders), nonché da librerie di base che supportano un'API basata su DSL.

Dato che la tendenza, almeno in quell'angolo del mondo, è verso la programmazione alfabetica, direi che è una buona metodologia per cui lottare.

Sfortunatamente, il livello di pensiero necessario per creare un buon DSL è spesso al di là della maggior parte dei programmatori, da quello che ho visto. So di lottare personalmente con alcuni dei concetti di volta in volta necessari. Potrebbe essere questa difficoltà che ha impedito a tali tecniche di ottenere un'adozione più ampia.

È il caso classico di quando si utilizza lo strumento è una cosa, ma crearlo è a un livello completamente diverso.


Per espandere un po 'dal mio punto di vista, non è molto che i DSL siano la stessa cosa della programmazione alfabetica, ma piuttosto che rendono molto più possibile la programmazione letterata . Soprattutto quando si tratta di DSL in linguaggio naturale .

Nella versione 1.8 di groovy, la funzionalità DSL in linguaggio naturale è stata sostanzialmente migliorata con l'aggiunta di catene di comando più potenti.

Ad esempio, le seguenti righe di codice stanno programmando , non solo pseudo-frasi:

drink tea with sugar and milk
move left by 30.centimeters
sendFrom "Guillaume" to "Jochen"
send from: "Jochen" to "Lidia"
Email.from "Lidia" to "Guillaume" withBody "how are you?"
contact.name "Guillaume" age 33
move left by 30.centimeters
sell 100.shares of MSFT
take 2.pills of chloroquinine in 6.hours
blend red, green of acrylic
artist.paint "wall" with "Red", "Green", and: "Blue" at 3.pm
wait 2.seconds and execute { assert true }
concat arr[0] with arr[1] and arr[2]
developped with: "Groovy" version "1.8-beta-2"

Nota: l'esempio di codice proviene dal blog di Guillaume Laforge

L'idea alla base della programmazione letteraria è che il linguaggio naturale è più comprensibile per l'uomo e questo è ciò che conta. Le capacità DSL di Groovy in linguaggio naturale rendono questa realtà molto più vicina, secondo me. Soprattutto quando tali DSL vengono utilizzati per creare regole aziendali per un'applicazione.

Essere in grado di "codificare" i componenti critici di un sistema usando il linguaggio naturale è l'essenza stessa della programmazione alfabetica. Dover intercalare il linguaggio naturale con blocchi di codice è una forma bastardata di programmazione alfabetica. Sebbene utile, credo che i DSL in linguaggio naturale che ti consentono di usare il linguaggio naturale come il codice stesso siano un grande passo avanti.

Espandere la capacità di programmazione in generale è il passo successivo del processo, ma in larga misura gli strumenti per farlo sono già in atto. Sì, non esiste ancora un DSL "generale", ma per domini più piccoli, la funzionalità è disponibile.

Per ulteriori esempi di ciò in azione (in nessun ordine particolare):


2
Punto di vista interessante. Dal mio punto di vista non si allinea molto bene con un DSL. Dal momento che la programmazione alfabetica è in un linguaggio non DSL. E gli strumenti non sono molto simili a una DSL. Non sono orientati verso il dominio problematico. Potresti fornire un esempio di come pensi che la programmazione alfabetica sia come una DSL? Un collegamento o un riferimento a un esempio potrebbe aiutare a chiarire la tua risposta.
S.Lott

Un esempio di ciò sono le catene di comando in Groovy 1.8 che ti permettono di "programmare" con cose come turn left then righto paint wall with red, green and yellow: docs.codehaus.org/display/GROOVY/…
cdeszaq

@ S.Lott - Sono d'accordo sul fatto che c'è sicuramente una differenza tra DSL e programmazione alfabetica, ma penso che le DSL possano essere uno strumento per ottenere una vera programmazione alfabetica in cui è possibile digitare un linguaggio naturale e farlo esprimere l'algoritmo desiderato. Per me, mescolare linguaggio e codice naturali è una forma bastardata di alfabetizzazione.
cdeszaq,

"è possibile digitare un linguaggio naturale e farlo esprimere l'algoritmo desiderato" nella migliore delle ipotesi è improbabile. Esistono background, giustificazioni, prove di correttezza, asserzioni di complessità (big- O ) e molta documentazione di supporto non alogritmica che non fa parte di uno schema DSL. Non sono sicuro di essere d'accordo con il parallelo ora che l'hai chiarito.
S. Lott

1
"spiegazione della logica del programma". Non la logica stessa. Ma una spiegazione. La logica è raramente autoesplicativa. Non contiene mai una prova di correttezza (che è difficile e talvolta impossibile). Raramente contiene una giustificazione della complessità della big-O. E raramente spiega le alternative che sono prestazioni inferiori o più memoria. Quindi, suggerirei che DSL non è all'altezza della "spiegazione".
S.Lott

-2

Penso che sia un errore pensare che LP sia una specie di DSL. Perché LP è - journal (con diagrammi, schemi, frammenti di pseudo-codice, cioè blocchi) di programma sviluppato, è architettura e così via ... È assolutamente analogo al taccuino di carta - molti sviluppatori li usano ma dopo aver finito il programma - elimina i tuoi quaderni, documenti ...

Molto tempo fa ogni fisico, astonomo, chimico / alchimista, matematico ha i suoi quaderni, manoscritti con molti schemi, informazioni necessarie, tabelle e senza di loro puoi capire o ripetere la loro esperienza di successo, i suoi risultati. E sempre tra questi popoli esiste la caccia a manoscritti / quaderni.

Oggi molti programmatori scrivono codice e talvolta aggiungono commenti! Byt programma non è solo codice - sono pensieri, idee, immaginazione, concetti e quando il nuovo sviluppatore eredita il codice alieno - rompe spesso tutte le idee e i concetti, crea diverse "scappatoie" e "backdoor", spero che tu mi capisca :)

Quindi, il requisito principale per LP (come strumento!) È anche consentire tutto ciò con una sintassi semplice, leggera e leggibile. Ho provato molti strumenti LP, ma oggi sto sviluppando il proprio - NanoLP ( http://code.google.com/p/nano-lp/ ) che ha lo scopo di soddisfare questa richiesta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.