Un linguaggio di programmazione potrebbe funzionare anche senza dichiarazioni?


9

Come programmazione in JavaScript, ho notato che tutto ciò che può essere fatto con istruzioni e blocchi può essere fatto solo con le espressioni. Un linguaggio di programmazione può funzionare bene solo con le espressioni? E, se sì, perché le dichiarazioni sono utilizzate?


2
Sì, ci sono molte lingue tutto-è-un'espressione, come Ruby e tutti i dialetti di Lisp.
Amara,

@sparkleshy Capisco, solo un'ipotesi: hanno tutti un operatore analogo alla virgola di JavaScript (esegue due istruzioni e restituisce il valore dell'ultima)? Questa è generalmente la soluzione per eseguire due istruzioni in sequenza? Sto contando il progn di CL come un analogo, immagino, anche se funziona per> 2 espressioni.
MaiaVictor,

1
Tutto-è-un'espressione non deve apparire diverso da un normale linguaggio di istruzioni, le dichiarazioni hanno solo ... valori. Se hai fatto espressioni di istruzioni javascript, tutto il codice esistente sarebbe completamente valido.
Amara,

1
CoffeeScript è un linguaggio tutto-è-un'espressione, che viene compilato in JavaScript.
Spoike,

1
correlati (forse un duplicato): quale espressività utile sarà impossibile in una lingua in cui un'espressione non è un'affermazione? "Perché così tante grammatiche fanno la distinzione tra expr e stmt quando, come notato nelle risposte, non ha senso."
moscerino il

Risposte:


14

Sicuro. Il modo più semplice è assegnare un valore di risultato a ogni costrutto che è attualmente un'istruzione e quindi trasformarlo in un'espressione. Questo non è necessariamente utile o significativo però. L'unico potenziale guadagno è un po 'di semplicità concettuale. Tuttavia, se poi si procede a rimuovere elementi come punti e virgola e loop (che richiedono invece il concatenamento tramite altri operatori e funzioni), i programmi che utilizzano pesantemente le istruzioni diventano brutti.

Un modo più radicale ma significativo per farlo è quello di progettare il linguaggio in modo tale che quasi tutto abbia un valore significativo e usarlo in modo da usare quasi sempre un'espressione per quel valore significativo, non per altri effetti. I linguaggi di programmazione funzionale lo fanno (in una certa misura; per esempio, Haskell ha delle dichiarazioni, che non sono espressioni).

Le dichiarazioni sono usate perché nel paradigma imperativo, ci sono molte operazioni comuni che non hanno un valore di risultato utile e perché la nozione di istruzioni sequenziali (piuttosto che calcoli) si adatta abbastanza bene a quel paradigma. Se una grande percentuale del tuo programma sta mutando lo stato, piuttosto che calcolare nuovi valori, non ha senso richiedere la produzione di un valore (qual è il risultato di un ciclo for?). Al contrario, quando l'intero paradigma (FP) è costruito attorno al calcolo dei valori, i valori anomali che non hanno un valore di risultato non giustificano un'eccezione: invece dai loro un risultato sentinella che non significa nulla.


-1 questo non è proprio vero
amara,

3
@sparkleshy Quale parte non è vera e come?

1
primo paragrafo: dubiti dell'idea che le dichiarazioni abbiano utili valori di ritorno (ma molti lo fanno), propongono una cosa brutta (perché?). secondo paragrafo: dichiara che tutti i linguaggi di programmazione funzionale usano questo brutto concetto di frangia, che è ridicolo. terzo paragrafo: falso, lo abbiamo già in {} blocchi, il valore viene ignorato e non causa alcun problema, errato; stai già dando loro la mancanza di un valore di vuoto, in che modo null è meno significativo di così? nel complesso: questo non è proprio vero
amara,

