Μετάβαση στο περιεχόμενο

Erlang

Από τη Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια
Erlang
Γενικά
Ημερ. Δημιουργίας1986
Είδοςσυναρτησιακή γλώσσα προγραμματισμού,γλώσσα προγραμματισμού,λογισμικό ανοικτού κώδικα,ελεύθερο λογισμικό,δεξιότητα
Διανομή
Έκδοση27.1.2 (17 Οκτώβριος 2024)[1]
ΛειτουργικάΑνεξάρτητο πλατφόρμας
Ανάπτυξη
Υπευθ. ανάπτυξηςEricsson
Γραμμένο σεErlang
Άδεια χρήσηςΆδεια Apache, Έκδοση 2.0
Σύνδεσμοι
Επίσημος ιστότοπος
https://www.erlang.org/
Αποθετήριο κώδικα
https://github.com/erlang/otp

ΗErlangείναιγλώσσα προγραμματισμούγενικών καθηκόντων με χαρακτηριστικάταυτοχρονισμού(concurrency) καισυλλογής απορριμμάτων.Το ίδιο όνομα αναφέρεται και στο σύστημα χρόνου εκτέλεσής της (runtime system). Το υποσύνολο της Erlang που μπορεί να εκτελείται ακολουθιακά είναι μιαγλώσσα συναρτησιακού προγραμματισμού,μεαυστηρή αποτίμηση(strict evaluation), μοναδική ανάθεση (single assignment) καιδυναμικό σύστημα τύπων(dynamic typing). Όσον αφορά τον ταυτοχρονισμό, ακολουθεί τομοντέλο Actor.Αναπτύχθηκε στηνEricssonγια την υποστήριξηκατανεμημένων,ανθεκτικών σε σφάλματα εφαρμογών που να εκτελούνται σε πραγματικό χρόνο (soft-real-time) και χωρίς διακοπή. Υποστηρίζει άμεση ενημέρωση του κώδικα κατά την εκτέλεση (hot swapping), χωρίς να χρειάζεται να σταματήσει το σύστημα.[2]

Αν και στις περισσότερες γλώσσες προγραμματισμού η χρήσηνημάτων(threads) θεωρείται δύσκολη και επιρρεπής σε λάθη, η Erlang παρέχει χαρακτηριστικά στο επίπεδο της ίδιας της γλώσσας για τη δημιουργία και το χειρισμό διεργασιών (processes), ώστε να διευκολύνεται η ανάπτυξη ταυτόχρονου κώδικα. Αν και όλος ο ταυτοχρονισμός είναι ρητός στην Erlang, οι διεργασίες επικοινωνούν μεταξύ τουςπερνώντας μηνύματααντί μέσω κοινών μεταβλητών, χωρίς να χρειάζονται κλειδώματα (locks).

Η πρώτη έκδοση αναπτύχθηκε από το Τζο Άρμστρονγκ το 1986.[3]Η γλώσσα αρχικά ήταν ιδιόκτητο λογισμικό της Ericsson, αλλά διανεμήθηκε σανλογισμικό ανοιχτού κώδικατο 1998.

Το όνομα "Erlang" αποδίδεται στον Bjarne Däcker και θεωρείται ότι είτε αναφέρεται στο Δανό μαθηματικό και μηχανικόAgner Krarup Erlang,ή ότι σημαίνει "Ericsson Language" ( "γλώσσα της Ericsson" ).[3][4]

Η Erlang σχεδιάστηκε για καλύτερη ανάπτυξη εφαρμογών τηλεφωνίας. Η αρχική της έκδοση υλοποιήθηκε σεProlog.[3]

Το 1998 ανακοινώθηκε το σύστημα Ericsson AXD301 (τύπου switch), που περιλάμβανε πάνω από ένα εκατομμύριο γραμμές Erlang, και ανακοινώθηκε ότι η αξιοπιστία του ήταν 99.9999999%.[5]Λίγο αργότερα η Erlang απαγορεύτηκε στα Ericsson Radio Systems για νέα προϊόντα, λόγω προτίμησης σε μη-ιδιόκτητες γλώσσες. Η απαγόρευση αυτή ήταν η αιτία που ο Άρμστρονγκ και άλλοι έφυγαν από την Ericsson.[6]Η υλοποίηση έγινε λογισμικό ανοιχτού κώδικα το τέλος του ίδιου χρόνου.[3]Τελικά η απαγόρευση σταμάτησε να ισχύει στην Ericsson και ο Άρμστρονγκ επαναπροσλήφθηκε στην Ericsson το 2004.[6]

