2011-10-01 18 views
25

Cả hai ngôn ngữ đều là JVM dựa trên sự hỗ trợ mạnh mẽ cho lập trình hàm. Tôi biết rằng sẽ có một lớp lớn các vấn đề mà cả hai ngôn ngữ sẽ cung cấp các giải pháp tuyệt vời .. Điều tôi muốn biết là nếu có bất kỳ loại vấn đề cụ thể nào mà các tính năng của Clojure sẽ cho nó một lợi thế đáng chú ý đối với Scala và ngược lại. Hiện tại chúng tôi làm rất nhiều công việc của chúng tôi ở Scala nhưng tôi muốn tìm kiếm các không gian vấn đề cụ thể nơi Clojure có thể cung cấp giải pháp tốt hơn.Lớp học nào của vấn đề là Clojure tốt/xấu trong việc giải quyết Scala vis-a-vis?

Trả lời

38

Cả hai ngôn ngữ đều rất có khả năng và phù hợp với hầu như tất cả các miền. Bạn không thể đi sai với ngôn ngữ nào cả - tôi đã đi xa đến mức có thể nói rằng họ có lẽ là hai ngôn ngữ hứa hẹn nhất hiện nay.

tôi vẫn nghĩ rằng có một vài lĩnh vực mà họ từng có lợi thế đặc biệt: những điểm mạnh đặc biệt

Clojure của liên quan đến Scala:

  • Concurrency - Clojure đã hỗ trợ đồng thời độc đáo và rất mạnh mẽ được xây dựng vào ngôn ngữ, dựa trên một cách suy nghĩ mới về nhận diện đối tượng và trạng thái có thể thay đổi. Điều này đã được giải thích rất tốt ở nơi khác vì vậy tôi sẽ không đặc biệt đi vào chi tiết ở đây, nhưng điều này video by Rich Hickey là một nơi tuyệt vời để có được một số hiểu biết.
  • Lập trình meta - Clojure là ngôn ngữ homoiconic làm cho nó đặc biệt thích hợp cho lập trình meta dựa trên macro, tạo DSL và tạo mã. Nó tuân theo triết lý "mã hóa dữ liệu" của Lisp về mặt này.
  • động gõ - Clojure là một ngôn ngữ năng động, với tất cả những ưu điểm thường đi kèm với các ngôn ngữ động (ít soạn sẵn, tạo mẫu nhanh, mã rất ngắn gọn, vv)
  • lập trình chức năng - mặc dù bạn có thể làm FP trong Scala, Clojure chắc chắn cảm thấy giống như một langauge chức năng (trong khi Scala có lẽ là mô tả tốt nhất là đa mô hình). Sự nhấn mạnh chức năng này trong Clojure thể hiện bằng nhiều cách, ví dụ được xây dựng trong hỗ trợ đánh giá lười biếng trên tất cả các thư viện cốt lõi, tất cả các cấu trúc dữ liệu đều không thay đổi, Clojure thành ngữ "coding style" là chức năng hơn là bắt buộc/OOP.

mạnh đặc biệt của Scala so với Clojure:

  • Object hướng - Scala là khái niệm gần gũi hơn với Java và có hỗ trợ tốt hơn cho các phương pháp OOP Java-style. Trong khi bạn có thể làm OOP trong Clojure, nó không phải là một sự phù hợp thoải mái.
  • cú pháp quen thuộc - cú pháp Scala có lẽ sẽ thoải mái hơn với những người đến từ ngôn ngữ không phải Lisp khác
  • tĩnh gõ - Scala có một hệ thống kiểu tĩnh rất tinh vi. Trong trường hợp gõ tĩnh là lợi thế, Scala sẽ có một cạnh rõ ràng. Các lợi thế thông thường của việc gõ tĩnh áp dụng - trình biên dịch có thể bắt được nhiều lỗi "loại" hơn, trình biên dịch có nhiều cơ hội hơn để thực hiện tối ưu hóa hiệu suất, v.v.
  • trưởng thành hơn - Scala dài hơn Clojure một chút (2003 so với . 2007), và kết quả là có một số lợi ích mà bạn mong đợi từ một ngôn ngữ trưởng thành hơn (hỗ trợ công cụ tốt hơn, cộng đồng lớn hơn một chút)

Để hoàn thiện, có một số lợi thế đặc biệt mà cả hai ngôn ngữ chia sẻ:

  • cộng đồng tích cực và sáng tạo - cả hai ngôn ngữ đã xây dựng được một cộng đồng năng động với một loạt các đóng góp
  • khả năng tương tác tuyệt vời với Java - cả hai ngôn ngữ có thể dễ dàng tận dụng các mảng lớn các thư viện và các công cụ trong hệ sinh thái Java
  • lợi thế JVM - cả hai ngôn ngữ được hưởng lợi từ tất cả các kỹ thuật tuyệt vời trong JVM (biên dịch JIT, các thuật toán thu gom rác thải, môi trường thực thi tối ưu hóa, vv)
+3

Tôi sợ những câu trả lời như một câu hỏi có thể đã dẫn đến. Cảm ơn bạn đã tạo ra một câu trả lời hoàn hảo! –

11

Tôi thích sử dụng Clojure để viết DSL vì hệ thống macro của Clojure. Ngoài ra, tôi thích Clojure cho một số loại hệ thống đồng thời. Hỗ trợ bản địa của Clojure cho software transactional memory hoàn toàn khác với mô hình diễn viên của Scala.

Clojure không có hỗ trợ tuyệt vời cho lập trình hướng đối tượng. Đối với các dự án mà mô hình hướng đối tượng hoạt động tốt, hoặc bạn sẽ dựa chủ yếu vào các thư viện/khung công tác Java, tôi thích Scala hơn.

+2

Câu trả lời hay, mặc dù Scala tốt hơn cho các DSL tự nhiên hơn (ít hơn (parenthetical)). –

+6

Lưu ý rằng [Akka] (http://akka.io/) cung cấp [hỗ trợ STM] tương tự (http://akka.io/docs/akka/1.2/scala/stm.html) cho Scala/Java. –

+2

@Duncan - lưu ý rằng Clojure DSL không cần phải có bất kỳ dấu ngoặc đơn nào ngoài hàm macro/hàm bạn quấn chúng vào bên trong. Bạn có thể dễ dàng viết một DSL mà đã làm một cái gì đó như (giải quyết-phương trình-rễ [x] "0,5x^3 - 6x^2 + 2x -1 = sin x") ví dụ – mikera

4

Một trong những điều tuyệt vời về Clojure và Scala là bạn có thể sử dụng cả hai trong số đó ở cùng một nơi, với ma sát tối thiểu. Tôi chỉ đề nghị thực hiện hầu hết các interop trong Clojure, vì tôi nghĩ rằng nó có một cạnh ở đó.

Chỉ cần thử cả hai và xem những vấn đề và ngôn ngữ nào phù hợp với nhau. Bạn luôn có thể tương thích giữa mã Java, Scala và Clojure trong cùng một hệ thống rất dễ dàng.

+0

Interop với cái gì? – soc

+0

Interop giữa các ngôn ngữ trên JVM. I E. Clojure sử dụng Java, Java sử dụng Scala, Scala sử dụng Clojure, v.v. –

+0

Khá lạ. Tôi thường nghe tuyên bố này rằng Clojure có sự tương tác tốt hơn, nhưng tiếc là điều này không bao giờ được hỗ trợ bởi bất kỳ sự kiện thực tế nào. – soc

Các vấn đề liên quan