2
@sparkleshy - Nessuna istruzione ha valori di ritorno utili, ecco perché sono dichiarazioni . Possono avere effetti collaterali utili (come il compito), ma non è la stessa cosa. Questo non è davvero un concetto marginale. È ben noto se non del tutto pratico se portato all'ennesima potenza. E quel valore di sentinella non è nullo o nullo, è un'unità che è leggermente diversa da entrambe. +1 per delnan per compensare questo.
Telastyn,

4
@sparkleshy (1) Potresti essere espressioni confuse (che possono essere l'unico componente di un'istruzione) con un'istruzione (che non sono espressione e non hanno valore di risultato). (2) Cosa? Qualsiasi avvocato FP lo confermerà (e sosterrà che è una buona cosa). O è solo la parte "tutto" a cui ti opponi? (3) I {} blocchi sono ciò di cui sto parlando ("nozione di istruzioni sequenziali"). E dove dico che qualcosa possa causare problemi? La differenza tra voide null/ unitè che questi ultimi sono valori e possono essere passati, mentre voidè speciale in quanto non esiste alcun valore di quel tipo.

5

Dipende da come definisci "istruzione" ed "espressione".

Una definizione molto rigorosa distinguerebbe tra affermazioni come "cose ​​che hanno effetti collaterali e forse un valore di ritorno" ed espressioni come "cose ​​che hanno valori di ritorno, ma non possono avere effetti collaterali". Con tale definizione, nessun programma significativo può essere scritto senza almeno un'istruzione (che dovrebbe valutare un'espressione e produrre il suo valore di ritorno) - le espressioni pure da sole non possono interagire con il mondo al di fuori del programma. Una sola lingua può ancora essere completamente pura (cioè, non avere alcuna dichiarazione), se la parte impura viene spostata fuori dalla lingua e nell'ecosistema di supporto (che è esattamente ciò che fa Haskell, sebbene la lingua abbia definizioni e espressioni) .

Se, tuttavia, si consentono effetti collaterali nelle espressioni, allora la distinzione tra espressioni ed espressioni diventa arbitraria e molto meno interessante - ovviamente è possibile inventare un linguaggio di programmazione che consiste solo di espressioni; la maggior parte dei dialetti Lisp funzionano in questo modo. In una situazione del genere, la valutazione di un'espressione per i suoi effetti collaterali è praticamente la stessa dell'esecuzione di un'istruzione e si potrebbe sostenere che in un linguaggio del genere espressioni e dichiarazioni sono la stessa cosa. La differenza tra un'affermazione e un'espressione, quindi, è solo sintattica.

Molte lingue fanno ancora questa distinzione sintattica, perché è utile non per motivi tecnici, ma per leggibilità. Fare qualcosa come un'espressione segnala che sei interessato al suo valore di ritorno, meno ai suoi effetti collaterali; rendendolo una dichiarazione dice al lettore che si intende causare effetti collaterali e che il valore restituito potrebbe essere o non essere interessante.


+1 per i commenti sulla leggibilità ... Alla fine, gli umani devono capirlo ...
mattnz,

1

ATL e Xtend sono linguaggi di programmazione ben funzionanti. Molti linguaggi funzionali sono anche privi di dichiarazioni. Quindi, sì, un linguaggio di programmazione può funzionare bene senza istruzioni. Penso che le dichiarazioni siano in molte lingue un relitto della programmazione imperativa. Sono ancora utilizzati perché sono ampiamente conosciuti e in alcuni casi rendono il codice più leggibile.


1

Sì.

Linguaggi funzionali (e linguaggi di assegnazione singola) tutto è un'espressione. Esempi sono Haskal (e SISAL). Dove entrambe le istruzioni if ​​e per i loop restituiscono valori.

Esistono altre classi di lingue: quella facile che mi viene in mente sono le lingue dichiarative (sono sicuro che ce ne sono molte altre che non dipendono dalle dichiarazioni). Queste lingue non hanno nemmeno bisogno di espressioni (nello stesso senso in cui si penserebbe normalmente). Dichiara ciò che è vero e puoi ottenere più risultati indietro. Quello facile qui è prolog.


Haskell ha dichiarazioni, non sono espressioni.
Janus Troelsen,
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.