Το 2006 προστέθηκε υποστήριξη για συμμετρικές πολυδιεργασίες (symmetric multiprocessing) στο σύστημα χρόνου εκτέλεσης και στην εικονική μηχανή (virtual machine).[3]

Η φιλοσοφία της ανάπτυξης της Erlang ταιριάζει με τη φιλοσοφία της ανάπτυξης λογισμικού για συστήματα βασισμένα σε Erlang. Κατά το Μάικ Γουίλιαμς, έναν από τους τρεις εφευρέτες της Erlang:[7]

  1. Βρες τις κατάλληλες μεθόδους-Σχεδίασε χρησιμοποιώντας αρχικές εκδόσεις.
  2. Δεν αρκεί να έχεις ιδέες, πρέπει να μπορείς και να τις υλοποιήσεις και να ξέρεις ότι δουλεύουν.
  3. Κάνε λάθη σε μικρή κλίμακα, όχι σε περιβάλλον παραγωγής.

Παραδείγματα συναρτησιακού προγραμματισμού

[Επεξεργασία|επεξεργασία κώδικα]

Ο αλγόριθμοςπαραγοντικόσε Erlang:

-module(fact).% Επειδή είναι το αρχείο 'fact.erl', το όνομα της μονάδας (module) και του αρχείου ΠΡΕΠΕΙ να είναι ίδια
-export([fac/1]).% Εξάγει τη συνάρτηση 'fac' με αριθμό ορισμάτων ίσο με 1 (1 παράμετρος, χωρίς τύπο ή όνομα)

fac(0)->1;% Αν 0, επιστρέφει 1, αλλιώς (το σύμβολο; σημαίνει 'αλλιώς')
fac(N)whenN>0,is_integer(N)->N*fac(N-1).
% Ορίζεται αναδρομικά και επιστρέφει το αποτέλεσμα
% (η τελεία. σημαίνει 'τέλος της if'/'endif' ή 'τέλος της συνάρτησης')

Ένας αλγόριθμος ταξινόμησης (παρόμοιος με τηνquicksort):

%% qsort:qsort(List)
%% Ταξινομεί μια λίστα από αντικείμενα
-module(qsort).% Είναι το αρχείο 'qsort.erl'
-export([qsort/1]).% Εξάγεται μια συνάρτηση 'qsort' με 1 παράμετρο (χωρίς τύπο ή όνομα)

qsort([])->[];% Αν είναι η κενή λίστα [], επιστρέφει μια κενή λίστα (δεν υπάρχει κάτι προς ταξινόμηση)
qsort([Pivot|Rest])->
% Συνθέτει αναδρομικά μια λίστα 'Front' όλα τα στοιχεία που πρέπει να είναι πριν το 'Pivot',
% μετά το 'Pivot' και μετά τη λίστα 'Back' με όλα τα στοιχεία που πρέπει να είναι μετά το 'Pivot'
qsort([Front||Front<-Rest,Front<Pivot])
++[Pivot]++
qsort([Back||Back<-Rest,Back>=Pivot]).

Το παραπάνω παράδειγμα καλεί αναδρομικά τη συνάρτησηqsortμέχρι να μη μείνει κάτι προς ταξινόμηση. Η έκφραση[Front || Front <- Rest, Front < Pivot]ονομάζεταιlist comprehension,που σημαίνει “Κατασκεύασε μια λίστα από στοιχείαFrontτέτοια ώστε τοFrontνα ανήκει στηRestκαι να είναι μικρότερο από τοPivot.”Ο τελεστής++συνενώνει λίστες.

Μια συνάρτηση σύγκρισης μπορεί να χρησιμοποιηθεί για πιο πολύπλοκες δομές, για να είναι πιο ευανάγνωστος ο κώδικας.

