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 thumb|esquerda|360px|Interpretador do Euphoria 3.1.1, sendo executado no Windows. 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.
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:
object r r = 1
O exemplo acima é o mesmo que:
object r r = 1
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, refere-se ao segundo elemento do terceiro elemento de X. Exemplo: Se X = {"ABC","DEF","GHI"}, então X = 'H'.
Em Euphoria não há o conceito de estruturas de dados, como em C. Um exemplo de uma sequence:
object r r = {"A", "B", "C", "D", "E", "F", "G"}
O exemplo acima é o mesmo que:
object r r = {65, 66, 67, 68, 69, 70, 71}
Como isso pode ser complicado, sequences podem ser usados de forma mais simplificada:
object r r = "ABCDEFG"
Os números podem ser colocados em hexadecimal:
object r, i, c, s, v r = #152 -- r é igual a 82 ou 'R' i = #FE -- i é igual a 254 c = #A000 -- c é igual a 40960 s = #FFFF00008 -- s é igual a 68718428168 v = -#10 -- v é igual a -16
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:
object r r = "ABCabc"
É o mesmo que:
object r r = {65, 66, 67, 97, 98, 99}
Que, por sua vez, é o mesmo que:
object r r = {"A", "B", "C", "a", "b", "c"}
Essa regra se aplica a tudo em Euphoria, inclusive aos nomes de variáveis e os comandos:
OBJECT R R = "ABC" -- Forma incorreta PUTS(1, R)
object I I = "ABC" -- Forma correta puts(1, I)
object c c = "ABC" -- Forma correta puts(1, c)
A primeira declaração, no exemplo acima, está incorreta, pois todos os comandos de Euphoria devem estar em minúsculas.
Multitarefa thumb|360px|Jogo “Language War”, feito em Euphoria 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:
object r -- Declara r como object atom i -- Declara i como atom integer c -- Declara c como integer sequence v -- Declara v como sequence
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.
constant r = 1 -- Declara r como constant de valor 1
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:
global constant r = 1 -- Declara r como constant global de valor 1 global object i -- Declara i como object global integer c -- Declara c como integer local function s() end function -- Declara s como função local global procedure v() end procedure -- Declara v como procedimento global
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:
CaractereDescrição\nNova linha\rOculta o caractere à esquerda\tTabulaçã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