# Euphoria (linguagem de programação)

Euphoria é uma linguagem de programação interpretada procedural de alto nível, criada por Robert Craig, da Rapid Deployment Software, em julho de 1993, e atualmente mantida pelo openEuphoria Group. A partir da versão 3.0.0, lançada em 19 de setembro de 2006, passou a ser totalmente código aberto (sob uma licença MIT modificada). Sua última versão estável foi a 4.0.5, lançada em 19 de outubro de 2012. O seu interpretador possui 30% de seu código fonte (front-end) em Euphoria e 70% (back-end) em C. A linguagem possui suporte a programação multitarefa, que possibilita a execução de várias tarefas simultaneamente, que pode ser útil na criação de jogos. O Euphoria pode ser usado como aplicação CGI. O File Archive Search é uma aplicação CGI e é escrito em Euphoria, por exemplo. Também pode ser usado como RAD, programando-se rapidamente em Euphoria, e depois traduzindo o código para C, usando o seu tradutor automático.
A linguagem possui um conjunto de tipos de dados simplista, constituído de quatro tipos: object, atom, integer e sequence.

## História

O Euphoria teve sua primeira versão publicada em Julho de 1993, como sendo um projeto de código fechado. Porém, a partir da versão 3.0.0, lançada em 19 de setembro de 2006, passou a ser totalmente código aberto (algumas partes do pacote já eram código aberto desde a versão 2.5 Alpha). Sua última versão estável foi a 4.0.5, e foi lançada em 19 de outubro de 2012.
Desenvolvida inicialmente como um projeto pessoal, para inventar uma linguagem de programação do zero, Euphoria teve sua real primeira versão criada por Robert Craig, para um Atari Mega-ST. A versão original para Atari Mega-ST, nunca foi lançada. A primeira “encarnação” mundialmente visível da linguagem, foi para o sistema DOS de 32 bit. Versões atuais, além do DOS de 32 bit, suportam Microsoft Windows, Linux e FreeBSD. Com o lançamento da versão 2.5 Alpha, lançada em 15 de novembro de 2004, o interpretador do Euphoria, foi dividido em três partes: o analisador sintático, o front-end e o back-end. O tradutor “Euphoria-para-C”, o encadernador (binder), e o front-end, possuem 100% de seus códigos em Euphoria, e o back-end possui 100% de seu código em C. O interpretador possui 30% de seu código (front-end) em Euphoria e 70% (back-end) em C.
O Euphoria, foi primeiramente usada como passatempo para programação de jogos e para criação de inteligência artificial, mas provou ser útil para os mais diversos propósitos. Já existem programas criados usando Euphoria, e programas que usam Euphoria, como linguagem de script. Um bom exemplo, é o SDK do 3DSTATE 3D Engine, o 3D Developer Studio.

## Características

O Euphoria foi desenvolvido com os seguintes objetivos em mente:
* Ser fácil de aprender e usar, igualmente ao BASIC, com construções de alto nível, mais consistentes
* Fornecer capacidades de programação de baixo nível, como C++, porém mais estruturada e mais abstrata que uma linguagem de baixo nível, fazendo a mesma menos perigosa
* Dar extensivo suporte a depuração, checagem de subscrição, checagem de tipo, e gerenciamento de memória automáticos
* Suporte para tipos definidos pelo usuário, com variáveis livres ou rigorosas, de acordo com o desejado
* Interpretado, com gerência de memória e coletor de lixo automáticos
* Ser veloz o bastante para rivalizar à altura com as linguagens compiladas, apesar de ser interpretada. A Rapid Deployment Software garante que o interpretador do Euphoria é 31 vezes mais rápido do que Python, 35 vezes mais rápido do que Perl e, consideravelmente mais rápido que todas as outras linguagens interpretadas, comparando valores do Great Computer Language Shootout, com os valores de um benchmark, que está no pacote padrão
O Euphoria suporta chamadas de rotinas de código de máquina, carregamento de DLLs e bibliotecas compartilhadas (shared library) dinamicamente, e funções de C.
O Euphoria não requer indentação (diferente de Python) e nem requer ponto e vírgula (;) no final de cada comando (diferente de C). Ele pode conter mais de um comando em uma mesma linha e, ele ignora os espaços em branco:
O exemplo acima é o mesmo que:

### Etimologia

O nome “Euphoria”, é um acrônimo para: “End User Programming with Hierarchical Objects for Robust Interpreted Applications” (em português: “Programação para Usuário Final com Objetos Hierárquicos para Aplicações Interpretadas Robustas”). Seu nome se pronuncia “Eufór-ia”.

