Saturday, October 24, 2009

Vài nét về ngôn ngữ Java

VÀI NÉT VỀ NGÔN NGỮ JAVA

Java là một ngôn ngữ lập trình do công ty Sun Microsystems phát triển vào đầu thập kỷ 1990. Xuất phát điểm của ngôn ngữ này là một dự án nghiên cứu của công ty trong đó lúc đầu các nhà nghiên cứu dùng C++. Ngay sau đó nhóm nghiên cứu đã cho rằng họ cần một thứ gì đó tốt hơn thế. Các nhà nghiên cứu này đều là các lập trình viên xuất sắc, do vậy họ đã bắt tay ngay vào việc xây dựng một ngôn ngữ lập trình mới bằng cách tận dụng các ý tưởng hay của các ngôn ngữ lập trình khác. Người thiết kế Java là ông James Gosling còn nhà lập trình triển khai phiên bản chương trình dịch Java công cộng đầu tiên là ông Arthur van Hoff. Thoạt đầu người ta đặt tên cho ngôn ngữ này là "Oak", thực ra chỉ là một cái tên không có ý nghĩa gì đặc biệt. Tên gọi "Java" là do nhà tiếp thị Kim Polese đặt cho ngôn ngữ này hàm ý những đặc điểm phong phú và thú vị của nó.

Vì Java xuất phát từ một dự án nghiên cứu chứ không phải là một sản phẩm nhằm mục đích sinh lời, công ty Sun đã đồng ý đưa Java Development Kit (bộ công cụ phát triển Java, bao gồm chương trình dịch và hệ thống đáp ứng chạy chương trình) lên Internet miễn phí vào khoảng giữa năm 1995. Trong vòng 6 tháng kể từ khi công bố miễn phí, Java đã được hơn một trăm ngàn người lập trình sử dụng. Hai năm sau, đã có tới hơn bốn trăm ngàn nhà phát triển phần mềm Java. Vì Java chạy khắp mọi nơi, tổng thị phần tiềm tàng cho toàn bộ các nhà lập trình này là trên 250 triệu hệ thống máy tính trên thế giới. Có thể nói rằng không có một ngôn ngữ nào trong quá khứ gặt hái được nhiều thành tích trong một thời gian ngắn như vậy. Tuy nhiên, do tốc độ chấp nhận Java quá nhanh, đôi khi bạn cũng có thể thấy những ý kiến cho rằng có sự "khuyếch trương quá đáng" về Java. Cũng dễ hiểu là đôi khi một phát triển mới thường gây sự chú ý vì nó thực sự tốt hơn những cái khác trong quá khứ.

Với Java, bạn sẽ có dịp tiếp cận với một trong những sự phát triển kỳ thú nhất của ngành công nghiệp phần mềm.

Hệ thống Java bao gồm một số cấu phần như sau:

- Ngôn ngữ lập trình Java
- Java Virtual Machine (Máy o Java, bộ thông dịch)
- Các thư viện phần mềm đi kèm hệ thống
- chương trình duyệt web HotJava hoặc chương trình duyệt web khác thích ứng với Java

Bạn đọc cũng nên lưu ý rằng có một số phần mềm bao hàm tên Java nhưng chỉ liên quan ngoài lề với Java. Chẳng hạn như JavaScript. Ðây là ngôn ngữ chỉ lệnh (script language) do Netscape Communications Corporation xây dựng. JavaScript được dùng trong chương trình duyệt Netscape để nhắc người sử dụng nhập, đọc thông tin, mở và đóng các cửa sổ phụ trợ v.v. JavaScript hỗ trợ khả năng lập trình cơ bản của chương trình duyệt nhưng không phải là một ngôn ngữ ứng dụng vạn năng như Java. Với việc xây dựng hỗ trợ Java trong Netscape Navigator 2.0, Netscape đã giúp cho việc phổ biến rộng rãi Java. Ðổi lại, Netscape được Sun cho phép dùng tên Java cho ngôn ngữ chỉ lệnh của họ. JavaScript chẳng liên quan gì tới Java, vì vậy để trở thành người lập trình Java bạn không cần phải học JavaScript. Dĩ nhiên nếu bạn đã biết JavaScript rồi thì cũng không sao.

