Các nhà phát triển Java nghĩ gì về Scala? [đóng cửa]


19

Tôi đã lưu ý rằng hỗ trợ IDE không ở đâu tốt bằng, nhưng bản thân ngôn ngữ hỗ trợ các thành ngữ lập trình chức năng rõ ràng hơn nhiều.


3
Python là tôn giáo của tôi, vì vậy tôi chỉ quan tâm đến những gì Guido nghĩ về Scala. neopythonic.blogspot.com/2008/11/scala.html
Công việc

7
Scala là một ngôn ngữ tuyệt vời đến nỗi nó không chỉ thu hút tất cả những bộ óc vĩ đại mà cộng đồng Scala có, mà đáng buồn thay, cũng có rất nhiều kẻ thù ghen tị cố gắng tìm bất cứ thứ gì để tấn công ngôn ngữ và những người sử dụng nó.
soc

@soc: Nói rõ hơn: Tôi không ghét Scala và những người sử dụng nó có lẽ không thể (không nên!) quan tâm đến những gì tôi nghĩ về nó. Tôi nghĩ nó quá phức tạp. Đó là tất cả. Sự phức tạp có thể phù hợp với những người có bộ não lớn. Tôi không :-)
Joonas Pulakka

3
Xin lỗi, tôi chỉ thấy khó chịu khi mọi người cứ lặp đi lặp lại những huyền thoại mà không ủng hộ những tuyên bố của họ.
soc

2
@soc: Chà, toàn bộ câu hỏi này là hoàn toàn chủ quan, vì vậy bất kỳ câu trả lời nào là đúng, có thể là huyền thoại hay không.
Joonas Pulakka

Câu trả lời:


18

Tôi đã lập trình Scala hơn một năm nay, vì vậy tôi sẽ cố gắng đặt lại chính mình một năm để trả lời câu hỏi này.

  • Mã Scala ngắn gọn hơn mã Java (không có setter hay getter, rất nhiều thông tin loại có thể được suy ra)
  • Sự hỗ trợ tích hợp cho nghĩa đen của XML rất hấp dẫn.
  • Khả năng tương thích và khả năng tương tác của thư viện Java là rất tốt
  • Sự hỗ trợ cho các thành ngữ chức năng nhất định là làm mới (để hiểu, đóng, các hàm lambda, ánh xạ, gấp, giảm)
  • Dường như không có một tính năng hay mà người tạo ngôn ngữ không muốn đưa vào

Những điểm trên ít nhiều là những gì tôi nghĩ về Scala trước khi tôi bắt đầu tìm hiểu nó.

Trong quá trình một năm, đây là những gì tôi tìm ra:

  • Mua sách cầu thang là một khoản đầu tư tuyệt vời và giúp tôi tiết kiệm hàng giờ để tự học mọi thứ
  • Cú pháp có một số điểm kỳ lạ và đôi khi tôi thực sự bối rối tại sao một cái gì đó không hợp lệ. Sự đánh đổi là một khi bạn đã quen thuộc, mã ít lộn xộn hơn và dễ đọc hơn. Lưu ý rằng đây không thực sự là một vấn đề nếu bạn đọc chứ không phải viết mã.
  • Thư viện bộ sưu tập trong 2.8 là một niềm vui để sử dụng. Thật khó để quay lại với Java.
  • Nghĩa đen của XML là tốt, nhưng ngoài một số điều cơ bản, tôi đã phải tiếp cận với hệ sinh thái thư viện Java. Đó là thuận tiện mặc dù.
  • Sử dụng các thư viện Java từ Scala là siêu dễ dàng và thuận tiện. Sử dụng các lớp Scala từ Java khó hơn một chút, nhưng nó hoạt động.
  • Tôi đã chuyển sang phiên bản cộng đồng IntelliJ IDEA và mặc dù nó không hoàn hảo nhưng nó vẫn chưa đủ tốt.
  • Người tạo ngôn ngữ thực sự nghĩ về bộ tính năng và tất cả các công việc thực sự độc đáo với nhau. Hỗ trợ hướng đối tượng tốt hơn trong Java (với các đặc điểm) và bạn có thể thực hiện lập trình chức năng.
  • Đó là một ngôn ngữ mà dường như một số nhà phát triển Java ghét với niềm đam mê. Đối với tôi, nó đã mang lại niềm vui của lập trình.

