Misura di potenza diversa dalla completezza di Turing


18

Inizialmente ho provato a chiederlo su StackOverflow, ma era troppo soggettivo :-(. Sono interessato ai metodi per definire il potere dei linguaggi di programmazione. La completezza di Turing è una, ma è quasi universalmente soddisfatta. Ciò che sarebbe bello è definire un misura del potere che discrimina tra i linguaggi di programmazione che sono effettivamente utilizzati. Ad esempio, qualcuno può proporre un metodo non soggettivo che discriminerebbe tra assembly e Java?

La completezza di Turing significa che una lingua è estremamente potente in ciò che può produrre (il che praticamente significa che può fare qualsiasi cosa senza tempo nel mondo reale). Quindi, se vogliamo definire una misura più forte di potere, dobbiamo adottare un altro approccio. La mancanza era stata suggerita nella domanda originale, ma non è affatto facile da definire. Qualcuno ha altri suggerimenti?

Risposte:


24

L'idea che stai cercando si chiama espressività e Matthias Felleisen ha una definizione matematicamente rigorosa:

" Sulla potenza espressiva dei linguaggi di programmazione "

www.ccs.neu.edu/scheme/pubs/scp91-felleisen.ps.gz (versione Postscript)

L'intuizione alla base dell'idea è che se hai due programmi equivalenti in due lingue diverse - diciamo, programma A in lingua X e programma B in lingua Y-- e se apporti una modifica locale ad A che richiede una modifica globale in B , quindi X è più espressivo di Y.

Un esempio fornito da Felleisen è il compito: nei linguaggi di programmazione dello schema è possibile rimuovere l'operatore di compito e avere ancora un linguaggio completo Turing. Tuttavia, in una lingua così limitata, l'aggiunta di una funzione che sarebbe localizzata se fosse consentita un'assegnazione richiederebbe una modifica globale al programma senza assegnazione.

La mia discussione ha semplificato alcuni dettagli e dovresti leggere l'articolo stesso per l'account completo.

Per rispondere alla tua altra domanda: puoi dire che Java è più espressivo dell'assembly perché puoi aggiungere una nuova classe al tuo programma Java e quindi ottenere i benefici del polimorfismo facendo in modo che altre parti del programma chiamino i suoi metodi senza modifiche globali. La gestione delle eccezioni è un altro esempio in cui Java è più espressivo dell'assembly: è sufficiente scrivere una singola throwistruzione per trasferire il controllo sullo stack. A un livello più elementare, puoi anche aggiungere una nuova caseistruzione vicino all'inizio di a switche non dovrai preoccuparti di ricalcolare manualmente le compensazioni di salto.


Grazie mille! Questo e 'esattamente quello che stavo cercando!
Casebash,

6

Se capisco correttamente la tua domanda, stai comunque cercando qualcosa che sia relativamente misurabile e non solo un giudizio soggettivo. In tal caso, preferirei personalmente la quantità di tempo impiegata per risolvere qualsiasi problema specifico (media su tutti i problemi e tutti i programmatori). In questa misura, potrebbe essere necessario considerare non solo il linguaggio stesso ma anche il framework / API utilizzato con esso. La sintassi succinta è un fattore molto piccolo: uno molto più importante è che la funzionalità più comunemente richiesta è facilmente accessibile.

Se stai cercando qualcosa di più soggettivo, direi quanto sia divertente . I programmatori tendono ad essere persone che vogliono risolvere i problemi, quindi un linguaggio di programmazione divertente da usare per i programmatori sarà inevitabilmente quello che risolverà la maggior parte dei problemi. Questa misura tiene conto del fatto che persone diverse hanno preferenze diverse su come usare le cose, quindi il “miglior” linguaggio di programmazione sarà quello che è più attraente per la più ampia gamma di programmatori. Tuttavia, potrebbe essere necessario considerare non solo il linguaggio di programmazione e l'API qui, ma anche l'ambiente (IDE), che è ovviamente ciò con cui il programmatore interagisce effettivamente.


Direi che anche misurare il tempo impiegato è soggettivo. Quale programmatore ha impiegato del tempo? Se provi i tempi di entrambe le lingue con lo stesso programmatore, quale lingua conosceva meglio? Esistono modi statistici per gestirlo, ma una persona non può farcela da sola.
John Fisher,

1
@John: Solo perché qualcosa può essere analizzato statisticamente non significa che sia soggettivo.
David Thornley,

@ David: Non era proprio questo il mio punto. Il punto era che senza uno studio preesistente, il richiedente non sarebbe stato in grado di confrontare il "potere" delle lingue a cui teneva - lasciandolo soggettivo se non analizzato statisticamente su un grande gruppo.
John Fisher,

1

Definirei quanto è potente una lingua da quanto puoi essere produttivo con essa. Molte persone tendono a parlare della produttività in termini di scrittura rapida del codice, ma poiché la maggior parte del ciclo di vita di un programma è di manutenzione, non di sviluppo, una misura migliore è la facilità con cui è possibile leggere ed eseguire il debug del codice, specialmente quando è scritto da qualcuno altro. Le lingue più potenti sono quelle più facili da leggere e mantenere.


2
La difficoltà di questo è che conoscere una lingua rende più facile per chi la conosce. Quindi, questa misura diventa soggettiva.
John Fisher,

1

Devi definire meglio la tua terminologia.

La completezza di Turing non riguarda il "potere", nel senso che probabilmente intendi. Piuttosto si tratta di calcolabilità; cioè se una determinata lingua può esprimere qualsiasi programma che può essere implementato usando una macchina di Turing. Si scopre che quasi tutti i linguaggi di programmazione sono Turing completi.

Ciò che probabilmente stai cercando è una misura di ciò che viene definito "espressività" del linguaggio di programmazione. Non sono sicuro che esista una tale misura, o se lo sia, se sia utile. Fondamentalmente, diversi linguaggi di programmazione sono migliori nell'esprimere soluzioni a diversi tipi di problemi.

MODIFICARE

Giusto per spiegarlo, i linguaggi di programmazione non hanno una proprietà nota come "potenza". Esiste un concetto comunemente noto come "espressività" o "potere espressivo" di un linguaggio di programmazione. L'espressività riguarda in parte quanto sia facile scrivere programmi concisi per affrontare problemi particolari. Ma c'è anche una notevole misura di quanto sia facile leggere e scrivere i programmi. È una specie di "bellezza". Lo saprò quando lo vedrò, ma non chiedermi di definirlo.

Il semplice confronto dei conteggi dei personaggi non ti dà una misura adeguata di espressività. Altrimenti potresti rendere un linguaggio più espressivo comprimendo il codice sorgente ... e non ha senso. In realtà, non conosco alcuna misura oggettiva di espressività e sospetto fortemente che non esista. Il che rende efficace la caratteristica inutile e poco interessante.


1
So che la completezza di Turing riguarda la calcolabilità. Sappiamo che esistono misure minori sulla scala della calcolabilità, come le macchine a stati finiti. Ma non possiamo usare la calcolabilità per definire un livello di potenza al di sopra di questo, poiché la completezza di Turing è estremamente potente in termini di calcolabilità
Casebash,

@Casebash - non hai ancora detto che cos'è il "potere".
Stephen C,

2
Questo perché non lo so e questo è il punto centrale di questa domanda!
Casebash,

Allora qual è il punto della tua risposta? Avrebbe dovuto essere un commento.
reinierpost,

@reinerpost - Il punto della mia risposta è spiegare in dettaglio che la domanda non ha senso e perché. Fondamentalmente la domanda è "C'è qualcosa chiamato" potere espressivo "- non so cosa sia ma potresti dirmi come misurarlo." E il nocciolo della mia risposta è che il "potere espressivo" è un concetto / proprietà mal definito, e Sicuramente non misurabile / quantificabile. (Ed è chiaramente una risposta e non un commento. Forse semplicemente non hai capito cosa sto cercando di dire?)
Stephen C
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.