# EUPHORIA (lenguaje de programación)

EUPHORIA (acrónimo del inglés: "End User Programming with Hierarchical Objects for Robust Interpreted Applications"), es un lenguaje de programación interpretado, de alto nivel, estructurado, imperativo, y motor de juego, simultáneamente, creado por Robert Craig en 1993 como su tesis doctoral, y luego comercializado por la firma RDS (Rapid Deployment Software). Euphoria es de dominio público y de código abierto. El código fuente del intérprete Euphoria está escrito completamente en lenguaje EUPHORIA.
El lenguaje posee soporte a la programación multitarea, que posibilita la ejecución de varias tareas simultáneamente, con una velocidad razonable, y puede ser útil en la creación de juegos que precisan ejecutar múltiples tareas.
Es un lenguaje simple y potente, que, comparado con otros lenguajes interpretados, ofrece una bastante mayor velocidad de ejecución, principalmente en entornos de texto. Aunque no es orientado a objeto su particular flexibilidad en el manejo de datos, rendimiento y sencillez lo convierten en una opción muy atractiva para desarrollos en las plataformas más utilizadas de 32 bits.
En cuanto a la programación en entornos gráficos, el intérprete ofrece una gama tal vez algo limitada de instrucciones, pero se mejora notablemente con el uso de librerías externas y con un entorno de desarrollo IDE/RAD disponible en forma gratuita.
Existe un traductor gratuito de EUPHORIA a C que permite generar a partir de código EUPHORIA un programa en lenguaje C para diversos compiladores disponibles, en DOS, Windows y Linux/BSD, con lo cual su velocidad de ejecución se puede incrementar al máximo.

## Historia

La primera versión de EUPHORIA fue publicada en julio de 1993, siendo un proyecto de código cerrado. A partir de la versión 3.0.0, lanzada el 19 de septiembre de 2006, pasó a ser totalmente código abierto (algunas partes del paquete ya estaban en dominio público, desde la versión 2.5 Alpha). Su última versión la 3.1.1 fue lanzada el 22 de agosto de 2007.
Desarrollado inicialmente como un proyecto personal, para inventar un lenguaje de programación desde cero, Euphoria tuvo su primera versión real para un Atari ST . La versión original para Atari ST, nunca fue lanzada. La primera aparición mundialmente visible del lenguaje, fue para el sistema DOS de 32 bits. Versiones actuales, además del DOS de 32 bits, soportan Microsoft Windows, Linux y FreeBSD. Los programadores involucrados en el proyecto (GNU) están actualmente trabajando para el desarrollo de versiones de 64 bits. Con el lanzamiento de la versión 2.5 Alpha, lanzada el 15 de noviembre de 2004, el intérprete de EUPHORIA, fue dividido en tres partes: un analizador sintáctico, un front-end, y un back-end, las primeras dos partes escritas en Euphoria y liberadas al dominio público y la tercera escrita en C se mantuvo secreta y solo se vendía bajo una licencia bastante restrictiva.
En 2008 se liberó la versión 3.0, como software libre con código fuente totalmente abierto. En el mismo año 2008 se liberaron dos versiones con ligeras modificaciones 3.1 y 3.1.1 y se empezó el desarrollo de la versión 4.0.
EUPHORIA, fue primeramente usado como pasatiempo para programación de juegos y para la creación de inteligencia artificial, mas probó ser útil para los más diversos propósitos. Ya existen programas creados usando EUPHORIA, y programas que usan EUPHORIA, como script para su programa. Un buen ejemplo, es el SDK de 3DSTATE 3D Engine, y 3D Developer Studio.

## Características

EUPHORIA fue desarrollado para que cumpliera con las siguientes premisas:
* Simplicidad: facilidad para su aprendizaje y uso rápidos.
* Poder: capacidades de programación en bajo nivel necesarias para acceder a rutinas del sistema operativo, memoria RAM, dispositivos, puertos y BIOS. Enlace simple con rutinas C.
* Seguridad: extenso soporte de depuración, chequeo de tipo de datos y gestión de memoria automática.
* Flexibilidad: soporte para tipos implícitos sencillos, potentes, dinámicos y también otros definidos por el usuario.
* Velocidad: velocidad suficiente para rivalizar con los lenguajes compilados puros.
* Eficiencia: desarrollo rápido de aplicaciones eficientes y robustas, con muy escaso consumo de recursos hardware.
* Gestión de Memoria: Gestión automática de memoria virtual, independientemente del sistema operativo.

### Tipos de archivo

Los archivos de código más comunes de EUPHORIA corresponden con los siguientes tipos y extensiones:
* .E (Biblioteca DOS - texto)
* .EU (Biblioteca Linux/FreeBSD - texto)
* .EW (Biblioteca Windows - texto)
* .EX (Ejecutable con Intérprete externo DOS32 - texto)
* .EXU (Ejecutable con Intérprete externo Linux/FreeBSD - texto)
* .EXW (Ejecutable con Intérprete externo Windows32 - texto)
* .IL (Programa multiplataforma - binario)
* .EXE (Ejecutable que incluye un pequeño intérprete - binario)
* .PRJ (Proyecto armado mediante la IDE EUPHORIA - texto)

### Tipos de datos

EUPHORIA tiene un tipo de dato básico:
* object: Un tipo de dato genérico que puede contener cualquier tipo de elemento, y puede ser cambiado durante la ejecución. Eso significa que si el programador tiene un objeto llamado X que posee el valor 3.172, después el programador puede darle a X el valor "ABC".
Adicionalmente, Euphoria tiene tres tipos de dato "especializados":
* atom: números implementados como enteros o fracionários de 32 bit o 64 bit, dependiendo del valor actual. Almacena los valores enteros en 4 bytes.
* integer: una forma especial de atom, restricta a valores enteros de 31 bits. Ese tipo de dato es más eficiente que el atom, pero no puede contener la misma extensión. Los caracteres son almacenados como enteros.
* sequence: Vector que puede contener cero o más elementos; cada elemento es un objeto. La cantidad de elementos a contener no es fija; el codificador puede agregar o quitar elementos cuando es requerido durante la ejecución.
Ejemplo de una secuencia:
El ejemplo de arriba es lo mismo que:
Donde cada elemento se reemplazó por su código ASCII. Como esto puede ser complicado, las secuencias pueden ser usadas de forma aún más simplificada:
que también puede ser declarado como:
Los números pueden ser colocados en hexadecimal: