Euphoria este un limbaj de programare creat de Robert Craig (Rapid Deployment Software)[2] în Canada, Toronto. Numele Euphoria este un acronim pentru «End-User Programming with Hierarchical Objects for Robust Interpreted Applications».
Prima lansare publică[3] a fost destinată mașinilor pe 32 de biți (i386) cu MS-DOS și a fost autorizată (1993). În 2006, odată cu lansarea versiunii 3[4], proiectul Euphoria a devenit deschis, iar comunitatea OpenEuphoria[5] a început să o dezvolte, iar în decembrie 2010 a lansat versiunea 4[6] cu un nou logo și mascot[7]. În prezent, OpenEuphoria versiunea 4. * lansată pentru Microsoft Windows, Linux, Mac OS X și trei sisteme BSD (FreeBSD, NetBSD, OpenBSD).
Euphoria este un limbaj imperativ interpretabil, de nivel înalt, cu scop general. Folosind un traducător de la codul sursă pe Euphoria, poate fi generat un cod sursă C, care la rândul său poate fi compilat într-un fișier executabil sau într-o bibliotecă dinamică folosind compilatoare cum ar fi GCC, OpenWatcom etc. Mai multe biblioteci GUI sunt suportate, inclusiv Win32lib[8] și wrappers pentru wxWidgets[9], GTK +[10] și IUP[11]. Euphoria are un sistem de baze de date simple[12] și ambalaje pentru lucrul cu alte tipuri de baze de date[13].
Prezentare
Euphoria este un limbaj procedural de uz general, ale cărui caracteristici distinctive sunt simplitatea, lizibilitatea, desfășurarea rapidă și performanțele ridicate.
Simplitate
Limbajul utilizează numai patru tipuri de date încorporate (a se vedea mai jos).
Colecția automată de gunoi.
Lizibilitate
Pentru a separa construcțiile sintactice, sunt folosite cuvinte cheie simple din limba engleză, mai degrabă decât semne de punctuație.
Implementare rapidă
Euphoria este un limbaj interpretat care facilitează prototiparea și dezvoltarea incrementală.
Productivitate
Euphoria folosește un colector eficient de gunoi care numără referințe și procesează corect referințele circulare.
Caracteristici distinctive
Euphoria a fost concepută și dezvoltată cu următoarele obiective și trăsături distinctive:
Ușurința de învățare și simplitatea structurilor de nivel înalt
Realizarea modelului de memorie "plat" pe 32 de biți pentru versiunea MS-DOS, care evită dificultățile de gestionare a memoriei și limitarea obiectelor în funcție de dimensiune și adresă
Suportă depanarea și gestionarea erorilor în timpul rulării
Controlul asupra limitelor matricelor
Tipărirea dinamică și puternică a variabilelor
Interpretabilitate cu gestionarea automată a memoriei și colectarea gunoiului
Tipuri de colecții heterogene (secvențe)
Biblioteca grafică DOS (Versiuni ale limbajului Euphoria până la 3.1.1 inclusiv)
Debugger
Sistem de baze de date încorporate
Posibilitatea de gestionare a memoriei la nivel scăzut (utilizată de obicei atunci când interacționați cu codul localizat în biblioteci dinamice)
Traducerea programului în limbajul C urmată de compilarea într-un modul executabil separat sau dintr-o bibliotecă dinamică
Compilația în Bytecode[8] și interpretarea ulterioară
Conectarea bytecode cu interpret[8] pentru a obține fișier executabil
Execuția interactivă (REPL) - în planurile comunității openEuphoria[14]
Utilizare
Euphoria este concepută ca o soluție gata făcută pentru a facilita procesarea colecțiilor dinamice de date de diferite tipuri și este deosebit de convenabilă pentru procesarea șirurilor și imaginilor. Euphoria este folosită pentru a experimenta inteligența artificială, a studia matematica, a învăța programarea și a crea fonturi compuse din mii de caractere.
Tipuri de date
Euphoria are patru tipuri de date încorporate:
atom
un număr, implementat ca un număr întreg cu semn pe 31 de biți sau un punct de flotare pe 64 de biți IEEE. Euforia trece în mod dinamic între reprezentarea unui număr ca număr întreg sau număr de punct de flotare, în funcție de valoarea sa actuală.
sequence(rând, secvență)
set format din mai multe elemente. Fiecare element al setului poate fi atât un atom, cât și un număr. Numărul de elemente ale seriei nu este fix (nu necesită un anunț obligatoriu). Programul poate adăuga sau elimina elemente în orice moment. Alocarea/eliberarea memoriei este efectuată automat prin numărarea referințelor. Accesul la elementele individuale are loc prin valoarea indexului, închisă în paranteze pătrate. Indicele primului element este [1]. Elementele rândurilor imbricate sunt accesate folosind indicii adiționali în paranteze pătrate, deci X [3] [2] se referă la cel de-al doilea element al seriilor imbricate, care este al treilea element al lui X. Fiecare element al seriei are un tip de obiect (vezi mai jos).
integer (întreg)
un atom ale cărui valori pot fi numere întregi de la -1073741824 la 1073741823 (de la -230 la 230-1). Tipul întregului este adesea mai eficient în operațiuni decât tipul atomului, dar nu poate conține același interval de valori. Caracterele sunt stocate ca numere, cum ar fi ASCII 'A', la fel ca 65.
object (obiect)
tipul general de date, care poate conține date ale oricăror tipuri listate (atom, secvență sau număr întreg) care se modifică în timpul execuției programului.
Euphoria nu are un tip de date special pentru șirurile de caractere. Un șir este o serie de numere întregi, totuși, pentru șiruri de caractere, se folosesc citatele duble obișnuite. Deci, în programul Euphoria
"ABC"
echivalent cu:
{'A', 'B', 'C'}
și echivalent cu:
{65,66,67}
În plus față de tipurile încorporate, Euphoria poate lucra cu tipurile de date definite de programator și poate seta un interval mai restrâns de valori variabile în limitele tipurilor încorporate. Tipurile de date definite de utilizator sunt utilizate în principal atunci când se depanează un program, iar după finalizarea acestuia, verificarea acestor tipuri poate fi dezactivată printr-o directivă without type_check, totuși, verificarea tipului încorporat este întotdeauna activată.
Exemple
Hello World
puts (1,"Hello World!\n")
Lucru cu rânduri
Următorul cod caută elementul x din grupul de elemente. Dacă se găsește un astfel de element, acesta este eliminat prin concatenarea tuturor elementelor din grupul din fața acestuia cu toate elementele după el. Observăm că primul element al seriei are un indice de un [1], iar semnul dolar $ ca indicele denotă numărul ultimului element al seriei.
function delete_item (object x, sequence group)
integer pos
pos = find( x, group )
if pos > 0 then
group = group[1 .. pos-1] & group[pos+1 .. $]
end if
return group
end function
Linia de cod
group = group[1 .. pos-1] & group[pos+1 .. $]
arată una dintre modalitățile de a lucra cu rânduri [23]. O serie poate conține un grup de elemente de orice tip și ele pot fi selectate și apoi combinate (concatenate) cu o altă serie utilizând operatori încorporați. Funcționarea elementelor de selecție dintr-o serie este denumită secțiune dintr-o serie.
Următoarea modificare a exemplului anterior înlocuiește elementul vechi cu unul nou. Deoarece variabilele vechi și noi sunt declarate ca obiecte, ele pot fi atît atomi, cît și rânduri. Verificarea tipului nu este necesară, deoarece funcția poate funcționa cu orice tip de date.
function replace_item( object old, object new, sequence group )
integer pos
pos = find( old, group )
if pos > 0 then
group[pos] = new
end if
return group
end function