La programmazione orientata al linguaggio è pratica?


12

Ho letto questo articolo sulla programmazione orientata al linguaggio. Sottolinea alcune debolezze nei moderni approcci procedurali / OOP alla programmazione e suggerisce un nuovo paradigma di programmazione che li risolverà

Sono tutto per parti di programma piccole e vagamente accoppiate: è molto meglio imparare molte piccole cose, tutte che userete, piuttosto che un paio di cose grandi, di cui usate solo frammenti.

Leggendo l'articolo, ho avuto l'impressione che l'autore stesse promuovendo una delle due cose:

  • Una moltitudine di linguaggi di scripting facilmente creabili
  • Un unico linguaggio facilmente estensibile che può riscrivere se stesso per soddisfare le esigenze del programmatore

Se sta suggerendo il secondo, risponderei con "Già fatto!" e dare Lisp come esempio. Come suggerisce Paul Graham, le lingue sembrano comunque muoversi continuamente verso questo .

Per quanto riguarda il primo, penso che sia una buona idea, se esiste un linguaggio di fondo che li lega tutti insieme. Questo mi sembra essere il punto debole: la comunicazione tra le lingue. Utilizzeresti le chiamate, che è un concetto procedurale o passaggio di messaggi, che mi ricorda la comunicazione tra processi? Gradirei l'opportunità di lavorare con linguaggi specifici per piccoli domini, se è facile usarli tutti contemporaneamente. Questo approccio (LOP) sarebbe pratico?


Ha sicuramente un enorme potenziale strabiliante.

2
Non mi è chiaro quale problema risolva questo paradigma. A proposito, LISP non è un esempio di linguaggio di successo.
mouviciel,

7
@mouviciel dipende molto da cosa intendi esattamente per "successo". È utilizzato dalla maggior parte dei programmatori? No. È in circolazione da molto tempo? Sì - 50 anni e oltre. La maggior parte delle lingue moderne ha rubato tutta una serie di utili funzioni? Sì. (Le lingue possono rubare ancora di più dalle lingue Lisp? Sì!)
Frank Shearar,

2
C'è una differenza tra una lingua ampiamente usata e una lingua utile. Una lingua che esplora nuove aree non viene generalmente utilizzata, ma può contribuire a tutti a lungo termine. D'altra parte, Java è inutile, dal momento che non porta nulla di nuovo al tavolo (anche se è sicuramente un linguaggio di successo da tutti gli account).
Matthieu M.

1
Lo troverei più utile per padroneggiare Lisp che per padroneggiare Cobol.
glenatron,

Risposte:


8

Ho sostenuto i DSL per molto tempo, ma mi preoccupo di ciò che accade a Good Ideas quando diventano bandwagons. Vengono creati prodotti che pubblicizzano The Good Idea, promettendo che tutto ciò che devi fare è ottenerne uno e sarai nel gruppo, senza dover pensare molto attentamente a ciò che significa.

Che cos'è una lingua? È un vocabolario e una sintassi in cui i significati possono essere comunicati, giusto? Ogni volta che dichiari una variabile, scrivi una funzione, definisci una classe, stai costruendo una nuova lingua, aggiungendo nomi e verbi a una lingua esistente. Ora puoi dire cose che prima non potevi.

Penso che ciò che rende un linguaggio specifico del dominio sia la misura in cui esprime naturalmente i concetti mentali che vengono comunicati, e penso che ci sia una semplice misura di ciò. Fondamentalmente, se esiste un semplice requisito indipendente X, che potrebbe essere incluso nel programma o meno, la sua corretta implementazione richiede una serie di inserimenti di codice, eliminazioni e sostituzioni Y. È possibile visualizzare un semplice diff prima e dopo Y. Il numero N di tali modifiche è una misura della specifica lingua del dominio. La N più piccola è, per esigenze tipiche, la migliore.

Non dipende necessariamente dalla sintassi elaborata, dalle strutture di controllo, dal passaggio dei messaggi o da ciò che hai. Da cosa dipende è in che modo implementa il requisito in modo conciso. Molti strumenti affermeranno di farlo, ma le affermazioni non sono effettive. Deve essere reale .

A volte è necessaria una tecnologia insolita . Ecco il mio esempio preferito. Quando lo è, illustra il punto che potrebbe essere necessario uno sforzo da parte dei programmatori per capirlo. Quindi la specificità del dominio (e la manutenibilità) non è affatto la stessa cosa della leggibilità .

