Programmazione * in * una lingua vs. scrittura del codice C in Ruby


10

Code Complete indica che è necessario evitare sempre il codice in una lingua anziché il codice in essa contenuto. Con ciò intendono

Non limitare il tuo pensiero di programmazione solo ai concetti che sono supportati automaticamente dal tuo linguaggio. I migliori programmatori pensano a ciò che vogliono fare, quindi valutano come raggiungere i loro obiettivi con gli strumenti di programmazione a loro disposizione. (capitolo 34.4)

Questo non porta all'utilizzo di uno stile di programmazione in ogni lingua là fuori, indipendentemente dai punti di forza e di debolezza della lingua a portata di mano?

Oppure, per mettere la domanda in un formato più rispondente:

Proporrebbe che si dovrebbe provare a codificare il proprio problema nel modo più ordinato possibile con i particolari della propria lingua, o se si dovrebbe piuttosto cercare la soluzione più elegante in generale, anche se ciò significa che è necessario implementare possibilmente costrutti imbarazzanti che non esistono nativamente nella propria lingua?


5
+1 buona domanda. Posso scrivere in Perl in mezza dozzina di lingue diverse, a questo punto.
Dan Ray,

@Dan Ray - strano! Scrivo sempre C in Perl.
James Anderson,

Risposte:


7

Esiste un approccio ancora migliore: dimentica del tuo patetico linguaggio di programmazione fisso. Codifica il tuo problema in un linguaggio che hai appena inventato, derivato dai termini del dominio del problema rilevante, codificalo nel modo più naturale possibile e solo allora pensa a implementare questo nuovo linguaggio di programmazione o a smorzare il tuo codice fino alle limitazioni del lingua esistente.

Questo approccio si chiama programmazione orientata al linguaggio . Esistono molte tecniche per implementare in modo efficiente le lingue specifiche del dominio ed è un argomento particolarmente caldo per la comunità di Ruby.


1
La comunità di Haskell abbraccia anche linguaggi specifici di dominio e il linguaggio di programmazione Haskell è particolarmente adatto per implementarli.
martedì

L'implementazione di un sistema di scripting su misura basato su un linguaggio incorporato come Lua o Tkl è considerata una scrittura DSL? In tal caso, come gestite le carenze, ad esempio di Lua?
bastibe,

@Paperflyer, in alcuni casi ha senso implementare linguaggi sopra qualcosa come Lua (specialmente se si tratta di Metalua), ma è più facile scrivere un compilatore adatto per la maggior parte dei DSL tipici.
SK-logic,

@tdammers, sì, Haskell e Scala parlano di DSL. Ma vengo dal lato più oscuro della Forza: il mio approccio preferito è la metaprogrammazione. Credo che gli interpreti ad hoc siano quasi sempre inferiori ai compilatori.
SK-logic,

2
@tdammers, un DSL implementato in aggiunta a funzioni di alto ordine è praticamente un interprete ad hoc. Non puoi estendere la sintassi di Haskell nello stesso modo in cui estendi, diciamo, Lisp. Anche con Template Haskell. È un modo totalmente diverso (e, direi limitato) di implementare le DSL. Va bene in molti casi, ma per qualsiasi cosa davvero complessa porta a implementazioni totalmente illeggibili, mentre una metaprogrammazione in più fasi è semplicemente banale, non importa quanto sia grande e aliena la tua DSL.
Logica SK

2

Credo che la risposta corretta, e quella prevista dal libro sia:

si dovrebbe cercare di codificare il proprio problema nel modo più ordinato possibile con i dettagli della propria lingua

Programmando in un linguaggio, ho sempre pensato che fosse usare tecniche al di fuori del normale stile del linguaggio in cui avrebbe portato un beneficio . Questa è una differenza fondamentale nella scrittura in uno stile in tutte le lingue.

Ad esempio, l'apprendimento di Haskell ha notevolmente migliorato la mia abilità nell'uso di funzioni di ordine superiore. Ora, durante la programmazione in c #, utilizzo i vari IEnumerablemetodi come Selectpiù spesso, poiché l'utilizzo di questi metodi porta a un codice più pulito rispetto alla scrittura per i loop. Tendo anche ad usare le funzioni pass e use (cioè Func<int, int>) più spesso a causa della mia esperienza con haskell. Il mio uso dell'ereditarietà è diminuito a causa di ciò e il più delle volte il risultato è un codice più semplice.

Tuttavia, non uso concetti come monadi o tipi di dati algebrici in c #. Questo perché nessuno dei due è chiaramente rappresentabile in c # e porta a pochi benefici in cambio di molta oscurità.

Quindi uso gli strumenti del linguaggio per usare le abilità che ho con il massimo effetto. Credo che sia programmazione nella lingua.


0

Proporrebbe che si dovrebbe provare a codificare il proprio problema nel modo più ordinato possibile con i particolari della propria lingua, o se si dovrebbe piuttosto cercare la soluzione più elegante in generale, anche se ciò significa che è necessario implementare possibilmente costrutti imbarazzanti che non esistono nativamente nella propria lingua?

Il punto è che i bravi programmatori non hanno una lingua. La citazione dal libro parla di "strumenti di programmazione a loro disposizione" - ciò significa che se conosci perl e Java, allora forse dovresti usare perl per quella rapida manipolazione delle stringhe. I linguaggi di programmazione non sono caselle per limitarci, ma strumenti che utilizziamo per risolvere i problemi. Questo è (imo) il codice completo. Non codificare in una casella di linguaggio / ambiente di programmazione, inserisci la migliore soluzione nel miglior linguaggio / ambiente di programmazione adatto a te, al tuo problema e alla tua soluzione.

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.