¿Qué son los lenguajes dinámicos?

¡Hola, Lectores!

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.

Lenguaje de programación PHP

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:

[php]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())’);
[/php]

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]<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.’ ‘;
}

?>[/php]

…puede ser escrito como esto:

[php]funcion = lambda(funcion1, funcion2) { funcion1 ( funcion2 (x) ) }
destino = map(funcion(funcion1, funcion2), a)[/php]

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!

13 comentarios en “¿Qué son los lenguajes dinámicos?

  1. Podrian hacer un tutorial de PHP orientado a objetos… es util, no-tan-dificil y dinamico!
    hahahhahahha

    La mayoria de los tutoriales de PHP son para hacer paginas o portales, pero no he visto muchos orientado a objetos per se

    Me gusta

  2. Que tal,

    la programación funcional no es tan complicada. Es crear programas con funciones (que son pequeñas subrutinas con una tarea específica), que procesan los datos que reciben (variables de entrada) y entrega el resultado (varibles de salida), para ser procesado por otras funciones. Es como armar un programa con piezas de Lego, y esas funciones las puedes usar posteriormente en cualquier otro programa.

    Creo que lo más valioso de los lenguajes dinámicos, es el hecho de las variables pueden cambiar de tipo (entero, flotante, caracter, etc.), durante el tiempo de ejecución.

    Saludos.

    Me gusta

  3. @Fernando,

    Tienes razón en que PHP es dinámico, pero no es tan fácil crear buenos productos porque la documentación te enseña a «usar» el lenguaje pero no a «pensar» en un buen método (punto a favor para Python y Ruby). Si quieres, puedo crear un tutorial.

    Me gusta

  4. @Herbert,

    Sí, es cierto que no es «tan» complicada, pero la estructura para pensar (por ejemplo, en LISP) cambia un poco respecto de lo que uno normalmente hace en PHP o en C (aunque en C algunos programadores hacemos uso extensivo de las macros para funciones como:

    #define DS_SUMA(X,Y) X+Y;

    A algunos de los programadores que conozco les da un poco de miedo «meterse» en la programación funcional porque es un paradigma distinto. :)

    Me gusta

  5. @Arturo393,

    En lo personal, uso Ruby como reemplazo de bash en tareas complejas (como por ejemplo, actualizar varios servidores DNS en línea teniendo cuidado con los bloqueos de escritura de archivos). Una parte de las aplicaciones que uso para una de las varias empresas en las que trabajo las hice en Ruby on Rails. También he hecho RESTful web services de manera bastante fácil.

    En general, todo depende de la persona con la que trabajo, no me caso con ningún lenguaje. :)

    Me gusta

  6. @David,

    es bueno conocer diferentes lenguajes de programación, pero creo, que se debe aprender a programar con los lenguajes que te sientas más comodo -a mi no me gusta Lisp, yo prefiero usar basic ó c, aunque ultimamente he estado jugando con python. Una vez que se entiende a fondo una forma de programar (sea; funcional, OOP, paralela, etc.), entonces, se puede intentarlo con otro lenguaje.

    Quizas, el problema inicial en p. funcional y OOP, es el tener que usar librerías con funciones y clases, que crearon otras personas, pero superado ese conflicto, no es más un problema.

    Allez Gute, und bis zum naechste mal.

    Me gusta

  7. @Herbert,

    Estoy de acuerdo contigo, salvo por una contradicción: ¿cómo sabes si te sentirás cómodo con el lenguaje de programación si es que no sabes programar en él? La idea (y espero que se note que apunto hacia esa idea) es proporcionar tips para programar mejor, sin importar (tanto) el lenguaje de programación.

    Uno no debería aprender a usar programación orientada a objetos usando código de otros, sino usando código que uno mismo escribe; de esa manera puede entender cómo funciona la orientación a objetos y analizar mejor los objetos que otras personas escriben.

    Danke für Alles!

    Me gusta

  8. @David,

    vuelvo a mi punto, si estas aprendiendo una forma de programación es mejor hacerlo en el lenguaje que mejor dominas, de lo contrario estas haciendo un doble esfuerzo, aprender la forma y además pulir tus conocimientos de otro lenguaje.

    Totalmente de acuerdo, hay que apreder a programar, sin importar el lenguaje a utilizar, y una forma que a mi me funciona es, trabajar primero con los aburridicimos diagramas de flujo.

    POO, también de acuerdo, pero, en la vida profesional eso es lo que se hace, usas código de otras personas, y es muy bueno aprender a trabajar en equipo desde un inicio. Tu creas algúnas fns y clases, y usas las de otro(s) compañero(s) para hacer alguna app, y después, comparan y discuten sus programas terminados.

    Saludos.

    Me gusta

  9. @Herbert,

    Lo siento, Ich habe nach Nederlande am wochenende geflucht.

    Aprender a programar es aprender a pensar. No existen tantos paradigmas como para que te familiarices con todos ellos al menos en concepto. ¿Cuánto vale entender qué son las clases y los objetos? Son como los design patterns: una vez que los comprendes, puedes aplicarlos en cualquier lenguaje, y eso la informática lo ha inheritado de la capacidad que las personas tienen para «hablar» un lenguaje.

    Cuando aprendí español, que pienso que no es perfecto, aprendí primero las estructuras y las palabras básicas. El hablar un idioma es exactamente lo mismo que el programar. Como bien dices, los diagramas de flujo, Nassi-Schneidermann, UML y todo eso te ayuda a pensar y a tener una estructura básica.

    Acerca de lo que dices sobre trabajar en equipo, no sé cómo es en Chile, pero nosotros trabajamos en un environment (¿ambiente o entorno?) multilenguaje. Si no aprendes a hablar en alemán o en inglés por tí mismo (los programadores aquí hablamos en alemán, pero nos comunicamos con el resto en inglés), es difícil que puedas trabajar en equipo.

    Piensa en la manera de aprender un idioma (cree, me ha funcionado con cinco idiomas)

    1.- Aprendes la estructura y los conceptos básicos.
    2.- Aprendes a usar la estructura y los vocablos básicos.
    3.- Practicas con alguien que ya conoce la estructura.
    4.- Trabajas en equipo con el resto de la gente.

    En programación es lo mismo:

    1.- Aprendes los conceptos básicos.
    2.- Escribes tus primeros programas, por malos que estén
    3.- Puedes usar Pair-Programming o cualquier técnica grupal para aprender mejor.
    4.- Recién después de eso (unos dos meses), puedes trabajar en equipo.

    Los estudiantes deberían haber pasado las dos primeras etapas en la universidad o el colegio técnico. Cuando llegan nuevos programadores aquí, evaluamos su desempeño durante un mes haciendo programación de a pares antes de que puedan tocar código por ellos mismos. Cuando haces eso, la transición entre tu nivel de conocimiento y el del resto de la gente con que trabajas es menor que cuando lanzas a los programadores a los leones.

    Es un costo, sí, de unos cuantos euros, pero te aseguras en el primer mes que la persona comprende el proyecto. La gran diferencia entre programadores y gente que usa aplicaciones para programar reside en la capacidad de adaptarse, y eso es más valorable que saber veinticinco lenguajes de programación.

    Auf wiederlesen!

    Me gusta

  10. Buen día, muy interesante tu articulo.

    Si vos quisieras usar un lenguaje dinámico, pero desarrollar aplicaciones web, que lenguaje sugerís para usar y con que framework para web ??

    Te explico, tengo que migrar una aplicación vieja, que usa metadata de una base de datos y dibuja automáticamente los formularios ?

    que se te ocurre ?

    Saludos
    Eduardo

    Me gusta

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.