Sự khác biệt chính giữa Scala và Groovy là gì? [đóng cửa]


128

Nhìn bề ngoài, Groovy và Scala trông khá giống nhau, ngoài Scala được gõ tĩnh và Groovy năng động.

  • Sự khác biệt chính khác, và lợi thế từng có khác nhau là gì?
  • Họ thực sự giống nhau như thế nào?
  • Có sự cạnh tranh giữa hai người không?
    • Nếu vậy, bạn nghĩ ai sẽ chiến thắng trong thời gian dài?

Groovy 2.0 cũng bao gồm gõ tĩnh: infoq.com/articles/new-groovy-20
HDave

Câu trả lời:


230

Cả hai đều là ngôn ngữ hướng đối tượng cho JVM có lambdas và đóng và tương tác với Java. Ngoài ra, chúng cực kỳ khác nhau.

Groovy là một ngôn ngữ "động" không chỉ theo nghĩa là nó được gõ động mà còn hỗ trợ lập trình meta động.

Scala là một ngôn ngữ "tĩnh" ở chỗ nó được gõ tĩnh và hầu như không có lập trình meta động ngoài những thứ vụng về mà bạn có thể làm trong Java. Lưu ý, hệ thống kiểu tĩnh của Scala đồng nhất và tinh vi hơn so với Java.

Groovy bị ảnh hưởng về mặt cú pháp bởi Java nhưng bị ảnh hưởng nhiều về mặt ngữ nghĩa bởi các ngôn ngữ như Ruby.

Scala bị ảnh hưởng về mặt cú pháp bởi cả Ruby và Java. Nó bị ảnh hưởng nhiều về mặt ngữ nghĩa bởi Java, SML, Haskell và một ngôn ngữ OO rất tối nghĩa được gọi là gBeta.

Groovy có nhiều công văn "tình cờ" do cách nó xử lý quá tải Java.

Scala chỉ là một công văn, nhưng có khớp mẫu lấy cảm hứng từ SML để giải quyết một số vấn đề tương tự mà nhiều công văn có nghĩa là phải xử lý. Tuy nhiên, trong đó nhiều công văn chỉ có thể gửi theo loại thời gian chạy, khớp mẫu của Scala có thể gửi trên các loại thời gian chạy, giá trị hoặc cả hai. Khớp mẫu cũng bao gồm ràng buộc biến dễ chịu về mặt cú pháp. Thật khó để nhấn mạnh tính năng đơn độc này làm cho việc lập trình trong Scala trở nên dễ chịu như thế nào.

Cả Scala và Groovy đều hỗ trợ một dạng thừa kế với mixin (mặc dù Scala gọi chúng là đặc điểm).

Scala hỗ trợ cả ứng dụng chức năng một phần và cà ri ở cấp độ ngôn ngữ, Groovy có một phương pháp "cà ri" vụng về để thực hiện ứng dụng chức năng một phần.

Scala không tối ưu hóa đệ quy đuôi trực tiếp. Tôi không tin Groovy. Điều đó quan trọng trong lập trình chức năng nhưng ít quan trọng hơn trong lập trình mệnh lệnh.

Cả Scala và Groovy đều được đánh giá háo hức theo mặc định. Tuy nhiên, Scala hỗ trợ các tham số gọi theo tên. Groovy không - gọi bằng tên phải được mô phỏng với các bao đóng.

Scala có "để hiểu", một sự khái quát hóa các cách hiểu danh sách được tìm thấy trong các ngôn ngữ khác (về mặt kỹ thuật chúng là sự hiểu biết đơn điệu cộng với một chút - ở đâu đó giữa Haskell's do và LINQ của C #).

Scala không có khái niệm về các trường "tĩnh", các lớp bên trong, các phương thức, v.v. - thay vào đó, nó sử dụng các đối tượng singleton. Groovy sử dụng khái niệm tĩnh.

Scala không được xây dựng trong việc lựa chọn các toán tử số học theo cách mà Groovy làm. Trong Scala bạn có thể đặt tên cho các phương thức rất linh hoạt.

Groovy có toán tử elvis để xử lý null. Các lập trình viên Scala thích sử dụng các loại Tùy chọn để sử dụng null, nhưng thật dễ dàng để viết một toán tử elvis trong Scala nếu bạn muốn.

Cuối cùng, có những lời nói dối, có những lời nói dối chết tiệt, và sau đó là điểm chuẩn. Trò chơi điểm chuẩn ngôn ngữ máy tính xếp hạng Scala ở giữa nhanh hơn Groovy (nhanh gấp hai đến 93 lần) trong khi vẫn giữ nguyên kích thước nguồn tương tự. điểm chuẩn .

Tôi chắc chắn có rất nhiều, rất nhiều sự khác biệt mà tôi chưa đề cập. Nhưng hy vọng điều này cung cấp cho bạn một ý chính.

Có một sự cạnh tranh giữa họ? Vâng, tất nhiên, nhưng không nhiều như bạn nghĩ. Đối thủ cạnh tranh thực sự của Groovy là JRuby và Jython.

Ai sẽ thắng? Quả cầu pha lê của tôi cũng bị nứt như bất kỳ ai khác.


21
sẽ là một chiến thắng cho cả hai nếu người ta có thể khiến các trường đại học bắt đầu dạy những ngôn ngữ này thay vì chỉ java =)
Chii