21

Chà, tôi nghĩ Scala quá phức tạp. Cảm giác như C ++ ở chỗ nó có vô số cách làm khác nhau. Một số người sẽ gọi đây là "sự giàu có", "tính biểu cảm" hoặc "sức mạnh", nhưng số dặm của bạn có thể thay đổi. Trong nhiều dự án trong thế giới thực, bạn sẽ phải giới hạn một cách giả tạo những tính năng ngôn ngữ nào bạn sẽ sử dụng và những gì không, để tất cả các nhà phát triển có liên quan có thể nói cùng một tập hợp ngôn ngữ.

Đối với lập trình chức năng, tôi thích Clojure , đơn giản hơn Scala.

Hãy để cuộc chiến thần thánh bắt đầu ;-)


2
Giá như Rich Hickey quan tâm nhiều đến .Net như anh ấy làm về JVM ...
Công việc

Sẽ rất hữu ích nếu bạn giải thích thêm một chút về những điều bạn cảm thấy quá phức tạp.
Richard Warburton

4
@Richard Warburton: Các vấn đề về sự phức tạp của Scala (hoặc, như Martin Oderky nói, "sức mạnh và vấn đề của Scala: khả năng mở rộng của nó") đã được thảo luận rộng rãi trên nhiều diễn đàn. Một cuộc thảo luận như vậy là ở đây . Tôi không nói rằng phức tạp == xấu mỗi se . Vấn đề là trong khi 1% lập trình viên sáng giá nhất có thể làm được điều kỳ diệu với Scala, thì đại đa số chỉ đơn giản là sẽ không "hiểu được", và đó vấn đề đối với việc sử dụng trong thế giới thực. Nó giống như một chiếc xe Công thức 1: đại đa số mọi người chỉ đơn giản là không thể lái một con thú như vậy.
Joonas Pulakka

2
+1 Để đề cập đến Clojure như một sự thay thế hợp lệ (khi nói đến lập trình chức năng).
Oliver Weiler

Clojure là tuyệt vời, nhưng nó là biểu diễn như Scala? Là nó dễ dàng để cấu trúc lại, mà không cần gõ tĩnh này? (Chẳng hạn, việc tái cấu trúc Python khá khó khăn - Tôi đã viết các phép tái cấu trúc cho nó.)
9000

13

Khoảng một năm trước, khi tôi càng ngày càng thất vọng về tương lai của các sản phẩm khởi nghiệp của mình nếu tôi tiếp tục sử dụng Java, tôi đã quyết định thử Scala. Lúc đó tôi đã lập trình bằng JavaScript và Python, Ruby cũng là một lựa chọn tốt, nhưng tôi đang tìm một ngôn ngữ được gõ tĩnh, tốt nhất là ngôn ngữ có thể chạy trên JVM.

Tôi thực sự đã cố gắng thích Scala, tôi thực sự đã làm, nhưng tôi thấy mã của nó hoàn toàn xấu xí và khó hiểu. Tôi đã tự hỏi một cách đáng kinh ngạc rằng nếu Scala là câu trả lời tốt nhất của chúng tôi cho Java, thì tôi chắc chắn đã bị lừa và bị kết án tiếp tục làm việc với ngôn ngữ mà tôi không thích sau tất cả ...

May mắn thay, không lâu sau đó, tôi đã tìm hiểu về Fantom . Người đàn ông, tôi đã yêu nó! Đối với tôi, nó giống như câu trả lời tuyệt vời của người Mỹ đối với bộ máy quan liêu của Đức! Nó phù hợp với các yêu cầu tôi đang tìm kiếm ở Scala, nhưng thanh lịch hơn nhiều . Nó đã tích hợp Vim , EclipseNetbeans , một khung web đẹp , các sản phẩm trưởng thành chạy cùng với nó, một cộng đồng nhỏ nhưng vô cùng hữu ích ... Gõ động và tĩnh! Tôi vui mừng!

(Tôi có thể tiếp tục nhưng bài này có nghĩa là về Scala, không phải Fantom, vì vậy tôi dừng ở đây. Sở thích của tôi rất rõ ràng , tuy nhiên có bài đăng này so sánh hai. Nhưng rõ ràng tôi không phải là người duy nhất, nếu bạn nghe podcast này [ mp3 ] cho đến khi kết thúc.)


9

Khi tôi bắt đầu say mê Scala 2 năm trước, nó trông xa lạ và đáng sợ với tôi. Tại một số điểm tôi phát hiện ra rằng ngôn ngữ cốt lõi thực sự đơn giản hơn Java rất nhiều, nhưng cú pháp và ngữ nghĩa của nó linh hoạt đến mức bạn có thể tạo các cấu trúc ngôn ngữ mới như nó, ngay cả khi không có tính năng macro. Tôi đã hoàn toàn chuyển sang Scala cho tất cả các dự án Java của mình, vì nó cho phép tôi viết mà không cần quá nhiều mã soạn sẵn.

Tôi thích Clojure, nhưng có những tình huống, trong đó nền tảng cần bạn biên dịch thành mã byte tĩnh (Android, applet, ...) và trong khi bạn có thể làm điều đó, trong Scala, nó chỉ ở đó.

Mặc dù Scala cho phép bạn giải quyết nhiều vấn đề theo cách chức năng, tôi thường thấy các vấn đề trong đó việc sử dụng các lớp cảm thấy tự nhiên hơn. Điều đó làm cho mọi thứ phức tạp hơn một chút, nhưng không ở đâu gần sự phức tạp và đau đớn của C ++.

Điều tuyệt vời nhất đối với tôi khi tôi thực sự bắt đầu học ngôn ngữ là tôi có thể lập trình như tôi đã làm bằng Java, chỉ cần không có tiếng ồn (giống như khi bạn khởi động Groovy), nhưng cuối cùng bạn muốn cố gắng đi sâu hơn vào sức mạnh của ngôn ngữ - nó phát triển cùng với bạn.

Về câu hỏi IDE: Sau khi sử dụng Emacs cho mọi thứ, tất cả các vấn đề về IDE của tôi đã biến mất :-)


9

Tôi thích Scala vì nhiều lý do, nhưng có một lý do thường bị bỏ qua: sự đơn giản của nó.

Scala có thể không đơn giản như, nói, Oberon, nhưng nó khá đơn giản hơn một số ngôn ngữ khác. Đặc tả ngôn ngữ Scala là ~ 160 trang, Đặc tả ngôn ngữ Java là ~ 600 (chỉ là ngôn ngữ, không phải JVM hoặc thư viện!), Đặc tả ngôn ngữ ECMA-334 C # (mà AFAIK tương ứng với một tập hợp con của Visual C # 2.0) là ~ 440 trang (cái này không có nội dung như hiểu câu hỏi LINQ, biểu thức lambda, phương thức mở rộng, đồng biến và chống chỉ định chung dynamic, đối số tùy chọn với giá trị mặc định, đối số từ khóa, var). Ngay cả bản nháp hiện tại cho ECMAScript 5.1 cũng lớn hơn ~ 210 trang. Và dĩ nhiên, ngôn ngữ "mặc định" của riêng tôi, Ruby, có Bản nháp ISO hiện tại nặng khoảng ~ 310 trang, chỉ xác định một tập hợp con nhỏ gần như không thể tin được của giao điểm của Ruby 1.8.6, 1.9.1 và 1.9.2.


6
Số lượng trang trong đặc tả ngôn ngữ là một thước đo thú vị về độ phức tạp của nó. Thật đáng kinh ngạc khi Scala phân chia ý kiến ​​về việc này. Không ai có thể nói Python phức tạp hay C ++ đơn giản, nhưng Scala dường như là cả hai :-) ví dụ: scala-lang.org/node/7431
Joonas

Bạn có thể xây dựng những thứ phức tạp với ngôn ngữ và một số sẽ trông giống như chúng là ngôn ngữ - các phương thức có tên không phải là alnum, trông giống như quá tải toán tử, chẳng hạn, không phải vậy.
người dùng không xác định

2
Số lượng trang trong thông số ngôn ngữ là một cách TERRIBLE để so sánh độ phức tạp của hai ngôn ngữ. Chỉ cần đưa ra hai ví dụ: thông số Java được viết theo kiểu gần như hướng dẫn trong khi thông số Scala được viết theo kiểu rất ngắn gọn. Hoặc một ví dụ khác, C # 2.0 thực sự phức tạp như Java ngày nay, hoặc có lẽ phức tạp hơn một chút với các máy móc, đại biểu và giả thuyết "không an toàn". Nhưng như bạn lưu ý, thông số kỹ thuật C # 2.0 nhỏ hơn JLS.
James Iry

1
Bây giờ, Martin Oderky đã so sánh kích thước của các ngữ pháp chính thức của các ngôn ngữ. Đó là một thước đo hợp lý cho một khía cạnh của sự phức tạp. Nhưng nó chỉ hợp lý vì ngữ pháp không linh hoạt như tiếng Anh. Ngay cả khi đó, bạn phải cẩn thận. Cũng giống như với các chương trình thông thường, bạn có thể dễ dàng kéo dài hoặc thu nhỏ ngữ pháp với các lựa chọn khác nhau về cách sắp xếp chúng, bao nhiêu sản phẩm khác biệt, bao gồm các lớp nhân vật cơ sở, v.v.
James Iry

3
chờ đã .. cái gì? Tại sao bạn lại cố gắng đo độ phức tạp với kích thước của thông số kỹ thuật? Đó là một ý tưởng khủng khiếp.
smartnut007

9

Đây là những gì hấp dẫn về Scala:

  • Con trỏ null là một ý tưởng khá tồi để bắt đầu. Hoare gọi đó là "sai lầm tỷ đô" của mình, nhưng Scala thậm chí còn tồi tệ hơn. Nó có các đối tượng tên null, Null, none và Nil. null là khả năng tương tác với Java. Null là đặc tả con trỏ null của W3C DOM, Không có gì là null nên được thay thế bằng và Nil là một cái gì đó trống rỗng.

  • Khi các cấu trúc ngôn ngữ hóa ra là hacky, thông thường người lập trình sẽ đổ lỗi và không phải là ngôn ngữ. Tuy nhiên, trong Scala, ngôn ngữ cốt lõi đã chứa các lớp thư viện chỉ có hành vi được ghi lại là "Đây là một bản hack". Đừng tin điều đó? Tìm kiếm scaladoc cho scala.xml.group.

  • Cuối cùng, Scala là tài liệu tồi. Hầu như không có lớp scala nào trong tài liệu chính thức đi kèm với mã ví dụ. Scala khó học hơn đáng kể so với Java và đòi hỏi kiến ​​thức sâu sắc về khoa học máy tính.

Để tránh bị nhầm lẫn với một người ghét Scala, đây là những gì tôi thích về nó:

  • Tôi có ít ngoại lệ hơn. Tôi chưa bao giờ có ClassCastException và rất ít NullPulumExceptions khi tương tác với Java.
  • Mã ngắn hơn và ngắn gọn hơn Java
  • Đó là thách thức trí tuệ. Java cảm thấy như ngôn ngữ bé khi so sánh.

10
nulllà con trỏ null của Java, Nulllà "loại" của nó. Nonelà một "trạng thái" có thể có của Option[T]một tập hợp có một hoặc một phần tử bằng không. Nillà một danh sách trống. Trong khi bạn muốn làm cho nó nghe có vẻ đáng sợ, thì không. Những loại đó không thể thay thế hoặc thay thế cho nhau và hành xử chính xác như họ nên làm.
soc

9

Scala phức tạp. Không có cách nào xung quanh nó! Cú pháp của nó cực kỳ linh hoạt và có thể được tùy chỉnh theo nhiều cách (trên tất cả các toán tử / ký hiệu trung gian) - và hệ thống loại có nhiều tính năng khác nhau hơn bất kỳ ngôn ngữ nào tôi biết.

Vì vậy, mọi thứ không phải là thẳng như ví dụ như trong Haskell: Máy đánh chữ để bao quát tất cả.

Khi Scala cố gắng kết hợp lập trình chức năng, OO, lập trình thủ tục và thư viện java cũng như ý tưởng của riêng mình, cuối cùng chúng tôi đã kết thúc với rất nhiều khái niệm dường như đi theo "cùng một hướng":

  • Giá trị tiềm ẩn
  • Hàm ẩn
  • Hiện sinh
  • Ký tự đại diện
  • Đặc điểm
  • Giao diện
  • Các lớp trừu tượng
  • Lớp học tình huống
  • Các loại kết cấu
  • Hạn chế chung
  • Xem giới hạn
  • Các loại ẩn danh

Việc lựa chọn trong số chúng có vẻ khó khăn lúc đầu và người ta có thể dễ dàng tự hỏi liệu người ta đã tìm ra giải pháp chính xác cho vấn đề nào đó chưa. Thậm chí có thể dễ dàng tạo ra những thứ hacky bằng cách lạm dụng implicits.

Nhưng điều thú vị là: Scala hoạt động. Đôi khi thật khó hiểu tại sao (đặc biệt là tìm hiểu những gì chuyển đổi ngầm định + thừa kế + ... một số đối tượng có chức năng X), nhưng bạn không phải bận tâm về điều đó hầu hết mọi lúc.

Viết Scala càng đơn giản càng tốt và nó sẽ hoạt động. Đừng bối rối bởi mọi thứ có thể và chỉ sử dụng những gì bạn cần. Và nếu bạn cần thứ gì đó, bạn có thể chắc chắn rằng bằng cách nào đó Scala có nó;)

Và bạn càng nhận được nhiều, bạn sẽ càng có thể tùy chỉnh Scala với các toán tử, ẩn ý, ​​đơn nguyên, cú pháp sôi nổi ... và cuối cùng nhận được một cái gì đó gần với DSL sẽ giải quyết hoàn hảo vấn đề của bạn.

Rốt cuộc, bạn luôn có khả năng chỉ sử dụng Scala như một Java tốt hơn nhiều với cú pháp rõ ràng hơn, dễ dàng hơn, suy luận kiểu và một số tính năng chức năng.


1
"Trên tất cả các toán tử / ký hiệu infix" - chỉ là scala thiếu toán tử. :) Đó chỉ là phương pháp.
người dùng không xác định

6

Đó là một ngôn ngữ tuyệt vời đơn giản hơn Java theo nhiều cách.

Hầu hết mọi người sẽ không thích nó, lập trình viên Java hay không, vì những lý do tương tự mà hầu hết mọi người, lập trình viên hay không, không thích học ngôn ngữ lập trình mới. Tôi nghi ngờ rằng hầu hết những người học ngôn ngữ lập trình thậm chí không thích học ngôn ngữ đó.

Nếu bạn lo lắng về một ngôn ngữ phức tạp như C ++, tôi sẽ tránh Clojure như bệnh dịch hạch. Rên rỉ rằng Scala phức tạp hơn Clojure đã trở thành đối số dự phòng cho những người hoàn toàn không biết gì về một hoặc cả hai ngôn ngữ.

Clojure có các macro, có nghĩa là bạn có thể thay đổi cú pháp của ngôn ngữ theo ý muốn, mang đến cho bạn không chỉ "vô số cách làm khác nhau" mà còn là một cách làm gần như vô tận. Và không có cú pháp mới nào mà các lập trình viên đang tạo với các macro sẽ được ghi lại ở bất kỳ đâu trong đặc tả ngôn ngữ.

