Espacio exclusivo para desarrolladores

Te invitamos a visualizar el contenido y esperamos que te ayude.

¿De que se trata?

Son aquellas que abarcan las bases teóricas de la información y la computación, así como su aplicación en sistemas computacionales.

LTAP

El futuro ingeniero no puede estar ajeno a estos cambios, ya que impactan en el espectro de decisiones que deben tomarse durante el proceso de construcción de software.

¿Qué es PHP?

PHP (acrónimo recursivo de PHP: Hypertext Preprocessor) es un lenguaje de código abierto muy popular especialmente adecuado para el desarrollo web y que puede ser incrustado en HTML.

El gran mundo tecnológico

Conoce y actualizate sobre los ultimos avances.

martes, 12 de mayo de 2015

Groovy

¿Qué es Groovy?

Groovy es un lenguaje de programación dinámico orientado a objetos para la máquina virtual Java (JVM) que se puede utilizar en cualquier lugar dónde se utilice Java. El lenguaje puede ser utilizado para combinar módulos de Java, ampliar las aplicaciones existentes de Java ó escribir nuevas aplicaciones. 



Groovy puede servir como un lenguaje de programación para los nuevos desarrolladores de la plataforma Java y también puede ser útil para los veteranos desarrolladores de Java interesados en aprender este flexible lenguaje. Groovy tiene una sintaxis similar a Java y funciona a la perfección con el bytecode de Java. Muchas de las características del lenguaje se parecen a las de Perl, Python, Ruby y Smalltalk.

Otras características incluyen:

  • Curva de aprendizaje corta.
  • Soporte para lenguajes específicos de dominio (domain-specific languages)
  • Sintaxis compacta
  • Soporte para tipado dinámico
  • Potentes primitivas de procesamiento
  • La facilidad de desarrollo de aplicaciones Web
  • Soporte para las pruebas unitarias.
El concepto Groovy fue introducido en 2003 por James Strachan. Las versiones beta se hicieron disponibles desde 2004 a 2006. Versión 1.0 fue lanzado en enero de 2007 y la versión 1.1 fue lanzado en diciembre de 2007. Groovy está atravesando normalización en Java Specification Request (JSR) 241. El director del proyecto es Guillaume Laforge.

Veamos unos pequeños ejemplos

Hello World:
  1. def name = 'World'
  2. println "Hello $name!"
Definiendo una clase:
  1. class Greet {
  2. def name
  3. Greet(who) {
  4. name = who[0].toUpperCase() + who[1..-1]
  5. }
  6. def salute() {
  7. println "Hello $name!"
  8. }
  9. }
  10.  
  11. g = new Greet('world') // create object
  12. g.salute() // output "Hello World!"
Utilizando las bibliotecas de Java:
  1. import static org.apache.commons.lang.WordUtils.*
  2.  
  3. class Greeter extends Greet {
  4. Greeter(who) {
  5. name = capitalize(who)
  6. }
  7. }
  8.  
  9. new Greeter('world').salute()
En línea de comandos:
  1. groovy -e "println 'Hello ' + args[0]" World







martes, 5 de mayo de 2015

Metaprogramación


El proceso de diseñar, codificar,depurary mantener elcódigo fuentedeprogramas computacionales se conoce como programación. El propósito de la programación es crear programas que exhiban un comportamiento deseado. El proceso de escribir código requiere frecuentemente conocimientos en varias áreas distintas, además del dominio del lenguaje a utilizar, algoritmos especializados y lógica formal. Programar no involucra necesariamente otras tareas tales como el análisis y diseño de la aplicación (pero sí el diseño del código), aunque sí suelen estar fusionadas en el desarrollo de pequeñas aplicaciones. 

Del proceso de programación surge lo que comúnmente se conoce comosoftware(conjunto de programas), aunque estrictamente esta última abarca mucho más que sólo la programación. Sin embargo lmetaprogramaciones la programación sobre la programación, o también se puede ver como programas que construyen programas. Uno de los principales objetivos de esta técnica es llevar a tiempo de compilación   cálculos que habitualmente se hacen en tiempo de ejecución.

