Mẫu hình | Mẫu hình lập trình |
---|---|
Thiết kế bởi | James Gosling Sun Microsystems |
Nhà phát triển | Oracle Corporation |
Xuất hiện lần đầu | 23 tháng 5 năm 1995; 29 năm trước |
Phiên bản ổn định | Java Standard Edition 21
/ 19 tháng 9 năm 2023; 9 tháng trước |
Kiểm tra kiểu | Tĩnh, mạnh, an toàn, kiểu danh định, hiển nhiên |
Ngôn ngữ thực thi | C và C++ |
Hệ điều hành | Cross-platform (multi-platform) |
Giấy phép | GNU General Public License, Java Community Process |
Phần mở rộng tên tập tin | .java,.class,.jar |
Trang mạng | For Java Developers |
Các bản triển khai lớn | |
OpenJDK và nhiều máy ảo Java | |
Phương ngữ | |
Generic Java, Pizza | |
Ảnh hưởng từ | |
CLU, Simula67, Lisp, Smalltalk, Ada 83, C++, C#, Eiffel, Generic Java, Mesa, Modula-3, Oberon, Objective-C, UCSD Pascal, Object Pascal | |
Ảnh hưởng tới | |
Ada 2005, BeanShell, C#, Chapel, Clojure, D, ECMAScript, Fantom, Gambas, Groovy, Hack, Haxe, J#, Kotlin, PHP, Python, Scala, Seed7, Vala, JavaScript, JS++ | |
|
Java (phiên âm Tiếng Việt: 'Gia-va') là một ngôn ngữ lập trình hướng đối tượng được thiết kế để giảm thiểu sự phụ thuộc thực thi. Đây là một ngôn ngữ lập trình đa mục đích cho phép các nhà phát triển viết mã một lần và chạy ở mọi nền tảng (WORA), nghĩa là mã Java biên dịch có thể chạy trên các JVM mà không cần phải biên dịch lại. Java có cú pháp tương tự như C và C++, nhưng có ít các tính năng cấp thấp hơn. Java runtime cung cấp các tính năng động như phản chiếu và sửa đổi mã trong thời gian chạy, điều mà các ngôn ngữ biên dịch truyền thống thường không có.
Java được James Gosling phát triển tại Sun Microsystems (nay là Oracle) và ra mắt lần đầu vào năm 1995 như một phần của nền tảng Java của Sun. Trình biên dịch Java, máy ảo và thư viện thực thi được Sun ban đầu phát hành dưới giấy phép độc quyền, nhưng từ năm 2007, Sun đã cấp phép hầu hết công nghệ Java của mình theo Giấy phép Công cộng GNU, tuân theo các thông số kỹ thuật của Quy trình Cộng đồng Java.
Đến tháng 10 năm 2023, phiên bản mới nhất của Java là Java 21, cũng là một phiên bản hỗ trợ dài hạn (LTS), được phát hành vào ngày 19 tháng 9 năm 2023. Oracle cung cấp các bản cập nhật miễn phí cho công chúng, với Java 8 LTS tiếp tục được hỗ trợ cho các mục đích thương mại và cá nhân.
Oracle và các công ty khác khuyên người dùng gỡ bỏ các phiên bản Java lỗi thời do rủi ro bảo mật nghiêm trọng. Các phiên bản Java 9, 10, 12, 13 và 14 không được hỗ trợ nữa, và người dùng được khuyến khích chuyển sang phiên bản mới nhất (hiện tại là Java 15) hoặc các bản phát hành LTS.
Lịch sử
James Gosling, Mike Sheridan và Patrick Naughton bắt đầu dự án ngôn ngữ Java vào tháng 6 năm 1991. Ban đầu được thiết kế cho truyền hình tương tác, Java sau đó trở thành một ngôn ngữ tiên tiến quá sớm đối với ngành truyền hình số. Ban đầu, ngôn ngữ được gọi là Oak, theo tên của cây sồi ngoài văn phòng của Gosling. Sau đó, dự án có tên là Green và cuối cùng là Java, được đặt theo tên loại cà phê từ Indonesia. Gosling đã thiết kế Java với cú pháp giống C/C++, quen thuộc với các lập trình viên hệ thống và ứng dụng.
Sun Microsystems phát hành bản triển khai công khai đầu tiên là Java 1.0 vào năm 1996. Nó hứa hẹn khả năng Viết một lần, Chạy mọi nơi (WORA), cung cấp thời gian chạy miễn phí trên các nền tảng phổ biến. Được cấu hình có tính bảo mật và an toàn, nó cho phép các hạn chế truy cập vào mạng và tệp. Các trình duyệt web lớn đã nhanh chóng tích hợp khả năng chạy ứng dụng Java trong các trang web, từ đó Java trở nên phổ biến rộng rãi. Trình biên dịch Java 1.0 được viết lại bằng Java bởi Arthur van Hoff để tuân thủ nghiêm ngặt đặc tả của ngôn ngữ Java 1.0. Với sự ra đời của Java 2 (ban đầu có tên là J2SE 1.2 vào tháng 12 năm 1998 – 1999), các phiên bản mới có nhiều cấu hình để hỗ trợ nhiều nền tảng khác nhau. J2EE bao gồm các công nghệ và API cho các ứng dụng doanh nghiệp thường chạy trên môi trường máy chủ, trong khi các API đặc biệt của J2ME được tối ưu hóa cho các ứng dụng di động. Phiên bản dành cho máy tính để bàn đã được đổi tên thành J2SE. Năm 2006, vì mục đích tiếp thị, Sun đã đổi tên các phiên bản J2 mới lần lượt là Java EE, Java ME và Java SE.
Năm 1997, Sun Microsystems đã tiếp cận ISO/IEC JTC 1 và sau đó Ecma International để chuẩn hóa Java, nhưng sau đó họ rút lui khỏi quy trình này. Java vẫn được coi là một tiêu chuẩn thực tế, được kiểm soát qua Quy trình Cộng đồng Java. Sun đã cung cấp hầu hết các triển khai Java của họ miễn phí, mặc dù sản phẩm vẫn có trạng thái phần mềm độc quyền. Sun đã thu được doanh thu từ Java bằng cách bán giấy phép cho các sản phẩm chuyên biệt như Hệ thống Doanh nghiệp Java.
Vào ngày 13 tháng 11 năm 2006, Sun phát hành JVM của họ dưới dạng phần mềm mã nguồn mở và miễn phí theo Giấy phép Công cộng GNU (GPL). Vào ngày 8 tháng 5 năm 2007, Sun hoàn thành quá trình cung cấp mã nguồn của JVM theo điều khoản phần mềm miễn phí / mã nguồn mở, ngoại trừ một số mã mà Sun giữ bản quyền.
Phó chủ tịch Rich Green của Sun mô tả vai trò của Sun đối với Java như một nhà truyền giáo. Sau khi Oracle mua lại Sun Microsystems vào năm 2009–10, Oracle mô tả chính mình là người quản lý công nghệ Java và cam kết thúc đẩy cộng đồng tham gia và minh bạch. Tuy nhiên, điều này không ngăn cản Oracle từ việc kiện Google ngay sau đó về việc sử dụng Java trong Android SDK.
Ngày 2 tháng 4 năm 2010, James Gosling từ chức tại Oracle.
Vào tháng 1 năm 2016, Oracle thông báo rằng môi trường thời gian chạy Java dựa trên JDK 9 sẽ ngừng hỗ trợ plugin trình duyệt.
Java là một nền tảng phần mềm linh hoạt, hoạt động trên mọi thiết bị từ máy tính cá nhân đến các trung tâm dữ liệu, từ các bảng điều khiển trò chơi đến siêu máy tính khoa học.
Nguyên lý
Trong quá trình phát triển ngôn ngữ Java, có 5 mục tiêu chính cần đạt được:
- Nó phải đơn giản, hướng đối tượng và dễ sử dụng.
- Nó phải mạnh mẽ và an toàn.
- Nó không phụ thuộc vào cấu trúc và có khả năng di động.
- Nó phải có hiệu suất thực thi cao.
- Nó phải hỗ trợ thông dịch, đa luồng và động.
Phiên bản
Các phiên bản của Java đã được phát hành:
Version | Date |
---|---|
JDK Beta | 1995 |
JDK1.0 | ngày 23 tháng 1 năm 1996 |
JDK 1.1 | ngày 19 tháng 2 năm 1997 |
J2SE 1.2 | ngày 8 tháng 12 năm 1998 |
J2SE 1.3 | ngày 8 tháng 5 năm 2000 |
J2SE 1.4 | ngày 6 tháng 2 năm 2002 |
J2SE 5.0 | ngày 30 tháng 9 năm 2004 |
Java SE 6 | ngày 11 tháng 12 năm 2006 |
Java SE 7 | ngày 28 tháng 7 năm 2011 |
Java SE 8 (LTS) | ngày 18 tháng 3 năm 2014 |
Java SE 9 | ngày 21 tháng 9 năm 2017 |
Java SE 10 | ngày 20 tháng 3 năm 2018 |
Java SE 11 (LTS) | ngày 25 tháng 9 năm 2018 |
Java SE 12 | ngày 19 tháng 3 năm 2019 |
Java SE 13 | ngày 17 tháng 9 năm 2019 |
Java SE 14 | ngày 17 tháng 3 năm 2020 |
Java SE 15 | ngày 15 tháng 9 năm 2020 |
Java SE 16 | ngày 16 tháng 3 năm 2021 |
Java SE 17 (LTS) | ngày 14 tháng 9 năm 2021 |
Java SE 18 | ngày 22 tháng 3 năm 2022 |
Java SE 19 | ngày 20 tháng 9 năm 2022 |
Java SE 20 | ngày 21 tháng 3 năm 2023 |
Java SE 21 (LTS) | ngày 19 tháng 9 năm 2023 |
Phiên bản Java
Sun đã định nghĩa và hỗ trợ bốn phiên bản Java nhằm vào các môi trường ứng dụng khác nhau và phân đoạn nhiều API của nó để chúng thuộc về một trong các nền tảng. Các nền tảng này bao gồm:
- Java Card cho thẻ thông minh.
- Java ME, hay còn gọi là Java Micro Edition - nhắm mục tiêu vào môi trường có tài nguyên hạn chế.
- Java SE, hay còn gọi là Java Standard Edition - nhắm mục tiêu vào môi trường máy trạm.
- Java EE, hay còn gọi là Java Enterprise Edition - nhắm mục tiêu vào các môi trường doanh nghiệp hoặc Internet phân tán lớn.
Các lớp trong Java API được tổ chức thành các nhóm riêng biệt gọi là gói. Mỗi gói chứa một tập hợp các giao diện, lớp, gói con và ngoại lệ tương ứng.
Sun cũng cung cấp một phiên bản được gọi là Personal Java, nhưng sau này đã được thay thế bằng các cấu hình Java ME dựa trên tiêu chuẩn mới hơn.
Hệ thống thực thi Java
Máy ảo Java (JVM) và bytecode
Một trong các mục tiêu thiết kế của Java là sự di động, tức là các chương trình được viết cho nền tảng Java phải có thể chạy một cách nhất quán trên mọi sự kết hợp phần cứng và hệ điều hành, với hỗ trợ thích hợp từ một thời gian chạy. Điều này được đạt được bằng cách biên dịch mã nguồn Java thành một ngôn ngữ trung gian được gọi là Java bytecode, thay vì biên dịch trực tiếp thành mã máy dựa trên kiến trúc cụ thể. Các lệnh bytecode trong Java có cấu trúc tương tự như mã máy, nhưng chúng được thiết kế để thực thi trên một máy ảo (VM) được viết riêng cho từng loại phần cứng máy chủ. Người dùng cuối thường sử dụng Môi trường Thực thi Java (JRE) được cài đặt trên máy tính của họ để chạy các ứng dụng Java độc lập hoặc trong trình duyệt web.
Các thư viện chuẩn cung cấp một cách thống nhất để truy cập các tính năng máy chủ như đồ họa, đa luồng và mạng.
Việc sử dụng bytecode phổ biến làm cho việc chuyển đổi nền tảng trở nên đơn giản hơn. Tuy nhiên, chi phí của việc dịch bytecode thành lệnh máy làm cho các chương trình dịch thuật thường chạy chậm hơn so với các chương trình thực thi gốc. Trình biên dịch Just-in-time (JIT) biên dịch bytecode thành mã máy trong quá trình chạy đã được giới thiệu từ rất sớm. Java là một ngôn ngữ độc lập nền tảng và được điều chỉnh để phù hợp với nền tảng cụ thể mà máy ảo Java (JVM) chạy trên đó, máy ảo này sẽ dịch bytecode Java thành mã máy của nền tảng.
Hiệu năng
Các chương trình viết bằng Java thường được biết đến là chậm hơn và yêu cầu nhiều bộ nhớ hơn so với các chương trình viết bằng C++. Tuy nhiên, tốc độ thực thi của các chương trình Java đã được cải thiện đáng kể với sự xuất hiện của tính năng biên dịch Just-in-time vào năm 1997/1998 cho Java 1.1, cùng với việc bổ sung các tính năng ngôn ngữ để hỗ trợ phân tích mã hiệu quả hơn (ví dụ như các lớp nội, lớp StringBuilder, xác thực tùy chọn, v.v.) và tối ưu hóa trên máy ảo Java, như HotSpot đã trở thành mặc định cho JVM của Sun từ năm 2000. Với Java 1.5, hiệu năng đã được cải thiện với việc bổ sung gói java.util.concurrent, bao gồm các triển khai miễn phí của ConcurrentMaps và các bộ sưu tập đa luồng khác và hiệu năng tiếp tục được cải thiện với Java 1.6.
Không có JVM
Một số nền tảng cung cấp hỗ trợ phần cứng trực tiếp cho Java; có những bộ điều khiển vi mô có thể thực thi bytecode Java trên phần cứng thay vì máy ảo Java phần mềm, và một số bộ xử lý dựa trên ARM có thể có hỗ trợ phần cứng để thực thi bytecode Java thông qua tùy chọn Jazelle, mặc dù hỗ trợ này đã bị loại bỏ trong hầu hết các triển khai hiện tại của ARM.
Quản lý bộ nhớ tự động
Java sử dụng thuật toán thu gom rác tự động (AGC) để quản lý bộ nhớ trong vòng đời của các đối tượng. Người lập trình chỉ định thời điểm tạo đối tượng và Java chịu trách nhiệm phục hồi bộ nhớ khi các đối tượng không còn được sử dụng. Khi không có tham chiếu nào đến một đối tượng, bộ nhớ không thể truy cập sẽ được tự động giải phóng bởi thuật toán thu gom rác. Một dạng rò rỉ bộ nhớ vẫn có thể xảy ra nếu mã lập trình giữ một tham chiếu đến đối tượng không cần thiết, thường xảy ra khi các đối tượng không cần thiết vẫn được lưu giữ trong các cấu trúc dữ liệu. Nếu các phương thức của một đối tượng không tồn tại, một ngoại lệ con trỏ null sẽ được ném ra.
Một trong những ý tưởng sau lớp mô hình quản lý bộ nhớ tự động của Java là người lập trình không cần phải chịu gánh nặng của việc quản lý bộ nhớ thủ công. Trong một số ngôn ngữ, bộ nhớ để tạo đối tượng được cấp phát ngầm trên ngăn xếp hoặc cấp phát rõ ràng từ heap. Trong trường hợp thứ hai, việc quản lý bộ nhớ là trách nhiệm của người lập trình. Nếu chương trình không phân bổ đối tượng, sẽ xảy ra rò rỉ bộ nhớ. Nếu chương trình cố gắng truy cập hoặc phân bổ bộ nhớ đã được phân bổ, kết quả sẽ là không xác định và dự đoán khó. Điều này có thể được khắc phục một phần bằng cách sử dụng con trỏ thông minh, nhưng điều này tăng chi phí và phức tạp. Lưu ý rằng thuật toán thu gom rác không ngăn chặn rò rỉ bộ nhớ logic, nơi bộ nhớ vẫn được tham chiếu nhưng không bao giờ được sử dụng.
Thuật toán thu gom rác có thể xảy ra bất cứ lúc nào. Lý tưởng nhất là nó xảy ra khi chương trình không hoạt động. Nó được đảm bảo sẽ kích hoạt khi không còn đủ bộ nhớ trống trên heap để phân bổ một đối tượng mới, điều này có thể dẫn đến tạm ngừng chương trình trong một khoảng thời gian ngắn. Trong Java, không thể quản lý bộ nhớ rõ ràng.
Java không hỗ trợ con trỏ số học như trong C/C++, trong đó địa chỉ của đối tượng có thể được thao tác số học (ví dụ như thêm hoặc trừ một số nguyên). Điều này cho phép thuật toán thu gom rác di chuyển các đối tượng được tham chiếu mà đảm bảo tính an toàn và bảo mật kiểu dữ liệu.
Tương tự như trong C++ và một số ngôn ngữ hướng đối tượng khác, các biến của kiểu dữ liệu nguyên thủy trong Java được lưu trữ trực tiếp trong các trường của đối tượng hoặc trên ngăn xếp của phương thức, chứ không phải trên heap. Điều này thường áp dụng đối với dữ liệu không nguyên thủy (nhưng hãy xem xét các trường hợp ngoại lệ). Đây là một quyết định được các nhà thiết kế Java đưa ra với mục đích tối ưu hiệu suất.
Java đi kèm với nhiều loại trình thu gom rác. Mặc định, HotSpot sử dụng thu gom rác song song. Tuy nhiên, cũng có nhiều trình thu gom rác khác có thể được sử dụng để quản lý bộ nhớ rác. Với 90% ứng dụng Java, thu gom rác đồng thời Mark-Sweep (CMS) là đủ. Oracle đang nhắm đến việc thay thế CMS bằng Garbage-First Collector (G1).
Giải quyết vấn đề quản lý bộ nhớ không giúp các lập trình viên giảm thiểu gánh nặng xử lý các tài nguyên khác như kết nối mạng, cơ sở dữ liệu, xử lý tệp tin, v.v., đặc biệt khi xảy ra lỗi.
Các lớp đặc biệt
Applet
Java applet là các ứng dụng được nhúng vào các ứng dụng khác, thường là trên các trang web và hiển thị trong trình duyệt web. API của Java applet không còn được sử dụng từ ngày 9 tháng 1 năm 2017.
Servlet
Công nghệ Java servlet cung cấp cho các nhà phát triển Web một cơ chế mở rộng dễ dàng và nhất quán để mở rộng chức năng của máy chủ Web và truy cập các hệ thống kinh doanh hiện có. Servlet là thành phần Java EE phía máy chủ tạo ra phản hồi (thường là các trang HTML) cho các yêu cầu (thường là HTTP) từ máy khách.
Một phần API của Java servlet đã được thay thế bởi hai công nghệ Java dành cho dịch vụ web:
- Java API cho RESTful Web Services (JAX-RS 2.0) hỗ trợ cho AJAX, JSON và dịch vụ REST, và
- Java API cho XML Web Services (JAX-WS) hỗ trợ cho dịch vụ web SOAP.
Sự phổ biến
Cho đến ngày 21 tháng 1 năm 2021, Java là ngôn ngữ lập trình phổ biến thứ hai trên thế giới với tỷ lệ 11,96%, chỉ đứng sau ngôn ngữ C. Trải qua 20 năm, Java và C vẫn luôn dẫn đầu trong bảng xếp hạng các ngôn ngữ lập trình phổ biến nhất, mặc dù độ phổ biến đã giảm nhẹ trong những năm gần đây. Java vẫn duy trì tỷ lệ trên 10%, chứng tỏ sự nổi bật của nó trong lĩnh vực lập trình.