Ο παρακάτω κώδικας ταξινομεί λίστες ανάλογα με το μήκος τους:

% Είναι το αρχείο 'listsort.erl'
-module(listsort).
% Εξάγει τη 'by_length' με 1 παράμετρο (δεν έχει σημασία ο τύπος ή το όνομα)
-export([by_length/1]).

by_length(Lists)->% Χρησιμοποιεί την 'qsort/2' και δίνει μια ανώνυμη συνάρτηση σαν παράμετρο
qsort(Lists,fun(A,B)whenis_list(A),is_list(B)->length(A)<length(B)end).

qsort([],_)->[];% Αν η λίστα είναι άδεια, επιστρέφει μια κενή λίστα (αγνοεί τη δεύτερη παράμετρο)
qsort([Pivot|Rest],Smaller)->
% Χωρίζει τη λίστα σε στοιχεία 'Smaller' πριν το 'Pivot' και υπόλοιπα (μη-'Smaller')
% μετά από το 'Pivot' και ταξινομεί τις υπολίστες.
qsort([X||X<-Rest,Smaller(X,Pivot)],Smaller)
++[Pivot]++
qsort([Y||Y<-Rest,not(Smaller(Y,Pivot))],Smaller).

ΗPivotεδώ θεωρείται ότι είναι η πρώτη παράμετρος που δίνεται στηνqsort()και το υπόλοιπο τηςListsονομάζεταιRest.Η έκφραση:

[X || X <- Rest, Smaller(X,Pivot)]

δε διαφέρει σε μορφή από την:

[Front || Front <- Rest, Front < Pivot]

(στο προηγούμενο παράδειγμα) εκτός από τη χρήση μιας συνάρτησης σύγκρισης στο τελευταίο μέρος, που λέει “Κατασκεύασε μια λίστα από στοιχείαXτέτοια ώστε τοXνα ανήκει στηRestκαι τοSmallerνα είναι αληθές ", με τοSmallerνα έχει οριστεί νωρίτερα σαν:

fun(A,B) when is_list(A), is_list(B) -> length(A) < length(B) end

Η ανώνυμη συνάρτηση ονομάζεταιSmallerστη λίστα παραμέτρων του δεύτερου ορισμού τηςqsortκαι μπορεί να κατονομαστεί με αυτόν τον τρόπο μέσα στη συνάρτηση. Δεν ονομάζεται στον πρώτο ορισμό τηςqsort,που χειρίζεται τη βασική περίπτωση της κενής λίστας και δε χρειάζεται τη συνάρτηση, άρα ούτε κάποιο όνομα για αυτήν.

Η Erlang έχει οκτώ βασικές (primitive) δομές δεδομένων:

  1. Ακέραιους(Integers): οι ακέραιοι γράφονται σαν ακολουθίες από δεκαδικά ψηφία, για παράδειγμα οι αριθμοί 12, 12375 και -23427 είναι ακέραιοι. Η αριθμητική με ακεραίους είναι ακριβής και περιορίζεται μόνο από τη διαθέσιμη μνήμη του υπολογιστή.
  2. Άτομα(Atoms): τα άτομα χρησιμοποιούνται σε ένα πρόγραμμα για να εκφράσουν διακριτές τιμές. Γράφονται σαν συμβολοσειρές από συνεχόμενα γράμματα η αριθμούς, με τον πρώτο χαρακτήρα να είναι υποχρεωτικά πεζό γράμμα. Τα άτομα μπορούν να έχουν οποιοδήποτε χαρακτήρα, αν χρησιμποιηθούν μονά εισαγωγικά, ενώ υπάρχει και μηχανισμός διαφυγής (escape convention) για τη χρήση οποιουδήποτε χαρακτήρα σε ένα άτομο.
  3. Αριθμοί κινητής υποδιαστολής(Floats): οι αριθμοί κινητής υποδιαστολής χρησιμοποιούν αναπαράσταση σύμφωνα με το πρότυπο IEEE 754 με χρήση 64-bit. (Εύρος: ±10308.)
  4. Αναφορές(References): οι αναφορές είναι καθολικά μοναδικά σύμβολα, η μόνη ιδιότητα των οποίων είναι ότι μπορούν να συγκριθούν ως προς την ισότητά τους. Δημιουργούνται από την έκφρασηmake_ref()της Erlang.
  5. Δυαδικά(Binaries): ένα δυαδικό είναι μια ακολουθία απόbytes.Τα δυαδικά προσφέρουν έναν τρόπο αποθήκευσης δεδομένων που καταλαμβάνει λίγο χώρο και υπάρχουν εκφράσεις της Erlang για τη δόμηση-αποδόμηση των δυαδικών και για γρήγορη είσοδο και έξοδο αυτών.
  6. Pids:Pid σημαίνει Process Identifier (αναγνωριστικό διαδικασίας) — ένα Pid δημιουργείται από την έκφρασηspawn(...)της Erlang και είναι μια αναφορά σε μια διαδικασία της Erlang.
  7. Θύρες(Ports): οι θύρες χρησιμοποιούνται για την επικοινωνία με τον έξω κόσμο. Δημιουργούνται με την ενσωματωμένη συνάρτηση (Built-In Function ή BIF)open_port.Στις θύρες μπορούν να αποσταλούν και να γίνουν αποδεκτά μηνύματα, αν αυτά υπακούν στο λεγόμενο "πρωτόκολλο των θυρών" ( "port protocol" ).
  8. Funs:τα Funs είναικλεισίματασυναρτήσεων και κατασκευάζονται από εκφράσεις της μορφής:fun(...) ->... end.