La metaprogramación no es una nueva idea - Nació hace ya más de 40 años, con el lenguaje Lisp, y se popularizó tremendamente en el lenguaje Smalltalk, a principios de los 80.
La metaprogramación consiste en ver al cerebro y/o mente humana como si fuese un computador, el cual consta de “hardware” y “software”. Partiendo de esa premisa podemos ver que el software con que se maneja nuestra mente el día de hoy, y por ende nuestra vida, no es único ni menos último, sino que podemos cambiarlo a consciencia a través de múltiples técnicas. A esta toma de consciencia y al ejercicio de cambio es lo que se denomina metaprogramación.
La metaprogramacion, es la programación sobre la programación, o también se puede ver como programas que construyen programas. Uno de los principales objetivos de esta técnica es llevar a tiempo de compilación cálculos que habitualmente se hacen en tiempo de ejecución.
      El idioma en que está escrito el metaprograma se llama el metalenguaje. El idioma de los programas que se manipulan se llama el lenguaje objeto. La capacidad de un lenguaje de programación para ser su propio metalenguaje se llama reflexión o reflexividad.
      La reflexión es una característica del lenguaje valiosa para facilitar metaprogramacion.
      Metaprogramación trabaja generalmente en una de tres maneras
      1. Consiste en exponer los componentes internos del motor de tiempo de ejecución al código de programación a través de interfaces de programación de aplicaciones.
      2. la ejecución dinámica de las expresiones que contienen comandos de programación, a menudo compuesto de cadenas, pero también puede ser de otros métodos que utilizan argumentos y/o el contexto. Por lo tanto, "los programas pueden escribir programas." Aunque ambos enfoques pueden ser utilizados en el mismo idioma, la mayoría de los idiomas tienden a inclinarse hacia uno o el otro.

La tercera forma es dar un paso fuera de la lengua por completo. Sistemas de propósito general del programa de transformación, que aceptan descripciones en lenguaje y puede llevar a cabo transformaciones arbitrarias en esos idiomas, son implementaciones directas de metaprogramación general. Esto permite metaprogramming a aplicar a prácticamente cualquier idioma de destino sin importar que la lengua de destino tiene ninguna habilidad metaprogramación propias

      Un compilador se puede pensar como un programa que genera otro programa.
      Un formateador de código es un programa que manipula otro programa.
      Una herramienta como javadoc utiliza nuestro programa para generar su documentación.

REPASANDO CONCEPTOS

Un framework o infraestructura digital, es una estructura conceptual y tecnológica de soporte definido, normalmente con artefactos o módulos de software concretos, que puede servir de base para la organización y desarrollo de software. Típicamente, puede incluir soporte de programas, bibliotecas, y un lenguaje interpretado, entre otras herramientas, para así ayudar a desarrollar y unir los diferentes componentes de un proyecto.
Lisp es una familia de lenguajes de programación de computadora de tipo multiparadigma con una larga historia y una sintaxis completamente entre paréntesis, Lisp es el segundo lenguaje de programación de alto nivel más viejo con un extenso uso hoy en día; solamente FORTRAN es más viejo. Al igual que FORTRAN, Lisp ha cambiado mucho desde sus comienzos y han existido un gran número de dialectos en su historia. Hoy, los dialectos Lisp de propósito general más ampliamente conocidos son Common Lisp y Scheme. Lisp  se convirtió rápidamente en el lenguaje de programación favorito en la investigación de la inteligencia artificial (AI). Como uno de los primeros lenguajes de programación, fue pionero en muchas ideas en ciencias de la computación, incluyendo las estructuras de datos de árbol, el manejo de almacenamiento automático, tipos dinámicos, y el compilador auto contenido.
Smalltalk es un lenguaje reflexivo de programación, orientado a objetos y con tipado dinámico. Por sus características, Smalltalk puede ser considerado también como un entorno de objetos, donde incluso el propio sistema es un objeto. Metafóricamente, se puede considerar que un Smalltalk es un mundo virtual donde viven objetos que se comunican entre sí, mediante el envío de mensajes.
Eval en varios lenguajes de programación, es una función que evalúa el contenido pasado como parámetro como si fuera una expresión. Funciones como eval son más comunes en lenguajes de programación interpretados que compilados, puesto que incluyendo esa función en un lenguaje compilado requiere incluir un intérprete o compilador con el programa, y más información sobre la ejecución (como por ejemplo los nombres de las variables). Algunos lenguajes compilados tienen instrucciones similares a eval.

¿Para qué se usa la metaprogramación?


En general la metaprogramación se utiliza más fuertemente en el desarrollo de frameworks. Simplemente porque un framework va a resolver cierta problemática de una aplicación, pero no va a estar diseñador para ninguna en particular. Es decir, la idea de framework es que se va a poder aplicar y utilizar en diferentes dominios desconocidos para el creador del framework. Entonces estos frameworks van a manipular objetos, sin conocerlos de antemano.

Ejemplos:
  • ORM's como hibernate: que van a encargarse de persistir las instancias de nuestras clases sin siquiera conocerlas de antemano.
  • Frameworks de UI: que deberán saber mostras cualquier objeto.
  • Frameworks de Testing, como JUnit suelen usar metaprogramación para analizar la clase de Test y encontrar los tests que se deben correr.
  • Otras herramientas:
    • javadoc: es una herramienta como el compilador de java, que lee el código fuente y genera documentación html.
    • code coverage: herramientas que miden cuánto de nuestro código es realmente ejecutado al correr los tests, y cuales lineas no.
