12/08/2018, 13:50

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.

0