Επίσης υπάρχουν δύο σύνθετοι (compound) τύποι δεδομένων:

  1. ν-άδες(Tuples): το περιεχόμενό τους είναι ένας σταθερός αριθμός από άλλους τύπους δεδομένων της Erlang. Η σύνταξη{D1,D2,...,Dν}σημαίνει μια ν-άδα με ορίσματαD1, D2,... Dn.Τα ορίσματα μπορούν να είναι βασικοί τύποι δεδομένων ή σύνθετοι τύποι δεδομένων. Η προσπέλαση στα στοιχεία μιας ν-άδας γίνεται σε σταθερό χρόνο.
  2. Λίστες(Lists): το περιεχόμενό τους είναι ένας μεταβλητός αριθμός από άλλους τύπους δεδομένων της Erlang. Η σύνταξη[Dh|Dt]σημαίενι μια λίστα με πρώτο στοιχείο τοDh,και υπόλοιπα στοιχεία τη λίσταDt.Η σύνταξη[]σημαίνει την άδεια λίστα, ενώ η[D1,D2,..,Dn]είναι συντομογραφία για την[D1|[D2|..|[Dn|[]]]].Η προσπέλαση στο πρώτο στοιχείο μιας λίστας μπορεί να γίνει σε σταθερό χρόνο. Το πρώτο στοιχείο μιας λίστας ονομάζεταικεφαλή(head) της λίστας και το υπόλοιπο ονομάζεταιουρά(tail) της λίστας.

Δίνονται δύο μορφές βολικής σύνταξης (syntactic sugar):

  1. Συμβολοσειρές(Strings): οι συμβολοσειρές γράφονται σαν λίστες χαρακτήρων ανάμεσα σε διπλά εισαγωγικά, που είναι ένας βολικότερος τρόπος για τη γραφή λιστών από ακέραιους κωδικούςASCII,οι οποίοι αντιστοιχούν στους χαρακτήρες της συμβολοσειράς, για παράδειγμα, η συμβολοσειρά "cat" είναι συντομογραφία της[99,97,116].
  2. Εγγραφές(Records): οι εγγραφές είναι ένας βολικότερος τρόπος για την απονομή ενός αναγνωριστικού (tag) σε κάθε στοιχείο μιας ν-άδας. Αυτό επιτρέπει στον προγραμματιστή να αναφέρεται σε ένα στοιχείο μιας ν-άδας με το όνομά του και όχι με τη θέση του σε αυτήν.

Ταυτοχρονισμός και κατανεμημένος προγραμματισμός

[Επεξεργασία|επεξεργασία κώδικα]

