Domanda Cosa intendi con l'espressività di un linguaggio di programmazione?


Vedo molto della parola "espressività" quando le persone vogliono sottolineare che una lingua è migliore dell'altra. Ma non vedo esattamente cosa intendano con questo.

  • È il verboseness / succinto? Voglio dire, se una lingua può scrivere qualcosa di più breve dell'altra, vuol dire espressività? Si prega di fare riferimento alla mia altra domanda - Articolo sulla densità del codice come misura della potenza del linguaggio di programmazione
  • È il potere della lingua? Paul Graham dice che una lingua è più potente dell'altro linguaggio, nel senso che una lingua può fare ciò che l'altra lingua non può fare (per esempio, LISP può fare qualcosa con una macro che l'altra lingua non può fare).
  • È solo qualcosa che rende la vita più facile? L'espressione regolare può essere uno degli esempi.
  • È un modo diverso di risolvere lo stesso problema: qualcosa come SQL per risolvere il problema di ricerca?

Cosa ne pensi dell'espressività di un linguaggio di programmazione? Puoi mostrare l'espressività usando un codice?

Qual è la relazione con l'espressività e DSL? Le persone escono con DSL per ottenere l'espressività?


46
2018-03-11 18:13


origine


risposte:


Personalmente, ritengo che "l'espressività" di una lingua discenda davvero da quanto chiaramente i costrutti linguistici possano "esprimere" le intenzioni dello sviluppatore.

Ad esempio, sento che C # (specialmente LINQ via C # 3+) sta diventando molto più espressivo. Questa dichiarazione LINQ è un grande esempio:

var results = collection.Where(item => item > 5);

Senza conoscere i dettagli della lingua o l'implementazione utilizzata, l'intento dello sviluppatore è (a mio avviso) molto chiaro nella dichiarazione di cui sopra.

Non penso che la verbalità del linguaggio sia uguale alla sua espressività, tuttavia, c'è una certa correlazione in atto. Se una lingua richiede molto codice per esprimere un'astrazione, è meno espressiva. Questi sono due concetti correlati, ma diversi.

Lo stesso vale per il potere - sebbene qui le caratteristiche di un linguaggio (es .: potenza) debbano essere abbastanza complete da esprimere chiaramente l'astrazione. Senza questo, l'espressività soffrirà. Detto questo, un linguaggio può essere molto "potente" in termini di caratteristiche, ma non necessariamente essere espressivo, se le caratteristiche sono difficili da comprendere.


30
2018-03-11 18:19



"Espressività" indica la capacità di dire solo ciò che si vuole fare:

bad_event = events.find(&:bad)

piuttosto che come vuoi farlo:

i = 0
bad_event = nil
while i < events.size && bad_event.nil?
  event = events[i]
  if event.bad?
    bad_event = event
  end
  i += 1
end

Tra le cose che contribuiscono all'espressività ci sono:

  • Una mancanza di zucchero sintattico richiesto
  • Funzioni di prima classe
  • Raccolta dei rifiuti
  • Sia la digitazione dinamica che l'inferenza del tipo
  • Il nucleo linguistico non è pedissequamente minimalista
  • Buona funzionalità nella libreria standard

In una certa misura, l'espressività di qualsiasi lingua può essere aumentata spingendo il più possibile "come farlo" in subroutine / oggetti in modo che la maggior parte del codice rimanente sia "cosa fare". La quantità di codice "come si fa" necessaria nel codice più astratto è una misura dell'espressività di una lingua: più il codice appare come pseudocodice, più è espressivo l'intento del programmatore.

Si può anche pensare alla "meta-espressività" di una lingua: quanto è espressiva la lingua nella costruzione di linguaggi specifici di dominio?


26
2018-03-11 18:42



Mi piace la nozione di potere espressivo di Matthias Felleisen, che è comparativo:

  • Il linguaggio A è strettamente più espressivo del linguaggio B se sono vere entrambe le seguenti condizioni:

    • Qualsiasi programma scritto nella lingua B può essere riscritto nel linguaggio A mantenendo intatta la struttura essenziale del programma.
    • Alcuni programmi scritti in linguaggio A devono essere ristrutturati violentemente per essere scritti nel linguaggio B.

Di solito vogliamo fare questi confronti osservando una sorta di "nucleo essenziale" di una lingua, ad esempio, forse vogliamo considerare un dialetto di C solo while e non anche for e do...while. O forse vogliamo considerare un dialetto di Perl con solo un prefisso if forma e no unless modulo. Ma a volte queste distinzioni superficiali sintattiche sono esattamente ciò che intendiamo per "potere espressivo"; per alcuni programmatori è importante dirlo

die ("found no solutions") unless length(solutions) > 0;

invece di

if (length(solutions) == 0) { die("found no solutions"); }

Quindi devi stabilire se stai chiedendo del potere espressivo della sintassi superficiale o della struttura più profonda.

L'altra cosa che mi piace dell'idea di Felleisen è che ammette la nozione di due lingue che sono decisamente diverse, ma nessuna delle due è più espressiva dell'altra.

Puoi leggere un'esposizione più dettagliata nelle prime due pagine del suo articolo Sulla potenza espressiva dei linguaggi di programmazione. Dopo di che viene un sacco di teoria a punta :-)


24
2018-03-11 21:12



Se vuoi una risposta un po 'teorica ma più rigorosa della maggior parte, potresti voler dare un'occhiata a Matthias Felleisen Sulla potenza espressiva dei linguaggi di programmazione. Sono abbastanza sicuro che un po 'di guardarsi intorno alla rete mostrerà almeno alcune copie.

Se vuoi una risposta più pratica di ciò che la maggior parte delle persone realmente significare quando lo dicono, questo è, francamente, piuttosto diverso. Di solito, almeno nella mia esperienza, un linguaggio "espressivo" significa: "Mi piace la lingua, ma non posso citare alcun supporto oggettivo per farlo". Viceversa, cose come "meno espressivo" o "non espressivo" generalmente significano: "Non mi piace il linguaggio [pure], ma non posso citare alcun supporto oggettivo per farlo".

"Non espressivo" è spesso simile a un politico che accusa un altro di essere "fascista" - chiaramente peggiorativo, ma senza alcuna definizione significativa di ciò che è presumibilmente sbagliato.

Uno dei grandi problemi deriva da una fondamentale differenza di opinioni. Ci sono almeno due idee generali fondamentalmente diverse che la gente sembra avere sull'espressività:

  1. la capacità di esprimere un'ampia varietà di idee.
  2. la capacità di esprimere chiaramente alcune idee specifiche (e spesso in modo succinto).

Per considerare alcuni esempi estremi, il linguaggio assembly si qualifica come altamente espressivo secondo i primi criteri: puoi fare praticamente qualsiasi cosa nel linguaggio assembly che puoi in un linguaggio di livello superiore, e puoi fare alcune cose nel linguaggio assembly che non puoi in sostanza qualsiasi linguaggio di livello superiore.

Ovviamente, il linguaggio assembly non sembra quasi così buono dalla seconda misura - in genere richiede un numero piuttosto elevato di codice abbastanza opaco per ottenere molto di tutto. Questa misura tenderebbe a favorire un linguaggio come Haskell o APL, per fornire solo un paio di esempi.

Queste due nozioni di ciò che significa "espressivo" sono spesso vicine a diametralmente opposte. Il primo tende a favorire i linguaggi di livello "più basso", mentre il secondo tende a favorire il livello "più alto". Combinando i due, è piuttosto banale scegliere una definizione che "provi" che una lingua di tua scelta è la più espressiva.


7
2018-03-11 18:40



Wikipedia ha un po 'del concetto. Io stesso intendo dire che una lingua può ottenere di più con meno (il cosiddetto "uso informale" nell'articolo di Wikipedia).