13
Không phải là bất biến là một đặc điểm chính của Scala? Thế còn đồng thời và diễn viên? Hãy cho chúng tôi biết thêm ...
Leonel

4
Nếu có bất kỳ sự cạnh tranh nào thì đó sẽ là với Clojure, nhưng Clojure không hứng thú với việc cạnh tranh.
Rayne

2
Cho rằng Scala sử dụng cùng một phương thức gõ tĩnh như java (mà hotspot có thể dễ dàng nội tuyến) và Groovy thực hiện phương thức động sẽ khiến Groovy thực sự khó khăn để đạt được hiệu suất của Scala. Đặc biệt với @specialised để tối ưu hóa hộp thư tự động của java, Scala có thể nhanh hơn java nhiều lần. Tuy nhiên, trường hợp sử dụng cho Groovy tương tự như sử dụng Ruby / Python - ngôn ngữ kịch bản được gõ động dễ sử dụng trong đó hiệu suất thường không phải là vấn đề lớn. ví dụ: nhiều khung công tác Groovy chứa một tấn mã Java cho hiệu suất (như Grails)
James Strachan

4
Vì câu trả lời này có rất nhiều phiếu bầu, nên có một phần tôi muốn sửa. Đúng là đa phương thức dựa trên thừa kế trong Groovy bắt đầu như một sự tình cờ, nhưng trên Hội nghị các nhà phát triển Groovy, bao gồm James và đó là rất lâu trước khi Groovy 1.0 chúng tôi quyết định giữ điều đó. Sẽ không khó để thay đổi điều này. Ngoài ra để thêm vào những gì James đã viết ... inv invocate đã gỡ bỏ rào cản mà anh ta đang nói đến
blackdrag

12

scala có nghĩa là một ngôn ngữ lai oo / chức năng và rất lên kế hoạch và thiết kế tốt. Groovy giống như một tập hợp các cải tiến mà nhiều người thích sử dụng trong java. tôi đã xem xét kỹ hơn về cả hai, vì vậy tôi có thể nói :)

không ai trong số họ là tốt hơn hoặc xấu hơn so với người khác. Groovy rất giỏi lập trình meta, scala rất giỏi mọi thứ không cần lập trình meta, vì vậy ... tôi có xu hướng sử dụng cả hai.



7

Bạn đã đánh vào đầu đinh bằng cách gõ tĩnh và động. Cả hai đều là một phần của thế hệ ngôn ngữ động mới, với các bao đóng, biểu thức lambda, v.v. Có một số khác biệt về cú pháp giữa cả hai, nhưng về mặt chức năng, tôi không thấy sự khác biệt lớn giữa Groovy và Scala.

Scala thực hiện Danh sách một chút khác nhau; trong Groovy, hầu hết mọi thứ đều là phiên bản của java.util.List, trong khi Scala sử dụng cả Danh sách và mảng nguyên thủy. Groovy có (tôi nghĩ) nội suy chuỗi tốt hơn.

Scala nhanh hơn, có vẻ như, nhưng những người Groovy thực sự đang đẩy hiệu suất cho phiên bản 2.0. 1.6 đã có một bước nhảy vọt về tốc độ so với loạt 1.5.

Tôi không nghĩ rằng một trong hai ngôn ngữ sẽ thực sự 'chiến thắng', vì chúng nhắm vào hai loại vấn đề khác nhau. Scala là một ngôn ngữ hiệu năng cao rất giống Java mà không có mức độ sôi nổi tương tự như Java. Groovy là để tạo mẫu và phát triển nhanh chóng, trong đó tốc độ không quan trọng bằng thời gian để các lập trình viên thực hiện mã.


3
"Groovy là để tạo mẫu và phát triển nhanh" - điều này cho thấy Groovy không phù hợp để sử dụng sản xuất mà tôi không đồng ý. Ví dụ, có khá nhiều trang web Grails được sử dụng trong sản xuất
Dónal

10
Scala không phải là một ngôn ngữ năng động.
John Oxley

2
"Groovy có (tôi nghĩ) nội suy chuỗi tốt hơn." - với Scala-2.10.0, điều này không còn đúng nữa (Scala có nội suy chuỗi mát mẻ).
VasiliNovikov

5

Scala có đường cong học tập dốc hơn nhiều so với Groovy. Scala hỗ trợ nhiều hơn cho lập trình chức năng với phép đệ quy mẫu và đệ quy dựa trên đuôi, nghĩa là nhiều công cụ hơn cho FP thuần túy.


0

Scala cũng có trình biên dịch động và tôi đã thực hiện bằng cách sử dụng twitter eval lib ( https://github.com/twitter/util ). Tôi giữ mã scala trong một tệp phẳng (không có bất kỳ phần mở rộng nào) và sử dụng lớp scala được tạo bằng eval trong thời gian chạy. Tôi có thể nói scala là lập trình meta và có tính năng biến chứng động

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.