Saltar para o conteúdo

Euphoria (linguagem de programação)

Origem: Wikipédia, a enciclopédia livre.
 Nota: Para outros significados, veja Euphoria.
Euphoria

Demonstração da função multitarefa
Paradigma Programação procedural
Surgido em julho de 1993 (31 anos)
Última versão 4.1.0 (2 de fevereiro de 2015; há 9 anos)
Criado por Robert Craig
Estilo de tipagem Dinâmica, fraca
Influenciada por BASIC, C, C++
Influenciou Py
Licença MIT modificada[1]
Extensão do arquivo
  • .e
  • .ex
  • .exw
  • .edb
Página oficial openeuphoria.org

Euphoria é uma linguagem de programação interpretada procedural de alto nível, criada por Robert Craig, da Rapid Deployment Software,[2] 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).[1] Sua última versão estável foi a 4.0.5, lançada em 19 de outubro de 2012.[3] O seu interpretador possui 30% de seu código fonte (front-end) em Euphoria e 70% (back-end) em C.[4] 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.[5] O File Archive Search[6] é 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.[7][8]

A linguagem possui um conjunto de tipos de dados simplista, constituído de quatro tipos: object, atom, integer e sequence.[9]

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.[3]

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.[10] 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.[4]

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.[11] 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.[12]

Características

[editar | editar código-fonte]

O Euphoria foi desenvolvido com os seguintes objetivos em mente:[13]

  • 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[14]
  • Dar extensivo suporte a depuração, checagem de subscrição, checagem de tipo, e gerenciamento de memória automáticos[15]
  • 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[13] 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,[16] 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.[17]

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:[9]

object   r r   =   1

O exemplo acima é o mesmo que:

object r
r = 1

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”.[13]

Tipos de arquivo

[editar | editar código-fonte]

Os arquivos de código de Euphoria são divididos em sete tipos de arquivo e, usam as seguintes extensões:[18]

  • .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

[editar | editar código-fonte]

O Euphoria tem um tipo de dado básico:[9]

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:

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

[editar | editar código-fonte]

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.[9] 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.

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,[19] 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.[20] 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.[21]

No total, Euphoria possui nove comandos que constituem sua característica multitarefa; são eles:[19]

  • 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

[editar | editar código-fonte]

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++.[9]

Declarações e variáveis

[editar | editar código-fonte]

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:[9]

object r   -- Declara r como object
atom i     -- Declara i como atom
integer c  -- Declara c como integer
sequence v -- Declara v como sequence

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.[9]

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

[editar | editar código-fonte]

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.[9] 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

[editar | editar código-fonte]

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.[9]

Caracteres especiais

[editar | editar código-fonte]

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:[9]

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

[editar | editar código-fonte]

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.[9]

O Euphoria possui bibliotecas, como qualquer outra linguagem; para acessá-la, basta usar a declaração include.[9] Para usá-la, basta seguir o modelo:

include biblioteca.extensão

Exemplo:

include machine.e -- Inclui a biblioteca machine.e

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

[editar | editar código-fonte]

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.[9] Exemplo:

include biblioteca1.e as b1 -- Aplica o identificador b1 à biblioteca
include biblioteca2.e as b2 -- Aplica o identificador b2 à biblioteca

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:

b1:r = 1 -- Atribui a r (de b1) o valor 1
b2:r = 2 -- Atribui a r (de b2) o valor 2

with / without

[editar | editar código-fonte]

O Euphoria também possui opções,[9] 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:

with profile    -- Ativa profile
without profile -- Desativa profile
without warning -- Desativa warning

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

[editar | editar código-fonte]
Editor oficial do Euphoria

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,[22] e o tradutor Euphoria-para-C[7]
  • Biblioteca padrão,[17] com rotinas relativas ao desenvolvimento de jogos e programas diversos
  • Euphoria Editor (ED) - Um editor com suporte a realce de sintaxe[23]
  • Euphoria Database System (EDS) - Um sistema de banco de dados para uso com programas Euphoria[24]
  • Manual da linguagem e de suas ferramentas[18]
  • Tutorial e exemplos de código para ajudar no aprendizado da linguagem
  • FAQ (Frequently Asked Questions - Questões Freqüentemente Perguntadas)[25] para os problemas mais conhecidos
  • Notas de lançamento[4] e um documento com 24 razões para mudar de C/C++ para Euphoria[26]
  • Manual com dicas para melhorar o desempenho dos códigos[27] 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.[7]

