Khám phá vùng đất Elixir [Part 1]

Có một điều bạn nên biết: phần cứng ngày càng ảnh hưởng và tác động một cách mạnh mẽ đến cách chúng ta viết phần mềm.

Vài thập kỷ trở về trước khi mà bộ nhớ là một loại tài nguyên cực kỳ giới hạn thì phần mềm cần phải quản lý việc cấp phát bộ nhớ một cách cực kỳ cẩn thận và tiết kiệm. Các lập trình viên khi đó phải tiết kiệm từng byte bộ nhớ khi viết chương trình. Nhưng việc quản lý bộ nhớ “manual” này rất phức tạp và do đó không thể tránh khỏi sai sót khi chương trình ngày càng lớn và phức tạp. Nhưng may mắn là tốc độ CPU ngày càng tăng theo định luật Moore, điều này đã cho phép các ngôn ngữ lập trình mới ứng dụng mạnh mẽ “garbage-collection” để giải phóng lập trình viên khỏi công việc quản lý bộ nhớ một cách thủ công hay gây lỗi.

Và ngày nay chúng ta lại chứng kiến một hiện tượng tương tự đang nổi lên: tốc độ CPU không còn có thể tăng lên liên tục theo định luật Moore nữa và chi phí mà bạn phải trả cũng tăng lên rất nhiều theo số GHz (một chiếc CPU xung nhịp 3.6 GHz có tốc độ gấp đôi một chiếc CPU 1.8 GHz nhưng giá thì đắt hơn gấp nhiều lần, và bạn cũng đừng mong ứng dụng của bạn sẽ thực sự chạy nhanh gấp đôi với chiếc CPU đắt tiền này!). Thay vào đó các CPU sẽ ngày càng nhiều cores hơn, và điều này có nghĩa là chúng ta cần phải viết các phần mềm sử dụng được tối đa các cores này, một cách đồng thời, để tối đa hóa hiệu năng của hệ thống.

Khi lập trình concurrency chúng ta cần phải có các phương thức an toàn để truy cập bộ nhớ một cách đồng thời. Do hầu hết các ngôn ngữ lập trình dạng imperative sử dụng mutable-state nên việc quản lý và đồng bộ hóa các truy cập này là hết sức khó khăn cho lập trình viên.

May mắn thay, các ngôn ngữ Functional Programming với immutable-state, mà Elixir là một trong số đó, sẽ giúp chúng ta xử lý vấn đề này.

Elixir (đọc là ơ-lích-xờ theo tiếng Anh, hoặc ê-li-xi[a] theo tiếng Pháp hoặc Việt - nghe cho kêu :D) là một ngôn ngữ lập trình với syntax được inspire từ Ruby, và cha đẻ của ngôn ngữ này là Jose Valim - một Rails Core team-member, từng được vinh danh Ruby Heroes vào năm 2010.

Elixir chạy trên ErlangVM, do đó thừa hưởng tất cả các đặc tính ưu việt của ErlangVM. Một đặc tính đặc biệt của ErlangVM là tất cả code mà bạn viết đều chạy trong các tiny/lighweight/concurrent “process”. Các process này nói chuyện với nhau qua phương thức message-passing, và đặc biệt: các process có thể nằm trên các máy vật lý khác nhau, ErlangVM sẽ quản lý việc giao tiếp giữa các process này một cách trong suốt và bạn không cần quan tâm. Điều này khiến nó trở thành một môi trường lý tưởng cho các hệ thống phân tán. Trên thực tế các phần mềm chạy với hàng trăm nghìn “process” trên ErlangVM không phải là hiếm và bạn cũng có thể dễ dàng tạo ra hàng trăm nghìn, hàng triệu “process” với Elixir. Một số phần mềm nổi tiếng chạy trên ErlangVM có thể kể đến là: WhatsApp, RabbitMQ, Riak, CouchDB, LeoFS, ejabberd, Chef-server, SimpleDB (AWS), Call-of-Duty game-core (Oh, REALLYYY!!)

Elixir mang đến một cách tiếp cận mới mẻ và thực tế cho concurrency- và functional-programming, đồng thời lấp đầy các khoảng trống trong Erlang ecosystem như meta-programming, polymorphism, tooling,… Kết hợp với syntax đẹp, gọn gàng, lôi cuốn, giúp Elixir trở thành một lựa chọn sáng giá cho thời đại multi-cores và realtime-web.

(to be continued…)