Ngày nay công nghệ thông tin đã có những bước tiến vượt bậc. Lập trình máy tính điện tử, viết nên các chương trình ứng dụng đang ngày một gần gũi với con người. Điều đó tạo nên sự phát triển mạnh mẽ của các ngôn ngữ lập trình. Với sự phát triển như vũ bão của mạng Internet, rất nhiều các chương trình ứng dụng đã được viết ra nhằm đáp ứng các yêu cầu về giải trí cũng như công việc cho người sử dụng. Tuy nhiên với môi trường Internet, sẽ có vô vàn các hệ điều hành khác nhau cùng truy cập một ứng dụng, vậy làm thế nào để một ứng dụng có thể chạy được trên tất cả mọi hệ điều hành, điều đó đã dẫn đến việc ra đời các ngôn ngữ lập trình không phụ thuộc hệ điều hành. Một trong các ngôn ngữ đó là Java.
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI TIỂU LUẬN MÔN NGÔN NGỮ LẬP TRÌNH MÁY ẢO JAVA (JVM-Java Virtual Machine) Lời nói đầu Ngày nay công nghệ thông tin đã có những bước tiến vượt bậc. Lập trình máy tính điện tử, viết nên các chương trình ứng dụng đang ngày một gần gũi với con người. Điều đó tạo nên sự phát triển mạnh mẽ của các ngôn ngữ lập trình. Với sự phát triển như vũ bão của mạng Internet, rất nhiều các chương trình ứng dụng đã được viết ra nhằm đáp ứng các yêu cầu về giải trí cũng như công việc cho người sử dụng. Tuy nhiên với môi trường Internet, sẽ có vô vàn các hệ điều hành khác nhau cùng truy cập một ứng dụng, vậy làm thế nào để một ứng dụng có thể chạy được trên tất cả mọi hệ điều hành, điều đó đã dẫn đến việc ra đời các ngôn ngữ lập trình không phụ thuộc hệ điều hành. Một trong các ngôn ngữ đó là Java. Với sự phát triển mạnh mẽ của ngôn ngữ Java đối với các ứng dụng trên Internet, việc tìm hiểu và học hỏi ngôn ngữ Java là hết sức cần thiết. Muốn hiểu sâu và học hỏi ngôn ngữ Java, cần nắm bắt hạch tâm của ngôn ngữ đó. Một trong các hạch tâm của ngôn ngữ Java là Máy ảo Java (JVM_ Java Virtual Machine) Với nhu cầu đó, em đã chọn đề tài tiểu luận "tìm hiểu máy ảo Java_ JVM". Tuy đã rất cố gắng nhưng do thời gian có hạn, báo cáo của em không tránh khỏi những thiếu sót. Em xin chân thành cảm ơn thầy Nguyễn Hữu Đức đã tạo điều kiện và giúp đỡ em hoàn thành tiểu luận này. MỤC LỤC 1 Tổng quan về máy ảo Java (JVM-Java Virtual Machine) 4 1.1 Giới thiệu về JVM 4 1.2 Máy ảo Java là gì? 5 2 Phương thức thực thi 6 2.1 Quản lý bộ nhớ và dọn rác 6 2.2 Quá trình kiểm tra file .class 7 3 Các kiểu dữ liệu được hỗ trợ trong JVM 7 3.1 Kiểu dữ liệu nguyên thủy 8 3.2 Kiểu dữ liệu tham chiếu 9 4 Tổng kết 10 1 Tổng quan về máy ảo Java (JVM-Java Virtual Machine) 1.1 Giới thiệu về JVM Thập kỷ 90 chứng kiến một sự phát triển như vũ bão của mạng Internet, kèm theo đó là vô vàn các ứng dụng trên các môi trường, hệ điều hành (OS) và các hệ xử lý (CPU) khác nhau. Tuy nhiên có một điểm hạn chế lớn là người lập trình phải rất vất vả khi chuyển đổi các ứng dụng của mình để các hệ thống khác có thể sử dụng được. Ngày 23/5/1995, công ty máy tính Sun Microsystems đã giới thiệu một công cụ lập trình mới - ngôn ngữ Java - nhằm khắc phục những khó khăn đó. Đặc điểm nổi bật nhất của Java là nó không phụ thuộc vào hệ điều hành và bộ xử lý. Điều này cho phép một ứng dụng viết bằng Java có thể được thực hiện trên bất kỳ hệ điều hành và hệ xử lý nào có hỗ trợ Java. Do vậy, người lập trình chỉ cần viết ứng dụng bằng Java đúng một lần, sau đó có thể sử dụng ứng dụng này trên các hệ điều hành khác nhau như Windows95, WindowsNT, Mac OS, Unix, theo phương châm: viết một lần, sử dụng ở bất kỳ đâu. Có thể định nghĩa một cách chính xác hơn về Java: là ngôn ngữ lập trình hướng đối tượng, được thiết kế độc lập với hệ điều hành, cho phép người lập trình viết chương trình một lần và có thể sử dụng tại bất kỳ đâu. Không chỉ giới thiệu ngôn ngữ lập trình, Sun Microsystems còn đưa ra hàng loạt công cụ hỗ trợ người lập trình phát triển các ứng dụng bằng Java, như Java Developer Kit, JavaBeans, HotJava Ngôn ngữ Java có cú pháp rất giống với ngôn ngữ C/C++ (là một ngôn ngữ rất mạnh được dùng phổ biến hiện nay), tuy nhiên nó đã được thay đổi khá nhiều để đáp ứng khả năng độc lập với hệ điều hành. Nền tảng của ngôn ngữ Java là các class. Các class đóng vai trò như những đối tượng, người lập trình khi xây dựng ứng dụng sẽ sử dụng một số class chuẩn của hệ thống, đồng thời có thể tự mình xây dựng class khác đáp ứng yêu cầu công việc. Java là ngôn ngữ dễ học, nó lược bớt những lệnh thừa và rườm rà của C/C++ để người lập trình chú trọng vào việc viết chương trình. Đồng thời, nó còn hạn chế người lập trình không can thiệp quá sâu vào hệ thống. Hiện nay Java được ứng dụng rất rộng rãi, chủ yếu là các ứng dụng được viết trên Internet nhằm khai thác tối đa khả năng của nó trong lĩnh vực viễn thông, truyền hình, mạng, và các máy tính đơn lẻ. Hiện tại các ứng dụng viết bằng Java khi thực hiện còn chậm hơn so với các ứng dụng được xây dựng thông thường, tuy nhiên hầu hết các nhà phát triển phần mềm đều cho rằng tốc độ sẽ được cải thiện và Java sẽ là ngôn ngữ lập trình của tương lai. Máy ảo Java là trái tim của ngôn ngữ Java. Môi trường Java bao gồm năm phần tử sau: - Ngôn ngữ - Định nghĩa Bytecode - Các thư viện lớp Java/Sun - Máy ảo java JVM - Cấu trúc của file . class Các phần tử tạo cho Java thành công là - Định nghĩa Bytecode - Cấu trúc của file .class - Máy ảo Java Java Virtual Machine (JVM) đóng vai trò rất quan trọng để các ứng dụng Java có thể thực hiện được. Nó hoạt động như một máy tính ảo, cũng có bộ lệnh, cấu trúc dữ liệu, bộ nhớ, Khi các ứng dụng Java (sau khi dịch, các ứng dụng viết bằng Java sẽ có phần mở rộng là class) thực hiện, JVM tiến hành phân tích mã trong class đó thành bộ lệnh của JVM rồi thực hiện giống như máy tính PC thao tác với các ứng dụng thông thường. Khả năng cơ động của file.class cho phép các chương trình Java viết một lần nhưng chạy ở bất kỳ đâu.Bởi vậy, các class sau khi dịch có thể được thực hiện trên bất kỳ hệ điều hành nào thông qua máy tính ảo JVM. Khả năng này có được nhờ sự giúp đỡ của Máy ảo java JVM. Hiện tại, JVM được xây dựng cho hầu hết các hệ điều hành và hệ xử lý hiện có, điều này có nghĩa là các ứng dụng viết bằng Java có đầy đủ điều kiện để phát triển. 1.2 Máy ảo Java là gì? Như đã biết, JVM bản chất là một chương trình có thể thực thi các đoạn mã lập trình của Java, và đặc điểm của những chương trình viết bằng Java là đều có thể chạy trên bất kỳ môi trường nào, miễn là có cài máy ảo JVM trên đó. Việc này sẽ tạo một động lực rất lớn thúc đẩy việc dùng lại các phần mềm Java đã được viết trước đây và việc phát triển phần mềm trên iPhone và iTouch. Máy ảo là một phần mềm dựa trên cơ sở máy tính ảo. Nó có tập hợp các lệnh logic để xác định các hoạt động của máy tính. Người ta có thể xem nó như một hệ điều hành thu nhỏ. Nó thiết lập các lớp trừu tượng cho: Phần cứng bên dưới,hệ điều hành,mã đã biên dịch. Trình biên dịch chuyển mã nguồn thành tập các lệnh của máy ảo mà không phụ thuộc vào phần cứng cụ thể. Trình thông dịch trên mỗi máy sẽ chuyển tập lệnh này thành chương trình thực thi. Máy ảo tạo ra một môi trường bên trong để thực thi các lệnh bằng cách: - Nạp các file.class - Quản lý bộ nhớ - Dọn "rác" Việc không nhất quán của phần cứng làm cho máy ảo phải sử dụng ngăn xếp để lưu trữ các thông tin sau: - Các "Frame" chứa các trạng thái của các phương pháp. - Các toán hạng của mã bytecode - Các tham số truyền cho phương pháp - Các biến cục bộ Khi JVM thực thi mã, một thanh ghi cục bộ có tên "Program Counter" được sủ dụng. Thanh ghi này trỏ tới lệnh đang thực hiện. Khi cần thiết, có thể thay đổi nội dung thanh ghi để đổi hướng thực thi của chương trình. Trong trường hợp thông thường thì từng lệnh một nối tiếp nhau sẽ được thực thi. Một khái niệm thông dụng khác trong Java là trình biên dịch "Just In Time-JIT". Các trình duyệt thông dụng như Netscape hay IE đều có JIT bên trong để tăng tốc độ thực thi chương trình Java. Mục đích chính của JIT là chuyển tập lệnh bytecode thành mã máy cụ thể cho từng loại CPU. Các lệnh này sẽ được lưu trữ và sử dụng mỗi khi gọi đến. 2 Phương thức thực thi 2.1 Quản lý bộ nhớ và dọn rác Trong C, C++ hay Pascal người lập trình sử dụng phương pháp nguyên thủy để cấp phát và thu hồi bộ nhớ ở vùng " Heap". Heap là vùng bộ nhớ lớn được phân chia cho tất cả các Thread. Để quản lý Heap, bộ nhớ được theo dõi qua các danh sách sau: - Danh sách các vùng nhớ rảnh chưa cấp phát. - Danh sách các vùng đã cấp Khi có một yêu cầu về cấp phát bộ nhớ, hệ thống kiểm tra xem xét trong danh sách chưa cấp phát để lấy ra khối bộ nhớ đầu tiên có kích cỡ sát nhất. Chiến thuật cấp phát này giảm tối thiểu việc phân mảnh của Heap. "Coalescing" là kỹ thuật khác cũng giảm thiểu việc phân mảnh của Heap bằng cách gom lại các vùng nhớ chưa dùng liền nhau. Còn kỹ thuật sắp xếp lại các phần đã dùng để tạo vùng nhớ lớn hơn gọi là "Compaction" Java sử dụng hai Heap riêng biệt cho cấp phát vùng nhớ tĩnh và vùng nhớ động. Một Heap(Heap tĩnh) chứa các định nghĩa về lớp, các hằng và danh sách các phương pháp. Heap còn lại(Heap động) được chia làm hai phần được cấp phát theo hai chiều ngược nhau. Một bên chứa đối tượng còn bên kia chứa con trỏ trỏ đến đối tượng đó. "Handle" là cấu trúc bao gồm hai con trỏ. Một trỏ đến bảng phương pháp của đối tượng, con trỏ thứ hai trỏ đến chính đối tượng đó. Chú ý rằng khi "compaction" cần cập nhập lại giá trị con trỏ của cấu trúc" Handle". Thuật toán dọn rác có thể áp dụng cho các đối tượng đặt trong Heap động. Khi có yêu cầu về bộ nhớ, trình quản lý Heap trước tiên kiểm tra danh sách bộ nhớ chưa cấp phát. Nếu không tìm thấy khối bộ nhớ nào phù hợp(về kích cỡ) thì trình dọn rác sẽ được kịch hoạt khi hệ thống rảnh. Nhưng khi đòi hỏi bộ nhớ cấp bách thì trình dọn rác sẽ được kích hoạt ngay. Trình dọn rác gọi hàm Finalize trước khi dọn dẹp đối tượng. Hàm này sẽ dọn dẹp các tài nguyên bên ngoài như các file đang mở. Công việc này không được trình dọn rác thực thi. 2.2 Quá trình kiểm tra file .class Việc kiểm tra được áp dụng cho tất cả các file .class sắp được nạp lên bộ nhớ để đảm bảo tính an toàn. Trình "Class Loader" sẽ kiểm tra tất cả các file .class không phụ thuộc hệ điều hành với mục đích giám sát sự tuân thủ các nghi thức để phát hiện các file ,class có nguy cơ gây hư hỏng đến bộ nhớ, hệ thống file cục bộ, mạng hoặc hệ điều hành. Quá trình kiểm tra sẽ xem xét đến tính toàn vẹn toàn cục của lớp. File .class bao gồm ba phần logic là: - Byecode - Thông tin về Class như phương pháp, giao diện và các giá trị được tập hợp trong quá trình biên dịch. - Các thuộc tính về lớp. Các thông tin của file . class được xem xét riêng rẽ trong các bảng như sau: - Bảng file chứa các thuộc tính - Bảng Method chứa các hàm của class - Bảng Interface chứa các giao diện và các hằng số Quá trình kiểm tra file .class được thực hiện ở bốn mức: • Mức đầu tiên thực hiện việc kiểm tra cú pháp để đảm bảo tính cấu trúc và tính toàn vẹn cú pháp của file .class được nạp • Mức thứ hai sẽ xem xét file.class để đảm bảo các file này không vi phạm các nguyên tắc về sự nhất quán ngữ nghĩa. • Mức thứ ba sẽ kiểm tra bytecode. Trong bước này các thông tin so sánh sẽ là số thông số truyền của hàm, khả năng truy xuất sai chỉ số của mảng, chuỗi, biểu thức. • Mức thứ tư sẽ kiểm tra trong thời gian thực thi để giám sát các việc còn lại mà ba bước trên chưa làm. Ví dụ như liên kết tới các lớp khác trong khi thực thi, hay kiểm tra quyền truy xuất. Nếu mọi điều thỏa mãn, lớp sẽ được khởi tạo. 3 Các kiểu dữ liệu được hỗ trợ trong JVM Trong JVM hỗ trợ 2 loại kiểu dữ liệu, đó là • Kiểu dữ liệu nguyên thủy (primitive) • Kiểu dữ liệu tham chiếu(references) 3.1 Kiểu dữ liệu nguyên thủy Các kiểu dữ liệu nguyên thủy mà JVM hỗ trợ bao gồm: Các kiểu số (numeric types), kiểu logic (boolean type), và các kiểu địa chỉ trả về (returnAddress type). Kiểu số bao gồm các kiểu số nguyên và các kiểu số phẩy động. Kiểu số nguyên gồm • byte (gồm 8 bit) • short (gồm 16 bit) • int (gồm 32 bit) • long (gồm 64 bit) • char (gồm 16 bit) Kiểu số phẩy động bao gồm • Float • Double Kiểu logic (boolean type) thì chỉ bao gồm 2 giá trị Đúng (True) hoặc Sai (False) Kiểu địa chỉ trả về chính là một loại con trỏ lệnh trong JVM, được sử dụng để trỏ tới một lệnh trong chương trình Java và không thể thay đổi trong khi chạy chương trình Bảng mô tả các kiểu dữ liệu nguyên thủy như sau Kiểu dữ liệu Độ dài theo số bít Phạm vi Mô tả Byte 8 -128 đến +127 Số liệu kiểu byte là một loại điển hình dùng để lưu trữ một giá trị bằng một byte. Chúng được sử dụng rộng rãi khi xử lý một file văn bản Short 16 -32768 đến +32767 Kiểu Short thường được dùng để lưu các số có giá trị nhỏ dưới 32767 Int 32 -2147483648 đến +2147483648 Kiểu Int thường được dùng để lưu một số có giá trị lớn đến 2147483648 Long 64 -9223372036854775808 đến +9223372036854775808 Kiểu Long thường được sử dụng để lưu một số có giá trị rất lớn Char 16 0 đến 65355 Kiểu char sử dụng để lưu tên hoặc các dữ liệu ký tự Boolean 1 "True" hoặc "False" Kiểu Boolean thường dùng để lưu các giá trị đúng hoặc sai Float 32 -340292347E+38 đến +340292347E+38 Kiểu Float thường dùng để lưu các số thập phân đến 340292347E+38 Double 64 -179769313486231570E+308 đến +179769313486231570E+30 8 Kiểu Double thường dùng để lưu các số thập phân có giá trị lớn đến +179769313486231570E+308 3.2 Kiểu dữ liệu tham chiếu JVM hỗ trợ 3 kiểu dữ liệu tham chiếu : Mảng (array types), Lớp(class types) và Giao diện(interface types) Bảng mô tả các kiểu dữ liệu tham chiếu như sau Kiểu dữ liệu Mô tả Mảng (array types) Tập hợp các dữ liệu cùng một loại: Ví dụ Tên sinh viên Lớp(class types) Tập hợp các biến và các phương thức. Ví dụ: Lớp"Sinh Viên" chứa toàn bộ các chi tiết của một sinh viên và các phương thức thực thi trên các chi tiết đó Giao diện(interface types) Là một lớp trừu tượng được tạo ra để bổ sung cho các kế thừa đa lớp trong Java 4 Tổng kết Có thể nói rằng sự ra đời của Java đánh dấu một cuộc cách mạng mới trong lĩnh vực Công Nghệ Thông Tin. Cuộc cách mạng này kéo theo một loạt những thay đổi: các ứng dụng dần được thay thế bằng Java, các thế hệ máy tính sử dụng những vi mạch có khả năng hỗ trợ Java, Làm quen với Java sẽ giúp chúng ta tiếp cận được với những công nghệ mới nhất của Công Nghệ Thông Tin. Hiện nay trên thế giới có hơn 6 triệu lập trình viên Java, và theo thông báo chính thức của Sun, thì có hơn 10.000 người trong số đó tập trung phát triển các ứng dụng trên các thiết bị di động. Chạy chương trình Java trên JVM vẫn còn chậm hơn một chút so với chạy chương trình viết thẳng cho hệ máy đó. Tuy nhiên, công nghệ JVM đang tiến bộ mau chóng về mặt tốc độ và khoảng cách sẽ được thu ngắn lại rất nhiều trước cuối năm nay. Symatec và Microsoft đã bán ra rất đúng lúc các trình biên dịch và Sun sẽ tung ra HotSpot VM trong quý 4 năm 1997. Với sự kết hợp này, người ta mong đợi chương trình Java sẽ chạy nahanh như các trình viết bằng C. Các hãng phần mềm coi hướng phát triển bằng JVM là rất hấp dẫn vì họ có thể đẩy các chương trình Java chạy trên mọi hệ máy. Chỉ cần họ viết một JVM cho hệ máy đó. Cho đến nay, đã có JVM cho rất nhiều hệ máy, từ máy tính lớn (mainframe) đến hầu hết tất cả các kiểu máy để bàn kể cả PC và Mac. . và giúp đỡ em hoàn thành tiểu luận này. MỤC LỤC 1 Tổng quan về máy ảo Java (JVM -Java Virtual Machine) 4 1.1 Giới thiệu về JVM 4 1.2 Máy ảo Java là gì? 5 2 Phương thức thực thi 6 2.1 Quản lý. dữ liệu nguyên thủy 8 3.2 Kiểu dữ liệu tham chiếu 9 4 Tổng kết 10 1 Tổng quan về máy ảo Java (JVM -Java Virtual Machine) 1.1 Giới thiệu về JVM Thập kỷ 90 chứng kiến một sự phát triển như vũ bão. trình của tương lai. Máy ảo Java là trái tim của ngôn ngữ Java. Môi trường Java bao gồm năm phần tử sau: - Ngôn ngữ - Định nghĩa Bytecode - Các thư viện lớp Java/ Sun - Máy ảo java JVM - Cấu trúc