O Euphoria é lançado sob uma licença MIT modificada, que permite a comercialização do mesmo.[1] 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[13] 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

[editar | editar código-fonte]

Há quatro formas de se distribuir programas Euphoria:[18]

  • 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[22]
  • 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[22]
  • 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[7]

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.[22]

Exemplos de código

[editar | editar código-fonte]
puts(1, "Olá, Mundo!\n")

Existem alguns livros comerciais recomendados pelos autores de Euphoria[28] 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[29] é 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
Outros projetos Wikimedia também contêm material sobre este tema:
Commons Imagens e media no Commons

Referências

  1. a b c «Euphoria Manual - Licensing» (em inglês). Consultado em 2 de outubro de 2012 
  2. «O que é o Euphoria» (em inglês). Consultado em 30 de abril de 2010 
  3. a b «Euphoria 4.0.5 Released» (em inglês). Consultado em 10 de fevereiro de 2013 
  4. a b c «História de Euphoria» (em inglês). Consultado em 30 de abril de 2010. Arquivado do original em 14 de julho de 2012 
  5. «Euphoria como aplicação CGI» (em inglês). Consultado em 30 de abril de 2010 
  6. «File Archive Search» (em inglês). Consultado em 30 de abril de 2010 
  7. a b c d «Euphoria To C Translator» (em inglês). Consultado em 30 de abril de 2010 
  8. Gelli, Sérgio. «Como aprender a programar e produzir aplicativos usando Euphoria». Viva o Linux. Consultado em 2 de outubro de 2012 
  9. a b c d e f g h i j k l m n «Language Definition» (em inglês). Consultado em 30 de abril de 2010 
  10. «Euphoria: Obscure Programming Language of the Month» (em inglês). Consultado em 30 de abril de 2010 
  11. «Tarefas na qual o Euphoria é bom» (em inglês). Consultado em 30 de abril de 2010 
  12. «3D Developer Studio» (em inglês). Consultado em 30 de abril de 2010 
  13. a b c d «Encorajamento da RDS, para vender o Euphoria» (em inglês). Consultado em 30 de abril de 2010 
  14. «Platform-Specific Issues for Euphoria» (em inglês). Consultado em 30 de abril de 2010 
  15. «Debugging and Profiling» (em inglês). Consultado em 30 de abril de 2010 
  16. «Teste de velocidade feito no Great Computer Language Shootout, por Doug Bagley» (em inglês). Consultado em 30 de abril de 2010 
  17. a b «Biblioteca padrão do Euphoria» (em inglês). Consultado em 30 de abril de 2010 
  18. a b c «Core Language» (em inglês). Consultado em 30 de abril de 2010 
  19. a b «Multitarefa em Euphoria» (em inglês). Consultado em 30 de abril de 2010 
  20. «Euphoric about Euphoria» (em inglês). Consultado em 30 de abril de 2010 
  21. «Language War» (em inglês). Consultado em 30 de abril de 2010 
  22. a b c d «Binder e Shrouder» (em inglês). Consultado em 30 de abril de 2010 
  23. «ED, o editor oficial» (em inglês). Consultado em 30 de abril de 2010 
  24. «Euphoria Database System» (em inglês). Consultado em 30 de abril de 2010 
  25. «FAQ do Euphoria» (em inglês). Consultado em 30 de abril de 2010 
  26. «24 razões para mudar de C/C++ para Euphoria» (em inglês). Consultado em 30 de abril de 2010 
  27. «Manual para melhorar o desempenho de programas Euphoria» (em inglês). Consultado em 30 de abril de 2010 
  28. «Livros sobre Euphoria» (em inglês). Consultado em 30 de abril de 2010 
  29. «Manual on-line» (em inglês). Consultado em 30 de abril de 2010 

Ligações externas

[editar | editar código-fonte]