Considero JavaScript espressivo (anche se questo potrebbe essere dovuto al fatto che Douglas Crockford ha perforato questa idea nella mia zucca) perché può fare così tanto con solo poche parole chiave. Ad esempio, il function keyword è una funzione, oltre a un metodo, una classe e una lambda.

Alcuni esempi di codice (tralasciando alcuni dettagli per brevità) in JavaScript. È una classe di eventi che ho scritto:

SJJS.util.Event = (function() {
    var _listeners = [];
    var _listenerReturns = [];

    return {
        addDomListener: function(element, eventName, listener) {
        },
        trigger: function(element, eventName) {
        },
        removeListener: function(eventlistener) {
        }
    }
})();

Con solo function, vare alcune parentesi graffe e parentesi ho creato una classe statica con metodi e variabili private.


4
2018-03-11 18:19



Per me è l'abilità che il linguaggio deve esprimere chiaramente la mia logica e le mie idee attraverso il codice, in modo che qualcun altro leggendo il codice che ho scritto possa facilmente capire a cosa stavo pensando quando l'ho fatto.


3
2018-03-11 18:38



Ho sempre pensato che fosse approssimativamente equivalente a quanto è alto un linguaggio. Se volessi provare a quantificare l'espressività, le unità sarebbero qualcosa del tipo "istruzioni del codice macchina per lingua"

Un linguaggio più espressivo potrebbe essere molto bravo a fare un sacco di lavoro senza scrivere molto codice. Tuttavia, probabilmente sarebbe più specifico del dominio e un po 'più lento per alcune attività rispetto a uno meno espressivo.


1
2018-03-11 18:54



Prendi ad esempio LINQ. Ti permette di usare programmazione funzionale.

La programmazione funzionale enfatizza l'applicazione delle funzioni, in contrasto con lo stile di programmazione imperativo, che enfatizza i cambiamenti di stato.

LINQ consente al tuo di esprimere ciò che vuoi fatto invece di come farlo. Questo è un chiaro esempio di espressività.


1
2018-03-11 18:58



In generale, con un linguaggio di programmazione completo, puoi fare tutto ciò che può fare un altro linguaggio completo di turing. Detto questo, alcuni possono farlo molto meglio degli altri.

Prendo espressività per significare quanto si può dire facilmente e quanto bene / chiaramente può essere detto. La capacità di essere conciso è parte di questo (un linguaggio molto potente e laconico è simile a quello J ). In genere trovo che essere concisi è un buon segno di essere espressivi. Se la lingua può esprimere un'operazione complessa in un modo semplice, sta andando nella giusta direzione.

Per quanto riguarda il potere, l'espressività non è tutto il potere di una lingua. Anche se può far parte di esso, velocità, sicurezza, stabilità, tutte queste cose fanno altrettanto.

esempio: la sommatoria di una lista in Common lisp usando l'operatore di loop è concisa ed espressiva

(loop for x in list sum x)


0
2018-03-11 18:25