Το βασικό πλεονέκτημα της Erlang είναι η υποστήριξηταυτοχρονισμού(concurrency). Η γλώσσα περιλαμβάνει λίγες αλλά ισχυρές βασικές εντολές με τις οποίες μπορούν να δημιουργηθούν διεργασίες και να επικοινωνούν μεταξύ τους. Οι διαδικασίες είναι ο βασικός τρόπος δόμησης ενός προγράμματος σε Erlang. Οι διεργασίες της Erlang σε γενικές γραμμές ακολουθούν το μοντέλοCommunicating Sequential Processes(CSP).[8]Δεν είναι διεργασίες του λειτουργικού συστήματος, ούτενήματα,αλλά ελαφρές διεργασίες, παρόμοιες με τα "πράσινα νήματα"που είχε αρχικά ηJava.Όπως οι διεργασίες του λειτουργικού συστήματος, και σε αντίθεση με τα πράσινα νήματα και τα νήματα του λειτουργικού συστήματος, οι διεργασίες της Erlang δεν έχουν κοινό χώρο μεταξύ τους. Το κόστος τους επίσης είναι χαμηλό, το ελάχιστο κόστος υπολογίζεται σε 300 λέξεις (words),[9]επομένως μπορούν να δημιουργηθούν πολλές διεργασίες χωρίς πρόβλημα στην ταχύτητα του προγράματος: έχουν δοκιμαστεί καταστάσεις με 20 εκατομμύρια διεργασίες στην πράξη.[10]Η Erlang υποστηρίζει συμμετρική πολυδιεργασία από την έκδοση R11B του Μαΐου του 2006.

Η επικοινωνία ανάμεσα στις διεργασίες (inter-process communication) γίνεται μέσω ενός ασύγχρονου συστήματος περάσματος μηνυμάτων, χωρίς κοινό χώρο μεταξύ των διεργασιών ( "shared-nothing" ): κάθε διεργασία έχει ένα "γραμματοκιβώτιο" ( “mailbox” ), που είναι μια ουρά από μηνύματα που έχουν σταλεί από άλλες διεργασίες και δεν έχουν καταναλωθεί ακόμα. Μια διεργασία χρησιμοποιεί τη βασική εντολήreceiveγια να διαβάζει μηνύματα που συμφωνούν με κάποιους κανόνες (patterns). Μια ρουτίνα χειρισμού μηνυμάτων ελέγχει όλα τα μηνύματα αν ταιριάζουν με κάθε κανόνα, μέχρι να βρει κάποιο. Όταν το μήνυμα καταναλωθεί και αφαιρεθεί από το γραμματοκιβώτιο, η διεργασία συνεχίζει την εκτέλεσή της. Ένα μήνυμα μπορεί να περιέχει οποιαδήποτεδομήτης Erlang, συμπεριλαμβανομένων των βασικών τύπων δεδομένων (ακεραίων, αριθμών κινητής υποδιαστολής, χαρακτήρων, ατόμων), των ν-άδων, των λιστών και των συναρτήσεων.

Ο παρακάτω κώδικας δείχνει πώς λειτουργεί η ενσωματωμένη υποστήριξη για κατανεμημένες διεργασίες:

% Δημιουργεί μια διεργασία και καλεί τη συνάρτηση web:start_server(Port, MaxConnections)
ServerProcess=spawn(web,start_server,[Port,MaxConnections]),

% Δημιουργεί μια απομακρυσμένη διεργασία και καλεί τη συνάρτηση
% web:start_server(Port, MaxConnections) στον υπολογιστή RemoteNode
RemoteProcess=spawn(RemoteNode,web,start_server,[Port,MaxConnections]),

% Στέλνει ένα μήνυμα στη διεργασία ServerProcess (ασύγχρονα). Το μήνυμα αποτελείται από τη ν-άδα (εδώ ζεύγος)
% από το άτομο "pause" και τον αριθμό "10".
ServerProcess!{pause,10},

% Παραλαμβάνει μηνύματα που στέλνονται στη διεργασία
receive
a_message->do_something;
{data,DataContent}->handle(DataContent);
{hello,Text}->io:format("Ήρθε μήνυμα hello:~s",[Text]);
{goodbye,Text}->io:format("Ήρθε μήνυμα goodbye:~s",[Text])
end.