"Nhưng chúng tôi có thể tránh sử dụng macro hoặc điều chỉnh những cái nào được phép trong mã của chúng tôi", bạn nói. Xin chúc mừng, giờ đây bạn đã "giới hạn một cách giả tạo những tính năng ngôn ngữ nào bạn sẽ sử dụng và không", đó chính xác là những gì những kẻ ngốc bập bẹ đang sử dụng Clojure of Scala sử dụng làm lý do để tránh Scala bắt đầu.


6
Cảm ơn về đầu vào Scala vs Clojure của bạn, nhưng đó có phải là những gì OP tôi hỏi về thực sự?
Martin Wickman

Điểm thú vị lại: macro. Hơi lo lắng, cũng có. Là các macro hoặc tương tự có sẵn trong Scala, hoặc toàn bộ điều "giới hạn giả tạo" là một sự xao lãng?
Armand

1
Đây dường như là một nhận xét cho câu trả lời của tôi hơn là một câu trả lời cho câu hỏi ban đầu. Tôi đồng ý, macro cung cấp cho bạn sức mạnh vô hạn, vì vậy khi sử dụng sai, chúng hút. Vì vậy, bạn nên sử dụng chúng đúng cách (chỉ khi cần thiết). Điều này không thay đổi thực tế rằng Clojure ngôn ngữ là một trong những ngôn ngữ đơn giản nhất. Scala chắc chắn là không.
Joonas Pulakka

> Điều này không thay đổi thực tế rằng Clojure ngôn ngữ là một trong những ngôn ngữ đơn giản nhất. <Điều này cũng hoàn toàn sai, trừ khi bạn sử dụng một số số liệu như "số lượng cấu trúc ngôn ngữ". Nếu bạn đang sử dụng một cái gì đó hữu ích, như việc đọc và viết chương trình bằng ngôn ngữ dễ dàng như thế nào, thì Clojure không phải là một trong những cách đơn giản nhất.
Josh

Vì vậy, hãy tiếp tục và cung cấp cho chúng tôi một số liệu tốt về độ phức tạp của ngôn ngữ. "Làm thế nào dễ dàng để đọc và viết chương trình bằng ngôn ngữ" là hoàn toàn chủ quan , vì vậy nó không thực sự giúp đỡ ở đây. Cấp, đến với một số liệu hữu ích khách quan có thể hầu như không thể. (Ví dụ Jörg W Mittag dưới đây là sử dụng số trang trong đặc tả ngôn ngữ như một biện pháp phức tạp khi khách quan, tôi không chắc chắn nó rất hữu ích..)
Joonas Pulakka

4

Tôi thực sự thích các loại chi tiết hơn của thư viện Scala. Có vẻ như thư viện bộ sưu tập mới đã được cân nhắc kỹ lưỡng. Tôi cũng thích cách nó giảm số lượng mã cần thiết cho các lớp đơn giản và các khái niệm chức năng mà nó thêm vào. Kiểu suy luận của nó cũng rất hữu ích. Nó cảm thấy như Java mà không có bánh xe đào tạo. Sau khi sử dụng C # một thời gian, Scala thực sự cảm thấy như một đối thủ cạnh tranh, với Java vẫn hữu ích nhưng bị bỏ lại phía sau.


2

Là một lập trình viên Java, ban đầu tôi thấy Scala thú vị. Tuy nhiên, sau khi nghiên cứu về nó một lúc (và chạy vào gần như tất cả các mặt tích cực / tiêu cực đã được liệt kê bởi những người khác), tôi đã cảm thấy rất "meh" đối với nó. Các cải tiến ngôn ngữ được bù đắp bởi sự sẵn có thấp hơn của bộ công cụ. Tôi không thể đưa ra bất kỳ lý do xác định nào để chuyển đổi. Điều đó tốt, nhưng nó không "đủ tốt hơn" để tạo ra một trường hợp để chuyển đổi. Không có yếu tố hưng phấn chủ quan đó (như Clojure dường như).

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.