Trọng tâm chính của Java là gì? Tại sao phải mất quá lâu để có được các tính năng mới?


10

Tôi đã khám phá các tính năng mới trong JDK8, như các biểu thức lambda, các phương thức mở rộng và API luồng mới.

Rõ ràng không có tính năng nào trong số này là mới trong thế giới lập trình và điều đó khiến người ta tự hỏi tại sao lại có tất cả những thứ này trong Java cho đến bây giờ.

Chúng tôi đã có các biểu thức lambda trong Lisp (1958), SML (1973), Haskell (1990), Python (1991), JavaScript (1994), Ruby (1995), Scala (2003), C # (2007) và 55 năm sau Lisp và thực tế mọi người khác, trong Java (2013).

Và tôi đã đọc về các luồng trong SIC (1996).

Tôi đã tự hỏi tại sao bây giờ? Bằng chứng cho thấy rằng cạnh tranh với các ngôn ngữ khác không phải là động lực.

Dường như tất cả các tính năng mới thú vị trong bản phát hành Java này chỉ là sản phẩm phụ của việc thực hiện song song. Chúng tôi có lambdas vì chúng làm cho việc viết các thuật toán song song đơn giản hơn và chúng tôi có các phương thức mở rộng vì chúng tôi cần chúng để hỗ trợ cho các thay đổi mà biểu thức lambda yêu cầu, v.v., v.v.

Vì vậy, câu hỏi của tôi là: chúng ta có thể khẳng định một cách an toàn rằng chủ đề chính trong bản phát hành sắp tới này của Java là thực sự song song không? Hoặc chúng ta có thể biện minh cho những lý do khác cho sự xuất hiện của các thủ thuật lâu đời nhất trong cuốn sách cho đến bây giờ trong Java?


4
Tất cả những điều này có thể biến thành một sự phô trương về hậu phương của Java.
Michael K

5
The evidence suggests- hãy chia sẻ nghiên cứu của bạn.

2
Không có tính năng nào trong Java hoặc trong JVM hoặc trong JRE là mới cả. Và ngay cả sự kết hợp các tính năng không phải là mới, Eiffel đã có tất cả những tính năng đó vào năm 1985 (GC, OO, loại an toàn, thậm chí cả Generics mà Java không có được cho đến năm 2003). Trong thực tế, mục tiêu rõ ràng của các nhà thiết kế Java là không giới thiệu bất cứ điều gì mới.
Jörg W Mittag

2
@MichaelK - Tôi đồng ý điều này có thể biến thành một cuộc chiến rực lửa. Nó cũng có thể biến thành một câu trả lời hợp lệ liên quan đến lịch sử đầy thách thức của Sun; Oracle mua lại Sun và Java; và cách các nhà duy trì hiện tại của Java đang cố gắng điều khiển ngôn ngữ. Tôi hy vọng rằng câu trả lời sẽ tập trung vào các khía cạnh mang tính xây dựng của câu hỏi này.

@MichaelT: Tôi hy vọng nó sẽ không biến thành một cuộc chiến rực lửa và một số ý tưởng thú vị có thể xuất hiện. Ví dụ, chúng ta thường cho rằng một ngôn ngữ không liên tục phát triển là đằng sau thời đại. IMO điều này không đúng vì nó giả định rằng sự phát triển ngôn ngữ là tuyến tính (rằng tất cả các tính năng mới trở nên phổ biến đều tốt và nên được áp dụng bởi tất cả các ngôn ngữ hiện đại). Nhưng những người duy trì ngôn ngữ có thể quyết định rằng một tính năng mới không phù hợp với phần còn lại của ngôn ngữ. Ngoài ra, hãy xem xét rằng có những ngôn ngữ ổn định, được tiêu chuẩn hóa mà chắc chắn không phải là đằng sau thời đại (ví dụ: Lisp thông thường).
Giorgio

Câu trả lời:


12

Khi Java được thiết kế lần đầu tiên, nó được coi là phù hợp để loại bỏ các hàm ẩn danh. Tôi có thể nghĩ về hai lý do (nhưng chúng có thể khác với những lý do chính thức):

  1. Java được thiết kế như một ngôn ngữ hướng đối tượng không có chức năng, do đó, việc có các hàm ẩn danh trong một ngôn ngữ không có chức năng là điều không tự nhiên. Hoặc ít nhất, điều này sẽ ảnh hưởng đến thiết kế ngôn ngữ rất nhiều.
  2. Các hàm ẩn danh không phổ biến trong các cộng đồng lập trình viên mà Java có nghĩa là thu hút (C, C ++, Pascal?). Ngay cả bây giờ, nhiều lập trình viên Java dường như coi các tính năng này khá kỳ lạ (nhưng điều này có thể sẽ thay đổi rất nhanh với Java 8).