Όπως δείχνει το παράδειγμα, μια διεργασία μπορεί να δημιουργηθεί σε κάποιο απομακρυσμένο μηχάνημα και η επικοινωνία με αυτή είναι "διαφανής", δηλαδή λειτουργεί ακριβώς όπως η επικοινωνία με μια τοπική διεργασία.

Ο ταυτοχρονισμός υποστηρίζεται από το μηχανισμό χειρισμού λαθών της Erlang. Όταν μια διεργασία καταρρεύσει για κάποιο λόγο, τερματίζει και στέλνει ένα μήνυμα στη διεργασία που την ελέγχει, για να την ενημερώσει.[11][12]Αυτός ο τρόπος χειρισμού λαθών κάνει ευκολότερη τη συντήρηση του λογισμικού και κάνει τον κώδικα λιγότερο πολύπλοκο.

Η υλοποίηση της Erlang της Ericsson φορτώνει κώδικα byte (bytecode) στην εικονική μηχανή της που μετατρέπεται σεthreaded codeστο χρόνο φόρτωσης. Περιέχει επίσης και ένα μεταγλωττιστή σε κώδικα μηχανής για πολλές πλατφόρμες, που έχει αναπτυχθεί από το High Performance Erlang Project (HiPE) του Πανεπιστημίου τηςΟυψάλα.Από τον Οκτώβριο του 2001 το σύστημα HiPE έχει ενσωματωθεί πλήρως στο σύστημα ανοιχτού κώδικα της Ericsson (Open Source Erlang/OTP).[13]Υποστηρίζει επίσηςδιερμηνεία,απευθείας από τονπηγαίο κώδικα,μέσω ενός αφηρημένου συντακτικού δένδρου (abstract syntax tree), από την έκδοση R11B-5.

Παράδειγμα εκτέλεσης κώδικα σε Erlang.

Φόρτωση κώδικα και μονάδες κώδικα

[Επεξεργασία|επεξεργασία κώδικα]

Ο κώδικας φορτώνεται σαν "μονάδες" κώδικα ( "modules" ) και το σύστημα μπορεί να κρατά δύο εκδόσεις μιας μονάδας στη μνήμη ταυτόχρονα, ενώ οι διεργασίες μπορούν να εκτελούν κώδικα ταυτόχρονα και από τις δύο. Οι εκδόσεις τότε αναφέρονται σαν η "παλιά" και η "νέα" έκδοση - μια διεργασία μετακινείται σε μια νέα έκδοση όταν κάνει κλήση στη μονάδα της.

Ακολουθεί ένα παράδειγμα αυτού του μηχανισμού (που ονομάζεται "hot code loading" ):

%% Μια διεργασία που κρατά ένα μετρητή.
%% Πρώτη έκδοση
-module(counter).
-export([start/0,codeswitch/1]).

start()->loop(0).

loop(Sum)->
receive
{increment,Count}->
loop(Sum+Count);
{counter,Pid}->
Pid!{counter,Sum},
loop(Sum);
code_switch->
?MODULE:codeswitch(Sum)
% Ζητά να χρησιμοποιήσει την 'codeswitch/1' από την τελευταία έκδοση του MODULE
end.

codeswitch(Sum)->loop(Sum).

Στη δεύτερη έκδοση, προστίθεται η δυνατότητα επαναφοράς του μετρητή στο μηδέν.

%% Δεύτερη έκδοση
-module(counter).
-export([start/0,codeswitch/1]).

start()->loop(0).

loop(Sum)->
receive
{increment,Count}->
loop(Sum+Count);
reset->
loop(0);
{counter,Pid}->
Pid!{counter,Sum},
loop(Sum);
code_switch->
?MODULE:codeswitch(Sum)
end.

codeswitch(Sum)->loop(Sum).