### Tipos de arquivo

Os arquivos de código de Euphoria são divididos em sete tipos de arquivo e, usam as seguintes extensões:
* .E (Biblioteca DOS)
* .EU (Biblioteca Linux/FreeBSD)
* .EW (Biblioteca Windows)
* .EX (Programa DOS)
* .EXU (Programa Linux/FreeBSD)
* .EXW (Programa Windows)
* .IL (Programa coberto, multiplataforma)

### Tipos de dado

O Euphoria tem um tipo de dado básico:

#### object

    Um tipo de dado genérico que pode conter qualquer tipo de elemento, e pode ser mudado durante a execução. Isso significa que se o programador tem um object chamado X que possui o valor 3.1415926, então depois o programador pode atribuir para X o valor "ABC". Um object pode ser classificado como um atom, integer ou sequence.
Adicionalmente, Euphoria tem três tipos de dado “especializados”:

#### atom

    Esses são números, implementados como inteiro ou fracionário de 32 bit ou 64 bit, dependendo do valor atual. Ele armazena os valores inteiros em 4 Bytes. Quando um atom inteiro recebe um valor fracionário, ele o converte e armazena o mesmo para fracionário de 8 Bytes, automaticamente.

#### integer

    Uma forma especial de atom, restrita a valores inteiros de 31 bit, numa faixa de -1073741824 até 1073741823. Esse tipo de dado é mais eficientes do que o atom, mas não pode conter a mesma extensão. Caracteres são armazenados como inteiros (exemplo: codificando A de ASCII é exatamente o mesmo que 65).

#### sequence

    Vetor que pode conter zero ou mais elementos; cada elemento é um object. O número de elementos na sequence não é fixa; o codificador pode adicionar ou remover elementos quando requirido durante a execução. Euphoria automaticamente “manobra” a alocação e a desalocação de memória, e automaticamente “coleta lixo” para o programador. Elementos individuais são referenciados usando um valor no índice fechado em colchetes. O primeiro elemento numa sequence tem um índice de 1. Elementos embutidos dentro de sequences são referenciados pelo colchete adicional, desde modo, X[3][2], refere-se ao segundo elemento do terceiro elemento de X. Exemplo: Se X = {"ABC","DEF","GHI"}, então X[3][2] = 'H'.
Em Euphoria não há o conceito de estruturas de dados, como em C. Um exemplo de uma sequence:
O exemplo acima é o mesmo que:
Como isso pode ser complicado, sequences podem ser usados de forma mais simplificada:
Os números podem ser colocados em hexadecimal:

### Caso-sensibilidade

Euphoria é caso-sensitivo, isto é, reconhece a diferença entre maiúsculas e minúsculas. Exemplo: A é diferente de a, já que em ASCII, A equivale a 65 e, a equivale a 97. Outro exemplo:
É o mesmo que:
Que, por sua vez, é o mesmo que:
Essa regra se aplica a tudo em Euphoria, inclusive aos nomes de variáveis e os comandos:
A primeira declaração, no exemplo acima, está incorreta, pois todos os comandos de Euphoria devem estar em minúsculas.

### Multitarefa

A linguagem possui suporte a programação multitarefa (do inglês multitasking), que possibilita a execução de várias tarefas simultaneamente, com uma velocidade razoável, que pode ser útil na criação de jogos que precisem executar múltiplas tarefas.
Junto dos exemplos do pacote padrão, existe um jogo chamado “Language War” (Guerra da linguagem), que demonstra o uso desta função. O jogo apresenta uma guerra entre times com nomes de linguagens famosas: EUPHORIA, Assembly, K&R C, ANSI C, C++, BASIC e, Java, onde o jogador controla o time EUPHORIA, e o computador controla os demais times. Esse exemplo é baseado num jogo de guerra espacial, desenvolvido em 1979, para o TRS-80, por David A. Craig e Robert Craig. Funciona apenas no DOS e no Windows, em resolução de tela de 640x480 e em 16 cores. Há também outro exemplo, que exibe vários “E”s girando independente e simultaneamente. Esse mesmo só pode ser executado no ambiente Windows, por estar em uma janela.
No total, Euphoria possui nove comandos que constituem sua característica multitarefa; são eles:
* task_create
* task_yield
* task_schedule
* task_list
* task_self
* task_status
* task_suspend
* task_clock_start
* task_clock_stop