Trong những năm tiếp theo, như Robert Harvey đã giải thích, chính sách của Sun là luôn giữ cho Java tương thích ngược và rất ổn định.

Mặt khác, các ngôn ngữ cạnh tranh khác đã xuất hiện (quan trọng nhất là C #, được sinh ra dưới dạng bản sao Java và sau đó có hướng phát triển riêng).

Các ngôn ngữ cạnh tranh đã khiến Java chịu áp lực vì hai lý do:

Sức mạnh biểu cảm

Các tính năng mới có thể làm cho các thành ngữ lập trình nhất định dễ viết hơn, làm cho ngôn ngữ hấp dẫn hơn đối với các lập trình viên. Thông thường tập hợp các tính năng được cung cấp bởi một ngôn ngữ là sự thỏa hiệp giữa sức mạnh biểu cảm, độ phức tạp của ngôn ngữ, sự gắn kết thiết kế: thêm nhiều tính năng làm cho ngôn ngữ trở nên biểu cảm hơn nhưng cũng phức tạp hơn và khó làm chủ hơn.

Dù sao, trong vài năm qua, các đối thủ của Java đã bổ sung rất nhiều tính năng mới mà Java không có và đây có thể được coi là một lợi thế.

Sự cường điệu

Vâng, thật không may, đây là một yếu tố trong lựa chọn công nghệ, ít nhất là từ những gì tôi có thể thấy trong kinh nghiệm hàng ngày của mình với tư cách là một lập trình viên: một công cụ phải có một tính năng nhất định, ngay cả khi hầu hết các thành viên trong nhóm không biết cách sử dụng nó và những người có thể sử dụng nó hầu như không cần nó hầu hết thời gian.

Sự cường điệu có thể còn quan trọng hơn đối với những người không có kỹ thuật như các nhà quản lý, những người có thể là người quyết định nền tảng cho một dự án nhất định. Các nhà quản lý đôi khi chỉ nhớ một số từ khóa như lambda, song song, đa lõi, lập trình chức năng, điện toán đám mây, ... Nếu công nghệ lựa chọn của chúng tôi có dấu màu xanh lục trên mỗi mục của danh sách, thì chúng tôi đã cập nhật.

Vì vậy, IMO trong một thời gian Java đã bị bắt giữa

  • chính sách ban đầu về sự ổn định ngôn ngữ và thiết kế đơn giản, một cơ sở mã lớn và cộng đồng nhà phát triển một mặt và
  • áp lực của các ngôn ngữ cạnh tranh có thể thu hút các lập trình viên Java, C # lúc đầu và sau đó là Scala, Clojure, F # (Tôi đặt tên cho những ngôn ngữ tôi biết, có thể có những ngôn ngữ khác).

Cuối cùng, Oracle quyết định nâng cấp Java để làm cho nó cạnh tranh hơn. Theo tôi, các tính năng mới giải quyết các lập trình viên Java, đặc biệt là các lập trình viên Java có thể bị cám dỗ chuyển sang C # và những người thấy các ngôn ngữ khác như Scala và Clojure quá khác so với Java. Mặt khác, các nhà phát triển có một số kinh nghiệm về lập trình chức năng và vẫn muốn sử dụng JVM có lẽ đã chuyển sang Scala, Clojure hoặc ngôn ngữ khác.

Vì vậy, các tính năng Java 8 mới sẽ làm cho Java trở thành ngôn ngữ mạnh mẽ hơn và trọng tâm được khai báo là lập trình song song và lập trình song song, nhưng bản nâng cấp dường như cũng giải quyết các khía cạnh tiếp thị (Mark Reinhold, kiến ​​trúc sư trưởng của Java tại Oracle, cho biết: nói rằng việc thêm các biểu thức Lambda chỉ là để theo kịp những đứa trẻ tuyệt vời, và có một số sự thật trong đó, nhưng lý do thực sự là bộ xử lý đa lõi, cách tốt nhất để xử lý chúng là với Lambda ", xem bài viết này ).

Vì vậy, vâng, nhiều tính năng (tất cả) Java 8 đã được biết đến, nhưng tại sao và khi một tính năng được thêm vào ngôn ngữ phụ thuộc vào nhiều yếu tố: đối tượng mục tiêu, cộng đồng hiện tại, cơ sở mã hiện có, đối thủ cạnh tranh, tiếp thị, v.v.

BIÊN TẬP

Một ghi chú ngắn về "... Tôi đã đọc về các luồng trong SIC (1996).": Bạn có nghĩa là bạn cần Java 8 lambdas để triển khai các luồng không? Trên thực tế bạn có thể thực hiện chúng bằng cách sử dụng các lớp bên trong ẩn danh.


+1 Và tôi ước tôi có thể cho bạn nhiều điểm hơn vì đây là câu trả lời hay nhất cho đến nay cho câu hỏi.
edalorzo

Dựa trên câu trả lời của bạn, tôi đã điều tra thêm về những gì Mark Reinhold đã nói tôi đã tìm thấy một bài viết thú vị. Tôi sẽ đăng nó ở đây với câu trả lời của bạn để tham khảo trong tương lai: Đóng cửa cho Java của Mark Reinhold .
edalorzo

Và bài viết đó thực sự đề cập đến một bài viết khác Đóng cho Java .
edalorzo

1
Từ liên kết bạn đã gửi, tôi tìm thấy ibm.com/developerworks/java/l Library / j-jtp03048 / index.html # 4.0 , nói rằng Java có thể sử dụng các lớp bên trong ẩn danh, nhưng chúng quá dài dòng. Tuy nhiên, đóng cửa Java 8 không chỉ là đường cú pháp cho các lớp bên trong ẩn danh. Vì vậy, bây giờ Java sẽ có các kiểu đóng khác nhau HAI (về mặt ngữ nghĩa): các lớp bên trong ẩn danh và các biểu thức lambda.
Giorgio

11

Java đã thay đổi trọng tâm theo thời gian. Lúc đầu, nó được thiết kế như một ngôn ngữ mạnh mẽ đơn giản, như một phản ứng đối với "phức tạp mạnh mẽ" C ++. Một số tính năng trong C ++ đã bị bỏ qua một cách có chủ ý, như quá tải toán tử, mẫu, enum, được coi là quá phức tạp hoặc di tích của thời đại C, và OOP đang ở đỉnh cao của sự phổ biến, mọi thứ đều được tạo thành một Vật thể trong một mô hình thế giới quan. Lambdas tại thời điểm này được coi đơn giản là "không cần thiết" kể từ khi giới thiệu các lớp ẩn danh / bên trong trong Java 1.1. Thực tế là cú pháp dài dòng hơn nhiều gần như được coi là một tính năng .

Java đã được công khai, không có động lực để thay đổi cho đến khi Microsoft giới thiệu C #, học được từ những bài học về lỗi thiết kế Java và đưa ra một loạt các tính năng ngôn ngữ mới. Họ không bị hạn chế bởi sự tương hợp ngược. Tôi nghĩ rằng các nhà khái niệm Java đã nhận ra sự nguy hiểm của cạnh tranh C # và phát hành Java 5 với các tổng quát, enum, v.v.

Việc đưa lambdas vào Java được thảo luận từ thời điểm đó và nó chỉ bị trầm trọng hơn bởi xu hướng hiện nay đối với lập trình chức năng. Nhưng những thứ như thế này chậm để làm cho đúng, và nó phải đúng ngay lần đầu tiên. Theo quan điểm của tôi, Java đã tạo ra các tổng quát với kiểu xóa vì tính tương thích ngược được coi là một lý do để thực hiện nó không hơn gì cú pháp cú pháp. Đóng cửa đã được suy nghĩ kỹ lưỡng hơn, nó xuất hiện, và nó sẽ không chỉ là đường cú pháp.

Tóm lại, chủ đề chính của Java 8 là gì? Tôi không nghĩ rằng một phiên bản ngôn ngữ có một chủ đề. Như C ++ 11, lý do của Java 8 là để theo kịp sự cạnh tranh bằng cách giới thiệu bằng ngôn ngữ những điều mà ngày càng nhiều lập trình viên đang sử dụng. Lisp có thể có lambda từ năm 1958, mức độ phổ biến của nó đã giảm xuống trong nhiều thập kỷ và chỉ lập trình chức năng gần đây mới được xem xét nghiêm túc đối với lập trình "chính thống" (vì không có từ nào tốt hơn).


"Lisp có thể có lambda từ năm 1958, mức độ phổ biến của nó đã giảm xuống trong nhiều thập kỷ và chỉ lập trình chức năng gần đây mới được xem xét nghiêm túc đối với lập trình" chính thống ": Sự phổ biến của ngôn ngữ dường như không phải là một chỉ số tốt cho hiệu quả của nó. Lập trình chức năng đã được ủng hộ trong nhiều năm, nhưng hầu hết mọi người trong ngành đều coi đó là loại công cụ mà các nhà nghiên cứu thích chơi để viết luận án tiến sĩ. Bây giờ tất cả các ngành công nghiệp đột nhiên thức dậy và cho nó một cơ hội, có thể bởi vì bây giờ OOP là dòng chính họ đang tìm kiếm điều lớn tiếp theo.
Giorgio

1
Lý do tại sao các lần đóng cửa ban đầu không được đưa vào Java theo: Tìm hiểu cuộc tranh luận về việc đóng cửa . James Gossling nói: "Việc đóng cửa ban đầu bị loại bỏ khỏi Java nhiều hơn vì áp lực thời gian hơn bất cứ điều gì khác. Trong những ngày đầu của Java, việc thiếu sự đóng cửa là khá đau đớn, và vì vậy các lớp bên trong đã ra đời: một sự thỏa hiệp khó chịu đã cố gắng tránh Một số vấn đề khó khăn. Nhưng như thường lệ trong rất nhiều vấn đề thiết kế, sự đơn giản hóa không thực sự giải quyết bất kỳ vấn đề nào, họ chỉ di chuyển chúng. "
edalorzo

"Bao gồm lambdas trong Java đã được thảo luận từ thời điểm đó và nó chỉ bị trầm trọng hơn bởi xu hướng hiện tại đối với lập trình chức năng.": Tôi thấy thú vị rằng trong một số cộng đồng (C ++, Java, ...) "thường sử dụng lambdas" làm lập trình chức năng ".
Giorgio

8

Rõ ràng không có tính năng nào trong số này là mới trong thế giới lập trình và điều đó khiến người ta tự hỏi tại sao lại có tất cả những thứ này trong Java cho đến bây giờ.

Bởi vì Java phải trải qua một quy trình phê duyệt có sự tham gia của một số bên liên quan có khả năng hiển thị cao trong một quy trình gần giống như "thiết kế theo ủy ban" và quá trình đó cần có thời gian, đó là tất cả.

Trái ngược với các ngôn ngữ khác và bạn sẽ tìm thấy một nhà độc tài nhân từ, hoặc một ủy ban nhỏ của các nhà thiết kế ngôn ngữ làm việc chặt chẽ với nhau và không bị ràng buộc với lợi ích của công ty.

Kết hợp điều đó với một cơ sở mã được thiết lập gồm hàng triệu dòng mã Java phải tương thích ngược và bạn có tất cả các thành phần để thay đổi với tốc độ băng hà.


1
OTOH, bạn cũng có các thành phần cho các tiêu chuẩn thực sự mạnh mẽ và được chấp nhận rộng rãi. Tương phản, ví dụ JPA với tình huống dành cho PHP, trong đó khung web của mọi người đều có ORM nửa khẳng định riêng.
Michael Borgwardt

Tôi có thể sai, nhưng sự hiểu biết của tôi là Haskell cũng là một ngôn ngữ "thiết kế theo ủy ban" và đó là một ngôn ngữ tiên tiến. Vì vậy, có lẽ đó không phải là điều cản trở Java?
Andres F.

@AresresF. Vâng, nhưng tôi tưởng tượng rằng bạn không có các công ty lớn, nguyên khối đang ngồi trong ủy ban Haskell. Xem thêm các cuộc hội thoại trong các ý kiến ở đây .
Robert Harvey

1

Tôi muốn nói rằng mục đích quan trọng nhất của ngôn ngữ lập trình là được sử dụng; hiện tại C và Java không có biểu thức lambda và chúng là những ngôn ngữ được sử dụng nhiều nhất (ví dụ theo TIOBE).

Và để trả lời câu hỏi tôi tin rằng Java được gửi đến doanh nghiệp; trong lĩnh vực này mọi thứ cần phải rất ổn định và đáng tin cậy; ví dụ Java 7 đã xuất hiện được gần 2 năm nhưng tôi không biết trực tiếp bất kỳ dự án nào trong Java 7. Ngoài ra, một điều quan trọng khác là khả năng tương thích ngược rất quan trọng đối với doanh nghiệp.


Tôi đồng ý với bạn (+1): Tôi đánh giá cao Java rất nhiều (như một ngôn ngữ và cho hệ sinh thái khổng lồ của nó) nhưng tôi sẽ thấy nó phù hợp hơn khi đóng băng ngôn ngữ tại Java 6. Tôi sẽ không nỗ lực học tập Java 7 hoặc 8 trừ khi tôi bị ép buộc (một dự án rất thú vị trong đó Java 7 hoặc 8 là bắt buộc), tôi thích dành thời gian để học Scala và Clojure.
Giorgio
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.