Scala vs Groovy vs Clojure [đã đóng]


676

Ai đó có thể vui lòng giải thích sự khác biệt lớn giữa Scala, Groovy và Clojure. Tôi biết mỗi trình biên dịch này chạy trên JVM nhưng tôi muốn so sánh đơn giản giữa chúng.

Câu trả lời:


873

Groovy là một ngôn ngữ được gõ động, có cú pháp rất gần với Java, với một số cải tiến cú pháp cho phép mã nhẹ hơn và ít bản tóm tắt hơn. Nó có thể chạy qua một trình thông dịch cũng như được biên dịch, điều này giúp cho việc tạo mẫu nhanh, tập lệnh và học ngôn ngữ động mà không phải học một cú pháp mới (giả sử bạn biết Java). Kể từ Groovy 2.0, nó cũng có sự hỗ trợ ngày càng tăng cho việc biên dịch tĩnh . Groovy hỗ trợ các bao đóng và hỗ trợ lập trình theo kiểu hơi chức năng, mặc dù nó vẫn còn khá xa so với định nghĩa truyền thống về lập trình chức năng.

Clojure là một phương ngữ của Lisp với một vài tính năng nâng cao như Bộ nhớ giao dịch phần mềm . Nếu bạn thích Lisp và muốn sử dụng một cái gì đó giống như nó trong JVM, Clojure là dành cho bạn. Nó có thể là ngôn ngữ chức năng nhất chạy trên JVM và chắc chắn là ngôn ngữ nổi tiếng nhất. Ngoài ra, nó có một sự nhấn mạnh mạnh mẽ hơn vào tính bất biến so với các phương ngữ Lisp khác, nó đưa nó đến gần hơn với trái tim của những người đam mê ngôn ngữ chức năng.

Scala là ngôn ngữ hướng đối tượng hoàn toàn, hơn cả Java, với một trong những hệ thống loại tiên tiến nhất có sẵn trên các ngôn ngữ không nghiên cứu và chắc chắn là hệ thống loại tiên tiến nhất trên JVM. Nó cũng kết hợp nhiều khái niệm và tính năng của các ngôn ngữ chức năng, mà không ảnh hưởng đến định hướng đối tượng, nhưng sự thỏa hiệp của nó đối với các đặc điểm ngôn ngữ chức năng đã loại bỏ một số người đam mê sau này.

Groovy có sự chấp nhận tốt và một khung web phổ biến trong Grails. Nó cũng cung cấp năng lượng cho hệ thống xây dựng Gradle, thứ đang trở thành một lựa chọn thay thế phổ biến cho Maven. Cá nhân tôi nghĩ rằng đó là một ngôn ngữ với tiện ích hạn chế, đặc biệt là khi Jython và JRuby bắt đầu xâm nhập vào vùng đất JVM, so với các ngôn ngữ khác.

Clojure, thậm chí giảm giá một số tính năng rất thú vị, có sức hấp dẫn mạnh mẽ chỉ bằng một phương ngữ Lisp trên JVM. Nó có thể hạn chế sự phổ biến của nó, được cấp, nhưng tôi hy vọng nó sẽ có cộng đồng trung thành xung quanh nó trong một thời gian dài.

Scala có thể cạnh tranh trực tiếp với Java và giúp nó kiếm tiền trên hầu hết các khía cạnh. Tất nhiên, hiện tại nó không thể cạnh tranh về mức độ phổ biến và việc thiếu sự hậu thuẫn mạnh mẽ của công ty có thể cản trở sự chấp nhận của nó đối với môi trường công ty. Nó cũng là một ngôn ngữ năng động hơn nhiều so với Java, theo nghĩa là ngôn ngữ này phát triển như thế nào. Từ quan điểm của ngôn ngữ, đó là một điều tốt. Từ quan điểm của người dùng có kế hoạch có hàng ngàn dòng mã được viết trong đó, không phải như vậy.

