Giới thiệu về Elixir
Bài đăng này đã không được cập nhật trong 8 năm
Mở đầu
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
.
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.
Cài đặt và hướng dẫn
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.
All rights reserved