### Gerenciamento de memória automático

No Euphoria, a alocação de memória acontece automaticamente, e os tipos de dado são convertidos dinamicamente, não sendo necessária a conversão, pois o tipo de dado é convertido assim que necessário e automaticamente. Exemplo: se há uma variável com um valor inteiro e a essa variável for atribuído um valor fracionário, essa variável será convertida para suportar o valor fracionário, alocando-se automaticamente memória suficiente para o mesmo, diferentemente de C/C++.

### Declarações e variáveis

Variáveis são palavras que recebem um determinado valor. Para se usar variáveis, é necessário que sejam declaradas primeiro, colocando seu tipo seguido do nome da variável:

#### Constantes

Além da variável comum, existem as variáveis constantes, que não recebem valores depois de terem recebido um valor inicial atribuído à mesma.
As constantes também devem ter um valor atribuído durante sua declaração, diferente das variáveis comuns. O tipo de dado de uma constante é object.

#### Global / Local

De todas as funções, procedimentos e variáveis, existem dois tipos: as globais e as locais. As globais são acessíveis de todos os arquivos; as locais, só são acessíveis do arquivo de onde foram declaradas. Um arquivo só pode acessar uma função em uma biblioteca inclusa, porque ela é global. Se ele fosse local, a mesma não poderia ser usada, exceto pelas funções de dentro da biblioteca. Quando uma função/procedimento/variável é declarada como local/global, assim ela será até o fim da execução do programa. Exemplo:
Por padrão, todas as funções, procedimentos e variáveis, são locais.

### Estruturas de controle e operadores

Estruturas de controle são comandos básicos que são usados para realizar comparações lógicas e repetições. Há três estruturas de controle em Euphoria: if, while, for. Operadores são símbolos especiais, que servem para fazer ações matemáticas, ou comparações lógicas, dentro de estruturas de controle.

### Caracteres especiais

O Euphoria, como em outras linguagens de programação, possui caracteres especiais, que servem como formatação de texto básica. Os suportados por Euphoria são:
| Caractere | Descrição |
| \n | Nova linha |
| \r | Oculta o caractere à esquerda |
| \t | Tabulação |
| \\ | Permite passar barra (\) como um sequence |
| \' | Permite passar aspas simples (') como um sequence |
| \" | Permite passar aspas duplas (") como um sequence |
| -- | Comentários não-multi-linha (não se propagam para outras linhas), que são ignorados pelo Euphoria. |

### Declarações Top-Level

Declarações Top-Level são comandos que afetam o código por inteiro. Esses comandos sempre são colocados no início do código. Não é obrigatório o uso de qualquer opção.

#### include

O Euphoria possui bibliotecas, como qualquer outra linguagem; para acessá-la, basta usar a declaração include. Para usá-la, basta seguir o modelo:
Exemplo:
Para incluir uma biblioteca com êxito, deve-se incluir sua extensão (normalmente .e). Também deve-se incluí-las uma de cada vez, e o nome da biblioteca não pode conter espaços em branco.
Esta estrutura também serve para permitir que o programador divida seu código em mútiplas partes, para que o código fique mais organizado. Nisso, apenas as variáveis e funções globais serão inclusas.

#### Espaço de nomes

Caso duas ou mais bibliotecas tenham uma função com o mesmo nome, deve-se usar um identificador de espaço de nomes (do inglês namespace identifier), para resolver o conflito. Esses identificadores são representados por as. Exemplo:
Os identificadores só são aplicados durante a inclusão de uma biblioteca. Para acessar uma função ou variável dessas bibliotecas, usa-se o identificador seguido de dois pontos (:) e o nome da função ou variável. Exemplo:

#### with / without

O Euphoria também possui opções, para personalizar a forma como o código será iniciado. Para ativar uma opção, coloca-se with, seguida da opção e, para desativar uma opção, coloca-se without, seguida da opção. Exemplo:
Ao todo, são cinco opções: profile, profile_time, trace, type_check e warning. Inicialmente, type_check e warning estão ativadas e, profile, profile_time e trace, estão desativadas. É necessário que se ative/desative as opções uma de cada vez.

## Pacote padrão