Như một tiết lộ cuối cùng, tôi rất quen thuộc với Scala và chỉ làm quen với hai người kia.


1
Đẹp một. Mặc dù tôi phải nói Scala có sự hỗ trợ của công ty Lightbend và được sử dụng bởi những tên tuổi lớn như LinkedIn, Twitter, Spark và rất nhiều ngân hàng. Nơi tôi làm việc, chúng tôi có một cơ sở mã gồm 11 triệu dòng Scala, đây không phải là một ý tưởng hay nhưng nó hoạt động.
Joan

219

Scala

Scala đã phát triển từ một ngôn ngữ chức năng thuần túy được gọi là Kênh và đại diện cho việc triển khai phòng sạch của hầu hết tất cả cú pháp của Java, chỉ khác nhau ở chỗ có thể cải thiện rõ ràng hoặc nơi nó sẽ làm tổn hại đến bản chất chức năng của ngôn ngữ. Sự khác biệt này bao gồm các đối tượng singleton thay vì các phương thức tĩnh và suy luận kiểu.

Phần lớn điều này dựa trên công việc trước đây của Martin Oderky với ngôn ngữ Pizza . Việc tích hợp OO / FP vượt xa các lần đóng cửa đơn thuần và dẫn đến ngôn ngữ được mô tả là hậu chức năng.

Mặc dù vậy, đây là cách gần nhất với Java theo nhiều cách. Chủ yếu là do sự kết hợp giữa hỗ trợ OO và gõ tĩnh, nhưng cũng do một mục tiêu rõ ràng trong thiết kế ngôn ngữ nên nó sẽ tích hợp rất chặt chẽ với Java.

Groovy

Groovy rõ ràng đã giải quyết hai chỉ trích lớn nhất của Java bằng cách

  • được gõ động, loại bỏ rất nhiều nồi hơi và
  • thêm đóng cửa cho ngôn ngữ.

Có lẽ về mặt cú pháp gần nhất với Java, không cung cấp một số cấu trúc chức năng phong phú hơn mà Clojure và Scala cung cấp, nhưng vẫn cung cấp một cải tiến tiến hóa rõ ràng - đặc biệt là để viết các chương trình syle script.

Groovy có sự hỗ trợ thương mại mạnh nhất của ba ngôn ngữ, chủ yếu thông qua các nguồn.

Clojure

Clojure là một ngôn ngữ chức năng trong gia đình LISP, nó cũng được gõ một cách linh hoạt.

Các tính năng như hỗ trợ STM cung cấp cho nó một số hỗ trợ đồng thời tốt nhất, trong khi Scala yêu cầu thư viện của bên thứ 3 như Akka để sao chép này.

Về mặt cú pháp, đây cũng là ngôn ngữ xa nhất trong ba ngôn ngữ từ mã Java điển hình.

Tôi cũng phải tiết lộ rằng tôi quen thuộc nhất với Scala :)


11
Tôi chưa bao giờ nghe về ngôn ngữ Kênh này trước đây. Cảm ơn đã lấp đầy một khoảng trống nhỏ trong hồ sơ lịch sử.
Randall Schulz

8
Bạn thực sự không thể gọi Clojure là ngôn ngữ chức năng thuần túy . Nó chắc chắn có thể viết mã mệnh lệnh.
dbyrne

2
Scala đã xây dựng trong thư viện Akka để đồng thời dựa trên diễn viên. Nó không còn là một sự phụ thuộc của bên thứ 3.
scott m người làm vườn

2
@Orubel Trong mã byte, một lớp scala giống hệt với lớp Java tương đương - các loại và tất cả. Như một trường hợp cụ thể, toàn bộ API Java Akka được viết bằng Scala. Vì vậy, vui lòng giải thích ý của bạn bằng cách "không thể tích hợp" ở đây - bởi vì nó đọc như FUD đối với tôi.
Kevin Wright

