PDA

View Full Version : [Hỏi ngu] Máy ảo Java



kimera
15-04-2013, 17:24
Theo mình biết thì khi viết chương trình bằng ngôn ngữ java, đầu tiên máy ảo java sẽ biên dịch chương trình thành mã bytecode rồi sau đó mới thông dịch mã bytecode này để ra kết quả, vì thế java có thể chạy được trên nhiều hệ điều hành. Mình có 1 thắc mắc là java chạy được trên nhiều hệ điều hành có đồng nghĩa với chạy được trên nhiều phần cứng khác nhau ko, vì mỗi phần cứng khác nhau có kiến trúc tập lệnh khác nhau. Mong mọi người giải đáp giúp mình, thanks

superthin
15-04-2013, 17:38
Bạn đặt câu hỏi này làm mình muốn hỏi ngược: bạn đang có bao nhiêu phần cứng khác nhau? Bạn liệt kê ra xem thử. Và phần cứng của bạn muốn đề cập cụ thể là những món gì?

Theo mình biết, Java chạy trên hầu hết các máy tính có mặt trên thị trường mà bạn hoặc các công ty thông thường có thể mua được. Việc tập lệnh gì đó thì bạn nên tìm hiểu ngôn ngữ lập trình cấp thấp hơn, ở Java bạn không cần quan tâm trừ khi bạn định viết lại máy ảo Java để cạnh tranh với Oracle.

Nếu bạn không hài lòng với câu trả lời trên, nên tìm đọc Bách khoa toàn thư, bài nói về công nghệ Java (http://vi.wikipedia.org/wiki/Java_(c%C3%B4ng_ngh%E1%BB%87)).

ksc10
15-04-2013, 18:17
Đã gọi là "máy ảo" thì (về lí thuyết) nó phải che hết phần cứng chứ.
Mà Java là WODE chứ không phải WORA (Write Once, Run Anywhere) đâu.

kimera
15-04-2013, 22:52
Mình chưa hiểu lắm, mã bytecode là mã máy đúng ko, vậy có nghĩa là máy ảo java đã có sẵn tập lệnh của từng phần cứng khác nhau hả(vd MIPS, ARM,...) và khi chạy trên phần cứng nào thì sẽ tạo ra mã bytecode tương ứng với tập lệnh của phần cứng đó. Mình suy nghĩ như thế có đúng ko?

ksc10
16-04-2013, 02:08
Mình chưa hiểu lắm, mã bytecode là mã máy đúng ko, vậy có nghĩa là máy ảo java đã có sẵn tập lệnh của từng phần cứng khác nhau hả(vd MIPS, ARM,...) và khi chạy trên phần cứng nào thì sẽ tạo ra mã bytecode tương ứng với tập lệnh của phần cứng đó. Mình suy nghĩ như thế có đúng ko?
Mã bytecode cũng giống như cái mà VB6 gọi là P-Code và cái mà Micro$oft đang gọi là CLR vậy, tất cả đều phải dịch về mã máy hết.
p/s: cái này thì nên xem cái mà ng` ta hay gọi là KTMT.

superthin
16-04-2013, 08:08
Mình chưa hiểu lắm, mã bytecode là mã máy đúng ko, vậy có nghĩa là máy ảo java đã có sẵn tập lệnh của từng phần cứng khác nhau hả(vd MIPS, ARM,...) và khi chạy trên phần cứng nào thì sẽ tạo ra mã bytecode tương ứng với tập lệnh của phần cứng đó. Mình suy nghĩ như thế có đúng ko?

Mã bytecode là mã trung gian, chưa phải là mã máy. Máy ảo Java sẽ biến mã này thành mã máy lúc thực thi. Và KHÔNG có chuyện khi chạy trên phần cứng nào thì sẽ tạo ra mã bytecode tương ứng với tập lệnh của phần cứng đó, bởi vì khi bạn chạy nghĩa là bạn đã chạy với mã bytecode rồi, bạn đã phải compile mã nguồn thành bytecode trước khi chạy bằng trình biên dịch javac trong bộ JDK. Bạn lo ngại về việc bạn viết Java ở máy này khi bỏ sang máy khác không chạy ư? Dĩ nhiên có trường hợp đó xảy ra trong thực tế: Java viết trên máy tính PC bỏ sang Android làm sao chạy khi bạn viết trên máy tính PC mà không dùng bộ phát triển cho Android, cái này là vấn đề của sự tự do trong phần mềm nguồn mở chứ không phải là vấn đề của ngôn ngữ lập trình, và người lập trình sẽ biết họ nên làm gì,...

Một số người cẩn thận thì mang mã nguồn sang máy cần chạy, và compile nó trên máy đó để ra thành bytecode để chạy. Nếu một đơn vị viết ưngs dụng Java để bán cho đơn vị khác, dĩ nhiên họ sẽ có hướng dẫn để khách hàng của họ biết nên làm thế nào để chạy được phần mềm họ viết.

Mà lạ, tại sao bạn cứ quan tâm gì việc máy ảo nó chứa tập lệnh gì?!, cái đó thì mua sách Kiến Trúc Máy Tính về đọc, hoặc bạn gửi email cho Oracle hỏi.

kimera
18-04-2013, 12:30
Ah, cái này là tò mò muốn hỏi cho biết thôi bạn. Cảm ơn bạn đã trả lời giúp mình, thanks :)