o    Analizadores de código: que evalúan nuestro código y genera métrics o miden violaciones a reglas definidas.

Modelos y metamodelos

Así como todo programa construye un modelo para describir su dominio. El domino de un metaprograma es otro programa denominado programa objeto o base y tendrá un modelo que describe a ese programa, al que llamamos metamodelo.
En el siguiente ejemplo, nuestro dominio contiene diferentes tipos de animales, entre ellos perros y humanos. 
El programa describe las características de los elementos del dominio utilizando (por ejemplo) clases, métodos y atributos. Entonces, el modelo contiene una clase Perro, que modela a los perros en el domino. Y el programa manipula instancias de la clase Perro.
Un metaprograma tendrá a su vez un (meta)modelo que describe a su dominio, el programa base. Así como en el dominio hay animales concretos, los habitantes del "metadominio" (= programa base) serán los elementos del programa: por ejemplo, clases, atributos, métodos.
Entonces el metamodelo deberá tener clases que permitan describir esos conceptos, por ejemplo en el metamodelo de Java encontraremos las clases Class, Method, Field. Este metamodelo describe la estructura posible de un programa Java. En otro lenguaje, ese metamodelo tendría diferentes elementos.
Así como el programa manipula las instancias de las clases Perro o Animal, el metaprograma manipula las instancias de las clases que conforman el metamodelo (Class, Method, Field, o las que fueran).

Reflection


Es un caso particular de metaprogramación, donde "metaprogramamos" en el mismo lenguaje en que están escritos (o vamos a escribir) los programas. Es decir, todo desde el mismo lenguaje.

Nota: Inicialmente el lenguaje "pionero" en cuanto a reflection fue LISP.

Ejemplos

El ejemplo más visible de esto es el caso de smalltalk, donde no existe una diferenciación entre IDE y nuestro programa. Ambos estan hechos en smalltalk, y de hecho viven en un mismo ambiente. Ambos estan construidos con objetos y pueden interactuar entre sí.
De hecho muchos componentes del "IDE" Pharo son elementos de metaprogramación, y utilizan reflection para inspeccionar nuestras clases y objetos.

Tipos de reflection

Para esto, generalmente, es necesario contar con facilidades o herramientas específicas, digamos "soporte" del lenguaje.  Entonces reflection, además, abarca los siguientes items que vamos a mencionar en esta lista:
  • Introspectionse refiere a la capacidad de un sistema, de analizarse a sí mismo. Algo así como la introspección humana, pero en términos de programa. Para eso, el lenguaje debe proveer ciertas herramientas, que le permitan al mismo programa, "ver" o "reflejar" cada uno de sus componentes.
  • Self-Modificationes la capacidad de un programa de modificarse a sí mismo. Nuevamente esto requiere cierto soporte del lenguaje. Y las limitaciones van a depender de este soporte.
Intercessiones la capacidad de modificar la semántica del modelo que estamos manipulando, desde el mismo lenguaje

La metaprogramación y los lenguajes dinámicos

Podemos categorizar a un lenguaje de dinámico cuando no requiere de ciclos determinados y claramente separados de compilación y ejecución. Mucha gente cree erróneamente que los lenguajes dinámicos (por ejemplo, Perl, Ruby, Python o PHP, ampliamente utilizados en el mundo del Software Libre) son interpretados - La realidad es completamente distinta, son lenguajes que cuentan con compiladores tremendamente eficientes, que en fracciones de segundo pueden convertir decenas de miles de ­líneas de código en una representación binaria (bytecode para sus respectivas máquinas virtuales). La caracterí­stica que define estos lenguajes como dinámicos no es el compilador ágil (aunque, claro está, lo requieren) - Es la presencia de la instrucción (o familia de instrucciones) «eval».
En resumidas cuentas, eval recibe un parámetro, tí­picamente una cadena, y lo evalúa como código fuente.

BIBLIOGRAFIA 

Gunnar Wolf .México .Documento en líneaDisponible en: http://sg.com.mx/content/view/636 


Wikipedia. Documento en linea.Disponible en: http://es.wikipedia.org/wiki/Lisp 
Wikipedia. Documento en linea.Disponible enhttp://es.wikipedia.org/wiki/Smalltalk 
Wikipedia. Documento en linea.Disponible enhttp://es.wikipedia.org/wiki/L%C3%ADnea_de_abonado_digital 
Wikipedia. Documento en linea.Disponible enhttp://es.wikipedia.org/wiki/Eval