Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (898.2 KB, 120 trang )
copy v..v sẽ đợc máy tính trợ giúp, tức là Sun muốn tất cả các máy tính đều chạy
Java. Bởi vì các chip đợc chạy trên mã byte code, nên nó không cần biên dịch
just- in -time. Các thiết bị sẽ không cần màn hiển thị, bộ nhớ lớn và nối kết mạng
Internet.
Sun Microelectronics gọi kiến trúc chip đầu tiên là Java One. Hiện nay Sun
đã có hai họ chip là microJava và ultraJava. MicroJava đợc sử dụng với mục đích
cung cấp cho các thị trờng trong lĩnh vực điều khiển. UltraJava có mục đích cung
cấp cho các workstation. Cơ sở của kĩ thuật này là một ngăn xếp super-scalar dựa
vào tập chỉ dẫn rút gọn của máy tính (RISC) gọi là picoJava. Đợc gọi là superscalar bởi vì nó thi hành kênh bốn trạng thái cho phép các phần khác nhau của
bộ xử lí làm bốn nhiệm vụ khác nhau cùng một lúc. Gọi là RISC bởi vì nó thực
thi hầu hết các chỉ dẫn trong một chu kì đồng hồ. Tính toán trong một kênh của
super-scalar giống nh các dòng assembly. Dữ liệu đợc xử lí dòng nọ tiếp dòng
kia. Trên hình 1.1 chỉ ra các kênh, khi đợc điền, sẽ cho phép picoJava tìm thấy,
giải mã, thi hành, và lu giữ sau đó trả lại kết quả. Trong quá trình tìm, picoJava
sử dụng bốn byte cache đa vào ngăn xếp. Ngăn xếp là tập hợp 64 thanh ghi 32
bits trên một chip. Sau khi lu trên chip, RAM đợc sử dụng để thực hiện cùng với
ngăn xếp.
Hình 1.1 Kênh picoJava bốn trạng thái
1.2 Java: u điểm và nhợc điểm
Ưu điểm
Java là một ngôn ngữ định kiểu mạnh. Tất cả các tên của lớp đều đợc xác
định kiểu và sử dụng để kiểm tra mọi sự tham chiếu tới lớp khi đ ợc thông
qua nh một đối số của phơng thức. Hầu hết các ngôn ngữ bậc cao hiện nay
đều có đặc điểm này, mặc dù kiểu C cũ thì lại tránh điều đó.
Java thì nhỏ: Java dựa trên kiểu biên dịch mã byte (byte code). Chứa cả
microkernel của chính nó, biên dịch mã byte cộng thêm lớp phụ là 215KB.
Điều này là một hoạt động có hiệu quả. Có nghĩa là biên dịch mã byte có thể
nằm gọn trong ROM và đa ra các microcontroller để chạy chơng trình java.
8
Java là dễ dàng dịch chuyển: Java là một ngôn ngữ đa nền (multi-platform).
Khẩu hiệu của Java là viết một lần chạy mọi nơi (Write Once, Run
Anywhere). Bởi vì ở đây chỉ xác định có một máy ảo, Java đa ra một giao
diện lập trình không chuẩn tắc tới các applet và các ứng dụng trên mọi phần
cứng. Nền Java là lí tởng cho Internet, ở đó chơng trình có thể đợc chạy trên
mọi máy tính trong mạng. Khi ta biên dịch mã nguồn của Java, ta phải thực
thi trên các mã byte (byte code). Mã byte đợc tạo thành bởi trình biên dịch
của Java và cấu trúc nên các chỉ dẫn tới Java virtual machine. Java là một
ngôn ngữ dễ dịch chuyển cho phép chạy trên mọi phần cứng mà máy ảo
Java có thể chạy. Mã byte lu trong file .class, đợc nạp tới máy ảo Java và
chứa cả biên dịch mã byte. Trên hình 1.2 là mối quan hệ giữa chơng trình
Java và phần cứng.
Hình 1.2
Java là hớng đối tợng: Java là ngôn ngữ lập trình hớng đối tợng. Trong mô
hình hớng đối tợng, một biến kiểu đối tợng chứa các dữ liệu cũng nh các
thuật toán cần thiết để thao tác với dữ liệu. Ngợc lại một ngôn ngữ lập trình
không hớng đối tợng là ngôn ngữ lập trình coi các biến nh một đối số tham
chiếu tới thủ tục. Không giống nh Pascal, C, Fortran, C++, Java không có
hàm (function). Trong Java tất cả các phơng thức (method) đều nằm trong
các lớp (classes). C++ là một ngôn ngữ có mở rộng về hớng đối tợng. Điều
này có nghĩa là ngời lập trình không hớng đối tợng có thể viết đợc trong C+
+, nhng một điều nh vậy không đợc cho phép trong Java.
Java không có con trỏ: Java thì crash-proof hơn C, C++ và Pascal - một đặc
điểm tốt hơn. Lí do là Java không cung cấp một kĩ thuật nào cho phép thao
tác với con trỏ một cách trực tiếp. Do đó không có cách cho ngời lập trình
thao tác với địa chỉ bộ nhớ. Theo nhiều cách khác nhau một con trỏ không
đúng có thể gây lỗi cho bộ nhớ hay chơng trình. Chúng ta không đủ không
gian nhớ để liệt kê tất cả chúng. Chúng ta có thể cảm ơn rằng java không có
con trỏ.
Java không có Multiple Inheritance: đa kế thừa đã đợc biết tới trong C++,
nhng đợc loại bỏ trong Java. Đa kế thừa là tính chất có hai hay nhiều lớp cơ
sở trực tiếp bên dới một lớp. Vấn đề đặt ra đối với đa kế thừa là sự chồng
chéo các tên phơng thức cũng nh các biến, chúng phải trùng tên nhau dựa
9
theo một quy tắc của ngôn ngữ và dờng nh thờng xuyên bị quên bởi các ngời
lập trình. ở đây chỉ có một kiểu kế thừa đợc cho phép là kiểu a-kind-of
(AKO). Trên hình 1.3 là một ví dụ kiểu kế thừa AKO.
Java có Garbage Collection: Java có phép lu trữ tự động bao gồm cả kĩ thuật
thu rác (rác đợc xem là các dữ liệu không còn giá trị sử dụng). Thu rác cho
phép máy ảo Java giành lại bộ nhớ đợc sử dụng bởi các biến bị loại bỏ. Để
thực hiện thu rác trong chơng trình ta sử dụng phơng thức gc() thuộc lớp
System và viết nh sau System.gc(). Nh vậy bạn không phải lo lắng về việc
giữ lại các dấu vết của bộ nhớ.
Animal
Mamal
Bird
Reptile
Human
Student
Professor
Hình 1.3
Java có các th viện lớp nền tảng: Java có các th viện nền tảng chứa
Abstract Window Toolkit (AWT). AWT cho phép giao diện ngời dùng
đồ hoạ kiểu hớng đối tợng đợc thay đổi trong các chơng trình. Th viện gồm
có tám gói chính và số lợng ngày càng tăng. Gói input/output
java.io cho phép thao tác với dữ liệu vào và ra. Gói mạng java.net ,
cho phép thao tác với các socket và URL. Gói tiện ích java.util cho phép
tthực hiện một số thao tác với hệ điều hành nh xem ngày tháng, thời gian,
số ngẫu nhiên,v..v
Nhợc điểm
Đôi khi thu rác là một việc làm ít hiệu quả: mặt hạn chế của việc thu rác nh
sau. Thu rác có thể dẫn tới chơng trình không quyết định đợc thời gian chạy.
Đối với hệ thống lớn, thu rác có thể sử dụng một lợng thời gian xác định nào
đó của bộ vi xử lý.
Java không phải là một ngôn ngữ hớng đối tợng thuần tuý. Chúng ta không
có khả năng tạo ra các instance của kiểu dữ liệu primative. Các kiểu dữ liệu
cơ bản trong Java là boolean, int, long, float, double, char
và byte. Ngợc lại trong Smalltalk thì tất cả các kiểu dữ liệu đều là các lớp.
API thiếu nhiều đặc trng: java thiếu các đặc trng có tính chất chìa khóa cho
một vấn đề. Ví dụ nó không cho phép chúng ta lập trình với các cổng nối
tiếp (cho dù hầu hết các máy tính đều có ít nhất một cổng) cũng nh không
cho phép đa ra máy in nếu đang ở trong một chơng trình Java. Java là một
ngôn ngữ mới, và bởi vì các đặc trng còn thiếu trong API, Java có thể không
dễ dàng sử dụng cho một số các ứng dụng nào đó.
10
Java không có phơng thức đảo cung cấp cho C++: có thể chúng ta muốn mở
rộng các đặc trng của Java API bằng cách lập trình trên một ngôn ngữ khác.
Thật không may là ngôn ngữ lựa chọn này chỉ có giới hạn là C. Không có
cách nào nối giữa Java và C++, một phần có thể do vấn đề về name-space
mangling. Trong C++, chức năng mã nguồn đợc định danh trong các hàm
khác tên nhau đối với trình nối kết. Điều này đợc gọi là name-space
mangling. Các hàm đợc đọc trệnh đi dựa vào kiểu đối số của nó. Bởi java
không có cách nhận biết hàm sẽ đợc đọc trệnh nh thế nào nên hàm sẽ không
đợc gọi tới.
1.3 Mô hình HTML và mô hình Java
Mô hình HTML cho phép tham chiếu tới một tài liệu dới dạng các file khác
kiểu nhau. Một Browser đọc các tham chiếu tới file HTML và chuyển chúng
tới chơng trình giải mã. Ví dụ, nếu một file là dới dạng nén thì browser tự động
giải nén nó.
Thiếu xót không tránh đợc trong mô hình này là browser có thể tăng lên
không có giới hạn. Ví dụ với Netscape browser, nó yêu cầu 16 MB RAM. Khi
một ứng dụng trở nên lớn hơn, chúng có xu hớng làm chậm các tác vụ bình thờng khác. Sau đây chúng ta so sánh mô hình HTML (HTML model) và mô hình
Java (Java model). Trong Java model, các mã đợc biên dịch trong các file có
đuôi .class và sau đó sẽ nạp xuống đa vào trong các applet thông qua mạng.
Mô hình HTML
Trên Internet, các máy tính đều chạy dịch vụ Hypertext Transfer Protocol
(HTTP). Các dịch vụ HTTP đa dữ liệu đáp ứng cho các Web browser. Một cách
tổng quát, dữ liệu ở các dạng khác nhau và HTML không cần giải mã các dữ
liệu. Kết quả là Internet HTTP server cung cấp miền lớn các dạng dữ liệu tới các
client nối với nó.
Trong HTML model, dữ liệu thô đợc ghi trong HTML document bằng một
tham chiếu siêu văn bản (hyper text reference). Để thực hiện giải mã dữ liệu với
một số lớn các dạng dữ liệu khác nhau, browser có sử dụng các ứng dụng trợ
giúp. Nhằm sắp xếp dữ liệu đúng với ứng dụng trợ giúp, browser có một giao
thức là Multipurpose Internet Mail Extension (MIME) cho phép dịch vụ HTTP
truyền dẫn cùng với dữ liệu. Dựa trên MIME, một bảng tìm kiếm xác định xem
dữ liệu đợc giải mã và hiển thị nh thế nào.
Một vấn đề khác. Dữ liệu thờng đợc hiển thị trong các khuôn dạng điện tử
rất đa dạng. Giả sử có một tài liệu Microsoft Word cung cấp trên Web, ta có thể
xem nó nh một Word document nhng Word 5 trên Mac không thể đọc đợc các
Word 6 hay 7. Vì vậy phải có một file RFT ( Rich text format ) để Word 5
có thể nhận biết hầu hết nội dung trong tài liệu. Tài liệu kiểu Word Document
thờng đợc chuyển sang dạng HTML nhằm cho phép mọi browser trên mạng có
thể "nhìn" nó. Thêm nữa HTML chỉ đáp ứng các đồ họa dới dạng ảnh GIF và
không duy trì trang tài liệu nguồn nguyên thuỷ dới dạng Word document. Ta
cũng có thể sử dụng PostScrip để nạp và in các tài liệu, tuy nhiên không cho
phép soạn thảo lại tài liệu và cũng không phải mọi file PostScrip đều có thể in đợc với các máy in. Bên cạnh đó, Adobe có tiến thêm một bớc trong Portable
11
Document Format (PDF) cho phép xem và in tất cả các tài liệu. Tuy vậy còn tồn
tại vấn đề là ngời dùng không thể soạn thảo lại các tài liệu này.
Mô hình Java
Mô hình Java khắc phục một số thiếu sót của mô hình HTML nhng nó không
dành lấy đợc sự chấp nhận rộng rãi. Trong Java, các mã byte tạo ra sau khi biên
dịch đợc lu trong các file .class. Các file này đợc nạp xuống các class loader của
máy client. Sau khi kiểm tra, máy ảo Java sẽ phiên dịch các mã byte.
Nguyên tắc hoạt động của trình biên dịch Java có dạng nh trên hình 1.4.
Java Source
(*.java)
JavaClasses
(*.class)
Java
Compiler
Hình 1.4
Cùng với Java, một thuật toán giải mã các dạng dữ liệu mới có thể đợc nạp
tuỳ theo câu lệnh. Tức là Web là một hớng đối tợng trong hoàn cảnh, dữ liệu đợc
nhập cùng với chơng trình để thực hiện một tác vụ. Mô hình Java là một cải tiến
lớn đáp ứng nhu cầu hiện tại, nó yêu cầu chúng ta có một giải pháp cho việc giải
mã trên phần cứng của ta.
Nguyên tắc của mô hình Java trên mạng nh trên hình 1.5
Runtime System/ Hardware
Java Source
Interpreter
Just-In-Time
Compiler
Compiler
Byte Codes
Byte Code Verifier
Network
ClassLoader
Hình 1.5
1.4 Môi trờng phát triển Java
Có nhiều sự chọn lựa có giá trị để phát triển Java, bao gồm các sản phẩm của
Sun (Java Workshop, Java Developers Kit (JDK)), Metrowerks' CodeWarrior , các sản
phẩm Symantec(Visual Café, Visual Café Pro, Café). Microsoft J++, Asymetrix
SuperCede và các chọn lựa khác. Để có thêm chi tiết ta hãy xem trên địa chỉ:
htt://www.javasoft.com/products/JDK/; ftp://ftp.metrowerks.com/; http://www.symetec
.com, http:/roaster.com/roaster/ và http://www.microsoft.com/java/.
J++ chạy trên Window 95/NT. Workshop có chỉ chạy trên Solaris và
Windows 95/NT. Các sản phẩm của Symantec và CodeWarrior chạy trên MacOS
và Window 95/NT.
Sau đây chúng ta hãy xem xét một ứng dụng đơn giản nhất của java trên môi
trờng JDK. Chúng ta tìm hiểu chi tiết cách tạo , biên dịch và chạy các chơng
12
trình Java. Sử dụng nền Java Development Kit (JDK). Ta có thể tìm thêm các
thông tin trên địa chỉ http://java.sun.com/prodocst/jdk/index.html.
Tạo một file nguồn
Sử dụng một trình soạn thảo, tạo một file có tên là Hello.java với các dòng
lệnh nh sau:
/**
* The Hello class implements an application that
* simply display Hello world to the standard output
*/
class Hello {
public static void main ( String[] args){
System.out.println( Hello World);
}
}
Biên dịch file nguồn
Biên dịch file nguồn bằng trình biên dịch của Java.
UNIX:
DOS shell (Windows 95/NT):
javac Hello.java
javac Hello.java
Nếu biên dịch thành công, trình biên dịch sẽ tạo ra file tên là Hello.class
trong cùng th mục với file nguồn Hello.java . File kiểu class này chứa các mã
byte . Nếu biên dịch không thành công, thì hãy chắc chắn ta nhập đúng kiểu và
tên của chơng trình chính xác nh chỉ ra ở trên hay không, và hãy chắc chắn chữ
thờng, chữ hoa có đúng nh trong tên file không.
Chạy ứng dụng
Chạy chơng trình bằng Java interpreter:
UNIX:
java Hello
DOS shell( Window 95/NT) java Hello
khi đó trên màn hình ta sẽ nhận đợc dòng chữ :
Hello World.
Phân tích một ứng dụng Java
Bây giờ hãy nhìn vào chơng trình nguồn, chúng ta có thể phân vân không
biết nó làm việc nh thế nào và nó giống các ứng dụng khác thế nào. Chơng trình
nguồn gồm hai khối lệnh chính, khối đầu tiên nằm ở phần đầu của chơng trình
sử dụng kí hiệu /** và */. Ngôn ngữ java cung cấp một trong ba kiểu kí tự đánh
dấu // để đa các lời giải thích vào chơng trình tơng tự nh trong C, C++. Trong
Java, mỗi phơng thức (đợc coi là một hàm chức năng giống nh một khối các mã
lệnh) và biến nằm gọn trong một lớp. Java không cung cấp các biến và các hàm
toàn cục. Do đó có thể xem khung của chơng trình java là một definition class.
Điểm truy nhập vào mỗi một ứng dụng Java là phơng thức main của nó. Khi
chạy ứng dụng cùng với java interpreter cần phải chính xác hoá tên lớp
muốn chạy. Interpreter sẽ gọi đến phơng thức main trong lớp đó. Phơng thức
main điều khiển luồng chảy của chong trình, cấp phát mỗi khi nguồn đợc gọi
tới, và chạy tất cả những phơng thức khác liên quan đến ứng dụng đó.
13
Lời giải thích trong Java
Trong Java có các kiểu trích dẫn lời giải thích nh sau:
/* text */ : trình biên dịch bỏ qua mọi thứ nằm trong cặp dấu này.
/** documentation */ : Dùng để chỉ ra một documentation comment, trình
biên dịch cũng bỏ qua nh đối với /* và */. Công cụ javadoc của JDK sử dụng lời
chú giải doc khi chuẩn bị tự động tạo ra documentation. Để có thêm thông tin về
javadoc hãy xem trên http://java.sun.com/products/jdk/1.1/docs/index.html#tools.
// text : trình biên dịch bỏ qua mọi thứ kể từ dấu // cho đến cuối dòng.
Định nghĩa một lớp
Dòng đầu đợc tô đậm trong phần chơng trình ở dới là khối định nghĩa lớp:
/**
* The Hello class implements an application that
* simply display Hello world to the standard output
*/
class Hello {
public static void main ( String[] args){
System.out.println( Hello World); // Display the String
}
}
Lớp là một khái niệm cơ bản, gồm một khối các câu lệnh của ngôn ngữ lập
trình hớng đối tợng giống nh kiểu java. Nó là một bản chi tiết mô tả trạng thái,
cách thức thực hiện đợc nối kết với instance của lớp đó. Khi ta khởi tạo một
lớp, ta tạo ra một đối tợng mà nó có cùng các trạng thái, cách thức thực hiện nh
các instance khác của cùng lớp đó. Trạng thái nối kết với lớp hay đối tợng đợc
lu trong các biến thành phần member variables. Cách thức thực hiện nối kết
với lớp hay đối tợng đợc thực thi trong các phơng thức.
Phơng thức main (Main Method)
Dòng đợc tô đậm là điểm bắt đầu và kết thúc của khai báo phơng thức main.
/**
* The Hello class implements an application that
* simply display Hello world to the standard output
*/
class Hello {
public static void main ( String[] args){
System.out.println( Hello World);
}
}
Mỗi ứng dụng Java đều có một phơng thức main đợc khai báo nh sau:
public static void main(String[] args)
Phơng thức main đợc khai báo cùng với ba từ khoá:
public: cho phép các đối tợng gọi tới phong thức main.
static : có nghĩa là phơng thức main là một phơng thức kiểu lớp.
void: chỉ ra rằng phơng thức main không trả lại giá trị.
14