Một đánh giá hiện đại về Java [đã đóng]


58

Tôi đã lập trình được một vài năm và tôi bắt đầu học Java và trong thời gian đó tôi đã tìm thấy nhiều nguồn khác nhau tuyên bố Java là ngôn ngữ kém hơn bằng cách này hay cách khác. Tôi nhận thức rõ rằng mỗi ngôn ngữ đều có điểm mạnh và điểm yếu, nhưng rất nhiều điều tôi đã đọc về Java dường như đã bị lỗi thời.

Lý do thường được trích dẫn nhất cho việc Java kém hơn là vì nó chậm hơn nhiều so với các ngôn ngữ được biên dịch nguyên bản khác, như C ++ chẳng hạn. Nhiều người chỉ trích nhà thiết kế trò chơi Notch (người đã phát triển Minecraft) vì sử dụng Java vì sự thiếu rõ ràng của nó trong bộ phận hiệu suất. Tôi biết Java đã chậm hơn rất nhiều trong ngày, nhưng đã có nhiều cải tiến kể từ đó, đặc biệt là quá trình biên dịch JIT.

Tôi muốn có một số ý kiến ​​khách quan về Java như một ngôn ngữ ngày nay. Vì vậy, câu hỏi của tôi có 4 phần.

  1. Hiệu suất.

    a. Làm thế nào để tốc độ của Java ngày nay so với C ++?

    b. Có thể tạo một tiêu đề AAA hiện đại bằng Java không?

    c. Trong những lĩnh vực cụ thể là Java chậm hơn C ++, nếu có? (ví dụ: Số giòn, đồ họa hoặc chỉ xung quanh)

  2. Bây giờ Java có được coi là ngôn ngữ được biên dịch hay ngôn ngữ được dịch không?

  3. Một số thiếu sót lớn của Java đã được giải quyết từ những ngày đầu là gì?

  4. Một số thiếu sót lớn của Java vẫn chưa được giải quyết là gì?

Biên tập:

Chỉ với mục đích làm rõ Tôi không tạo Java này với C ++, rõ ràng trung bình c ++ sẽ nhanh hơn Java một chút. Tôi chỉ đơn giản là cần một cái gì đó để so sánh Java với sự trưởng thành như một ngôn ngữ tại thời điểm này. Vì c ++ đã tồn tại mãi mãi, tôi nghĩ tôi sẽ là một điểm tốt để so sánh.



4
Tôi thích thực tế là một cái gì đó 10 tuổi không còn hiện đại.
cwallenpoole

4
Java trông khác rất nhiều khi bạn xem nó như một khung / nền tảng thay vì chỉ là một ngôn ngữ. Có lẽ vấn đề là tên về cơ bản là "Java" cho cả hai.
Joe Internet

1
Cũng như một điểm tương phản - Minecraft gần đây đạt doanh số 3 triệu. Tôi không nghĩ rằng những thiếu sót được cho là của Java đã làm tổn thương trò chơi đủ để ảnh hưởng đến doanh số rất nhiều.
Michael K

3
Hoàn toàn bất kỳ ngôn ngữ nào là kém hơn "bằng cách này hay cách khác". Theo định nghĩa.
SK-logic

Câu trả lời:


62

a. Làm thế nào để tốc độ của Java ngày nay so với C ++?

Khó đo lường. Điều đáng chú ý là một phần chính của tốc độ thực hiện, đó là cấp phát bộ nhớ, là các thuật toán rất khác nhau trong Java và C ++. Bản chất không xác định của trình thu thập khiến cho việc thu thập dữ liệu hiệu suất có ý nghĩa rất khó so với quản lý bộ nhớ xác định của C ++, bởi vì bạn không bao giờ có thể chắc chắn trạng thái của trình thu thập đó là gì. điều đó có thể có ý nghĩa so sánh chúng. Một số mẫu cấp phát bộ nhớ chạy nhanh hơn nhiều với một GC, một số mẫu chạy nhanh hơn nhiều với bộ cấp phát riêng.

Tuy nhiên, điều tôi muốn nói là Java GC phải chạy nhanh trong mọi tình huống. Tuy nhiên, một công cụ phân bổ riêng có thể được hoán đổi cho một công cụ phù hợp hơn. Gần đây tôi đã đưa ra một câu hỏi trên SO về lý do tại sao một C # Dictionarycó thể thực thi trong (0,45 ms trên máy của tôi) so với tương đươngstd::unordered_mapmà thực hiện trên (10ms trên máy của tôi). Tuy nhiên, chỉ bằng cách hoán đổi bộ cấp phát và tìm kiếm những thứ thích hợp hơn, tôi đã cắt thời gian thực hiện đó xuống còn 0,34ms trên máy của mình - một phần ba của thời gian chạy ban đầu. Bạn không bao giờ có thể hy vọng thực hiện loại tối ưu hóa tùy chỉnh đó với Java. Một ví dụ tuyệt vời về nơi điều này có thể tạo ra sự khác biệt thực sự là phân luồng. Các thư viện luồng gốc như TBB cung cấp các bộ cấp phát bộ đệm luồng nhanh hơn so với các bộ cấp phát truyền thống khi xử lý nhiều phân bổ trên nhiều luồng.

Bây giờ, nhiều người sẽ nói về các cải tiến JIT và cách JIT có nhiều thông tin hơn. Chắc chắn, đó là sự thật. Nhưng nó thậm chí còn không gần với những gì trình biên dịch C ++ có thể kéo - bởi vì trình biên dịch có thời gian và không gian vô hạn để chạy, theo quan điểm về thời gian chạy của chương trình cuối cùng. Mỗi chu kỳ và mỗi byte mà JIT dành để suy nghĩ về cách tốt nhất để tối ưu hóa chương trình của bạn là một chu trình mà chương trình của bạn không chi tiêu thực hiện và không thể sử dụng cho nhu cầu bộ nhớ của chính nó.

Ngoài ra, sẽ luôn có những lúc tối ưu hóa trình biên dịch và JIT không thể chứng minh các tối ưu hóa nhất định - đặc biệt là trong trường hợp những thứ như phân tích thoát. Trong C ++, sau đó là các giá trị là trên stack nào , trình biên dịch không cần phải thực hiện nó. Ngoài ra, có những điều đơn giản, như bộ nhớ liền kề. Nếu bạn phân bổ một mảng trong C ++, thì bạn phân bổ một mảng duy nhất, liền kề. Nếu bạn phân bổ một mảng trong Java, thì nó không liền kề nhau, bởi vì mảng chỉ chứa đầy các con trỏ có thể trỏ đến bất cứ đâu. Đây không chỉ là chi phí bộ nhớ và thời gian cho các lần chuyển hướng kép mà còn cả chi phí bộ nhớ cache. Kiểu này là ở chỗ ngữ nghĩa ngôn ngữ của Java đơn giản thực thi rằng nó phải chậm hơn mã C ++ tương đương.

Cuối cùng, kinh nghiệm cá nhân của tôi là Java có thể trung bình bằng một nửa tốc độ của C ++. Tuy nhiên, thực tế không có cách nào để sao lưu bất kỳ báo cáo hiệu suất nào mà không có bộ điểm chuẩn cực kỳ toàn diện, vì các thuật toán cơ bản khác nhau có liên quan.

b. Có thể tạo một tiêu đề AAA hiện đại bằng Java không?

Tôi cho rằng bạn có nghĩa là "trò chơi", ở đây, và không phải là một cơ hội. Đầu tiên, bạn phải tự viết mọi thứ từ gần như tất cả các thư viện và cơ sở hạ tầng hiện có nhắm mục tiêu C ++. Mặc dù không làm cho nó không thể thực hiện được, nó chắc chắn có thể đóng góp vững chắc cho những điều không khả thi. Thứ hai, ngay cả các công cụ C ++ cũng khó có thể phù hợp với các hạn chế bộ nhớ nhỏ của các bảng điều khiển hiện có - nếu các JVM thậm chí còn tồn tại cho các máy chơi game đó và các game thủ PC mong đợi nhiều hơn một chút cho bộ nhớ của chúng. Tạo các trò chơi AAA hiệu suất là đủ khó trong C ++, tôi không thấy làm thế nào nó có thể đạt được trong Java. Không ai từng viết một trò chơi AAA với thời gian đáng kể dành cho một ngôn ngữ không được biên dịch. Hơn thế nữa, nó chỉ đơn giản là cực kỳ dễ bị lỗi. Sự phá hủy mang tính quyết định là điều cần thiết khi xử lý, ví dụ, tài nguyên GPU - và trong Java, bạn '

c. Trong những lĩnh vực cụ thể là Java chậm hơn C ++, nếu có? (ví dụ: Số giòn, đồ họa hoặc chỉ xung quanh)

Tôi chắc chắn sẽ đi khắp nơi. Bản chất tham chiếu được thi hành của tất cả các đối tượng Java có nghĩa là Java có nhiều hướng dẫn và tham chiếu trong đó hơn C ++ - một ví dụ tôi đã đưa ra trước đó với các mảng, nhưng cũng áp dụng cho tất cả các đối tượng thành viên. Trong đó trình biên dịch C ++ có thể tra cứu biến thành viên trong thời gian không đổi, thời gian chạy Java phải theo một con trỏ khác. Bạn càng truy cập nhiều, điều này sẽ càng chậm, và JIT không thể làm gì về điều đó.

Trong đó C ++ có thể giải phóng và sử dụng lại một phần bộ nhớ gần như ngay lập tức, trong Java bạn phải chờ bộ sưu tập và tôi hy vọng rằng phần đó không bị hết bộ nhớ cache và vốn đã yêu cầu nhiều bộ nhớ hơn đồng nghĩa với hiệu năng phân trang và bộ nhớ đệm thấp hơn. Sau đó nhìn vào ngữ nghĩa cho những thứ như đấm bốc và unboxing. Trong Java, nếu bạn muốn tham chiếu một int, bạn phải tự động phân bổ nó. Đó là một sự lãng phí vốn có so với ngữ nghĩa C ++.

Sau đó, bạn có vấn đề chung. Trong Java, bạn chỉ có thể hoạt động trên các đối tượng chung thông qua kế thừa thời gian chạy. Trong C ++, các mẫu có nghĩa đen bằng không - một thứ Java không thể phù hợp. Điều này có nghĩa là tất cả các mã chung trong Java vốn đã chậm hơn một mã tương đương chung trong C ++.

Và sau đó bạn đến với Hành vi không xác định. Mọi người đều ghét nó khi chương trình của họ trưng bày UB và mọi người đều ước rằng nó không tồn tại. Tuy nhiên, UB về cơ bản cho phép tối ưu hóa không bao giờ tồn tại trong Java. Hãy xem bài viết này mô tả tối ưu hóa dựa trên UB. Không xác định hành vi có nghĩa là việc triển khai có thể thực hiện tối ưu hóa nhiều hơn và giảm mã cần thiết để kiểm tra các điều kiện sẽ không được xác định trong C ++ nhưng được xác định trong Java.

Về cơ bản, ngữ nghĩa của Java cho rằng đó là ngôn ngữ chậm hơn C ++.

Bây giờ Java có được coi là ngôn ngữ được biên dịch hay ngôn ngữ được dịch không?

Nó không thực sự phù hợp với một trong những nhóm đó. Tôi nói rằng quản lý thực sự là một danh mục riêng biệt, mặc dù tôi nói rằng nó chắc chắn giống một ngôn ngữ được giải thích hơn là một ngôn ngữ được biên dịch. Quan trọng hơn, có khá nhiều chỉ có hai hệ thống được quản lý chính là JVM và CLR và khi bạn nói "được quản lý" thì điều đó đủ rõ ràng.

Một số thiếu sót lớn của Java đã được giải quyết từ những ngày đầu là gì?

Tự động đấm bốc và unboxing là điều duy nhất tôi biết. Các khái quát giải quyết một số vấn đề, nhưng xa từ nhiều.

Một số thiếu sót lớn của Java vẫn chưa được giải quyết là gì?

Tướng của họ rất, rất yếu Tổng quát của C # mạnh hơn đáng kể - mặc dù tất nhiên, cả hai đều không phải là mẫu khá. Phá hủy quyết định là một thiếu lớn. Bất kỳ hình thức lambda / đóng cửa nào cũng là một vấn đề lớn - bạn có thể quên API chức năng trong Java. Và, tất nhiên, luôn có vấn đề về hiệu suất, đối với những lĩnh vực cần chúng.


10
Bạn dường như có một số hiểu lầm về cách JIT hiện đại hoạt động. Nếu không thì thông tin tốt.
Sean McMillan

7
"Quan trọng hơn, có khá nhiều chỉ có hai hệ thống được quản lý chính là JVM và CLR" - um, Python? Hồng ngọc? Smalltalk? LISP ? Tất cả đều sử dụng công cụ thu gom rác, thiếu số học con trỏ và AFAIK có ít nhất một triển khai dựa trên mã byte.
Michael Borgwardt

3
@Michael: Lần trước tôi đã kiểm tra, ít nhất Python và Ruby rơi khá nhiều vào trại "diễn giải". Các triển khai phổ biến nhất của chúng không được biên dịch trước thành mã byte trong một pha riêng biệt cũng như không bao gồm các JIT. Không được sử dụng Smalltalk hoặc LISP nhưng tôi không chắc chắn về việc đưa chúng vào trại "chính" - và tôi cũng chưa bao giờ nghe nói về Smalltalk hoặc LISP JIT.
DeadMG

19
+1 câu trả lời hay. cuối cùng cũng có người hiểu tại sao Java sẽ luôn chậm hơn C ++.
jeffythedragonslayer

2
Có bất kỳ điểm nào trong số những điểm này vượt quá bất kỳ vấn đề hiệu suất thế giới thực nào (accexdotal hoặc điểm chuẩn) không? Nó có đáng chú ý bởi hầu hết người dùng? Nói rằng ngôn ngữ X nhanh hơn 0,25% so với ngôn ngữ Y không có nghĩa là ngôn ngữ Y chậm. Với các trò chơi video, bạn đang nói về các máy chơi game khéo léo hay có bao gồm các trò chơi trên PC không?
TheLQ

34

Tôi sẽ bắt đầu với điều kiện là gần như không ai có thể đưa ra ý kiến ​​trung lập thực sự về ngôn ngữ lập trình. Nếu bạn biết rõ hai ngôn ngữ đủ để nhận xét về chúng một cách có ý nghĩa, thì gần như không thể tránh khỏi việc bạn sẽ thích ngôn ngữ này hơn ngôn ngữ kia. Như một cảnh báo công bằng, tôi thích C ++ hơn Java, điều này chắc chắn ảnh hưởng đến các bình luận của tôi ở ít nhất là ở một mức độ nào đó.

1a. Tốc độ: tốc độ bạn nhận được từ C ++ hoặc Java thường sẽ phụ thuộc ít hơn vào ngôn ngữ hoặc cách triển khai của ngôn ngữ đó so với kỹ năng của (các) lập trình viên sử dụng nó. Cuối cùng, C ++ có thể giành chiến thắng về tốc độ thường xuyên hơn không, nhưng sự khác biệt trong mã bạn viết mới là điều thực sự quan trọng.
1b. Vâng, có lẽ. Đồng thời, C ++ đã được thiết lập tốt và tôi nghi ngờ hầu hết các hãng game đều thấy đủ lợi thế để bận tâm chuyển sang Java.
1c. Một câu trả lời thấu đáo cho điều này có thể có thể lấp đầy một khối lượng lớn. C ++ nói chung sẽ làm tốt hơn với các nguồn lực hạn chế hơn. Java được hưởng lợi nhiều hơn từ (ví dụ) có rất nhiều bộ nhớ "dự phòng".
2. Thực thi chậm và thu gom rác chậm có lẽ là hai điều rõ ràng nhất. Thư viện cửa sổ ban đầu (AWT) khá vụng về - Swing là một cải tiến lớn.
3. Độ dài. Thiếu vận hành quá tải. Sử dụng thu gom rác. Thiếu nhiều di sản. Java Generics cực kỳ hạn chế so với các mẫu C ++.

Tôi nên thêm rằng một số (tất cả?) Những nhược điểm đó (đặc biệt là sử dụng bộ sưu tập rác, nhưng những thứ khác nữa) được nhiều người coi là lợi thế của Java. Ngoại lệ duy nhất có thể là tính dài dòng của nó. Tình hình dài dòng đang dần cải thiện đôi chút, nhưng bạn chắc chắn không thấy các cuộc thi golf mã thắng Java thường xuyên và trong mã thông thường, nó cũng có xu hướng sử dụng khá nhiều mã. Tôi nghi ngờ có ít nhất một vài người xem nó là dễ đọc và dễ hiểu hơn, vì vậy nó có thể được coi là một lợi thế.


12
Các thế hệ Java thậm chí không thể so sánh với các mẫu C ++. Các mẫu Java là đường cú pháp để hỗ trợ kiểm tra kiểu thời gian biên dịch. Các mẫu C ++ là một hệ thống tạo mã Turing-Complete.
kevin cline

10
+1 cho tính dài dòng. Nó lên đó với COBOL cho cú pháp dài vô nghĩa. Với tất cả các kiểu "thử" "bắt" và với tất cả ht e
James Anderson

1
@Mark: cá nhân, tôi thấy câu trả lời này là một mớ hỗn độn không thể đọc được và muốn không gặp lại điều này. Câu trả lời nên là câu trả lời, không phải là thảo luận.
Michael Borgwardt

2
+1 Đối với toán tử quá tải, một số thứ mà nhiều người coi là nhược điểm nhỏ, nhưng đối với tôi là một nhược điểm lớn. Và tất nhiên các mẫu, nhưng gần như tất cả mọi người coi chúng là chính.
Chris nói Phục hồi lại

2
Các mẫu C ++ không có ý định hoàn thành Turing - điều đó xảy ra một cách tình cờ, là kết quả của thiết kế của nó. Tuy nhiên, đôi khi nó rất hữu ích: tra cứu siêu dữ liệu mẫu C ++.
sắp tới

11
  1. Về hiệu suất;
    1. Trong tốc độ thực thi mã thuần túy, Java gần bằng với C ++ đơn giản. Nhưng Java có xu hướng sử dụng nhiều bộ nhớ hơn - một phần vì nó dựa trên GC, một phần vì thiết kế của nó tập trung nhiều vào sự đơn giản và an toàn hơn là hiệu quả. Do vấn đề bộ nhớ cache, nhiều bộ nhớ chuyển sang tốc độ thấp hơn. Một thấp hơn khi so sánh với giá cao điều chỉnh C ++.
    2. Nếu bạn cho rằng một tiêu đề AAA phải hoạt động ở rìa của những gì có thể sử dụng phần cứng hiện tại, thì không. Ít nhất là không ở phía khách hàng. Tôi sẵn sàng đặt cược rằng một số tiêu đề AAA đã sử dụng Java cho các phần của cơ sở hạ tầng phụ trợ.
    3. Bất cứ điều gì bạn làm việc với các bộ dữ liệu lớn và C ++ đều có thể được tối ưu hóa để truy cập chúng theo cách thân thiện với bộ đệm.
  2. Nó được biên dịch thành mã byte và biên dịch JIT khi chạy. Biên dịch so với giải thích là một sự phân đôi sai lầm, lỗi thời.
  3. & 4. Có quá nhiều thứ để liệt kê tất cả, và sẽ có sự bất đồng về hầu hết chúng.

3
Nói Java sử dụng rất nhiều bộ nhớ vì nó dựa trên GC gần giống như nói một chiếc xe 18 bánh sử dụng nhiều xăng vì nó có 18 bánh. Tôi không biết gì về Java, nhưng tôi nghi ngờ vấn đề là sự phình to thời gian chạy và quá nhiều thứ được lưu vào bộ đệm, rác ít ngữ nghĩa và không phải là một lỗ hổng trong chính cách tiếp cận bộ sưu tập rác.
Joey Adams

3
Ở cấp độ rõ ràng nhất, bộ sưu tập rác có nghĩa là có một độ trễ giữa một đối tượng không sử dụng và bộ thu gom rác thực sự lấy lại không gian của nó. Trong một môi trường được quản lý thủ công, không gian có thể được giải phóng ngay lập tức khi đối tượng không sử dụng. Độ trễ có nghĩa là môi trường thu gom rác sử dụng nhiều bộ nhớ hơn. Và thông thường, nó hoạt động tốt hơn khi có nhiều bộ nhớ hơn vì nó làm giảm chi phí hoạt động.
Michael Borgwardt

1
@MichaelBorgwardt Bạn có thể muốn đề cập rằng tốc độ cần có thời gian vì hầu hết các JVM cần phải bắt đầu lại từ đầu mỗi lần. Hồ sơ thông tin từ các lần chạy trước không được sử dụng lại.

11

Đầu tiên là một số bối cảnh, C ++ của tôi rất thô sơ, vì vậy hầu hết các trải nghiệm của tôi với Java liên quan đến trải nghiệm gần đây của tôi với C #, dù sao cũng là một táo táo hơn nhiều so với táo.

1. Tốc độ

a. Làm thế nào để tốc độ của Java ngày nay so với C ++?

Tôi nghĩ rằng điều này được trả lời tốt nhất bởi câu hỏi SO Tại sao java có tiếng là chậm? nhưng tôi cũng nghĩ rằng toàn bộ câu hỏi này được tô màu bởi bài đăng trên blog của Jeff Atwood, Gorilla vs. Shark . Cảm ơn Péter & Christopher.

b. Có thể tạo một tiêu đề AAA hiện đại bằng Java không?

Điều đó phụ thuộc vào các ưu tiên của nhà phát triển và kỹ năng của các nhà phát triển. Ngoài ra, đó không phải là một hoặc một tình huống, các phần khác nhau của tiêu đề có thể yêu cầu những thứ khác nhau của ngôn ngữ mà chúng được triển khai, dẫn đến một môi trường ngôn ngữ không đồng nhất.

Gần đây tôi đã thấy một số trò chơi đề cập rằng họ đang tải môi trường Python trong khi họ đang tải và tôi nghi ngờ rằng ngựa cho các khóa học là một động lực mạnh mẽ nếu bạn muốn đưa tiêu đề của mình ra đúng thời điểm cho mùa lễ (ví dụ) .

c. Trong những lĩnh vực cụ thể là Java chậm hơn C ++, nếu có? (ví dụ: Số giòn, đồ họa hoặc chỉ xung quanh)

Bạn có thể viết mã hiệu suất kém bằng bất kỳ ngôn ngữ nào, nhưng một số ngôn ngữ giúp bạn dễ dàng đưa ra lựa chọn tốt hơn, trong khi những ngôn ngữ khác có nhiều khả năng cho phép bạn tự nâng mình bằng cánh hoa của mình . Java rơi vào loại trước, C ++ chắc chắn rơi vào loại sau.

Với sức mạnh to lớn đi kèm với trách nhiệm lớn lao như họ nói (chưa kể đến khả năng làm hỏng hoàn toàn đống của bạn * 8 ').

2. Java hiện được coi là ngôn ngữ được biên dịch hay ngôn ngữ được giải thích?

Tôi không thể nói hầu hết mọi người coi đó là gì, nhưng nhiều người biết sự khác biệt giữa ngôn ngữ được biên dịch và giải thích, và đã không sống trong hang động trong 20 năm qua, cũng sẽ biết rằng JIT ( Just-in Trình biên dịch -Time ) là một phần quan trọng của hệ sinh thái Java, vì vậy có lẽ nhiều khả năng sẽ được xem xét biên dịch trong những ngày này.

3. Một số thiếu sót lớn của Java đã được giải quyết từ những ngày đầu là gì?

Tôi là một chuyển đổi khá gần đây sang Java, vì vậy tôi có ít bối cảnh về cách nó đã phát triển. Nhưng thật thú vị khi lưu ý rằng có những cuốn sách như Java: Các bộ phận tốt tìm cách điều khiển mọi người theo hướng các phần của ngôn ngữ nên được ưa thích trong những ngày này và giúp mọi người tránh xa các khu vực đang hoặc nên không dùng nữa

4. Một số thiếu sót lớn của Java vẫn chưa được giải quyết là gì?

Theo tôi, một vấn đề với Java là việc áp dụng các tính năng mới chậm.

Đã đến Java từ C # và xem qua trang so sánh Wikipedia , đây là những điều nổi bật đối với tôi:

Những điều tôi nhớ trong Java, so với C #

  • Thuộc tính , đặc biệt là thuộc tính tự động. Họ làm cho việc xây dựng và duy trì giao diện dễ dàng hơn nhiều .
  • Đóng cửa / lambdas . Tôi thực sự thất vọng khi nghe rằng hỗ trợ Java đã bị đẩy lùi một lần nữa . Cuối cùng, chúng ta có Closures / lambdas trong Java 8, nhưng thời gian cần chứng thực cho tuyên bố của tôi về việc áp dụng chậm.
  • Kiểu suy luận ( var) có vẻ giống như đường cú pháp, nhưng khi bạn có các loại chung phức tạp, nó có thể làm cho mã rõ ràng hơn nhiều bằng cách loại bỏ rất nhiều sự trùng lặp vô giá trị.
  • Các lớp một phần thực sự giúp giữ mã được tạo tự động (nói từ trình xây dựng GUI) tách biệt với mã viết của lập trình viên.
  • Các loại giá trị , đôi khi có một đối số cho việc sử dụng trọng lượng nhẹ structtrên một lớp đầy đủ.
  • Các phương thức mở rộng có thể làm cho các hệ thống trở nên phức tạp nếu được sử dụng quá mức, nhưng rất tốt để chỉ ra cách thức chính tắc để thực hiện một cái gì đó cho một lớp nếu cần thiết.
  • Các loại không được ký , đôi khi bit thừa đó có thể tạo ra tất cả sự khác biệt. *số 8')

Những điều tôi không bỏ lỡ trong Java, so với C #

  • Quá tải toán tử là rất tốt khi nó được sử dụng một cách chính xác, nhưng khi sử dụng không tốt có thể dẫn đến khó tìm lỗi và ngắt kết nối giữa những gì một toán tử rõ ràng nên làm và những gì nó thực sự làm.
  • Các loại giá trị không thể bỏ qua dường như luôn gây ra nhiều rắc rối hơn giá trị của chúng.
  • Truy cập vào unsafemã. Bạn phải rất cẩn thận với điều này mà hiếm khi tôi thấy nó đáng để nỗ lực thêm.

Như vậy, ngay cả khi so sánh táo với táo, Java được coi là đã tụt lại phía sau.

Hai vấn đề lớn khác mà tôi thấy với Java là sự chậm trễ khởi động quá lớn và thực tế là (đối với một số JVM), bạn phải quản lý đống của mình và cả đống thế hệ vĩnh viễn . Với các ứng dụng C # luôn bắt đầu ngay lập tức và tôi chưa bao giờ phải nghĩ về heap, vì nó được phân bổ ra khỏi nhóm bộ nhớ hệ thống, không phải từ nhóm được phân bổ trước được gán cho máy ảo.


1
Đó là câu hỏi SO mà bạn liên kết, câu trả lời được chấp nhận là vô cùng sai lầm.
DeadMG


@Mark: Có lẽ. Sau đó, một lần nữa, nó có thể là tốt để thả nó hoàn toàn. Tôi đã có tiếng nói trong câu trả lời của riêng mình cho cùng một câu hỏi, vì vậy việc thêm nhiều hơn vào các bình luận dường như không thực sự bổ sung nhiều kiến ​​thức mới.
Jerry Coffin

8

Tôi có thể chỉ cho bạn một nguồn có thể giúp trả lời phần đầu tiên của câu hỏi cho bạn. Các ngôn ngữ lập trình bắn ra http://shootout.alioth.debian.org/u64q/which-programming-lacular-are-fastest.php là một nguồn khá tốt để xem các ngôn ngữ nhanh như thế nào so với nhau. Chúng thậm chí có thể được lọc trên các danh mục khác nhau để xem ngôn ngữ nào hoạt động tốt hơn các ngôn ngữ khác. Java nhanh hơn nhiều so với vài năm trước.



Vâng, tôi có lẽ nên liên kết thẳng đến trang đó xin lỗi.
bschaffer13

4

1) Nói đúng về UX tôi nhận được với Java, nó cảm thấy chậm. Tôi không thể nói cho bạn tại sao thực sự. Tôi vẫn chưa bắt gặp một ứng dụng máy tính để bàn dựa trên Java, nó không cảm thấy chậm và có một sự thay thế không phải Java nhanh hơn. Điều đó đang được nói, Java có thể rất nhanh về tốc độ tính toán thuần túy và internet có đầy đủ các tiêu chuẩn để chứng minh điều đó. Tuy nhiên, thời gian khởi động của các ứng dụng Java và khả năng đáp ứng của GUI của chúng vẫn chưa cải thiện IMHO. Có lẽ bạn có thể làm điều đó;)
Cuối cùng, tốc độ không phải là vấn đề quá lớn. Không chỉ phần cứng ngày càng nhanh hơn, mà hầu hết mọi người vẫn quan tâm rất ít đến nó miễn là phần mềm làm gì, nó nên làm gì và tỷ lệ thời gian tương tác so với thời gian chờ đợi là hợp lý.

2) Gần đây, sự khác biệt này đã trở nên rất mờ nhạt, rằng thực sự có rất ít giá trị đối với nó.

3 + 4) Thực tế đã có một số thay đổi đối với Java. Một số người tranh luận rằng, những thay đổi này đã làm hỏng triết lý hoàn toàn đơn giản của Java bằng cách củng cố các tính năng của người ngoài hành tinh. Thật sự rất khó để nói một cách khách quan, thiếu sót là gì và thế mạnh là gì. Đối với tôi, Java dài dòng một cách không cần thiết, hạn chế và kém về tính năng, trong khi những người khác coi những đặc điểm này là một sự rõ ràng dễ chịu, an toàn và rõ ràng.
Vì vậy, trong khi đó là những điều này, cá nhân khiến tôi không sử dụng Java, tôi không nghĩ chỉ cần thêm những thứ tôi bỏ lỡ trong Java là một ý tưởng hay. Có rất nhiều ngôn ngữ tôi thích chạy trên JVM và bẻ cong Java để gần gũi hơn với chúng sẽ đánh bại mục đích của Java.

Đó là một vấn đề ưu tiên

Vấn đề với Java là, nó được thiết kế để ngăn bạn tự bắn vào chân mình. Một nguyên nhân cao cả, nhưng với tất cả những hạn chế mà nó buộc vào bạn, không có khả năng, bạn vấp phải một trong những đôi chân an toàn của mình, không thể tự mình bị trói tay sau lưng vì an toàn và cuối cùng chết, bởi vì bạn phá vỡ hộp sọ của bạn. : D
Theo một cách nào đó, Java là một phản ứng với C ++, nó cung cấp cho bạn đủ sợi dây để không chỉ treo mình mà còn cả thế giới. Đó là tất cả những sợi dây, làm cho nó rất hấp dẫn đối với những chàng cao bồi. Tất cả sự tự do và tất cả sức mạnh đó.

Vì vậy, chỉ cần đặt, đây thực sự chỉ là một vấn đề ưu tiên.

Nhưng, một điểm là, với C ++ thay thế cho Java, bạn có thể tự do lựa chọn các hạn chế của riêng mình. Hoặc để thực sự phát điên với tất cả sự kiểm soát mà bạn có, có nguy cơ làm cho các đồng nghiệp của bạn hoàn toàn bối rối:

Tôi thấy 'cout' bị dịch chuyển "Xin chào thế giới" sang trái và dừng ngay tại đó.
- Steve Gonedes

Java đã chọn không cung cấp quá tải toán tử, vì lý do đó. Tất nhiên, điều này ngăn mọi người làm xáo trộn mã của họ bằng cách nhân con trỏ hàm với danh sách. Nhưng đồng thời, nó ngăn người khác thực hiện phép tính hình học / đại số với các toán tử thông thường. (v1 * v2 / scale) + (v3 * m)thực sự là rất rõ ràng hơn nhiều v1.multiply(v2).divide(scale).add(v3.multiply(m)). Tôi thấy lý do tại sao điều này có thể loại bỏ những người đối phó với đồ họa và tính toán 3d.

Java đã chọn áp đặt bộ sưu tập rác, trong khi trong C ++, bạn có thể chọn. Bạn thực sự có thể đào tất cả các cách xuống và đến gần với phần cứng. Bạn có thể đóng gói dữ liệu dày đặc vào các cấu trúc. Bạn có thể thực hiện phép thuật bóng tối, chẳng hạn như căn bậc hai nghịch đảo nhanh . Bạn có thể thực hiện một số siêu dữ liệu phức tạp và khó hiểu nhất trên trái đất bằng cách sử dụng các mẫu. Nhưng nó cũng có nghĩa là, bạn có thể bị lạc và mất hàng giờ để gỡ lỗi tất cả các mớ hỗn độn bạn đã tạo hoặc xem qua các lỗi biên dịch hoàn toàn không có ích.
Nhưng nếu bạn có kỷ luật chỉ sử dụng các phần của ngôn ngữ bạn thực sự thành thạo, bạn có thể viết mã C ++ an toàn như mã Java, nhưng bạn có tùy chọn đẩy dần về phía trước.

Vì vậy, trong khi về mặt kỹ thuật không có gì ngăn cản bạn viết phần mềm tiên tiến bằng Java, bạn sẽ thấy rằng nhiều nhà phát triển thực sự đam mê viết phần mềm tuyệt vời và vui vẻ và phát triển trong khi thực hiện vượt ra ngoài những gì Java cung cấp như một ngôn ngữ.

Nhưng thế giới không chỉ bao gồm những người được đặt ra để tạo ra điều lớn lao tiếp theo hoặc chỉ những người sẽ hạn chế việc sử dụng năng lượng được trao cho họ chỉ khi họ kiểm soát nó. IMHO Java là kết hợp hoàn hảo cho những người muốn tạo ra kết quả ổn định một cách thoải mái.


+1 Vì thực tế là trong C ++, không có gì ngăn cản bạn viết mã giống như Java và tương tự, không có gì ngăn cản bạn làm nhiều hơn thế. Đó là lập trình viên làm cho một ngôn ngữ không an toàn hoặc khó khăn.
Chris nói Phục hồi lại

0

Thu gom rác là điều lớn. Mỗi lần như vậy, GC sẽ khóa mọi thứ khác trong vài trăm mili giây (tùy thuộc vào kích thước của heap) và thực hiện một bộ sưu tập chính. Điều này tốt nếu bạn không có bất kỳ hạn chế về thời gian nào, nhưng nếu bị trễ có nghĩa là thất bại, đây là một điểm dừng hiển thị. Bạn có thể chi tiền cho Java thời gian thực và HĐH thời gian thực, nhưng bạn chỉ cần sử dụng GCC và Linux tiêu chuẩn và bạn sẽ không gặp phải những vấn đề này.

Nếu không có các tạm dừng ngẫu nhiên không thể đoán trước, Java có thể đủ nhanh cho hầu hết mọi thứ hiện nay. Và nếu bạn dành hàng tháng để điều chỉnh cài đặt GC của mình và như vậy, có lẽ, chỉ có thể, bạn có thể khiến nó hoạt động đủ lâu để khách hàng cắt cho bạn một tấm séc.


Hầu hết những người thu gom rác hiện đại không ngăn cản thế giới.

-1

3) Những thiếu sót đã được sửa chữa.

Một vài năm trước đã có rất nhiều sự tức giận tại Java. Hầu hết các lập trình viên Java là các lập trình viên web / máy chủ và họ đang phát điên với tính dài dòng của Java. Vì vậy, một số ngôn ngữ như Ruby trở nên phổ biến và Java bắt đầu suy yếu dần. Tuy nhiên, với các chú thích và khung mới như ngủ đông và Spring, mọi người đã ngừng phàn nàn và quay lại Java.

4) Những thiếu sót hiện tại

Phần cứng là tất cả đi đa lõi. Mặc dù Java có thể thực hiện đa luồng, nhưng nó dựa trên C là ngôn ngữ tuần tự và chức năng để làm cho nó đa luồng là không thanh lịch, phải nói là ít nhất. Nhân tiện, đó không chỉ là một bài phê bình về Java, mà là khá nhiều ngôn ngữ. Một số cách nghĩ hoàn toàn khác về mã là cần thiết. Có lẽ lập trình chức năng là con đường của tương lai.


1
Điên? Khó nghĩ như vậy. Và rõ ràng là bạn chưa có cái nhìn về các công cụ đồng thời trong Java 6.

-1

Tôi đã phản ứng với câu hỏi này bởi vì nó sẽ đưa ra những câu trả lời sai lệch và phần lớn không liên quan:

b. Có thể tạo một tiêu đề AAA hiện đại bằng Java không?

Mọi người đều có thể đồng ý rằng các tiêu đề AAA sẽ khó sản xuất bằng Java và không có ví dụ thực tế nào tôi biết. Tuy nhiên, với bản chất của AAA sẽ đảm nhận rất nhiều thứ (vì đây thực sự là một thuật ngữ khó hiểu đến từ tiếp thị), vì vậy tốt hơn là nên hỏi những điều sau:

Có thể tạo một tiêu đề hiện đại với thành công hợp lý bằng cách sử dụng Java?

Câu trả lời là " Có, bạn có thể. " Tuy nhiên, phần thành công thực tế của phương trình dựa nhiều vào sự kiên trì và may mắn của bạn (hoặc tuân thủ zeitgeist) nhưng điều đó nằm ngoài phạm vi của trang web này.


-6

Một vùng certian của tốc độ đi xuống trình biên dịch so với trình biên dịch. Không phải ngôn ngữ vs ngôn ngữ. Có thể có những lợi thế cho việc biên dịch JIT vì nó có thể tối ưu hóa cho thông số kỹ thuật của máy đang chạy. So sánh JIT được biên dịch C ++ và Java để so sánh trình biên dịch "táo với táo" hơn.

Nhưng có một số điều mà chính ngôn ngữ Java giới hạn hiệu năng của chính nó.

  1. phân bổ trên ngăn xếp. Java không thể làm điều này. Đối với các lớp kích thước cố định nhỏ trong một giải pháp không đệ quy, điều này thường là lý tưởng. Bạn cũng có thể tránh phân mảnh heap.

  2. chức năng không ảo. Java không thể làm điều này. Tất cả các cuộc gọi phương thức nhận được một cú đánh vĩnh viễn ngay cả khi chúng không được lên kế hoạch để ghi đè.

Có lẽ là một số thứ khác nhưng đó là tất cả những gì tôi có thể nghĩ ra khỏi đỉnh đầu của tôi.


2
Trình biên dịch JIT hiện đại có thể tối ưu hóa cả hai trường hợp này. Java (kể từ 6) có phân bổ ngăn xếp: en.wikipedia.org/wiki/Escape_analysis . Đối với các hàm không ảo, trình biên dịch JIT sẽ giải quyết các cuộc gọi phương thức ảo chỉ đi đến một đích (và đôi khi thậm chí có thể nội tuyến nó) thành các cuộc gọi không ảo.
Steven Schlansker

1
# 2 là không có thật: bất kỳ JIT nào đều có chức năng là ảo hoặc không ảo dựa trên việc chúng hiện đang bị ghi đè.
amara

-16

1) không liên quan, và lập luận để khởi động.
Không chỉ có thể tạo ra các phần mềm chính trong Java, các hệ thống như vậy được phân phối mỗi ngày và điều hành hầu hết các công ty lớn trên thế giới.
2) ditto.
Đọc đặc tả JVM và bạn biết. Java chưa bao giờ là một ngôn ngữ được giải thích.
3) ditto.
Đọc 15 năm ghi chú phát hành. Chúng tôi không thể tìm ra những gì bạn cho là "lỗ hổng lớn" sẽ được giải quyết.
4) ditto.
Lỗ hổng lớn phải giải quyết là JCP có xu hướng can thiệp với ngôn ngữ cốt lõi và các thư viện mà không có lý do rõ ràng nào khác ngoài việc lấy tên của somoene trên một JSR để họ có thể viết một cuốn sách với lời giới thiệu có thẩm quyền rằng "họ là lãnh đạo của JSR-666 ". Hy vọng việc tái cấu trúc JCP của Oracle sẽ giải quyết vấn đề đó.
Bạn dường như chỉ muốn khuấy động một cuộc chiến ngôn ngữ ở đây và nhận định kiến ​​của bạn chống lại Java được xác nhận bởi những người khác bởi vì bạn không thể tìm thấy bất kỳ lời biện minh thực sự nào cho nó.


à, tôi thấy mọi người đã bắt đầu các cuộc chiến bằng cách hạ bệ bất cứ ai không nói xấu Java. Làm tốt lắm mọi người!
jwenting

10
Tôi nghĩ rằng lý do cho các downvote là thực tế rằng câu trả lời của bạn không thực sự là một.
blubb

6
Câu trả lời này chỉ là trolling. OP đã có một câu hỏi hay, được suy nghĩ kỹ, không ranty. Sau đó, bạn đến với "nhận định kiến ​​của bạn chống lại Java được xác nhận bởi những người khác bởi vì bạn không thể tự mình tìm thấy bất kỳ lời biện minh thực sự nào cho nó". Phải, -1. Ồ và không, tôi không ghét Java, ngôn ngữ yêu thích hiện tại của tôi cho rất nhiều thứ
TheLQ

4
OP đã viết một câu hỏi khá hay và đặt câu trả lời đúng. Thực sự không cần phải buộc tội anh ta khuấy động bất cứ điều gì.
Adam Lear

ah, tôi thấy mọi người đã bắt đầu các cuộc chiến bằng cách đưa ra những câu hỏi (và câu trả lời) nghiêm túc cho những người nổi giận và cảm thấy bản thân bị tấn công. Quá tệ, tôi không thể downvote được.
Chris nói Phục hồi lại
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.