Ngôn ngữ Java

Thực ra Java không đưa ra nhiều ý tưởng hoàn toàn mới mà sự đổi mới ở đây là việc gom lại các ý tưởng hay nhất của các hệ thống đi trước. Java là một ngôn ngữ lập trình hướng đối tượng trong cùng một họ như C++, Pascal hay Algol-60. Các chương trình Java có các mô tả dữ liệu và các câu lệnh nhóm lại trong các hàm (do Java là một ngôn ngữ lập trình hướng đối tượng, các hàm của nó thường được gọi là các "phương pháp" (method). Các phương pháp có thể gọi tới các phương pháp khác. Sự thực hiện chương trình sẽ được bắt đầu với một phương pháp có tên đặc biệt là main().

Java nhanh chóng được nhiều nhà lập trình công nhận. Các câu lệnh và các biểu diễn tương tự như trong nhiều ngôn ngữ và trong nhiều trường hợp là đồng nhất như trong C hoặc C++. Mặc dù Java đã bổ sung một số điểm mới, nét phân biệt nhất của Java lại là những đặc điểm mà nó bỏ qua. Chẳng hạn, so sánh với C, Java không có

- Số học địa chỉ bộ nhớ (con trỏ)
- Bộ tiền xử lý
- Câu lệnh goto
- Chuyển đổi kiểu tự động
- Các biến và hàm tổng thể
- Các định danh xác định kiểu.

Còn so với C++ thì Java không có

- Các mẫu (template - tuy nhiên người ta đang tính đến việc bổ sung đặc điểm này cho Java)
- Quá tải toán tử (operator overloading)
- Ða thừa kế
- Ða ABI (Application Binary Interface, giao diện nhị phân ứng dụng)

Nếu bạn không phải là người lập trình C++ và bạn không biết một số những khái niệm trên thì cũng không hề gì. Ngay cả một người lập trình C++ cũng không nhất thiết đã thành thạo tất cả những khía cạnh này. Với Java bạn không cần phải biết tới chúng.

Tới đây, có lẽ bạn cũng muốn biết liệu Java có thay thế C++ hay không. Trên thực tế có thể nói rằng Java đang "cạnh tranh" với C++ trên phương diện ngôn ngữ đầu tiên được xem xét đến để phát triển các ứng dụng mới. Tuy nhiên, các ngôn ngữ lập trình mức cao không bao giờ thực sự mất đi cả. C++ sẽ vẫn còn trong một thời gian nữa đối với các ứng dụng riêng. Có 3 lý do về việc người ta sẽ tiếp tục lập trình với C++ là:

- Tính tương thích với mã hiện tại
- Không cần đào tạo lại cán bộ liên quan
- Có sẵn nhiều công cụ tốt hơn (nhanh hơn)

Trong các lý do nêu trên, lý do đầu tiên sát với thực tế về việc bảo trì mã chương trình bằng C++, nhưng có lẽ cũng chỉ xác đáng cho một thời gian ngắn nữa. C++ đã đạt tới đỉnh điểm và nay nó sẽ duy trì ở mức đó hoặc đi xuống. Tổ hợp C và Java sẽ không để cho C++ có địa vị dài hạn nữa.

Máy ảo Java (Java Virtual Machine)

Mã nguồn Java được biên dịch để sinh ra mã đối tượng gọi là bytecode (mã byte). Nếu chỉ có thế thôi thì cũng chẳng có gì khác với các ngôn ngữ khác. Ðiều khác nhau căn bản ở đây là bytecode không phải là mã nhị phân của bất kỳ máy tính đang tồn tại thực tế nào mà đó là một loại mã máy kiến tạo - trung gian có thể dễ dàng dịch sang để chạy trên bất kỳ máy tính cụ thể nào. Bạn sẽ thực hiện một chương trình Java bằng cách chạy một chương trình khác gọi là Java Virtual Machine hay là JVM. Thông thường trong hầu hết các môi trường hiện tại JVM được gọi thực hiện bằng một chương trình có tên là java. JVM đọc chương trình bằng bytecode và thông dịch hoặc biên dịch nó ra theo hệ lệnh thực tế.

Ðây là một đặc điểm có ý nghĩa rất lớn. Chạy bytecode trên một JVM là lý do vì sao các phần mềm Java là "viết một lần, chạy khắp nơi". Các chương trình chạy được Java (Java executable) cung cấp một bộ mã nhị phân chạy trên mọi bộ xử lý. Nói cách khác, một ứng dụng bằng Java của bạn chẳng hạn là chương trình xyz nào đó bằng Java sẽ chạy trên mọi hệ thống hỗ trợ Java mà không cần phải có riêng "xyz cho DOS", "xyz cho Windows 3.1", "xyz cho Windows 95"...

Tính dễ chuyển mang và tính năng của phần mềm

Tính dễ chuyển mang của phần mềm là khuynh hướng lý tưởng của ngành công nghệ phần mềm. Nó đã được nghiên cứu, tìm kiếm từ lâu nay nhưng chưa bao giờ thực sự đạt được. Java làm cho ngành công nghệ này tiến lại gần tính dễ chuyển mang của phần mềm nhiều hơn tất cả các hệ thống trước đó. Tại các cửa hàng bán phần mềm hiện nay, có lẽ bạn sẽ thấy chủ yếu là các phần mềm dùng cho Windows (một số chỉ cho Windows 3.1, một số cho cả Windows 95 và Windows 3.1), một số ít cho Mac và một số rất ít (có thể là không có) cho Unix. Khi Java trở thành ngôn ngữ phổ biến thì bạn có thể chọn từ tất cả các phần mềm có trong cửa hàng và phần mềm bạn chọn mua sẽ chạy trên tất cả các hệ thống máy tính mà bạn có. Lúc đó mọi người có được sự lựa chọn rộng rãi hơn và giá phần mềm cũng sẽ hạ do các nhà cung ứng phần mềm có thể phân bổ chi phí phát triển trên một thị trường rộng lớn 250 triệu máy tính chứ không phải chỉ cho 91 triệu hệ thống Windows 3.1 hoặc cho 20 triệu hệ thống Macintosh hoặc cho 8 triệu hệ thống Unix.

Máy ảo Java (chẳng qua chỉ là một cái tên mỹ miều cho bộ thông dịch) phải được triển khai cho mỗi hệ thống máy tính và sau đó mọi bytecode sẽ chạy được trên hệ thống đó. Ðiểm quan trọng ở đây là bytecode có khả năng chuyển mang tổng hợp. Ðương nhiên vấn đề đặt ra là làm sao để có các JVM thích hợp cho từng môi trường. Có lẽ vấn đề này cũng tương tự như quá trình để cho các máy tính cá nhân (PC) là tương thích DOS trước đây.

Một điều lý thú là bytecode không phải chỉ dành riêng cho Java. Nếu bạn sửa đổi một chương trình dịch đối với một số ngôn ngữ khác như Ada hay Visual Basic để nó sinh ra được bytecode thì bạn cũng có thể chạy bytecode đó "ngon lành" trên JVM trên bất kỳ máy tính nào. Ðây là một hướng mà các nhà cung ứng phần mềm đang quan tâm. Khả năng chạy được mã của bạn trên mọi hệ thống máy tính trên hành tinh là lý do mạnh mẽ để cải cách. ý tưởng về JVM hỗ trợ đắc lực cho hướng cải cách này.

Java có những đảm bảo tính dễ chuyển mang, bao gồm việc cung cấp cùng một giao diện người lập trình ứng dụng (API, Application Programmer Interface) trên mọi loại nền; cùng một giao diện nhị phân ứng dụng (ABI, Application Binary Interface), cụ thể là máy ảo Java, trên mọi loại nền. Ngoài ra ngôn ngữ Java còn có qui định bắt buộc một số điểm lâu nay vẫn để tuỳ thuộc vào sự cụ thể hoá của người viết chương trình dịch. Bằng cách yêu cầu rằng các toán hạng được đánh giá theo thứ tự nghiêm ngặt từ trái qua phải và qui định kích thước của tất cả các kiểu cơ bản (kiểu nguyên là 32 bit, kiểu chính xác gấp đôi là 64 bit v.v) Java đáp ứng không những tính dễ chuyển mang mà còn cả cách xử lý đồng nhất của chương trình trên các hệ thống khác nhau. Java dùng Unicode là tập ký tự chuẩn có thể biểu diễn các ký hiệu, ký tự trong hầu hết các bảng chữ cái trên thế giới, kể cả các ký tự tiếng Việt cũng như các loại chữ tượng hình của châu A'. Trong thời gian sắp tới, nếu chuẩn tiếng Việt cho công nghệ thông tin của Việt nam dựa trên Unicode thì chắc chắn Java dễ dàng hỗ trợ cho chuẩn đó.

Một điều có thể dễ nhận thấy rằng việc bảo đảm tính dễ chuyển mang có thể ảnh hưởng tới tính năng thực hiện của phần mềm. Tuy nhiên, ta có một sự cân nhắc đáng giá. Bạn hãy hình dung xem, nếu tất cả các hệ thống được xây dựng trong nhiều năm qua không cố gắng tiết kiệm chi phí của hai byte "thừa" và lưu giữ các con số năm bằng 4 byte chứ không phải là 2 byte thì chúng ta đã không gặp phải sự cố đau đầu "vấn đề năm 2000" . Với Java, có thể bạn thấy một số điểm là hơi "cồng kềnh" hoặc "dư thừa". Tuy nhiên, những qui định chặt chẽ và chuẩn hoá của Java chính là để đảm bảo tính dễ chuyển mang và tính năng của nó trong một tương lai dài lâu.

Java với việc quản lý bộ nhớ

Trong lập trình, một vấn đề rất nặng nề được đặt ra là việc quản lý bộ nhớ động, trong đó có việc "dọn dẹp bộ nhớ" - tức là việc giải phóng những phần bộ nhớ mà chương trình đã dùng xong để dành cho những mục đích khác. Khi một chương trình chạy, nó sẽ phân bổ bộ nhớ để lưu giữ các đối tượng mới. Khi sự tồn tại của các đối tượng này đã kết thúc thì không gian bộ nhớ dành cho chúng cần được giải phóng và dùng lại cho các đối tượng khác. Nếu bộ nhớ không được giải phóng thì quá trình (chương trình) sẽ ngày càng lớn lên và sẽ có thể chiếm hết tất cả không gian nhớ, gây tràn. Một số ngôn ngữ như COBOL-74 không trang bị khả năng quản lý bộ nhớ động (do vậy một số chương trình hết sức khó viết hoặc không thể viết được). Một số ngôn ngữ khác như Pascal, C, C++ lại trút gánh nặng quản lý bộ nhớ lên vai người lập trình. Thậm chí người lập trình còn phải quan tâm xem phần nào của bộ nhớ đang được sử dụng và phải giải phóng phần nào của bộ nhớ khi cần thiết. Những chuyện này dẫn đến nhiều loại lỗi khác nhau của các chương trình, phổ biến là lỗi không giải phóng được bộ nhớ gây ra các "lỗ hổng" không bao giờ được khai báo lại trong bộ nhớ. Còn tệ hơn là các lỗi gây ra do việc cố giải phóng những phần bộ nhớ còn đang sử dụng dẫn đến hỏng hoặc mất dữ liệu.

Các chương trình Java được quản lý về bộ nhớ ở mức hệ thống và người lập trình không bao giờ phải lo lắng về chuyện đó. Thư viện thời gian chạy của Java sẽ giám sát các cấu trúc dữ liệu. Khi không còn một tham chiếu nào tới một cấu trúc dữ liệu thì nó không thể là đang được sử dụng vì chương trình không có cách gì để đọc hoặc ghi nó. Lúc đó nó sẽ là đối tượng của việc dọn dẹp bộ nhớ.

Java hướng tới việc dọn dẹp bộ nhớ tự động. Việc dọn dẹp bộ nhớ tự động ảnh hưởng tới tính năng vì nó liên quan đến các quá trình khác chạy trong nền sau để giám sát việc sử dụng bộ nhớ. Tuy nhiên thực tế đã chỉ ra rằng, ở đây cũng có một sự cân nhắc đáng giá. Một hệ thống nhỏ thực hiện dọn dẹp bộ nhớ tự động đã dẫn tới sự cải thiện rất lớn thông qua việc gỡ bỏ một loạt các lỗi của các chương trình Java. Có thể so sánh, các chương trình C++ chịu trách nhiệm quản lý các đống (heap) bộ nhớ của riêng chúng do vậy chúng phải có mã dài hơn, mất nhiều thời gian gỡ rối hơn và các chương trình lớn thường dẫn tới các lỗi rất khó phát hiện và xử lý về việc dọn dẹp bộ nhớ.

Java và WWW (World Wide Web)

Có hai loại chương trình Java: chương trình đơn lẻ, gọi là các ứng dụng, và chương trình chạy trong các trình duyệt web, gọi là các applet. Một applet đơn thuần là một chương trình ứng dụng chạy bên trong một chương trình duyệt. Có rất ít khác biệt giữa lập trình ứng dụng và lập trình applet. Trên thực tế cùng một bộ mã nhị phân có thể đồng thời là cả hai thứ đó. Ðiều này có nghĩa là tất cả những kiến thức và kỹ năng lập trình ứng dụng Java cũng áp dụng được cho lập trình applet Java và ngược lại..

Applet hoạt động giống như cung cách bạn đặt một trang web với các siêu văn bản trên một server và một máy khách (client) có thể tải trang đó xuống theo yêu cầu để xem các văn bản đã sắp đặt theo khuôn dạng. Tương tự, bạn viết và biên dịch một chương trình applet Java và đặt một tham chiếu URL hoặc HTML tới nó trong trang web. Khi một client duyệt qua trang web này, mã nhị phân của applet Java được tải xuống client đó cùng các tệp văn bản và đồ hoạ. chương trình duyệt chứa một JVM và nó sẽ thực hiện applet trên máy tính của client.

Ðiều mô tả ở trên nghe có vẻ giản đơn và có lẽ cũng chẳng có gì thú vị nhưng thực tế nó đã làm sôi động cả ngành công nghệ máy tính. Trước Java, WWW là giao diện chỉ đọc (read-only interface). Bạn duyệt và trình duyệt phục vụ bạn đọc các trang, chỉ có thế thôi. Nay các trang web có thể làm cho các chương trình được chạy và chương trình duyệt ngày càng trở nên giao diện máy tính vạn năng. Thoạt tiên, các applet được coi là các ứng dụng nhỏ nhưng trên thực tế không có hạn chế nào về kích thước cuả các applet cả. Do chỗ mô hình này rất tiện lợi nên hiên nay đã có các applet đủ các kích cỡ.

Các applet hết sức phù hợp với mô hình xử lý khách - chủ. Bằng cách viết chương trình Java của mình như là một applet bạn có thể đưa nó vào một trang web và cho phép mọi người, với mọi loại máy tính ở mọi nơi trên mạng intranet của bạn truy nhập và thực hiện nó một cách tự động mà không phải cài đặt một cái gì cả. Khi nâng cấp hoặc thay đổi applet của mình bạn chỉ việc đưa phiên bản mới của applet lên trang web và thế là trong lần truy nhập sau đó các client sẽ được cập nhật một cách tự động. Các vấn đề đau đầu liên quan đến phân phối phần mềm như làm thế nào để cài đặt hay cập nhật các phiên bản cho một loạt các máy tính có thể giải quyết dễ dàng theo cách này.


No comments:

Post a Comment