Ο παραπάνω κώδικας που εκτελείται επαναλαμβανόμενα θα καλέσει εξωτερικά την codeswitch/1 (η?MODULEείναι μακροεντολή τουπροεπεξεργαστήγια την τρέχουσα μονάδα κώδικα) μόνο όταν λάβει ένα μήνυμα που να αποτελείται από το άτομο 'code_switch'. Αν υπάρχει μια νέα έκδοση της μονάδας "counter" στη μνήμη, τότε θα κληθεί η συνάρτηση codeswitch/1 που της ανήκει. Η ύπαρξη ενός συγκεκριμένου σημείου εισόδου σε μια νέα έκδοση είναι πρακτική που επιτρέπει στον προγραμματιστή να μετατρέψει την κατάσταση του προγράμματος όπως απαιτείται από τη νέα έκδοση. Στο παράδειγμα, η κατάσταση είναι ένας ακέραιος.

Στην πράξη τα συστήματα κατασκευάζονται με βάση αρχές σχεδίασης από το Open Telecom Platform, που οδηγούν σε δυνατότητες καλύτερης αναβάθμισης του κώδικα. Η επιτυχής φόρτωση με αυτόν τον τρόπο είναι γενικά δύσκολη - ο κώδικας πρέπει να ξαναγράφεται για να χρησιμοποιεί τις δυνατότητες της Erlang.

Το 1998, η Ericsson διένειμε την Erlang σανλογισμικό ανοιχτού κώδικαγια να εξασφαλίσει ότι θα είναι ανεξάρτητη κατασκευαστή, καθώς και για να την κάνει πιο γνωστή. Η Erlang, μαζί με βιβλιοθήκες και την κατανεμημένη βάση δεδομένων πραγματικού χρόνου Mnesia, αποτελούν τη συλλογή βιβλιοθηκών Open Telecom Platform (OTP). Η Ericsson και κάποιες ακόμα εταιρείες προσφέρουν εμπορική υποστήριξη για την Erlang.

Από τη διάθεση του ανοιχτού κώδικα, η Erlang έχει χρησιμοποιηθεί από πολλές εταιρείες διεθνώς, όπως η Norte και η T-Mobile.[14]Αν και η Erlang σχεδιάστηκε για συγκεκριμένες ανάγκες και για μεγάλο μέρος της ιστορίας της δεν ήταν γνωστή, γίνεται όλο και δημοφιλέστερη λόγω της ζήτησης για ταυτόχρονες υπηρείες.[15][16] Η Erlang χρησιμοποιείται σε εξυπηρετητέςMMORPG.[17]

Η Erlang είναι διαθέσιμη για πολλά λειτουργικά συστήματα τύπουUnix,όπως τοMac OS X,αλλά και για ταMicrosoft Windows.

Εγχειρήματα που χρησιμοποιούν Erlang

[Επεξεργασία|επεξεργασία κώδικα]

Στα εγχειρήματα που χρησιμοποιούν Erlang περιλαμβάνονται τα εξής:

  • ηCouchDB,μια βάση δεδομένων βασισμένη σε έγγραφα που χρησιμοποιείMapReduce
  • οejabberd,ένας εξυπηρετητής στιγμιαίων μηνυμάτων (Extensible Messaging and Presence Protocol, XMPP)
    • το σύστημα Facebook Chat,[18]που βασίζεται στον ejabberd[19]
  • οGitHubegitd,[20]που είναι αντικαταστάτης του κανονικού git-daemon που έρχεται με τοGit
  • το σύστημα διαχείρισης βάσεων δεδομένωνMembase,που είναι βελτιστοποιημένο για την αποθήκευση δεδομένων πίσω από διαδραστικές εφαρμογές Ιστού
  • η υλοποίησηRabbitMQτου Advanced Message Queuing Protocol (AMQP)
  • η κατανεμημένη βάση δεδομένωνSimpleDB,που είναι μέρος τωνAmazon Web Services[21]
  • η Twitterfall, μια υπηρεσία που εμφανίζει τάσεις και παρατηρήσεις από τοTwitter[22][23]
  • τοWings 3D,λογισμικό μοντελοποίησης 3D
  • ο εξυπηρετητής Ιστού Yaws
  • η κατανεμημένη βάση δεδομένων Riak
  • η Goldman Sachs χρησιμοποίησε την Erlang για προγράμματα που διεκπεραίωναν πολλές συναλλαγές

