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ữ.
Bạn đang xem: Clojure là gì
Xu hướng lúc bấy giờ là đa lõi, hiện có 2 ngôn từ điển hình nổi bật trên JVM tương hỗ đ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 trình làng 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.Nên dùng Clojure hoặc Scala nếu chương trình thiên về giám sát 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 việc làm, 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à độ đáng 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 tăng trưởng bằng. Tuy vậy hiện Clojure có động lực tăng trưởng mạnh hơn Scala vì một số ít 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.Scala phối hợp cả lập trình hướng đối tượng người dù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 thuần hơn rất nhiều. Scala là ngôn từ tĩnh, phải dịch rồi mới chạy được. Clojure là ngôn từ độ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 suất cao ra mã JVM hơn Clojure ). Yếu tố lai giữa OOP và FP của Scala vừa là ưu và là điểm yếu ké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ó khuynh 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ối thiểu một trong những biến thể của Lisp ( vì được dạy ở trường ) rất phần đông, nhất là trong giới điều tra và nghiên cứu khoa học máy tính .Cả Clojure và Scala đều hoàn toàn có thể gọi trực tiếp thư viện viết bằng Java và ngược lại ( tuy nhiên 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 từ để học, thì có lẽ rằng 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.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 từ phổ cập như Java, C #, Ruby nên khi mới khởi đầu học thì vận tốc học nhanh hơn Clojure. Ví dụ Twitter trong thời hạn ngắn đã hoàn toà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 từ nếu không làm đổi khác tâm lý của mình thì không đáng học. Clojure dựa trên Lisp mà Lisp là ngôn từ FP cổ xưa thứ 2 ( sau Forth ) và có lẽ rằng là duy nhất còn sống khoẻ đến ngày này. Scala lai giữa OOP và FP nên mặc dầu 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ó khuynh hướng viết theo kiểu OOP ( vậy thì dùng Java quách cho xong ), không tạo được đổi khác gì trong tâm lý 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).
Xem thêm: VốN Oda Lã Gã¬? ÄÁº·C Ä‘IểM, Æ°U Ä‘IểM Vã Nhæ°Á»£C Ä‘IểM CủA NguồN VốN Oda?
Học Scala sẽ có cảm xú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 xú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 và khám phá kĩ những chủ để sau khi học Clojure :Cú pháp ngoặc ()Các form căn bản như def, defn, fn, ifSequence và list, vector, hash, setLập trình concurrent và var, atom, ref, và agentCách liên kết với JavaCú pháp ngoặc ( ) Các form cơ bản như def, defn, fn, ifSequence và list, vector, hash, setLập trình concurrent và var, atom, ref, và agentCách link 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ì.(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.
Xem thêm:
Khi list được quote thì nó chỉ là giá trị literal ( khối tài liệu ). Khi list không được quote thì nó là lời gọi hàm : ( 1 ) list sẽ được evaluate và ( 2 ) thành phần tiên phong gọi là form sẽ quyết định hành động list sẽ được evaluate ra giá trị gì. ( a b c d ) thì hoàn toàn 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 : khám phá xem d là gì trước, sau đó đến c v.v. Xem thêm : Theme Park Là Gì ? Nghĩa Của Từ Theme Park Trong Tiếng Việt Theme Park Là GìClojure gồm phần core ngôn từ ( giống corelib của Ruby ) và phần contrib gồm những thư viện phong phú ( giống stdlib của Ruby ). Thư viện contrib nào tương quan nhiều đến bản thân ngôn từ 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 chú ý tập dùng được càng nhiều thư viện trong contrib càng tốt.