Elixir Lang'e Giriş

Yayınlanan: 2015-02-27

İksir Programlama Diline Giriş (Ve Neden Seviyorum)

Birkaç ay önce sizi Golang'la ve neden bu kadar çok sevdiğimi tanıtan bir makale yazdım. Onu gerçekten hala sevsem de, son zamanlarda yeni bir dille oynuyorum; İksir. Programlama İksiri kitabını satın aldım ve takip ediyorum. Elixir'i zaten sevmeye başladım ve bu makalede nedenini size göstermeyi umuyorum.

Birkaç yıl önce Couchbase için çalışırken, Erlang'a ve dağıtık sistemlere büyük ilgi duydum. Bana göre Erlang kafa karıştırıcı. Elixir'i gördüğümde, hemen iyi bir şeyin üzerinde olduğumu anladım. Elixir, Erlang VM'nin üzerinde çalışan işlevsel ve eşzamanlı bir dil olarak detaylandırılmıştır.

Pek çok kez, insanların İksir'in 'Erlang için Ruby' olduğunu söylediğini duydum. Bu teori tamamen yanlış değil, ama gerçekçi olarak, esas olarak sadece İksir'in sözdizimi Ruby'den etkilenir, çünkü paylaşmaz. aynı programlama yapılarının çoğu. Elbette, Erlang VM'nin üzerine inşa edilmiş olması ve bize Erlang ilkellerine doğal olarak doğrudan erişim sağlamasıyla Erlang'a benzer.

Her neyse, daha fazla tereddüt etmeden, biraz İksir ile başlayalım.

Kurulum

OSX üzerinde çalışıyorsanız, kurulum Homebrew kullanmak kadar kolaydır:
~ brew update
~ brew install erlang
~ brew install elixir

Bunu yaptıktan sonra, aşağıdakileri çalıştırabilmelisiniz:

~ elixir -v
> Elixir 1.0.2

Artık Elixir düzgün bir şekilde yüklendi, bir Etkileşimli İksir açabilir ve bazı temel ortak türlerle oynayabiliriz.

İksir Türleri

Girerek bir Etkileşimli İksir REPL başlatın
> iex

Değişkenler:

iex(1)> name = "rbin"
#=> "rbin"

atomlar:

Elixir'de Atom, adının kendi değeri olduğu bir sabittir.
iex(2)> :this_is_an_atom
#=> :this_is_an_atom
iex(3)> :my_atom == :atom
#=> false

demetler:

Tuples'ı tanımlamak için Curly Brace notasyonunu kullanıyoruz. Elixir'de, Tuple'lar hemen bellekte saklanır, yani bir Tuple'ın boyutunu almak veya bir Tuple öğesine erişmek hızlıdır, ancak güncelleme veya eleman eklemek pahalıdır, çünkü tüm tuple'ın bellekte kopyalanmasını gerektirir.

iex(4)> tuple = {:hello, "world"}
#=> {:hello, "world"}
iex(5)> elem(tuple, 1)
#=> "world"

Listeler:

Elixir'de listeler, bağlantılı listeler olarak bellekte saklanır. Öğeleri başa ekleyerek listeleri önemsiz bir şekilde güncelleyebiliriz, ancak boyutunu bulmak için tüm listeyi geçmemiz gerektiğinden öğeleri eklemek daha pahalıdır.

iex(8)> list = [1, 2, :atom]
#=> [1, 2, :atom]
iex(9)> ["string"] ++ list
#=> ["string", 1, 2, :atom]
iex(10)> list ++ [31]
#=> [1, 2, :atom, 31]

Bir listenin Baş ve Sonunu almak da dahil olmak üzere listelerle kullanılacak çok kullanışlı yerleşik işlevler vardır.

iex(11)> hd(list)
#=> 1
iex(12)> tl(list)
#=> [2, :atom]

Anonim İşlevler:

Elixir'de fonksiyonlar birinci sınıf vatandaşlardır, yani fonksiyonları diğer fonksiyonlara argüman olarak geçirebiliriz. Aşağıda, is_function/1 işlevine argüman olarak ileteceğimiz, bir işlev içeren add adında bir değişken tanımlayacağız.

iex(14)> add = fn a, b -> a + b end
#Function<12.90072148/2 in :erl_eval.expr/5>

iex(15)> add.(13, 31)
#=> 44

iex(16)> is_function(add)
#=> true

Projelerimizi Düzenleme (Karma)

Elixir, Mix adlı süper kullanışlı bir araçla birlikte gelir. Mix, projelerimizi çok kolay bir şekilde oluşturmamıza, düzenlememize, derlememize ve test etmemize olanak tanıyan bir derleme aracıdır. Ayrıca bağımlılıkları yönetmemizi de kolaylaştırır. (Her zaman hassas bir konu!) Mix ile yeni bir proje oluşturmak için aşağıdakileri yapmamız yeterlidir:
~ mix new myapp --module MyApp
Bu, içinde birkaç dosya bulunan myapp adlı bir dizin oluşturacaktır. Ayrıca lib/myapp.ex içinde MyApp modülünü tanımlayacaktır.
* creating README.md
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/myapp.ex
* creating test
* creating test/test_helper.exs
* creating test/myapp_test.exs