Quindi sono d'accordo con il secondo approccio, secondo cui una buona lingua è quella che consente facilmente di costruire le lingue necessarie su di essa. (Questo è quello che mi è piaciuto di Lisp.) Ma è ancora più importante che i programmatori debbano sapere come costruire lingue per abbinare i domini in cui stanno lavorando ed essere disposti a scalare le curve di apprendimento di tali lingue.

Non lo vedo davvero. Invece sono bloccati nei "programmi = algoritmi + struttura dei dati", o "i nomi diventano classi e i verbi diventano metodi" trasformano le modalità di pensiero. Non stanno lavorando in termini di come prendere domini di pensiero e linguizzarli per la massima concisione.


Sicuramente d'accordo con te sulla parte del carrozzone - "il capo dai capelli a punta sa in quale lingua dovrebbe essere scritto. [...] Java." Un altro problema è quello che Joel definisce "l'astronauta dell'architettura". Potrei anche vedere i DSL impilarsi l'uno sull'altro ad infitium (sp?). Immagino che dipenda dal programmatore -> ingegnere informatico -> scienziato informatico.
Michael K,

E se non richiede sforzo per capire, è probabile che non ne valga davvero la pena :)
Michael K,

4

Questo è piuttosto l'approccio Ruby.

  • Mantieni il linguaggio di base semplice ed estendi tramite gemme
  • Crea dialetti di Ruby per domini specifici tramite patch scimmia. Ruby on Rails.

Non so se sia meglio, ma immagino sia molto pragmatico.


7
RoR non è un dialetto di Ruby.
back2dos,

4
@ back2dos: stavo pensando nella metaprogrammazione. Naturalmente RoR non è un linguaggio di programmazione diverso. Ciò che intendo per dialetto è che anche se tutto ciò che sta alla base di Rails è Ruby, dal punto di vista dello sviluppatore sta usando Ruby a un livello più alto di astrazione. Un dominio. Un dialetto. Usa viste, modelli, controller e li sta programmando usando una sintassi che ricorda una lingua diversa, un dialetto per così dire. Questa è la bellezza di un linguaggio sceneggiato così potente come Ruby.
Nerian,

Penso che sia importante vedere davvero la differenza. AspectJ è un dialetto di Java, mentre AspectR è solo una libreria Ruby. La differenza è davvero la lingua. Ruby è stato progettato per fornire flessibilità ed espressività e Java no. Entrambi possono essere considerati linguaggi di uso generale, la differenza è che Ruby è generalmente abbastanza espressivo da eliminare la necessità di un DSL effettivo per qualsiasi scopo generale, mentre Java non lo è, anche se ad esempio si usano comunemente viste, modelli e controller.
back2dos,

1

L'approccio LOP è estremamente pratico. Tieni presente che non devi necessariamente implementare "linguaggi di scripting": la metodologia è applicabile anche agli eDSL e sono generalmente compilati in modo efficiente. Sto usando questo approccio letteralmente in tutto il mio lavoro di sviluppo.


Perdonate la mia ignoranza: un eDSL potrebbe essere un preprocessore per un'altra lingua, giusto?
Michael K,

@Michael, sì, è possibile implementare eDSL in questo modo, vedi CamlP4 per esempio. Ma più spesso eDSL si basa sulle funzionalità del linguaggio (ad es. Macro Lisp, modelli C ++, ecc.).
SK-logic

1

Vedremo molto di più sui linguaggi specifici di dominio in futuro, a giudicare dalle persone che ne parlano adesso. Ho notato che Martin Fowler ne parla molto e alcuni articoli interessanti attraverso Lambda The Ultimate sull'argomento, tra gli altri.

Ciò mi suggerisce che questa è sicuramente una direzione in cui soffia il vento per quanto riguarda la progettazione del linguaggio di programmazione e le piattaforme di programmazione. In un certo senso lo è già da un po 'di tempo - uno dei vantaggi di Ruby (come alcuni già osservato) è che semplifica la creazione di DSL ma in realtà ce ne sono molti in giro nelle applicazioni e nelle librerie di programmazione che già utilizziamo.


È possibile aggiungere FoF con viene utilizzato per sviluppare driver per il multi-kernel Barrelfish. Un linguaggio per sviluppare DSL in :)
Matthieu M.

0

Sto usando LOP ogni volta che programmo da solo. Ho scoperto che in alcuni progetti non esiste altro modo per rispettare il programma. In una semplice allegoria, si può equiparare l'uso del LOP agli utensili elettrici. Se lavori da solo in officina, non puoi fare le cose manualmente e rispettare la scadenza. Se ci sono altre persone con te, coordinare l'uso di tali elettroutensili è essenziale per l'efficienza e la sicurezza.
In modalità squadra, LOP richiede una preparazione organizzativa per evitare un disastro della Torre di Babele.

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.