O Euphoria é distribuído num pacote, que inclui ferramentas básicas, que auxiliam a programação no mesmo. No Windows, ele vem com um instalador, que instala e configura o Euphoria rápida e automaticamente. O pacote inteiro gira em torno de 2 Megabytes, permitindo ser baixado rapidamente. Ele inclui:
* Interpretador (front-end e back-end), binder e shrouder, e o tradutor Euphoria-para-C
* Biblioteca padrão, com rotinas relativas ao desenvolvimento de jogos e programas diversos
* Euphoria Editor (ED) - Um editor com suporte a realce de sintaxe
* Euphoria Database System (EDS) - Um sistema de banco de dados para uso com programas Euphoria
* Manual da linguagem e de suas ferramentas
* Tutorial e exemplos de código para ajudar no aprendizado da linguagem
* FAQ (Frequently Asked Questions - Questões Freqüentemente Perguntadas) para os problemas mais conhecidos
* Notas de lançamento e um documento com 24 razões para mudar de C/C++ para Euphoria
* Manual com dicas para melhorar o desempenho dos códigos de programas Euphoria e, um manual com documentação das funções específicas de plataforma
* Guia de como usar Euphoria como aplicação CGI
* Código fonte do Euphoria, parcialmente em Euphoria e C
* Dois ícones do Euphoria: um colorido e outro em escala de cinza
Ele também contém partes do CauseWay DOS Extender e da biblioteca Allegro, ambos sob domínio público.

### Licença

O Euphoria é lançado sob uma licença MIT modificada, que permite a comercialização do mesmo. Ela explica que o Euphoria não tem nenhuma garantia, e pede, mas não requer, que programadores coloquem algum reconhecimento da linguagem e da comunidade oficial de desenvolvimento do Euphoria, em programas criados no mesmo, e colocando também, uma ligação para a página oficial do Euphoria. A RDS encoraja que pessoas modifiquem, sublicenciem, distribuem e vendam o Euphoria. Por este motivo, há diversas versões não-oficiais do Euphoria, espalhadas pela Internet, com diferentes licenças de uso.

### Distribuição de programas Euphoria

Há quatro formas de se distribuir programas Euphoria:
* O código fonte em Euphoria pode ser distribuído da mesma forma que foi escrito. O usuário final precisará do interpretador para executar o código
* O código pode ser “coberto”, usando o shrouder, para proteger o código fonte, onde todos os códigos Euphoria são compilados para um único arquivo, numa linguagem intermediária bytecode de baixo nível, o Euphoria IL (Euphoria Intermediate Language), impedindo que outros possam ver, copiar, ou modificar o código fonte. O código IL pode ser interpretado pelo back-end, que é também uma máquina virtual
* O código fonte em Euphoria pode ser “encadernado”, usando o binder, onde todos os códigos Euphoria são embutidos em um único interpretador, para uma fácil distribuição. Opcionalmente, pode-se aplicar um ícone ao executável (Windows, somente). Como o shrouder, o código estará protegido contra cópias. A desvantagem, em relação ao método anterior, é que o código terá alguns Kilobytes a mais e, a vantagem é que o código não necessita do interpretador ou do back-end, para ser executado. Ao invés disso, ele se auto-interpreta, já que está embutido no interpretador
* O usuário pode usar o tradutor de “Euphoria-para-C”, para converter o código fonte em Euphoria, num código fonte de C, e então compilar, usando um compilador de C, em um código de máquina. Usando essa técnica, além de poder criar um programa mais ágil, pode-se criar programas como bibliotecas dinâmicas. O tradutor e capaz de produzir código C, compatível com cinco compiladores: Borland C++ Builder, DJGPP, GCC, LCC e Watcom
Quando o código passa pelo binder ou pelo shrouder, o código é revisado automaticamente, e as rotinas e as variáveis não usadas, são apagadas, para otimizar a velocidade do código e diminuir o tamanho do mesmo.

## Livros

Existem alguns livros comerciais recomendados pelos autores de Euphoria que possuem conteúdo não-diretamente ligado à programação em Euphoria, mas que podem ser muito úteis para o aprendizado no mesmo, já que o manual oficial é muito direto, e não possui muitas partes teóricas. Abaixo segue-se uma lista:
* The C Programming Language – este é o livro padrão na programação em C. Já que Euphoria pode ser programado com C, de várias formas, este livro pode ser de boa ajuda para se conhecer um pouco sobre C. Este livro é breve, completo e bem estruturado
* Programming Windows - Fifth Edition – este livro ensina programação de baixo nível em Windows usando C e a Win32 API. O que for aprendido, pode ser facilmente adaptado a Euphoria
* Wikinomics - How Mass Collaboration Changes Everything – este livro aborda assuntos relacionados a softwares código aberto e colaboração em massa