khả năng mở rộng của Scala trên Java


9

Tôi đọc một bài báo nói rằng Scala xử lý đồng thời tốt hơn Java.

http://www.theserverside.com/feature/Solve-the-Scalability-Paradox-with-Scala-Clojure-and-Groovy

... Giới hạn khả năng mở rộng được giới hạn cụ thể cho chính ngôn ngữ lập trình Java, nhưng nó không phải là giới hạn của toàn bộ nền tảng Java ...

Các vấn đề về khả năng mở rộng với Java không phải là một tiết lộ mới. Trên thực tế, rất nhiều công việc đã được thực hiện để giải quyết những vấn đề này, với hai trong số các dự án thành công nhất là ngôn ngữ lập trình có tên Scala và Clojure ...

... Scala đang tìm cách xoay quanh vấn đề rắc rối và mô hình khóa của ngôn ngữ Java ...

Sao có thể như thế được? Scala không sử dụng các thư viện cốt lõi của Java, điều này mang đến tất cả các vấn đề về luồng và khóa từ Java sang Scala?

Câu trả lời:


16

Vâng, tất nhiên là có. Và Java sử dụng lại tất cả các cơ sở hạ tầng được cung cấp bởi JVM, được viết bằng C và cuối cùng nó chạy bằng mã máy!

Điểm cho phép các nhà phát triển để cho các ứng dụng của họ mở rộng quy mô là không cung cấp nhiều năng lượng thô hơn. Trình biên dịch đã có tất cả sức mạnh mà phần cứng của bạn cho phép và không ngôn ngữ nào có thể cung cấp thêm. Trong thực tế, toàn bộ quan điểm của các ngôn ngữ bậc cao là hạn chế những gì lập trình viên có thể làm trong đó. Nghe có vẻ kinh khủng, nhưng nút cổ chai trong việc viết mã tuyệt vời, chính xác, hiệu quả không phải là mô hình tính toán. Đó là bộ não của những người phải hiểu các chương trình được viết cho máy. Kinh nghiệm cho thấy chúng ta không đủ thông minh để hiểu giải pháp tối ưu về mặt lý thuyết của một vấn đề tính toán phức tạp; chúng tôi thậm chí có thể không nhận ra nó nếu chúng tôi nhìn thấy nó.

Trong ví dụ cụ thể, bài viết có lẽ có nghĩa là Scala cung cấp các thư viện và khái niệm cấp cao hơn giúp các nhà phát triển dễ hiểu hơn các vấn đề của họ từ góc độ đồng thời, và do đó, kết quả cuối cùng tốt hơn và có thể mở rộng hơn so với mã hóa trực tiếp trong Java ( hoặc C, hoặc Trình biên dịch) sẽ có được. Điều đó không mâu thuẫn với thực tế là Scala chạy hoàn toàn trên một máy ảo Java. JVM là một phát minh tuyệt đẹp cho phép tất cả các loại công cụ gọn gàng được viết dễ dàng hơn có thể nếu không có nó - bao gồm các khung và thư viện làm cho mọi thứ trở nên phức tạp hơn dễ dàng. Thật tuyệt phải không?


2
Ngôn ngữ bậc cao làm nhiều hơn hạn chế. Chúng cũng cho phép trừu tượng hóa - trình biên dịch có tất cả sức mạnh của phần cứng, nhưng nó không giúp bạn trừu tượng hóa nó. Và trong trường hợp cụ thể này, tôi muốn nói những gì Scala làm là hạn chế 50%, trừu tượng 50%.
Daniel C. Sobral

1
@Daniel - Tôi đồng ý rằng trừu tượng là có giá trị nhưng chắc chắn trừu tượng chỉ là một hình thức hạn chế? Theo nghĩa loại bỏ các chi tiết cụ thể của các trường hợp cụ thể và chỉ giữ lại khái niệm chung? Wikipedia đặt nó như thế này: "Trừu tượng có thể được hình thành bằng cách giảm nội dung thông tin của một khái niệm hoặc một hiện tượng có thể quan sát được"
mikera

5

Đó là vấn đề hỗ trợ thư viện. Java sử dụng cấu trúc Thread mức thấp để biểu diễn đồng thời (đây giống như ngôn ngữ lắp ráp của thế giới tương tranh). Có rất nhiều thư viện và kỹ thuật bạn có thể sử dụng để xây dựng các giải pháp có thể mở rộng trên các giải pháp này, chẳng hạn như sử dụng sự hỗ trợ được cung cấp bởi gói java.util.conc hiện và làm theo các kỹ thuật của Brian's Goetz trong cuốn sách Thực hành đồng thời Java của ông. Scala đã giúp giới thiệu những thứ như khung công tác Akka (hiện cũng có thể sử dụng bằng Java), trong đó có một số thực tiễn tốt hơn và hỗ trợ thư viện. Điều đó không có nghĩa là ngôn ngữ Java không thể bắt kịp (các bộ sưu tập song song, v.v.), như các trạng thái Kilian, tất cả đều chạy trên JVM và do đó là JMM.

