Làm quen với Clojure
Clojure
7
White

Ngoc Dao viết ngày 21/03/2016

JVM (Java Virtual Machine) là nền tảng hấp dẫn vì có nhiều thư viện nhất trong các loại nền tảng và có tốc độ nhanh. Ngôn ngữ chỉ là tập hợp các qui luật logic, bất kì ngôn ngữ nào cũng chỉ cần dịch sang byte code theo đúng chuẩn JVM là chạy được trên nó, nên ngoài Java trên JVM hiện có cả trăm ngôn ngữ.

Xu hướng hiện nay là đa lõi, hiện có 2 ngôn ngữ nổi bật trên JVM hỗ trợ đa lõi là Scala và Clojure. Bài Khủng hoảng đa lõi: Scala vs Erlang đã đề cập Scala, bài này giới thiệu Clojure bằng cách so sánh với Scala và Erlang, sau đó hướng dẫn cách thiết lập môi trường học.

So sánh với Scala và Erlang

Đa nhiệm có 2 mục tiêu: tận dụng hiệu quả sức mạnh xử lí của 1 máy và của nhiều máy. Do hạn chế của JVM nên Clojure và Scala chỉ làm tốt mục tiêu đầu, còn Erlang làm tốt cả 2. JVM dùng native thread của hệ điều hành nên Clojure và Scala chỉ chạy song song hiệu quả chừng vài ngàn công việc, vì các hệ điều hành chỉ chạy hiệu quả tối đa chừng vài ngàn thread, hơn nữa thì hệ điều hành sẽ không ổn định thậm chí treo máy. Erlang dùng green thread nên tốc độ tạo thread cực nhanh cỡ nano giây và số lượng thread tạo ra có thể lên đến cả triệu. Khi tải lên cao (nhiều công việc đến dồn dập cùng lúc), chương trình Erlang chỉ chạy chậm lại chứ ít có khả năng chết vì hệ thống hết tài nguyên (CPU và bộ nhớ) như chương trình Clojure và Scala. Tuy vậy với loại chương trình chuyên về tính toán số học thì Clojure và Scala nhanh hơn Erlang, do đó:

  • Nên dùng Clojure hoặc Scala nếu chương trình thiên về tính toán chỉ cần chạy tốt trên 1 máy, mỗi máy chỉ cần chạy song song chừng vài ngàn công việc, và ít cần truyền thông tin giữa nhiều máy.
  • Nên dùng Erlang khi chương trình cần độ song song cao trên 1 máy và nhiều máy, chịu được tải và độ tin cậy cao.

Erlang ra năm 1986, Scala ra năm 2003, Clojure ra sau Scala 4 năm nên chưa phát triển bằng. Tuy vậy hiện Clojure có động lực phát triển mạnh hơn Scala vì một số lí do:

  • Scala kết hợp cả lập trình hướng đối tượng (OOP) và lập trình hàm (FP), cú pháp phức tạp còn hơn cả Java. Trong khi đó Clojure chỉ là một biến thể (dialect) của Lisp, thuần FP nên cú pháp đơn giản hơn rất nhiều.
  • Scala là ngôn ngữ tĩnh, phải dịch rồi mới chạy được. Clojure là ngôn ngữ động, không cần dịch trước khi chạy (Ruby cũng động như cú pháp phức tạp hơn Clojure nhiều nên JRuby chậm hơn Clojure do mã Ruby khó dịch hiệu quả ra mã JVM hơn Clojure).
  • Yếu tố lai giữa OOP và FP của Scala vừa là ưu và là nhược điểm. Ưu vì cú pháp giống Java nên dễ học với người đã biết Java, nhược vì người trước nay chỉ quen viết OOP sẽ có xu hướng viết Scala theo kiểu OOP, ít tận dụng được tính năng xử lí đa lõi của Scala. 
  • Clojure là biến thể của Lisp, mà số người biết ít nhất một trong những biến thể của Lisp (vì được dạy ở trường) rất đông đảo, nhất là trong giới nghiên cứu khoa học máy tính.

Cả Clojure và Scala đều có thể gọi trực tiếp thư viện viết bằng Java và ngược lại (tuy vậy cú pháp gọi Java của Clojure tốt hơn). Nếu phải chọn học 1 trong 2 ngôn ngữ để học, thì có lẽ nên:

  • Chọn Scala nếu cần làm gấp project gì đó vì Scala nhiều tài liệu hơn, cú pháp giống những ngôn ngữ phổ biến như Java, C#, Ruby nên khi mới bắt đầu học thì tốc độ học nhanh hơn Clojure. Ví dụ Twitter trong thời gian ngắn đã có thể chuyển từ Ruby sang Scala.
  • Nên chọn Clojure nếu chưa biết FP là gì. Người ta bảo ngôn ngữ nếu không làm thay đổi suy nghĩ của mình thì không đáng học. Clojure dựa trên Lisp mà Lisp là ngôn ngữ FP cổ xưa thứ 2 (sau Forth) và có lẽ là duy nhất còn sống khoẻ đến ngày nay. Scala lai giữa OOP và FP nên mặc dù dễ làm quen hơn nhưng nếu trước giờ chỉ quen mỗi OOP thì khi viết chương trình bạn sẽ có xu hướng viết theo kiểu OOP (vậy thì dùng Java quách cho xong), không tạo được thay đổi gì trong suy nghĩ cho cái đầu của mình.

2 mô hình xử lí song song được hiệu quả nhất hiện nay là

