Un poco de Teoría de la Computación (parte 1)

25 de septiembre de 2009

Hola a todos! la motivación del presente artículo nace de la necesidad de comprender algunos temas relacionados con las teoría de la computación, antes de asimilar los nuevos lenguajes multiparadigma, como es el caso de F#, Scala y otros, que se perfilan como herramientas para el futuro del desarrollo de software comercial y empresarial.

Atención! para comprender estos temas sólo requerimos haber programado alguna vez en algún lenguaje de programación, y entender la estructura y funcionamiento general de un programa.

Sus comentarios y aportes serán bienvenidos! Pues bien, en esta ocasión empezaremos con dos conceptos simples: objetos de primera y segunda clase, y variables libres y vinculadas.




Objetos de primera y segunda clase



En las ciencias de la computación, en el contexto de cualquier lenguaje de programación, un objeto de primera clase es una entidad que puede:

  • Ser parámetro de alguna subrutina.
  • Ser el resultado de alguna subrutina.
  • Ser asignado a una variable.


Por ejemplo, en el contexto de Visual Basic, diríamos que los objetos de primera clase son los datos básicos tales como los Enteros, Decimales, Cadenas, y los Objetos (estructuras de datos y subrutinas).

Los objetos de primera clase requieren también que se puedan:

  • Construir en tiempo de ejecución. Ejemplo:

// codigo en javascript
var s = "Hola";
var saludo = new String(s + " " + s + "!");

Aquí es claro que estamos construyendo una secuencia de caracteres con el valor “Hola Hola!”, la estamos grabando en la memoria, y la estamos etiquetando con el nombre de “saludo” (variable de tipo cadena). Otro ejemplo de construcción:

' codigo en Visual Basic
Set Jefe = CreateObject("MiClase.Empleado")
Set Asistente = CreateObject("MiClase.Empleado")

  • Expresarse como valores anónimos (o literales).

Un valor anónimo es aquel que no está etiquetado (asignado) con algún nombre o descripción en particular. Por ejemplo:

// codigo en C#
MessageBox.Show( "No me gusta programar" );
# codigo en Ruby, imprime 12
puts "Cadena Larga".length



En ambos casos hemos construido el valor directamente, sin ninguna variable de por medio, por eso se les conoce como “anónimos”.
De otro lado, en C y C++ por ejemplo, no es posible crear nuevas funciones en tiempo de ejecución. Como resultado, las funciones no son Objetos de Primera Clase, sino que son indirectamente manipulados a través de los muy "temidos" punteros a funciones (o como los delegados en C#). También se les conoce como objetos de segunda clase.




Variables Libres y Vinculadas



Veamos, en las ciencias de la computación, una variable libre es aquella que, en el contexto de una rutina o función, no es local, ni tampoco se obtiene como argumento de la misma. Mmm a ver expliquemos algo más. ¿Qué tipo de variable podría ser esta? Veamos un ejemplo:


     Public Function PromedioSimple( ByVal X as Integer, ByVal Y as Integer )
         Dim Z as Integer
         Z = 2
         PromedioSimple = (X + Y ) / Z
     End Function


Aquí vemos claramente que ni X, ni Y (argumentos de la función), ni Z (variable local) son variables libres. Podríamos hacer que Z sea libre si lo cambiamos así:


     Global Z As Integer
     Z = 2



     Public Function PromedioSimple( ByVal X as Integer, ByVal Y as Integer )
         PromedioSimple = (X + Y ) / Z
     End Function


Ciertamente Z es libre en este contexto, toma independientemente cualquier valor previo a la ejecución de la función. Al resto de las variables (X & Y) se les conoce como variables vinculadas.

Tomemos otro ejemplo del lenguaje cotidiano, analicemos la oración:

     Jorge encontró su libro

Esta oración puede significar dos cosas:

a)   Jorge encontró su propio libro que andaba buscando de hace rato, ó
b)   Jorge encontró el libro de alguien más.

Debido a esto, se dice que el pronombre su es una variable libre, ya puede tomar cualquiera de los dos significados sin problemas.


Siguientes pasos


En un siguiente post hablaremos acerca de la transparencia referencial y los efectos paralelos en un lenguaje de programación, asi como las funciones puras e impuras, conceptos que serán fundamentales en el contexto de la programación funcional.

Gracias por su atención!

0 comentarios:

Publicar un comentario