Your mix project was created successfully.
You can use mix to compile it, test it, and more:

cd myapp
mix test

Gördüğümüz gibi, temel bir proje yapısı için gereken tüm dosyaları alıyoruz. Bence bu, Elixir ile birlikte gelen daha hoş özelliklerden biri. Proje yönetimi araçlarına sahip olmak son derece kullanışlıdır ve büyük bir zaman tasarrufu sağlar.

Mix.exs dosyası, projemizi yapılandırmak ve bağımlılıkları yönetmek vb. için kullanılan ana dosyadır. Projemiz için çok yakut benzeri testler yazabileceğimiz bir test/klasör alıyoruz. Elbette projemizin kaynak dosyalarını içeren bir lib/folder alıyoruz. Uygulamamızda mix testi yaparsak, aşağıdakileri alırız:
$ mix test
Compiled lib/myapp.ex
Generated myapp.app
.

Finished in 0.04 seconds (0.04s on load, 0.00s on tests)
1 tests, 0 failures

Randomized with seed 543313

eşzamanlılık

Erlang'a çok benzeyen Elixir, eşzamanlılık için 'Aktör' modelini kullanır. Kodumuzun tamamı Processes içinde çalışır ve bu işlemler birbirinden izole edilir. Elixir'de Process'leri oluşturarak ve bunlar arasında mesaj gönderip alarak tam eşzamanlı programlar yapabiliriz.

Elixir'de, argüman olarak başka bir işlevi alan spawn işlevini kullanarak işlemleri başlatıyoruz.

iex(1)> spawn(fn -> IO.puts 1 + 1 end)
#=> 2
#PID<0.55.0>

Gördüğünüz gibi, 1 + 1 çıktısı veren bir süreç oluşturduk ve ayrıca Süreç Kimliğini de döndürdük. Bir değişkene atayabileceğimiz ve sürece mesaj göndermek için kullanabileceğimiz için bu İşlem Kimliğini döndürmek yararlıdır. Bunu yapmadan önce, sürece gönderdiğimiz mesajları elde etmek için bir alma mekanizması oluşturmamız gerekiyor. (Devam edebilir ve bunu Etkileşimli İksir oturumumuzda satır satır yapabiliriz.)

Bunu yaptıktan sonra, area_loop değerini değerlendiren bir süreç oluşturabilir ve onu pid öğesine atayabiliriz.

pid = spawn(fn -> Geometry.area_loop() end)
#=> #PID<0.40.0>

Daha sonra, :rectangle atomunu veya :circle atomunu alıp almadığına bağlı olarak, önceden tanımlanmış kodumuzun eşleşeceği pid'e mesajlar gönderebiliriz.

send pid, {:rectangle, 2, 3}
#=> Area = 6
# {:rectangle,2,3}

send pid, {:circle, 2}
#=> Area = 12.56000000000000049738
# {:circle,2}

Process.alive kullanarak işlemlerin hala çalışıp çalışmadığını kontrol edebiliriz. işlev.

Process.alive?(pid)
#=> false

Çözüm

Bu blogun yüzeyini bile çizmedik. Elixir'de o kadar çok harika özellik var ki, umarım kendiniz de kontrol etmeye devam edersiniz. Bu süreçte size yardımcı olması için aşağıda bazı öğrenme kaynaklarını listeledim, ancak yola çıkmadan ve dalmadan önce, Elixir ile ilgili en sevdiğim şeylerden bazıları:

  • Yakut benzeri bir sözdizimi ve Erlang benzeri ilkellerle kavraması kolaydı.
  • Arkasında harika bir topluluk var
  • Eşzamanlılık modeli hem bana tanıdık hem de çok güçlü
  • Mix bir nimettir ve ÇOK zaman kazandırır
  • İksir bizi her şeyi belgelemeye teşvik ediyor
  • Dağıtılmış uygulamalar oluşturmayı çok daha az kafa karıştırıcı bir savaş alanı haline getirir
  • Elixir'in UZUN bir yoldan gittiğini görebiliyorum.

Kaynaklar

Elixir'i öğrendiğim kısa sürede çok faydalı bulduğum bazı kaynaklar:

  • http://elixir-lang.org/getting-started/introduction.html
  • https://pragprog.com/book/elixir/programming-elixir
  • https://teamgaslight.com/blog/the-best-resources-for-learning-elixir
  • http://egzersiz.io

* Gidin ve o İksir'i yudumlayın! – @rbin *