. Erlang và Scala theo mô hình actor, Clojure theo mô hình STM. Actor giải quyết được vấn đề xử lí song song ở cả 2 trường hợp trên cùng một máy và trên nhiều máy khác nhau. STM thì chỉ giải quyết được vấn đề trên một máy. Tuy vậy, chủ trương của Clojure là dùng STM để tận dụng tối đa đặc tính của việc việc chạy trên một máy là bộ nhớ có thể dùng chung, giải quyết thật tốt vấn đề một máy trước, rồi trong tương lai mới tìm cách giải quyết vấn đề nhiều máy sau (dùng JMS chẳng hạn).

Học Scala sẽ có cảm giác nó tham lam tích hợp đủ thứ tính năng hầm bà lằng. Học Clojure sẽ có cảm giác nó đẹp.

Cách học

Nên biết Java trước khi học Clojure. Nếu đã biết Lisp rồi thì quá khoẻ vì Clojure chỉ là một phiên bản của Lisp, giống JRuby so với Ruby.

Cần tìm hiểu kĩ các chủ để sau khi học Clojure:

  • Cú pháp ngoặc ()
  • Các form căn bản như def, defn, fn, if
  • Sequence và list, vector, hash, set
  • Lập trình concurrent và var, atom, ref, và agent
  • Cách liên kết với Java

Nắm kĩ được các chủ đề trên là yếu tố quyết định để có căn bản Clojure vững chắc. Ở đây ta chỉ bàn thêm về chủ đề căn bản nhất là cú pháp ngoặc, các chủ đề khác trên mạng có đầy.

Cú pháp ngoặc có 3 điểm quan trọng:

  • Khi list được quote thì nó chỉ là giá trị literal (khối dữ liệu).
  • Khi list không được quote thì nó là lời gọi hàm: (1) list sẽ được evaluate và (2) phần tử đầu tiên gọi là form sẽ quyết định list sẽ được evaluate ra giá trị gì.
  • Dấu ngoặc chỉ để dành cho máy, thụt đầu dòng (indent, tuy đơn vị thụt không cố định là 2 hay 4 khoảng trắng như đa số ngôn ngữ) mới dành cho người. Khi nhìn mã nguồn, hãy nhìn thụt đầu dòng và làm như không thấy sự tồn tại của dấu ngoặc. Lúc đạt đến cảnh giới nhìn mà không thấy dấu ngoặc nữa là lúc bạn đã lên đến niết bàn của Lisp. Việc nhìn mà không thấy này chính ra lại là điều quan trọng nhất đối với người chưa quen với cú pháp của Lisp. Khi đã làm được việc này rồi, thì sẽ thấy mã nguồn của Clojure cũng dễ đọc như mã nguồn của các ngôn ngữ khác. Để dễ dàng làm được việc này, cần giúp sức của trình soạn thảo văn bản, ví dụ Emacs hoặc Eclipse.
  • (a b c d) thì có thể coi a là tên hàm, những cái còn lại là tham số. Để dễ hiểu thường phải đọc theo thứ tự từ phải sang trái: tìm hiểu xem d là gì trước, sau đó đến c v.v.

Clojure gồm phần core ngôn ngữ (giống corelib của Ruby) và phần contrib gồm các thư viện đa dạng (giống stdlib của Ruby). Thư viện contrib nào liên quan nhiều đến bản thân ngôn ngữ thì sẽ được đưa vào core dần. Thư viện nào tốt được xử dụng nhiều thì sẽ được đưa vào contrib. Hãy để ý tập dùng được càng nhiều thư viện trong contrib càng tốt.

Đọc thêm

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Ngoc Dao

102 bài viết.
289 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
62 8
Làm thế nào để nâng cấp trang web mà không làm gián đoạn dịch vụ? Đây là câu hỏi phỏng vấn các công ty lớn thường hỏi khi bạn xin vào vị trí làm lậ...
Ngoc Dao viết hơn 2 năm trước
62 8
White
42 1
Bài viết này giải thích sự khác khác nhau giữa hai ngành khoa học máy tính (computer science) và kĩ thuật phần mềm (software engineering), hi vọng ...
Ngoc Dao viết hơn 2 năm trước
42 1
White
34 1
Nếu là team leader, giám đốc công ty hay tướng chỉ huy quân đội, vấn đề cơ bản bạn gặp phải là “hướng mọi người đi theo con đường bạn chỉ ra”. Thử...
Ngoc Dao viết hơn 2 năm trước
34 1
Bài viết liên quan
White
0 0
Clojure là ngôn ngữ functional có hỗ trợ OOP. Về mặt khoa học máy tính, có nhiều cách để thực hiện đa hình. Ở phiên bản trước 1.2, đa hình trong Cl...
Ngoc Dao viết hơn 2 năm trước
0 0
White
2 0
Cách mã nguồn mở hoạt động vẫn là bí ẩn đối với nhiều người. Hi vọng bài viết nhằm gây quỹ cho Clojure dưới đây sẽ giúp giải tỏa thắc mắc cốt lõi c...
Ngoc Dao viết hơn 2 năm trước
2 0
White
3 4
Máy tính ngày càng có nhiều lõi. Do đó tìm cách lập trình đa nhiệm sao cho sử dụng tối ưu hết các lõi là xu hướng tất yếu. Ở cấp độ máy ảo, nằm gi...
Ngoc Dao viết hơn 2 năm trước
3 4
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
102 bài viết.
289 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!