Ngoài ra, các đối tượng của Java cũng có thể thay đổi theo mặc định và nó đòi hỏi một số kiến ​​thức không tầm thường để làm cho chúng trở nên bất biến một cách hiệu quả. Scala có uy tín giúp tạo ra các vật thể bất biến dễ dàng hơn


2

Scala không sử dụng các thư viện cốt lõi của Java, điều này mang đến tất cả các vấn đề về luồng và khóa từ Java sang Scala?

Vâng, vâng, và nếu bạn khóa trong Scala, bạn sẽ phải đối mặt với những vấn đề tương tự. Tuy nhiên, vấn đề là bạn không được phép, vì Scala cung cấp cho bạn những thứ trừu tượng xử lý vấn đề này một cách an toàn hơn.

Bây giờ, Scala làm hai điều thực sự có ích. Một trong số đó là mô hình diễn viên, có thể được coi là một mô hình tương tranh, được Scala cung cấp như một thư viện. Nếu bạn là một lập trình viên Java, tôi khuyên bạn nên truy cập trang web Akka và xem công cụ Java của họ. Đây là thư viện sẽ thay thế thư viện diễn viên hiện tại của Scala và bạn có thể sử dụng nó từ Java.

Điều thứ hai mà Scala thực hiện đó là sử dụng các cấu trúc dữ liệu bất biến. Không có gì ngăn cản Java sử dụng các cấu trúc dữ liệu bất biến - String, đối với một, chính nó là bất biến! Các cấu trúc dữ liệu không thay đổi không gặp phải vấn đề tương tranh do các luồng không thể thay đổi chúng.

Có những thứ khác thêm vào những thứ này, để tạo nên các giải pháp đầy đủ, chẳng hạn như các tác nhân và stm (cả hai đều có sẵn từ Akka) hoặc chốt (từ Java).

Bây giờ, hai điều trên có thể được thực hiện bằng Java, như tôi đã nói. Bạn có thể sử dụng Akka trong Java và bạn có thể viết các cấu trúc dữ liệu bất biến trong Java (hoặc sử dụng từ các thư viện cung cấp chúng). Tuy nhiên, Java khiến việc sử dụng công cụ này trở nên khó khăn, bởi vì nó không hỗ trợ các loại bậc cao hơn, cũng không phải đóng và các hàm hạng nhất.

Vì vậy, trong khi bạn có thể làm điều đó, các lập trình viên thường sẽ không bởi vì, trong Java, việc viết mã như vậy rất dài dòng (ý tôi là, nhiều hơn so với tiêu chuẩn cho Java).


0

Ý nghĩ chính của bài viết được tham khảo là:

giới hạn khả năng mở rộng được giới hạn cụ thể cho chính ngôn ngữ lập trình Java, nhưng nó không phải là giới hạn của toàn bộ nền tảng Java. Trong thực tế, khi các chương trình được viết để tận dụng đúng nền tảng Java cơ bản, khả năng mở rộng tuyến tính không phải là vấn đề.

Nếu khả năng mở rộng lớn là những gì bạn cần, bạn luôn có thể tận dụng các ngôn ngữ JVM ngoại vi như Scala và Clojure

Tôi không thể đồng ý với điều này. Sử dụng các ngôn ngữ JVM như Scala ngụ ý:

  1. sử dụng hỗ trợ thời gian chạy cụ thể. Hỗ trợ này cũng có thể được truy cập trực tiếp từ các chương trình Java.

  2. cú pháp cụ thể, cho phép các biểu thức ngắn gọn để truy cập vào hỗ trợ thời gian chạy dễ dàng và ít bị lỗi hơn. Điều này là đúng và việc viết bằng Java thuần túy thì dài dòng hơn và đòi hỏi nhiều kỷ luật hơn, nhưng khoảng cách không quá lớn.

Nói tóm lại, Scala xử lý đồng thời tốt hơn Java vì sử dụng mô hình Actor. Mô hình diễn viên cũng có thể được sử dụng trong Java. Có một số thư viện diễn viên cho Java, bao gồm Akka (được Scala sử dụng), vì vậy việc chuyển sang Scala không phải là một điều bắt buộc.

Sử dụng mô hình Actor thông qua Java thuần có những ưu điểm riêng:

  • gỡ lỗi dễ dàng hơn
  • khả năng tùy chỉnh thư viện diễn viên được sử dụng. Điều này đặc biệt đúng khi thư viện nhỏ gọn và do đó dễ hiểu, như cái này của tôi: df4j
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.