Che cosa significa “I dati sono solo il codice muto, e il codice è solo dati intelligenti” significa? [chiuso]

StackOverflow https://stackoverflow.com/questions/871833

  •  22-08-2019
  •  | 
  •  

Domanda

Ho appena imbattuto in un'idea in La struttura e l'interpretazione dei programmi informatici :

  

Dati è solo il codice muto, e il codice è solo dati intelligenti

Non riesco a capire che cosa significa. Qualcuno può aiutarmi a capire meglio?

È stato utile?

Soluzione

Questa è una delle lezioni fondamentali della SICP e uno dei più potenti idee della scienza informatica. Funziona in questo modo:

Quello che noi pensiamo come "codice" in realtà non hanno il potere di fare nulla da solo. Codice definisce un programma solo all'interno di un contesto di un'interpretazione - al di fuori di tale contesto, si tratta solo di un flusso di caratteri. (.. Davvero un flusso di bit, che è davvero un flusso di impulsi elettrici, ma teniamolo semplice) Il significa di codice è definito dal sistema all'interno del quale si esegue - e questo sistema solo tratta il codice come dati che gli dice ciò che si voleva fare. C codice sorgente è interpretato da un compilatore C come dati che descrivono un file oggetto che si desidera creare. Un file oggetto viene trattato dal caricatore di dati che descrivono alcune istruzioni macchina che si desidera mettersi in coda per l'esecuzione. istruzioni macchina vengono interpretati dalla CPU come dati che definiscono la sequenza di transizioni di stato dovrebbe subire.

I linguaggi interpretati spesso contengono meccanismi per il trattamento di dati come il codice, il che significa che è possibile passare il codice in una funzione in qualche forma e poi eseguirlo - o anche generare il codice in fase di esecuzione:

#!/usr/bin/perl
# Note that the above line explicitly defines the interpretive context for the
# rest of this file.  Without the context of a Perl interpreter, this script
# doesn't do anything.
sub foo {
    my ($expression) = @_;
    # $expression is just a string that happens to be valid Perl

    print "$expression = " . eval("$expression") . "\n";
}

foo("1 + 1 + 2 + 3 + 5 + 8");              # sum of first six Fibonacci numbers
foo(join(' + ', map { $_ * $_ } (1..10))); # sum of first ten squares

Alcune lingue come schema hanno un concetto di "funzioni di prima classe", il che significa che è possibile trattare una funzione come dati e passarlo intorno senza valutare fino a che si vuole veramente.

Il risultato è che la divisione tra "codice" e "dati" è praticamente arbitraria, una funzione di sola prospettiva. Più basso è il livello di astrazione, il "più intelligente" il codice deve essere: deve contenere più informazioni su come dovrebbe essere eseguito. D'altra parte, più informazioni le forniture interprete, più muto il codice può essere, fino a quando non inizia a guardare come i dati senza intelligenza a tutti.

Uno dei più potenti modi per scrivere il codice è come una semplice descrizione di ciò che è necessario: i dati che verrà trasformato in codice che descrive come ottenere ciò che è necessario dal contesto interpretativo. Noi chiamiamo questo "programmazione dichiarativa" .

Per un esempio concreto, in considerazione HTML. HTML non descrive un linguaggio di programmazione Turing-completo. Si è semplicemente strutturata dei dati. La sua struttura contiene alcune furbizia che lasciarlo controllare il comportamento del suo contesto interpretativo - ma non un sacco di intelligenza. D'altra parte, contiene più intelligenza che i paragrafi di testo che compaiono su una pagina web media:. Questi sono i dati abbastanza stupida

Altri suggerimenti

Nel contesto della sicurezza: a causa di buffer overflow, quello che pensato come dati e quindi innocue (ad esempio un'immagine) può diventare eseguito come codice e p0wn la macchina

.

Nel contesto di sviluppo del software: Molti sviluppatori sono molto paura di cose "hardcoding" e molto appassionato di estrazione di parametri che potrebbero avere per cambiare in file di configurazione. Questo è spesso basata sull'idea che i file di configurazione sono solo "dati" e quindi possono essere cambiati facilmente (perhapy da parte dei clienti) senza sollevare i problemi (la compilazione, l'implementazione, test) che cambiare nulla nel codice sarebbe.

Ciò che questi sviluppatori non si rendono conto è che dal momento che questo "dati" influenza il comportamento del programma, è davvero il codice; si potrebbe rompere il programma e l'unico motivo per non richiedere test completa dopo un tale cambiamento è che, se fatto correttamente, i valori configurabili hanno una molto specifica, effetto ben documentato e qualsiasi valore non valido o di una struttura di file danneggiato sarà catturato da il programma.

Tuttavia, ciò che troppo spesso accade è che la struttura del file di configurazione diventa un linguaggio di programmazione vero e proprio, completo di controllo di flusso e tutto - uno che è mal documentato, ha una sintassi eccentrico e parser e che solo gli sviluppatori più esperti nella squadra può toccare senza rompere completamente l'applicazione.

Quindi, in un linguaggio come Scheme, anche il codice viene trattata come dati di prima classe. Si può trattare le funzioni e le espressioni lambda molto come si trattano altro codice, dici passandoli in altre funzioni e le espressioni lambda. Mi consiglia di continuare con il testo come questo tutto diventa chiaro.

Questo è qualcosa che si dovrebbe arrivare a capire da scrivere in un compilatore.

Un passo comune in compilatori è quello di trasformare il programma in un albero di sintassi astratta. Rappresentazione sarà spesso come alberi, come [+, 2, 3] dove + è la radice, e 2, 3 sono i bambini.

Lingue Lisp per trattamento semplicemente questo come i suoi dati. Quindi non v'è alcuna separazione tra dati e codice, che sono entrambe le liste che sembrano alberi AST.

Codice è sicuramente dei dati, ma i dati è sicuramente non sempre del codice. Facciamo un semplice esempio - nome del cliente. Non ha niente a che fare con il codice, è un funzionale (essenziale), al contrario di un tecnica (accidentale) aspetto un'applicazione.

Si potrebbe forse dire che tutti i dati tecnici / accidentale è il codice e che i dati / funzionale indispensabile non lo è.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top