3
Để tóm tắt tài liệu đó: "Các tính năng Scala không tồn tại trong Java không thể được sử dụng trực tiếp trong Java". Tuy nhiên ... các thành viên loại trừu tượng và các loại loại cao hơn là các tính năng khá tiên tiến mà bạn chắc chắn không bị buộc phải sử dụng! Java cũng không thể sử dụng các phương thức mà không có tham số, trình xây dựng hoặc mô đun mở rộng từ Groovy, do đó cũng khiến Groovy "không được tích hợp chặt chẽ" theo định nghĩa của riêng bạn.
Kevin Wright

68

Tôi không bao giờ có thời gian để chơi với clojure. Nhưng đối với scala vs Groovy, đây là lời của James Strachan - người tạo Groovy

"Mặc dù mẹo của tôi để thay thế javac lâu dài là Scala. Tôi rất ấn tượng với nó! Tôi có thể thành thật nói rằng nếu ai đó đã cho tôi xem cuốn sách Lập trình trong Scala của Martin Oderky, Lex Spoon & Bill Venners năm 2003 tôi Có lẽ chưa bao giờ tạo Groovy. "

Bạn có thể đọc toàn bộ câu chuyện ở đây


72
Cần phải đề cập rằng tuyên bố này không nói rằng Scala tốt hơn Groovy. James cũng được biết đến khi nói rằng nếu anh ta biết có bao nhiêu rắc rối để tạo ra một ngôn ngữ thì anh ta sẽ không bao giờ tạo ra một ngôn ngữ. Nhìn thấy trong bối cảnh này, rõ ràng tại sao anh ta sẽ không phát triển Groovy. Và tôi dám nói ông đã đưa ra nhiều ý tưởng hay, nhưng ông không phải là người tạo ra Groovy hiện tại. ông đã rời khỏi dự án từ lâu trước 1.0 vào năm 2007 và không tham gia kể từ đó. Có ít nhất là không có anh ta trong dự án như đã có với anh ta.
blackdrag

31
Và cho rằng James Strachan đang tích cực làm việc với ngôn ngữ Kotlin, Scala rõ ràng không đủ ấn tượng với anh ta.
bdkosher

6
@bdkosher anh ấy đang làm việc vì Scala quá ấn tượng đối với hầu hết các lập trình viên, và [quan trọng hơn,] ở một số nơi quá phức tạp, quá
Tên hiển thị

30

Chúng có thể được phân biệt với nơi chúng đến hoặc chủ yếu là nhà phát triển mà chúng nhắm mục tiêu.

Groovy giống như phiên bản kịch bản của Java. Các lập trình viên Java thời gian dài cảm thấy như ở nhà khi xây dựng các ứng dụng nhanh được hỗ trợ bởi các kiến ​​trúc lớn. Groovy on Grails, như tên cho thấy tương tự như khung Rails. Đối với những người không muốn bận tâm đến tính dài dòng của Java mọi lúc.

Scala là một ngôn ngữ lập trình hướng đối tượng và chức năng và các lập trình viên Ruby hoặc Python có thể cảm thấy gần gũi hơn với ngôn ngữ này. Nó sử dụng khá nhiều ý tưởng tốt phổ biến được tìm thấy trong các ngôn ngữ lập trình này.

Clojure là một phương ngữ của ngôn ngữ lập trình Lisp, vì vậy các nhà phát triển Lisp, Scheme hoặc Haskell có thể cảm thấy như ở nhà trong khi phát triển với ngôn ngữ này.


24
Scala không thực sự là một ngôn ngữ lập trình chức năng. Nó là một ngôn ngữ lập trình hướng đối tượng đầu tiên, với các tính năng chức năng.
Daniel C. Sobral