Άλλες γλώσσες που έχουν εμπνευστεί τα χαρακτηριστικά ταυτοχρονισμού τους από την Erlang:

  1. «Release 27.1.2».17 Οκτώβριος 2024.Ανακτήθηκε στις 18 Οκτώβριος 2024.
  2. Joe Armstrong· Bjarne Däcker· Thomas Lindgren· Håkan Millroth.«Open-source Erlang - White Paper».Αρχειοθετήθηκεαπό το πρωτότυποστις 13 Ιουνίου 2006.Ανακτήθηκε στις 23 Ιανουαρίου 2008.
  3. 3,03,13,23,33,4Joe Armstrong, "History of Erlang", inHOPL III: Proceedings of the third ACM SIGPLAN conference on History of programming languages,2007,ISBN 978-1-59593-766-7
  4. Erlang, the mathematician?
  5. «Concurrency Oriented Programming in Erlang»(PDF).2 Νοεμβρίου 2002.
  6. 6,06,1«question about Erlang's future».6 Ιουλίου 2010.
  7. "Find the right methods—Design by Prototyping." / "It is not good enough to have ideas, you must also be able to implement them and know they work." / "Make mistakes on a small scale, not in a production project."
  8. Βιβλίο CSP
  9. «Erlang Efficiency Guide - Processes».
  10. Ulf Wiger (14 Νοεμβρίου 2005).«Stress-testing erlang».comp.lang.functional.misc.Ανακτήθηκε στις 25 Αυγούστου 2006.
  11. Joe Armstrong.«Erlang robustness».Ανακτήθηκε στις 15 Ιουλίου 2010.
  12. «Erlang Supervision principles».Ανακτήθηκε στις 15 Ιουλίου 2010.
  13. «High Performance Erlang».Αρχειοθετήθηκεαπό το πρωτότυποστις 16 Ιουνίου 2011.Ανακτήθηκε στις 26 Μαρτίου 2011.
  14. «Who uses Erlang for product development?».Frequently asked questions about Erlang.Ανακτήθηκε στις 16 Ιουλίου 2007.The largest user of Erlang is (surprise!) Ericsson. Ericsson use it to write software used in telecommunications systems. Many dozens projects have used it, a particularly large one is the extremely scalable AXD301 ATM switch.Άλλοι εμπορικοί χρήστες: Nortel, Deutsche Flugsicherung (ο εθνικός οργανισμός ελέγχου της εναέριας κυκλοφορίας της Γερμανίας), T-Mobile.
  15. «Programming Erlang».Ανακτήθηκε στις 13 Δεκεμβρίου 2008.Virtually all language use shared state concurrency. This is very difficult and leads to terrible problems when you handle failure and scale up the system...Some pretty fast-moving startups in the financial world have latched onto Erlang; for example, the Swedish www.kreditor.se.
  16. «Erlang, the next Java».Αρχειοθετήθηκεαπό το πρωτότυποστις 11 Οκτωβρίου 2007.Ανακτήθηκε στις 8 Οκτωβρίου 2008.I do not believe that other languages can catch up with Erlang anytime soon. It will be easy for them to add language features to be like Erlang. It will take a long time for them to build such a high-quality VM and the mature libraries for concurrency and reliability. So, Erlang is poised for success. If you want to build a multicore application in the next few years, you should look at Erlang.
  17. Clarke, Gavin (5 Φεβρουαρίου 2011).«Battlestar Galactica vets needed for online roleplay»(HTML).Music and Media.The Reg.Ανακτήθηκε στις 8 Φεβρουαρίου 2011.
  18. http://www.facebook.com/note.php?note_id=16787213919&id=9445547199&index=2
  19. «Αρχειοθετημένο αντίγραφο».Αρχειοθετήθηκεαπό το πρωτότυποστις 18 Ιουνίου 2009.Ανακτήθηκε στις 2 Απριλίου 2011.
  20. http://github.com/blog/112-supercharged-git-daemon
  21. What You Need To Know About Amazon SimpleDB
  22. http://twitter.com/jalada/status/1206606823
  23. http://twitter.com/jalada/statuses/1234217518

Περαιτέρω διάβασμα

[Επεξεργασία|επεξεργασία κώδικα]

Εξωτερικοί σύνδεσμοι

[Επεξεργασία|επεξεργασία κώδικα]