Elixir

**Elixir** on dünaamiline, funktsionaalne programmeerimiskeel, mis on üles ehitatud Erlangi printsiipidel. 

Elixir on välja töötatud selleks, et selle abil saaks luua kergesti hallatavaid ja skaleeritavaid rakendusi. Elixir ise kompileerib baitkoodi, mis on ühilduv Erlangi virtuaalmasinaga (BEAM) ning see tagab 100% koostalitlusvõime Erlangiga.

Erlang on ise väikese latentsusega, hajutatud ja suure rikketaluvusega süsteem. Need omadused erakordselt olulised, kui on tegemist rakendustega, kus fundamentaalne teenus peab olema kättesaadav kõigile. 

## Ajalugu
Elixiri arendus hakkas pihta 2011. aastal, kui programmeerimiskeele looja José Valim üritas parandada Railsi võimekust. Rails ei pakkunud vastavat lahendust probleemile ning José hakkas vaatama teisi tehnoloogiaid. Ta valis välja Erlangi virtuaalmasina. Tema eesmärk oli rakendada suuremat paindlikkust ja produktiivsust Erlangi virtuaalmasinas ning säilitada Erlangi ökosüsteem ning sellest arenes välja uus programmeerimiskeel Elixir.

## Platvormi omadused
### Skaleeritavus
Kogu Elixiri kood jookseb kergekaaluliste lõimetel, mida nimetatakse protsessideks. Need on omavahel eraldatud ja peavad omavahel sidet:
```
current_process = self()
# Loome Elixir'i protsessi
spawn_link(fn ->
  send current_process, {:msg, "tere maailm"} #saadame sõnumi tere maailm
end)

# Ootame, kuni sõnum on saabunud
receive do
  {:msg, contents} -> IO.puts contents #prindib välja tere maailm
end
```
Eraldatus lubab protsesse eemaldada sõltumatult, millega lühenevad süsteemisisesed pausid ja arvuti ressursse kasutatakse võimalikult efektiivselt. Protsessid on võimelised suhtlema erinevate masinate protsessidega üle võrgu. Arendajal on võimalik töö mitme sõlme vahel ära jagada. See loob aluse hajussüsteemi ehitamiseks.

### Veataluvus
#### Esimest tüüpi viga
Esimest tüüpi vead on seotud probleemidega, mis tulevad väljastpoolt programmi. Need tekivad siis, kui kolmanda osapoole teenuse või süsteemiressurssi vahel puudub ühendus või võtab liiga kaua aega. Erlangi virtuaalmasin on vastutav kommunikatsiooni eest serveri ja sõlmede vahel. Sõlme informeeritakse sellest, kui ühendus puudub teise sõlme vahel.

#### Teist tüüpi viga
Teist tüüpi vead on seotud andmetega. Need tekivad siis, kui rakenduse funktsioon teeb näiteks matemaatilisi tehteid ja saab sisendiks sõne numbri asemel, siis selle tõttu rakendus hangub. Programm on tõrketaluv, kui süsteem suudab ennast ise ravida loogikavigadest, vale sisendi ja sisemiste vigade eest. Elixir on kompileeritud keel, kus vead koodis takistavad rakenduse käivitumist. See tagab, et rakendus oleks vähemalt korrektne käivitumisel. Seda nimetatakse järelevalve printsiipiks ja seotakse protsessi eralduvusega, kus üks moodul on võimeline käitama isoleerituid protsesse. See tagab, et vead ühes moodulis ei jooksuta kokku tervet rakendust ja seda moodulit saab taaskäivitada ka eraldi.

## Keele omadused
### Funktsionaalne programmeerimine
Funktsionaalne programmeerimine edendab programmeerimise stiili arendajas. See aitab arendajal kirjutada koodi, mis on lühem, kiirem ja paremini hallatav. Mustrisobitus tagab arendajale üleliigsete andmete likvideerimise ja ligipääsu andmetele: 
 %Kasutaja{nimi: nimi, vanus: vanus} = Kasutaja.get("John Doe")
 nimi #=> tagastab "John Doe"
Valvurid koos mustrisobitusega lubab arendajal sobitada ja olla kindel, et rakendus töötab väga spetsiifiliste tingimuste korral:
 def juhi(%Kasutaja{vanus: vanus}) **when** vanus>= 16 do
  #when on valvur, mis teeb seda, et funktsioon käivitatakse ainult siis, kui juht on vanem kui 16.
 end
 
 juhi(Kasutaja.get("John Doe"))
 #=> ebaõnnestub
Elixir tugineb tugevalt neile omadustele, et arendaja tarkvara töötaks kindlatel piirangutel.

## Viited