16
Tôi phải nói rằng, câu trả lời này cảm thấy rất giống như một cú đánh trong bóng tối. Tôi nghĩ rằng một trường hợp tốt có thể được đưa ra là Python gần Groovy hơn Scala và Ruby (theo ý kiến ​​của tôi) không quá gần với bất kỳ điều nào ở trên, có lẽ lại gần Groovy nhất. Haskell không quá giống như (Thông thường) Lisp hoặc Scheme (và do đó không giống như Clojure). Đối với tôi, câu trả lời này cảm thấy (tốt nhất!) Như "Tôi cũng không biết, hãy để tôi Wikipedia cho bạn".
John Y

21
Scala là một ngôn ngữ bắt buộc với một số tính năng chức năng. Nếu mọi người tiếp tục gọi một chức năng ngôn ngữ ngay khi nó chấp nhận các thành ngữ từ thế giới chức năng thì thuật ngữ này sẽ trở thành một thuật ngữ tiếp thị khác. Cũng có thể bắt đầu gọi hàm C ++ và mệnh lệnh Haskell.
jon-hanson

9
@alanlcode Oderky có thể nói những gì anh ấy muốn. Scala không có bất kỳ hệ thống nào để cách ly các tác dụng phụ, theo mặc định, nó không lười biếng và không coi mã là dữ liệu - nó coi các lệnh gọi hàm là dữ liệu, khác nhau. Đây là những vấn đề lớn nếu bạn muốn có đầy đủ chức năng. Mặt khác, Scala luôn cố gắng để đảm bảo Mô hình Đối tượng của nó không bị lỗi. Tôi yêu Scala, nhưng nó rõ ràng là chức năng thứ hai.
Daniel C. Sobral

7
Mặt khác, họ ngôn ngữ ML được công nhận là chức năng nhưng nghiêm ngặt và cho phép các tác dụng phụ / mã mệnh lệnh.
GClaramunt

8

Tôi đang đọc cuốn sách Lập trình viên thực dụng "Bí quyết Groovy: Mỡ bánh xe Java" của Scott Davis, Bản quyền 2008 và được in vào tháng Tư cùng năm.

Hơi lỗi thời nhưng cuốn sách cho thấy Groovy thực sự là một phần mở rộng của Java. Tôi có thể viết mã Java có chức năng chính xác như Java và đổi tên tệp * .groovy và nó hoạt động tốt. Theo cuốn sách, điều ngược lại là đúng nếu tôi bao gồm các thư viện cần thiết. Cho đến nay, thử nghiệm dường như chịu được điều này.


Đó là cuốn sách tốt nhất để học Groovy.
topr

Có lẽ điều quan trọng cần lưu ý là không phải tất cả các mã sẽ hoạt động giống hệt nhau. Một số trong những khác biệt này bao gồm cách Groovy hiểu các dấu ngoặc kép đơn và kép và ưu tiên của nó đối với quyền anh trong việc mở rộng. Hầu hết các mã sẽ làm việc như nhau, mặc dù.
Ononator

4

Rõ ràng, cú pháp hoàn toàn khác nhau (Groovy gần nhất với Java), nhưng tôi cho rằng đó không phải là điều bạn đang yêu cầu.

Nếu bạn quan tâm đến việc sử dụng chúng để tạo kịch bản cho một ứng dụng Java, Scala có lẽ không phải là một lựa chọn tốt, vì không có cách nào dễ dàng để đánh giá nó từ Java, trong khi Groovy đặc biệt phù hợp cho mục đích đó.


Tôi không hiểu quan điểm của bạn về việc sử dụng Scala để viết kịch bản Java. Bạn chắc chắn có thể viết một tập lệnh Scala điều khiển mã Java; không evalyêu cầu
Daniel Yankowsky

2
@Daniel, vui lòng xem câu hỏi về việc sử dụng Scala cho kịch bản mà tôi đã liên kết. Câu trả lời được chấp nhận ở đây là việc thiếu một cơ sở "eval" và hỗ trợ javax.scripting làm cho việc sử dụng Scala để tạo kịch bản cho một ứng dụng Java trở nên khó khăn hơn, ví dụ như Groovy.
Thilo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.