Giới thiệu về Elixir
Hiện nay ngoài việc yêu cầu phát triển nhanh 1 trang web thì ta còn đề cao tốc độ xử lý của trang web, mức tiêu tốn RAM của trang web vì chi phí mua RAM trên host là khá đắt đỏ nên các nhà phát triển phần mềm luôn cố gắng chú trọng đến việc cố gắng giải quyết vấn đề này. Đối với cộng đồng lập trình ...
Hiện nay ngoài việc yêu cầu phát triển nhanh 1 trang web thì ta còn đề cao tốc độ xử lý của trang web, mức tiêu tốn RAM của trang web vì chi phí mua RAM trên host là khá đắt đỏ nên các nhà phát triển phần mềm luôn cố gắng chú trọng đến việc cố gắng giải quyết vấn đề này. Đối với cộng đồng lập trình viên thì việc giải quyết vấn đề tốc độ là giải quyết concurrency. Việc này thì được xử lý khá tốt ở những ngôn ngữ lâpj trình hướng chức năng (functional programming) như Scala, Erlang hay Elixir. Trong bài viết này ta sẽ cùng tìm hiểu về ngôn ngữ Elixir.
Elixir là một ngôn ngữ hướng chức năng (functional programming), dựa trên nền tảng của Erlang để phát triển một ngôn ngữ lập trình mới có cú pháp dề dùng và các công cụ kèm theo tiện lợi cho việc tạo gói và test.
Elixir chạy trên Erlang Virtual Machine với hiệu suất rất cao.Có thể chạy hàng trăm nghìn process chỉ trên cùng một server. Nếu process không được dùng đến sẽ không chiếm tài nguyên, và thời gian để sống lại thì siêu nhanh. Đấy là lợi thế của Erlang, được sử dụng trong các ứng dụng viễn thông nên tốc độ luôn là một vấn đề đặt lên hàng đầu.
Đặc điểm nổi trội của lập trình hướng chức năng là tính không bị đột biến. Điều này không được đảm bảo ở ngôn ngữ lập trình hướng đối tượng.
Nếu bạn đang sử dụng MAc OS thì đơn giản chỉ cần
brew install elixir
Đối với các hệ điều hành khác, các bạn có thể dễ dàng cài đặt thông qua hướng dẫn ở trang chủ của Elixir Cài đặt tại đây
Sau khi cài đặt thành công thì ta có thể kiểm tra version củ elixir
elixir --version Erlang/OTP 18 [erts-7.3] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace] Elixir 1.3.1
Vì bài viết này chỉ mang tính chất giới thiệu nên tôi sẽ không đi sâu vào tỉmg hiểu từng module của Elixir. Dưới đây sẽ chỉ giới thiệu những khái niệm cơ bản của elixir.
Để chạy thử và tìm hiểu các câu lệnh của elixir ta sẽ sử dụng iex (giống như irb của rails) câu đầu tiên vẫn là hello world huyền thoại thôi
IO.puts "hello world"
->
hello world :ok
Ở đây thì ta đã sử dụng module IO và hàm puts để in ra string như mong muốn.
Build Tools
Để build 1 ứng dụng Elixir hoàn chỉnh ta sẽ dùng 3 tool chính là OTP, Mixix và ExUnit
-
OTP - Open Telecom Platform. Có thể coi như là một framework được phát triển để giải quyết các vấn đề thường gặp trong việc phát triển distributed application dựa trên Erlang. OTP cho phép người lập trình có thể monitor node này từ node khác. Khi node kia chết vì lý do nào đó: thiên tai, mất điện... thì các node còn lại sẽ biết và sẽ có phương pháp xử lý (email cho admin, tự khởi động server dự phòng để thay thế...)
-
Mix là một công cụ dùng để build ứng dụng elixir thông qua các task để compiling, creating hay testing.
ExUnit là một côn cụ test unit dành cho elixir.
Chú ý là để sử dụng những tool trên thì hệ thống yêu cầu phải cài đặt Elixir v1.2.0 trở lên.
Tạo ứng dụng
Để tạo 1 ứng dụng Elixir ta sẽ sử dụng công cụ Mix thông qua cú pháp mix new + project name. Ở đây ta sẽ tạo ứng dụng sample_elixir
mix new sample_elixir
mix sẽ tạo thư mục sample_elixir cùng với các file
* creating README.md * creating .gitignore * creating mix.exs * creating config * creating config/config.exs * creating lib * creating lib/sample_elixir.ex * creating test * creating test/test_helper.exs * creating test/sample_elixir_test.exs
Ta để ý thấy file mix.exs nằm ở thư mục gốc của dự án và nó sẽ chịu trách nhiệm cấu hình cho dự án.
defmodule SampleElixir.Mixfile do use Mix.Project def project do [app: :sample_elixir, version: "0.1.0", elixir: "~> 1.3", build_embedded: Mix.env == :prod, start_permanent: Mix.env == :prod, deps: deps()] end Configuration for the OTP application Type "mix help compile.app" for more information def application do [applications: [:logger]] end Dependencies can be Hex packages: {:mydep, "~> 0.3.0"} Or git/path repositories: {:mydep, git: "https://github.com/elixir-lang/mydep.git", tag: "0.1.0"} Type "mix help deps" for more examples and options defp deps do [] end end
Ở đây, mix.exs đã định nghĩa sẵn 2 ham public là project sẽ chịu trách nhiệm khai báo cấu hình của dự án và application sẽ gen ra application file. Ta để ý thấy còn 1 hàm private deps được gọi trong hàm project và nó sẽ chịu trách nhiệm định nghĩa các dependencies
Sau khi tạo xong project, ta di chuyển đến thư muc dự án và tiến hành compile
mix compile
Ta se nhận được kết quả
Compiling 1 file (.ex) Generated sample_elixir app
Sau khi tiến hành compile thì file manifest sample_elixir.app được tự động sinh ra.
Running tests
Khi khởi tạo project thông qua mix thì nó cũng tự động sinh ra cấu trúc thư mục test với các file test có tên đặt theo cú pháp <filename>_test.exs nằm trong thư mục test để test tương ứng với các file trong thư mục lib.
Cụ thể trong project demo của ta thì ta sẽ có test/sample_elixir_test.exs ứng với lib/sample_elixir.ex.
Nội dung của file test hiện chỉ có
defmodule SampleElixirTest do use ExUnit.Case doctest SampleElixir test "the truth" do assert 1 + 1 == 2 end end
Ta sẽ thấy 2 điều đáng lưu ý là
- file test có đuôi là exs ( Elixir script file) nên sẽ không cần compile trước khi chạy test
- Ở đây đã định nghĩa sẵn module SampleElixirTest, ExUnit.Case để sử dụng testing API.
Mix cũng sẽ tự sinh file test/test_helper.exs để config moi trường chạy test.
Tiến hành chạy test
mix test
Kết quả là
Compiled lib/sample_elixir.ex Generated sample_elixir app Consolidated List.Chars Consolidated Collectable Consolidated String.Chars Consolidated Enumerable Consolidated IEx.Info Consolidated Inspect . Finished in 0.07 seconds (0.07s on load, 0.00s on tests) 1 test, 0 failures Randomized with seed 749106
Khi chạy mix test thì hệ thống đã compile lại toàn bộ source file và sinh ra application file một lần nữa.
Thử thay đổi nội dung test/sample_elixir_test.exs
assert 1 + 1 == 3
Chạy mix test một lần nữa ta sẽ thu được kết quả
Finished in 0.07 seconds (0.07s on load, 0.00s on tests) 1 test, 0 failures Randomized with seed 749106 Thangngocs-MacBook-Air:sample_elixir thangngoc$ vi test/sample_elixir_test.exs Thangngocs-MacBook-Air:sample_elixir thangngoc$ mix test 1) test the truth (SampleElixirTest) test/sample_elixir_test.exs:5 Assertion with == failed code: 1 + 1 == 3 lhs: 2 rhs: 3 stacktrace: test/sample_elixir_test.exs:6 Finished in 0.07 seconds (0.07s on load, 0.00s on tests) 1 test, 1 failure Randomized with seed 437587
Nếu test case fail thì ExUnit sẽ thông báo chi tiết lỗi gì và ở case nào.
Kết luận
Elixir là một ngôn ngữ mới, kết hợp những gì hay nhất từ cú pháp dễ dùng giống Ruby với sự ổn định và tốc độ của Erlang. Bài tới chúng ta sẽ cùng nhau tìm hiểu sâu hơn về cú pháp và các module của Elixir.