E (limbaj de programare) - E (programming language)

E
Paradigmă Multi-paradigmă : orientată pe obiecte , transmiterea mesajelor
Proiectat de Mark S. Miller
A apărut prima dată 1997
Disciplina de tastare Puternic , dinamic
OS Cross-platform
Licență Porțiuni în diferite licențe gratuite
Site-ul web erights .org
Implementări majore
E-on-Java, E-on-CL
Influențată de
Joule , Original-E , Java
Influențat
Ponei

E este un limbaj de programare orientat pe obiecte pentru calcule distribuite sigure , creat de Mark S. Miller , Dan Bornstein , Douglas Crockford , Chip Morningstar și alții la Electric Communities în 1997. E provine în principal din limbajul concurent Joule și din Original-E , un set de extensii la Java pentru programare distribuită sigură. E combină calculul bazat pe mesaje cu sintaxa Java . Un model de concurență bazat pe bucle și promisiuni de evenimente asigură că impasul nu poate avea loc niciodată.

Filozofie

Limbajul E este conceput având în vedere calculul securizat ; acest lucru se realizează în principal prin respectarea strictă a modelului de calcul orientat pe obiect, care în forma sa pură are proprietăți care susțin calculul securizat. Limbajul E și biblioteca standard utilizează o filozofie de proiectare bazată pe capacități, pentru a ajuta programatorii să construiască software securizat și pentru a permite componentelor software să coopereze, chiar dacă nu au încredere deplină. În E, referințele la obiecte servesc drept capabilități, prin urmare capabilitățile nu adaugă costuri generale de calcul sau conceptuale. Sintaxa lingvistică este concepută pentru a fi ușor de auditat de către persoane pentru defecte de securitate. De exemplu, domeniul lexical limitează cantitatea de cod care trebuie examinată pentru efectele sale asupra unei variabile date. Ca un alt exemplu, limba folosește operatorul == pentru comparație și operatorul : = pentru atribuire; pentru a evita posibilitatea confuziei, nu există operator = .

Model computational

În E, toate valorile sunt obiecte, iar calculul se realizează prin trimiterea de mesaje către obiecte. Fiecare obiect aparține unei cuve (analog unui proces ). Fiecare cuvă are un singur fir de execuție, un cadru de stivă și o coadă de evenimente. Programarea distribuită este doar o chestiune de a trimite mesaje către obiecte la distanță (obiecte din alte cuve). Toate comunicările cu părțile la distanță sunt criptate de runtime E. Mesajele de sosire sunt plasate în coada de evenimente a cuvei; bucla de evenimente a cuvei procesează mesajele primite unul câte unul în ordinea sosirii.

E are două modalități de a trimite mesaje: apelul imediat și trimiterea eventuală . Un apel imediat este exact ca o funcție tipică sau un apel metodic într-un limbaj non-concurent: expeditorul așteaptă până când receptorul termină și returnează o valoare. O eventuală trimitere trimite mesajul în timp ce produce un substituent pentru rezultatul numit o promisiune . Expeditorul continuă imediat cu promisiunea. Mai târziu, când receptorul termină și dă un rezultat, promisiunea se rezolvă la rezultat. Deoarece numai comunicările eventuale sunt permise atunci când comunicați cu obiecte la distanță, blocajele nu se pot întâmpla. În sistemele distribuite, mecanismul promisiunii minimizează, de asemenea, întârzierile cauzate de latența rețelei.

Sintaxă și exemple

Sintaxa lui E este cea mai asemănătoare cu Java , deși are o asemănare cu Python și Pascal . Variabilele sunt tastate dinamic și lexical scoped . Spre deosebire de Java sau Python, totuși, E este compus în întregime din expresii . Iată un program E extrem de simplu:

 println("Hello, world!")

Iată o funcție recursivă pentru calcularea factorialului unui număr, scrisă în E. Funcțiile sunt definite folosind cuvântul cheie def .

 def factorial(n :int) :int {
   if (n == 1) {
     return 1
   } else if (n > 0) {
     return n * factorial(n-1)
   } else {
     throw("invalid argument to factorial: "+n)
   }
 }

În prima linie ,: int este o gardă care constrânge argumentul și rezultatul funcției. Un paznic nu este chiar același lucru cu o declarație de tip; gărzile sunt opționale și pot specifica constrângeri. Primul : int asigură că corpul funcției va trebui să gestioneze doar un argument întreg. Fără al doilea : int de mai sus, funcția nu ar putea returna o valoare. Posibilitatea de a vedea în față că informațiile scapă din funcție este utilă pentru auditul de securitate.

Deoarece E este destinat să susțină o cooperare sigură, exemplul canonic pentru programele E este moneda, un sistem simplu de monedă electronică în doar câteva rânduri de E. Următorul cod definește o funcție care face monete, în care fiecare monetărie are propria sa valută. Fiecare monetărie poate face poșete care dețin moneda sa, iar orice deținător de două poșete din aceeași monedă poate transfera în siguranță bani între poșete. Prin examinarea rapidă a codului sursă, un programator E poate verifica cu ușurință că numai monetăriile pot schimba suma de bani în circulație, că banii pot fi creați și nu distruși, că monetăriile pot crea doar bani din propria lor monedă și că numai titularul unei posete își poate schimba echilibrul.

 def makeMint(name) :any {
   def [sealer, unsealer] := makeBrandPair(name)
   def mint {
     to makePurse(var balance :(int >= 0)) :any {
       def decr(amount :(0..balance)) :void {
         balance -= amount
       }
       def purse {
         to getBalance() :int { return balance }
         to sprout() :any { return mint.makePurse(0) }
         to getDecr() :any { return sealer.seal(decr) }
         to deposit(amount :int, src) :void {
           unsealer.unseal(src.getDecr())(amount)
           balance += amount
         }
       }
       return purse
     }
   }
   return mint
 }

Obiectele din E sunt definite cu cuvântul cheie def , iar în cadrul definiției obiectului, cuvântul cheie to începe fiecare metodă. Expresiile de gardă din acest exemplu ilustrează modul de specificare a unei constrângeri de valoare (ca în : (int> = 0) sau : (0 .. echilibru) ).

Exemplul de mentă folosește un mecanism încorporat numit sigilant . Funcția makeBrandPair creează două obiecte asociate, un sigilant și un nesigilant, astfel încât sigilatorul poate sigila un obiect într-o cutie, iar nesigilatorul este singurul obiect care poate recupera conținutul cutiei. Consultați site-ul web E pentru o explicație mai detaliată a acestui exemplu de bani.

Vezi si

Referințe

linkuri externe