2008-11-20 22 views
14

Quay lại năm 2000 (khi .NET được tung ra khi chúng tôi IIRC) nó là một ngôn ngữ tiên tiến tiên tiến (lần cuối tôi sử dụng nó là 2003).Điều gì đã xảy ra với Java (Cụ thể là Ngôn ngữ)?

Từ những gì tôi đã đọc, Sun chỉ phát triển ngôn ngữ quá chậm. Tôi thậm chí còn đọc rằng ngôn ngữ đã phát triển, chẳng hạn như việc bổ sung Generics, các nhà phát triển đã phàn nàn về việc triển khai kém.

Đây có phải là những nhận thức chính xác hay không và nếu có, bất kỳ suy nghĩ nào về lý do tại sao, đặc biệt với sự cạnh tranh dường như rõ ràng từ C#?

+0

Tôi sẽ trả lời bằng một câu hỏi khác. Tại sao Microsoft, đặt rất nhiều nỗ lực vào các tính năng "ưa thích ngôn ngữ" như linq, cây biểu hiện và tất cả những thứ đó, tại sao họ chỉ bỏ qua kinh nghiệm từ thế giới Java? 5 năm trước người Java đã làm Hibernate ... – badbadboy

+0

bây giờ họ đã ra với Linq để thực thể đó là một cái gì đó không phải là quá thú vị để được trung thực .... Họ đang rất đằng sau trong một số những thứ khác ... – badbadboy

+4

Cộng đồng có thể làm thư viện - ví dụ NHibernate. Nó có ý nghĩa đối với MS làm công việc 'cốt lõi' như cải tiến ngôn ngữ và thời gian chạy. C# 3 là * nhiều * đẹp hơn để sử dụng hơn Java 6 - và đẹp hơn nhiều so với C# 1. –

Trả lời

20

Hầu hết các ngôn ngữ đều có một bàn tay mạnh mẽ liên quan đến nguồn gốc và sự tiến hóa của chúng. Hãy suy nghĩ: Larry Wall/Perl, Guido/Python, Matz/Ruby, Odersky/Scala, Hickey/Clojure, vv Những anh chàng này là tất cả các dudes ngôn ngữ rực rỡ. Tôi sẽ cho cánh tay trái của tôi một nửa thông minh như bất kỳ người trong số họ. Java đã thực sự có sự khác biệt không chỉ có một mà là một loạt các chàng trai ngôn ngữ tuyệt vời ở vị trí lãnh đạo - bắt đầu với Gosling, nhưng tôi cũng nghĩ về Guy Steele, Bill Joy, Gilad Bracha, Neal Gafter, v.v. - tất cả những người tuyệt vời. Đó thực sự là một điều tốt (tôi nghĩ). Nó làm cho ngôn ngữ tốt hơn nhưng ngăn cản sự trì trệ.

Nhưng trong vài năm qua, đã có một chân không thực sự của lãnh đạo ngôn ngữ. Tại thời điểm này, không ai quan tâm đến cửa hàng. Không ai đưa ra quyết định khó khăn về những gì phù hợp với khuôn Java và có ý nghĩa để thêm (hoặc quan trọng hơn là không thêm). Tôi không biết điều đó có nghĩa là gì. Tôi hy vọng rằng sự phổ biến rộng lớn và tầm với của Java và cơ sở vững chắc của JVM có nghĩa là chân không này quá hấp dẫn để không được lấp đầy và được chỉ dẫn tại một thời điểm nào đó.Nhưng tôi chỉ hy vọng một cách thận trọng vì tôi không biết đó là ai.

John Rose là dude ở phía JVM. Mặc dù nếu tôi chỉ có thể có được sự đổi mới trong cái này hay cái kia, tôi sẽ dùng JVM ngay bây giờ. :)

+0

Alex, Alex, Alex Terrocotta là công nghệ hiện đại, hoàn hảo, độc đáo. Tôi ước chúng ta cũng có thể sử dụng phiên bản .net. Đôi khi, tôi đang nghĩ về khả năng để đánh bại hiệu suất của đất nung tích hợp với combo hibernate trong .net, nhưng nó không phải là có thể. – sirmak

+0

Tôi muốn lưu ý (3 năm sau) rằng Brian Goetz đã thực sự nổi lên như là bàn tay hướng dẫn mới trong cách Java ngôn ngữ sẽ phát triển và imho đó là điều tốt nhất có thể có thể đã xảy ra. –

11

Java chắc chắn đã phát triển rất chậm - đặc biệt nếu bạn so sánh nó với C# và VB. Cá nhân tôi cảm thấy rằng họ đã đưa ra quyết định sai lầm với generics về việc giữ tính tương thích ngược với chi phí của thời gian thực hiện an toàn và hiệu quả. Cách tiếp cận .NET hoạt động tốt hơn rất nhiều ở gần như mọi cách, IMO.

Java 7 có long list of potential features - cả ngôn ngữ và nền tảng - nhưng nó đã là một thời gian rất dài trong quá trình tạo và vẫn có dấu hỏi đáng kể trên nhiều tính năng.

Tôi không muốn đặt bất kỳ "đổ lỗi" nào về lý do điều này xảy ra, tuy nhiên.

+0

Cảm ơn bạn đã cắm vào danh sách tính năng.Tôi cũng duy trì một blog liên kết Java 7 tại http://java7.tumblr.com nếu bạn quan tâm đến việc theo dõi mọi thứ theo cách đó. Mọi thứ trên blog liên kết đều kết thúc trên trang tính năng đó (cuối cùng). –

+0

Hơn hai năm sau và phiên bản Java hiện tại vẫn là "Phiên bản 6 Cập nhật 24". – tiago2014

6

Sự phát triển của ngôn ngữ Java đã chậm, nhưng cố ý như vậy.

Generics cung cấp một ví dụ điển hình. Khả năng tương thích với các phiên bản Java trước là một yêu cầu. Với mục tiêu của dự án, việc thực hiện Generics thực hiện một chức năng rất hữu ích chính xác như được thiết kế. Tuy nhiên, nó không đáp ứng được sự mong đợi của nhiều nhà phát triển đã mong đợi hành vi của các generics được đổi mới.

Đổi mới trong JVM, mặt khác, đã cực kỳ nhanh chóng, thường dẫn đầu cho các máy ảo khác và thúc đẩy cạnh tranh trong lĩnh vực hoạt động.

Theo tôi, ngôn ngữ Java phải ổn định nhất có thể. Tôi thích ý tưởng đóng cửa, nhưng tôi không tin Java là ngôn ngữ cho họ. (Nếu một cái gì đó phải đi vào, tôi thích FCM bảo thủ.) Tôi làm việc với một nhóm các nhà phát triển cần đào tạo, xây dựng và duy trì một ứng dụng sản xuất phức tạp. Ngôn ngữ Java cho chúng ta một sự pha trộn tốt đẹp về quyền lực và cấu trúc như nó.

Các ngôn ngữ khác, như Scala và Groovy và các cổng tới JVM như Ruby và Python, sẽ tiếp tục cung cấp cho nền tảng Java, ngay cả sau khi ngôn ngữ Java đã đi theo con đường COBOL.

1

Tôi nghĩ rằng Mặt trời hiện đang bảo thủ và đảm bảo họ đưa ra quyết định đúng đắn sau khi đưa ra một vài quyết định kém.

Ngoài ra còn có rất nhiều cảnh báo và rối tung xung quanh trước khi Java 1.5 xuất hiện. Nhiều công ty đang sử dụng các hack của bên thứ ba như Generic Java, bởi vì các tính năng ngôn ngữ cốt lõi này không có sẵn nhưng mong muốn mạnh mẽ.

Tôi nghĩ rằng họ đã tăng tốc trở lại từ 1.5, với 1.7 trên đường chân trời, và có vẻ như mỗi trong số này đã cung cấp các tính năng mới rất hữu ích. Nguồn mở của ngôn ngữ cũng tốt.

Và bất cứ điều gì một số người nói, duy trì tính tương thích ngược lại là một tính năng rất quan trọng trong ngôn ngữ Java.

Tôi sẽ nói điều đó.NET đã đá lừa của Sun vào thiết bị, và rằng nó là tốt mà cả hai đều tồn tại.

+3

Sun đã tăng tốc từ 1.5? Điều đó đã được phát hành hơn 4 năm trước. Kể từ đó chúng tôi đã có C# 2, C# 3, và tôi sẽ không được * hoàn toàn * ngạc nhiên khi thấy tàu C# 4 trước Java 7. Ít nhất tôi đã có một ý tưởng khá vững chắc những gì sẽ có trong C# 4 - danh sách tính năng cho Java 7 vẫn có vẻ rất cao trong không khí. –

+0

Có nói rằng, tôi hoàn toàn đồng ý rằng đó là một điều tốt cho cả Java và .NET tồn tại :) –

+2

.NET 4.0 hiện đã được gửi trước Java 7. :) –

21

Từ quan điểm của doanh nghiệp, việc phát triển ngôn ngữ không phải là điều tốt, nó thực sự khá tệ.

Đó là lý do tại sao bạn nghe các ngôn ngữ cũ hơn như cobol, fortran và thậm chí C được viết với số năm sau họ - nhiều doanh nghiệp gắn bó với năm đó.

Trên hết, các nhóm lớn hơn có nghĩa là có nhiều khả năng một người nào đó trong nhóm của bạn sẽ làm những việc mà người khác không hiểu, vì vậy có giá trị quan trọng nhưng được đánh giá thấp trong việc giữ ngôn ngữ đơn giản và sạch sẽ. Điều này có nghĩa là không thêm quá nhiều cách thay thế để làm việc.

Tôi đã làm việc với Ruby và có một quả bóng với ngôn ngữ, nhưng nhìn nó từ quan điểm của một doanh nghiệp, đó là một ngôn ngữ hoàn toàn đáng sợ. Tôi không thể đếm được những cách mà một lập trình viên xấu có thể làm rối tung một đội lớn, buộc họ phải mất nhiều ngày để gỡ rối một mớ hỗn độn được tạo ra trong vài phút.

Có những công ty từ chối chuyển sang java 5.0 vì tính phức tạp của generics. (Chúng tôi vẫn đang làm việc trên 1.3x nhưng đó là vì một lý do khác).

Và thành thật mà nói, hầu hết các "Cải tiến" đều giúp bạn mua được rất ít. Một số thay đổi cú pháp, khả năng loại bỏ một vài cấp niềng răng.

Tôi không thể nghĩ ra một trường hợp duy nhất mà Java đã buộc tôi lặp lại logic nghiệp vụ (Đó là điều tôi lo lắng khi cố gắng tạo mã "DRY") - đó là một ngôn ngữ đủ để hoàn toàn khô nếu bạn là một lập trình viên giỏi. Ví dụ, bất cứ điều gì bạn có thể làm với một đóng cửa bạn có thể làm với một phân lớp mà không lặp lại logic kinh doanh - những gì bạn kết thúc với vẻ tồi tệ hơn vì lớp niềng răng/định nghĩa lớp bổ sung, nhưng thường tái sử dụng hơn (Bạn có thể mở rộng lớp bạn sử dụng để thực hiện gọi lại, nhưng bạn không thể mở rộng phương thức đóng, bạn phải viết lại phương thức đóng.)

Tôi không cảm thấy mã này trong vài thập kỷ đầu tiên trong sự nghiệp của mình (Tôi yêu các thủ thuật ngôn ngữ, vui hơn, nhưng bây giờ tôi đã ở đây lâu rồi - Có thể tuổi già của tôi lẻn vào, hoặc nó có thể là kinh nghiệm, nhưng bây giờ tôi thấy những lợi ích to lớn đơn giản, rõ ràng, mã ổn định (được cung cấp bởi một ngôn ngữ không cho phép bạn chơi thủ thuật) và thực sự không thể tìm thấy một lợi thế duy nhất cho nhiều metho thay thế ds, ngay cả khi họ lưu một hoặc hai dòng gõ.

Nếu bạn đang tìm kiếm bản nâng cấp java, hãy xem Scala. Thật đáng kinh ngạc, vẫn chạy trên JVM, tương tác với Java, v.v.

+5

Lợi ích của hầu hết các cải tiến ngôn ngữ có thể được tóm tắt trong một một từ: dễ đọc. So sánh khả năng đọc, sắp xếp và chiếu một bộ sưu tập bằng cách sử dụng LINQ to Objects với mã tương đương trong Java ... –

+1

Có thể, nhưng nhìn LINQ nó có vẻ là cách đằng sau Active Record - MUCH ít có thể đọc/sử dụng được. Điều đó có làm cho nó sai? Tôi không chắc nó so sánh với chú thích Java + Hibernate như thế nào. –

+0

Ngoài ra, một lập trình viên tốt sẽ có thể thể hiện bản thân một cách dễ đọc bằng bất kỳ ngôn ngữ nào. Trong Java, tôi nhận thấy nó có một chút tài năng lập trình để làm như vậy, trong Ruby ít hơn nhiều. –

3

Java có các vấn đề khác nhau sau đó .Net tại thời điểm này, dẫn đến các lựa chọn khác nhau.

.Net, tương đối mới và có cơ hội để tránh một số lỗi của Java có cơ hội làm việc khác đi. Điều này mang lại cho nó hai lợi thế chính:

  1. MS có thể phân biệt rõ hơn giữa các nền tảng thời gian chạy. C# 3.0 rõ ràng sẽ không chạy trên khuôn khổ 1.1, và C# 1.1 sẽ không chạy trên khuôn khổ 3.0. Tất nhiên, có một số fuzziness đó, nhưng nói chung bạn có một ý tưởng tốt hơn nơi bạn đứng. Mặt khác, JVM của máy khách tự động cập nhật theo mặc định trên các cửa sổ. Vì vậy, nó có thể được nhiều trickier giữ một hệ thống cũ làm việc.
  2. Khuôn khổ .Net, trẻ hơn, đã tích lũy được ít phức tạp hơn nhiều và phức tạp bên trong. Những thứ đó sẽ giết chết tốc độ mà bạn có thể thêm các tính năng mới. Bây giờ chúng ta bắt đầu thấy một số điều này trong .Net cũng vậy. Ví dụ: có một số hàm BCL yêu cầu bạn truyền vào hoặc trả về một mảng mà thay vào đó hãy sử dụng một IEnumerable. Lịch sử của những chức năng đó làm cho nó gần như không thể thay đổi chúng.

Hai thứ này âm mưu với nhau để làm cho nó có thể (tại thời điểm này) để các ngôn ngữ .Net tiến nhanh hơn. Tuy nhiên, như tôi đã nói chúng tôi bắt đầu thấy những hiệu ứng này bắt kịp với. Net là tốt.

+0

Mã C# 1.1 * sẽ chạy trên khung 3.0. Trong khi khả năng tương thích không hoàn hảo, nó khá tốt. Nếu bạn đã có một chương trình được xây dựng với .NET 1.1, rất có khả năng nó sẽ chạy nếu bạn đã cài đặt .NET 3.0. –

+0

do đó nhận xét 'fuzziness' :) –

+0

Nó cũng đáng chú ý là bạn có thể có nhiều phiên bản .NET được cài đặt và bạn có thể liên kết với các phiên bản cụ thể. Các hệ thống cũ thực tế không nên ngừng hoạt động khi cập nhật diễn ra. –

1

Trong một thời gian dài, Java có (tốt hơn hoặc tệ hơn) được ưa thích để giới thiệu chức năng mới thông qua các khuôn khổ, thay vì trong chính ngôn ngữ đó.

Bạn có thể lập luận rằng, một người viết ứng dụng Spring/Hibernate/Struts thực sự viết bằng một phương ngữ đặc biệt của Java, vì mã của họ sẽ phần lớn không thể hoạt động mà không có tất cả phép thuật phản xạ/tiêm/thiết bị khuôn khổ.

Cá nhân, tôi muốn ngôn ngữ phát triển nhiều hơn một chút, và cho các tác giả khuôn khổ từ bỏ khỉ với ngữ nghĩa ngôn ngữ thông qua thao tác bytecode.

Là một lưu ý phụ, tôi cũng rất không đồng ý với quyết định của Sun về việc sử dụng loại tẩy xoá trong việc triển khai Generics. Giả sử, họ muốn đảm bảo khả năng tương thích ngược, nhưng đối với tôi dường như hoàn toàn giả mạo, vì Chú thích (được thêm vào chính xác cùng một lúc, trong Java 5) đã tạo ra một tập hợp không tương thích của riêng mình. Ở bất kỳ mức nào, mã được biên dịch cho Java 5 không bao giờ có thể được thực thi trên một JVM trước đó, do đó yêu cầu tương thích ngược có vẻ rất đáng ngờ đối với tôi.

+0

Loại xóa là về khả năng tương thích về phía trước. Các giải pháp khác đã được xem xét cho vấn đề này, nhưng xóa được chọn là một cách sạch sẽ để cho phép mã được biên dịch cho Java 1.4 để tiếp tục làm việc mà không cần sửa đổi trong thời gian chạy 1,5. – erickson

+0

Ah, vâng. Tôi đã không nghĩ về điều đó. Khi .NET giới thiệu các kiểu generic, chúng đã làm như vậy bằng cách thêm một không gian tên hoàn toàn mới và phân biệt các lớp sưu tập tham số từ các lớp bộ sưu tập vanilla cũ. Cả hai giải pháp đều khá xấu xí. – benjismith

Các vấn đề liên quan