Thông dịch và biên dịch trong Java

Xin chào mọi người,
Mình mới tìm hiểu về Java nên mình có một thắc mắc về vấn đề thông dịch và biên dịch trong Java.
Theo như mình được học thì: Mã nguồn được Javac BIÊN DỊCH thành dạng bytecode. sau đó được chạy trên từng hệ điều hành cụ thể nhờ trình THÔNG DỊCH java.
Thế tại sao không phải là: Mã nguồn được Javac BIÊN DỊCH thành dạng bytecode. sau đó được chạy trên từng hệ điều hành cụ thể nhờ trình BIÊN DỊCH java. ?
hoặc: Mã nguồn được Javac THÔNG DỊCH thành dạng bytecode. sau đó được chạy trên từng hệ điều hành cụ thể nhờ trình THÔNG DỊCH java. ?
mọi người giải đáp giúp mình với, mình cám ơn !

Do dịch sang tiếng Việt nó vậy thôi, và người đọc không hiểu được từ THÔNG và từ BIÊN thôi(hoặc cố tình tự vẽ vời thêm để làm rối bản thân).

Thực chất trình BIÊN DỊCH của Java được gọi là Java compiler, nó sẽ chuyển đổi các file code thành java byte-code. Để làm gì ?

Để trình THÔNG DỊCH, được gọi là Java Virtual Machine (JVM) thông dịch (chạy) byte-code này thành ngôn ngữ máy (machine-code) để chạy. Tại sao ?

Vì có nhiều Os khác nhau về nền tảng bên dưới, nên JVM sẽ viết riêng cho những OS đó (Windows, Linux và MAC). Và JVM riêng cho từng OS này sẽ biên dịch cùng java byte-code thành machine code riêng của OS đó để thực thi đoạn lệnh. Bởi vậy, mới có định nghĩa Write Once, Run Everywhere (In theory) của Java.

Got it ?

6 Likes

Bây giờ mình có 1 tài liệu tiếng Anh, mình đưa một người dịch giùm mình rồi hôm sau đưa cho mình thì người đó gọi là Biên dịch viên. Cuốn sách sau khi dịch là sản phẩm của Biên dịch.

Nhưng giả sử bây giờ mình đi gặp mấy người nước ngoài để nc mà không biết tiếng Anh. Thì lúc này mình sẽ thuê một người thể dịch song song và liên tục cho mình với người nước ngoài kia. Thì người này được gọi là Thông dịch viên.

Vậy Biên dịch là khi bạn chuyển từ ngôn ngữ này sang ngôn ngữ khác một cách không song song. Còn thông dịch thì nó xảy ra song song; tức bạn nói “xin chào”, thì bên kia sẽ nhận được ngay là “hello”.


Tương tự như vậy cho Java.

Từ file .java ta nhờ java compiler biên dịch ra file .class chứa bytecode. Java compiler ở đây giống như anh Biên dịch viên dịch cuốn sách từ ngôn ngữ Java sang Bytecode.

Sau đó mỗi lần chạy chương trình, Java Virtual Machine mới thông dịch cho máy hiểu để có thể chạy chương trình. Thằng JVM bây giờ như anh Thông dịch viên, thông dịch cuốn sách ngôn ngữ Bytecode sang mã máy.

Tại sao lại viết ra cuốn sách Bytecode chi cho mệt vậy? :confused:
Đơn giản là khi viết ra cuốn sách Bytecode rồi, thì sau đó ta đem đi đâu mà có thằng JVM nhờ nó vừa đọc vừa dịch cho thằng mã máy nào cũng được. Đỡ phải viết tùm lum cuốn sách cho từng thằng mã máy khác nhau.

16 Likes

Đặc điểm nhận dạng:
Biên dịch: chỉ cần dịch 1 lần (java code sang bytecode, sau khi dịch xong thì có thể vứt mịa cái source đi).
Thông dịch: cần dịch nhiều lần (mỗi lần muốn chạy class file là phải gõ lệnh java helloworld.class chẳng hạn)

1 Like

Một topic khá thú vị có liên quan:

2 Likes

java là ngôn ngữ vừa thông dich vừa biên dịch , ide đóng vai trò biên dịch còn jvm là trình thông dịch , vì vậy java chạy được trên mọi nền tảng mà có jvm …

1 Like

Rất dễ hiểu. Cám ơn bạn

Vậy thì tại sao từ source code java jvm ko đem đi thông dịch cho từng máy, mà phải qua thêm công đoạn là biên dịch ra byte code ?

jvm nó dốt lắm. jvm ngày xưa học văn kém nên không hiểu nổi những dòng code java văn vẻ được, mà nó chỉ hiểu được những bytecode đơn giản thôi. Chưa kể, Java có cho hệ thống nhúng, tức cái thằng jvm trong hệ thống đó còn dốt ác nữa :frowning: Nên thôi bytecode cho lành nha.

Chưa hết, compile ra bytecode còn giúp một việc nữa là giảm tải lượng công việc cho thằng jvm nữa cơ. Goi là optimize đó.
Như có cac dev hay làm như sau

int a = 10;
a += 20;
int c = 30;
a += c;

Có thể làm nhwu trên, giúp hiểu rõ từng bước tính toán của a, giúp người khác đọc code sảng khoái hơn. Nhưng jvm đã dốt rồi còn bắt nó làm nhiều việc chi vậy :confused:
Thôi bh tui compile ra thành int a = 60; xong. Khỏe re cho jvm;

Và cái hay nữa là, khi dịch về bytecode, giả dụ Java có những syntax mới, thì javac có thể biên dịch về những lệnh bytecode của hệ thống cũ. (cross-compiling) Từ đó giúp những hệ thống cũ có thể hiểu được phần mềm mặc dù được viết bằng syntax mới không phải update hệ thống theo syntax kia. Quá xá tiện :3

8 Likes

Tuyệt vời…cho minh xin skype bạn đi…còn nhiều thứ minh muốn tìm tòi lắm…tks bạn

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?