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.
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.
Câu trả lời:
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.
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:
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 ;-)
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 , Eclipse và Netbeans , 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.)
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 :-)
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.
Đâ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ó:
null
là con trỏ null của Java, Null
là "loại" của nó. None
là 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. Nil
là 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.
Scala là 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":
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 implicit
s.
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.
Đó 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.
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.
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ư).