Ustedes pudieron apreciar que yo uso lenguajes como PHP, Python y Ruby. Éstos tienen características especiales, por lo que se les llama “lenguajes dinámicos”. Pero, ¿cuál es la diferencia con un lenguaje estático?, más bien, ¿qué es lo que hace a estos lenguajes dinámicos?
Cada lenguaje de programación tiene sus propias “terminologías”. Vale decir, dependiendo de la manera en que cada lenguaje aborde un problema, crea un idioma para que los desarrolladores se comuniquen. Hay muchos ejemplos, pero no quiero confundirles, así es que les daré sólo uno: los lenguajes interpretados no tienen “tiempo de compilación”, porque el lenguaje no se compila. La idea es que un lenguaje de programación dinámico agregue todas estas características en tiempo de “ejecución”, no en tiempo de “compilación” o de “carga”.
La definición de un lenguaje dinámico es: todo aquel lenguaje que posea características que permitan alterar el curso del lenguaje de manera legítima, a través de la inyección de código o de la ejecución de funcionalidades especiales. Describiré, pues, algunas de las maneras de agregar dinamismo a un lenguaje de programación e intentaré explicarlas con pseudocódigo.
1.- Evaluación de código
Un lenguaje puede tener un mecanismo (una función eval() o una clase del tipo función) que permite “evaluar” (leer, corregir e implementar) código en el lenguaje que escribimos. Esto nos da mucha flexibilidad pero también conlleva a riesgos de seguridad, permitiendo a gente con malas intenciones escribir código que no queremos que se ejecute. Una utilidad de esto es aplicar un filtro a una función:
function recordsetfilter(Recordset $rs, $filter)
{
$newrs = new Recordset();
foreach($rs as $record)
{
$rec = new Record();
$rec = $record;
$rec->setNombre(
eval($filter)
);
$newrs->add($record)
}
return $newsrs;
}
// ... código que nos genera un Recordset
$rs = recordsetfilter($rs, 'strtoupper($this->getNombre())');
Las funciones de rango mayor son funciones que toman una o más funciones como una entrada y/o entregan una función como una salida. La misma función descrita arriba es una implementación pobre de la función map(), que toma una función y una lista o arreglo de elementos, y que retorna como resultado una lista con la función aplicada a cada elemento de la lista de entrada. PHP tiene una función llamada usort() que permite tomar una función de comparación y dependiendo de lo que esta función entregue, el algoritmo hace un ordenamiento.
2.- Alteración del objeto en tiempo de ejecución
Esto es un poco complejo, pero se refiere al cambio de la herencia del objeto.
Por ejemplo, tengo una clase automóvil que extiende a la clase vehículos y también a la clase bienes. El resultado de esta operación es que un automóvil puede ser acelerado, frenado, con el motor encendido, con el motor apagado; y además puede ser comprado, vendido, traspasado o efectuarse una tasación sobre éste.
3.- Programación Funcional
Me gustaría escribir un artículo completo relacionado con programación funcional. Es un tópico totalmente entretenido, aunque es difícil de comprender a la primera. La idea de la programación funcional es definir funciones matemáticas que luego se aplican sin importar su estado. Algo como esto en PHP.
<php
$a = array(1, 2, 3, 4);
$i = 0;
foreach($a as $e)
{
$a[$i] = funcion1(funcion2($e));
$i++;
}
foreach($a as $e)
{
echo $e.' ';
}
?>
…puede ser escrito como esto:
funcion = lambda(funcion1, funcion2) { funcion1 ( funcion2 (x) ) }
destino = map(funcion(funcion1, funcion2), a)
La idea es decir que funcion() toma como parámetros las funciones funcion1() y funcion2(), y definir que a un elemento x dado se le aplicará primero funcion2() y al resultado se le aplicará funcion1(), luego se puede mapear el arreglo a para aplicarle nuestra nueva función a cada uno de los elementos. Elementos propios de la programación funcional son los closures, las continuaciones y la reflexión de datos.
4.- Macros
Las macros permiten hacer introspección dentro del código y evaluación del mismo. Ruby provee la mayor parte de la funcionalidad de las macros a través de su sistema de orientación a objetos.
Recuerdo que decidí volver a utilizar Ruby cuando leí un artículo que trataba precisamente de la diferencia entre las macros de LISP y la sintáxis natural de Ruby. (en inglés, pero fácil de leer).
Espero que esta densa explicación sea de utilidad para ustedes. Que les vaya bien y hasta otra entrega.
Ya saben, el castellano no es mi idioma nativo, así es que si tienen dudas o preguntas sobre algún párrafo, ¡háganmelas saber!
Auf Wiederlesen!













Vamos... sabemos que quieres comentar algo ;)