Esta es una de las lecciones fundamentales de SICP y una de las ideas más poderosas de la informática. Funciona así:
Lo que consideramos como "código" en realidad no tiene el poder de hacer nada por sí mismo. El código define un programa solo dentro de un contexto de interpretación: fuera de ese contexto, es solo una secuencia de caracteres. (Realmente una secuencia de bits, que en realidad es una corriente de impulsos eléctricos. Pero seamos simples). El que significa del código está definido por el sistema dentro del cual lo ejecuta, y este sistema solo trata su código como datos eso le dice lo que quería hacer. El código fuente C es interpretado por un compilador C como datos que describen un archivo objeto que usted quiere que cree. Un archivo objeto es tratado por el cargador como datos que describen algunas instrucciones de la máquina que desea poner en cola para su ejecución. Las instrucciones de la máquina son interpretadas por la CPU como datos que definen la secuencia de transiciones de estado a las que debe someterse.
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 tiene un concepto de "funciones de primera clase", lo que significa que puede tratar una función como datos y pasarla sin evaluarla hasta que realmente lo desee.
El resultado es que la división entre "código" y "datos" es bastante arbitraria, una función de perspectiva solamente. Cuanto menor sea el nivel de abstracción, más "inteligente" debe ser el código: debe contener más información sobre cómo debe ejecutarse. Por otro lado, mientras más información suministre el intérprete, más tonto puede ser el código, hasta que comienza a parecerse a los datos sin ninguna inteligencia.
Una de las formas más potentes de escribir código es como una simple descripción de lo que necesita: datos que se convertirán en código que describirá cómo obtener lo que necesita según el contexto interpretativo. Llamamos a esto "declarative programming".
Para un ejemplo concreto, considere HTML. HTML no describe un lenguaje de programación completo de Turing. Es meramente datos estructurados. Su estructura contiene algunos conocimientos que le permiten controlar el comportamiento de su contexto interpretativo, pero no mucha 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 tontos.
¿Cómo se puede decir que está "redactado elegantemente" si no sabes lo que significa? – sykora
Primero pensé que era un quiasma, pero ahora creo que es una antimetabole. – tuinstoel
http://en.wikipedia.org/wiki/Von_Neumann_architecture –