¿Qué significa “de datos es sólo código mudo, y el código es sólo datos inteligentes” significa? [cerrado]

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

  •  22-08-2019
  •  | 
  •  

Pregunta

Me encontré con una idea en la la estructura y la interpretación de los programas de ordenador :

  

Los datos son solo código mudo, y el código es sólo datos inteligentes

No entiendo lo que significa. ¿Puede alguien ayudarme a entender mejor?

¿Fue útil?

Solución

Esta es una de las lecciones fundamentales de SICP y una de las ideas más potentes de la informática. Funciona de esta manera:

Lo que nosotros consideramos como "código" en realidad no tienen el poder de hacer nada por sí mismo. Código define un programa sólo dentro de un contexto de interpretación - fuera de ese contexto, es sólo un flujo de caracteres. (.. Realmente un flujo de bits, que es realmente una corriente de impulsos eléctricos Pero vamos a mantenerlo simple) El significa de código se define por el sistema dentro del cual se ejecuta - y este sistema solo trata a su código como los datos que le dice lo que quería hacer. código fuente en C es interpretada por un compilador de C como datos que describen un fichero objeto que desea que crear. Un archivo objeto es tratado por el cargador como los datos que describen algunas instrucciones de máquina que desea hacer cola para su ejecución. instrucciones de máquina son interpretados por la CPU como datos que definen la secuencia de transiciones de estado que debe someterse.

Los lenguajes interpretados a menudo contienen mecanismos para el tratamiento de datos como código, lo que significa que puede pasar el código en una función en alguna forma y luego ejecutarlo - o incluso generar código en tiempo de ejecución:

#!/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

Algunos idiomas como el esquema tienen un concepto de "funciones de primera clase", lo que significa que se puede tratar como una función de los datos y pasarlo alrededor sin evaluarla hasta que realmente quiere.

El resultado es que la división entre "código" y "datos" es más o menos arbitraria, en función de la única perspectiva. Cuanto menor sea el nivel de abstracción, el "inteligente", el código tiene que ser: tiene que contener más información acerca de cómo debe ser ejecutado. Por otro lado, la mayor información de los suministros de interpretación, más tonto que el código puede ser, hasta que empieza a parecerse a los datos sin inteligencia en absoluto.

Una de las maneras más eficaces para escribir código es como una simple descripción de lo que necesita: Los datos que se convirtió en código que describe cómo obtener lo que necesita por el contexto interpretativo. Llamamos a este "programación declarativa" .

En un ejemplo concreto, considere HTML. HTML no describe un lenguaje de programación Turing completo. Meramente se estructura de datos. Su estructura contiene algunos inteligencia que permiten que controlan el comportamiento de su contexto interpretativo - pero no un montón de inteligencia. Por otro lado, contiene más inteligencia que los párrafos de texto que aparecen en una página web promedio:. Esos son datos bastante tontas

Otros consejos

En el contexto de la seguridad: Debido a desbordamientos de búfer, lo que pensar en como los datos y por lo tanto inofensivos (como una imagen) puede llegar a ser ejecutado como código y p0wn su máquina

.

En el contexto de desarrollo de software: Muchos desarrolladores son mucho miedo de cosas "codificar" y muy inclinado en la extracción de parámetros que podrían tener que cambiar en archivos de configuración. Esto a menudo se basa en la idea de que los archivos de configuración son sólo "datos" y por lo tanto se pueden cambiar fácilmente (perhapy por los clientes) sin aumentar los problemas (compilación, implementación, pruebas) que cambiar nada en el código haría.

Lo que estos desarrolladores no se dan cuenta es que, dado que estos "datos" influye en el comportamiento del programa, lo que realmente es el código; que podría romper el programa y la única razón para no requerir prueba completa después de un cambio de este tipo es que, si se hace correctamente, los valores configurables tienen un efecto muy específico, bien documentada y cualquier valor no válido o una estructura de archivos rotos será capturado por el programa.

Sin embargo, lo que muy a menudo sucede es que la estructura de archivos de configuración se convierte en un lenguaje de programación en su propio derecho, con flujo de control y todo - uno que está mal documentado, tiene una sintaxis peculiar y analizador, y que sólo los desarrolladores más experimentados en el equipo puede tocar sin romper la aplicación por completo.

Por lo tanto, en un lenguaje como el esquema, incluso el código se trata como datos de primera clase. Usted puede tratar funciones y expresiones lambda mucho como tratas a otro código, dice pasarlos a otras funciones y expresiones lambda. Recomiendo continuar con el texto ya que esto todo llegar a ser bastante clara.

Esto es algo que debe llegar a entender de escribir en un compilador.

Un paso común en los compiladores es transformar el programa en un árbol de sintaxis abstracta. Representación será a menudo como árboles tales como [+, 2, 3] donde + es la raíz, y 2, 3 son los niños.

Los lenguajes Lisp se limita a tratar esto como sus datos. Así que no hay separación entre los datos y el código que son las dos listas que se parecen a los árboles de AST.

Código de datos es, sin duda, pero los datos es, sin duda no siempre código. Vamos a dar un ejemplo básico - el nombre del cliente. No tiene nada que ver con el código, que es un funcional (esencial), en comparación con un técnica de aspecto (accidental) de una aplicación.

Probablemente se podría decir que ningún dato técnico / accidental es de código y que los datos de funcionamiento / no es esencial.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top