مقدمة إليكسير لانج
نشرت: 2015-02-27مقدمة في لغة برمجة الإكسير (ولماذا أحبها)
لقد كتبت مقالًا قبل بضعة أشهر أعرّفتك به على موقع Golang ، ولماذا أحببته كثيرًا. بينما ما زلت أحبها بالفعل ، إلا أنني كنت ألعب مؤخرًا بلغة جديدة ؛ إكسير. اشتريت كتاب Programming Elixir وقمت بمتابعته من خلاله. لقد جئت بالفعل لأحب Elixir وآمل أن أوضح لك السبب في هذا المقال.
بينما كنت أعمل في Couchbase قبل عامين ، كنت مهتمًا جدًا بـ Erlang والأنظمة الموزعة. بالنسبة لي ، إرلانج محير. عندما رأيت الإكسير ، عرفت على الفور أنني كنت أفكر في شيء جيد. تم تفصيل Elixir كلغة وظيفية ومتزامنة تعمل على قمة Erlang VM.
لقد سمعت كثيرًا ، الناس يقولون أن الإكسير هو "روبي من أجل إرلانج" وما إلى ذلك. هذه النظرية ليست خاطئة تمامًا ، ولكن من الناحية الواقعية ، فإن تركيب الإكسير يتأثر بشكل أساسي بـ Ruby ، لأنه لا يشارك العديد من نفس بنيات البرمجة. إنه ، بالطبع ، مشابه من حيث طرق إرلانج ، حيث يتم بناؤه على قمة Erlang VM ، ويمنحنا وصولاً مباشرًا إلى بدائيات إرلانج أصلاً.
على أي حال ، دون مزيد من التردد ، دعنا نتعمق في بعض الإكسير.
تثبيت
إذا كنت تعمل على OSX ، فسيكون التثبيت سهلاً مثل استخدام Homebrew:
~ brew update
~ brew install erlang
~ brew install elixir
بمجرد القيام بذلك ، يجب أن تكون قادرًا على الجري:
~ elixir -v
> Elixir 1.0.2
الآن تم تثبيت Elixir بشكل صحيح ، يمكننا فتح Elixir التفاعلي واللعب ببعض الأنواع الشائعة الأساسية.
أنواع الإكسير
ابدأ تشغيل Elixir REPL تفاعليًا عن طريق إدخال
> iex
المتغيرات:
iex(1)> name = "rbin"
#=> "rbin"
الذرات:
في Elixir ، Atom هو ثابت يكون اسمه فيه قيمته الخاصة.
iex(2)> :this_is_an_atom
#=> :this_is_an_atom
iex(3)> :my_atom == :atom
#=> false
مجموعات:
نستخدم تدوين Curly Brace لتعريف المجموعات. في Elixir ، يتم تخزين Tuples على الفور في الذاكرة ، مما يعني الحصول على حجم Tuple ، أو الوصول إلى عنصر Tuple سريع ، لكن تحديث العناصر أو إضافتها يعد مكلفًا لأنه يتطلب نسخ المجموعة بالكامل في الذاكرة.
iex(4)> tuple = {:hello, "world"}
#=> {:hello, "world"}
iex(5)> elem(tuple, 1)
#=> "world"
القوائم:
في الإكسير ، تُخزَّن القوائم في الذاكرة كقوائم مرتبطة. يمكننا تحديث القوائم بشكل تافه عن طريق إضافة العناصر مسبقًا ، لكن إلحاق العناصر يكون أكثر تكلفة ، حيث نحتاج إلى اجتياز القائمة بأكملها لمعرفة حجمها.
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]
هناك وظائف مضمنة مفيدة للغاية لاستخدامها مع القوائم ، بما في ذلك الحصول على الرأس والذيل لقائمة.
iex(11)> hd(list)
#=> 1
iex(12)> tl(list)
#=> [2, :atom]
وظائف مجهولة:
في Elixir ، الدوال هي مواطنين من الدرجة الأولى ، مما يعني أنه يمكننا تمرير الوظائف كوسيطات إلى وظائف أخرى. أدناه ، سنعرّف متغيرًا باسم add يحتوي على وظيفة ، وسنمررها كمتغير إلى is_function / 1 func .
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
تنظيم مشاريعنا (ميكس)
يأتي Elixir بأداة مفيدة للغاية تسمى Mix. Mix هي أداة بناء تتيح لنا إنشاء مشروعاتنا وتنظيمها وتجميعها واختبارها بسهولة بالغة. كما أنه يسهل علينا إدارة التبعيات. (دائمًا موضوع حساس!) لإنشاء مشروع جديد باستخدام Mix ، نقوم ببساطة بما يلي:
~ mix new myapp --module MyApp
سيؤدي هذا إلى إنشاء دليل يسمى myapp مع بعض الملفات بداخله. سيحدد أيضًا وحدة MyApp داخل lib / myapp.ex .
* 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
كما نرى ، نحصل على جميع الملفات اللازمة لهيكل المشروع الأساسي. أعتقد أن هذه واحدة من أجمل الميزات المتوفرة التي تأتي مع الإكسير. يعد امتلاك أدوات إدارة المشروع أمرًا مفيدًا للغاية وموفرًا كبيرًا للوقت.
ملف mix.exs هو الملف الرئيسي المستخدم لتهيئة مشروعنا وإدارة التبعيات وما إلى ذلك. نحصل على اختبار / مجلد ، حيث يمكننا كتابة اختبارات تشبه روبي جدًا لمشروعنا . بالطبع نحصل على مجلد lib / ، والذي يحتوي على الملفات المصدر لمشروعنا. إذا أجرينا اختبار المزيج على تطبيقنا ، فسنحصل على ما يلي:
$ 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
التزامن
يستخدم Elixir ، مثل Erlang ، نموذج "الممثل" للتزامن. تعمل جميع التعليمات البرمجية الخاصة بنا داخل العمليات ، ويتم عزل هذه العمليات عن بعضها البعض. يمكننا عمل برامج متزامنة بالكامل في الإكسير عن طريق نشر العمليات وإرسال واستقبال الرسائل فيما بينها.
في Elixir ، نبدأ العمليات باستخدام وظيفة spawn ، والتي تأخذ وظيفة أخرى كوسيطة.
iex(1)> spawn(fn -> IO.puts 1 + 1 end)
#=> 2
#PID<0.55.0>
كما ترون ، لقد أنتجنا عملية نتجت عنها 1 + 1 ، وأعدنا أيضًا معرّف العملية. تعد إعادة معرف العملية هذا مفيدًا ، حيث يمكننا تخصيصه لمتغير واستخدامه لإرسال رسائل إلى العملية. قبل أن نقوم بذلك ، نحتاج إلى إنشاء آلية استلام للوصول إلى الرسائل التي نرسلها إلى العملية. (يمكننا المضي قدمًا والقيام بذلك في جلسة Interative Elixir الخاصة بنا ، سطراً بسطر.)
بمجرد القيام بذلك ، يمكننا إنشاء عملية تقوم بتقييم area_loop ، وإسنادها إلى pid .
pid = spawn(fn -> Geometry.area_loop() end)
#=> #PID<0.40.0>
يمكننا بعد ذلك إرسال رسائل إلى pid التي ستتطابق معها الشفرة المحددة مسبقًا ، اعتمادًا على ما إذا كانت تتلقى : ذرة المستطيل ، أو : ذرة الدائرة .
send pid, {:rectangle, 2, 3}
#=> Area = 6
# {:rectangle,2,3}
send pid, {:circle, 2}
#=> Area = 12.56000000000000049738
# {:circle,2}
يمكننا التحقق لمعرفة ما إذا كانت العمليات لا تزال قيد التشغيل باستخدام Process.alive؟ وظيفة.
Process.alive?(pid)
#=> false
خاتمة
نحن لم نخدش السطح في هذه المدونة. هناك العديد من الميزات الرائعة في Elixir ، آمل أن تستمر في التحقق منها بنفسك. لقد قمت بإدراج بعض موارد التعلم أدناه لمساعدتك على طول الطريق ، ولكن قبل أن تغوص في الغوص ، إليك بعض الأشياء الشخصية المفضلة عن Elixir:
- كان من السهل فهمه ، بتركيبة تشبه الياقوت ، وأصول بدائية شبيهة بإيرلانغ
- لديه مجتمع رائع وراءه
- إنه نموذج التزامن مألوف بالنسبة لي ، وقوي جدًا
- المزيج هو هبة من السماء ، ويوفر الكثير من الوقت
- يشجعنا الإكسير على توثيق كل شيء
- يجعل بناء التطبيقات الموزعة ساحة معركة أقل إرباكًا
- أستطيع أن أرى الإكسير يسير في طريق طويل.
موارد
بعض المصادر التي وجدتها مفيدة جدًا في وقتي القصير في تعلم الإكسير:
- 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://exercism.io
* انطلق واشرب هذا الإكسير! -rbin *