2012-08-07 30 views
16

Cách mã được viết bằng Java cần được biên dịch trong mã byte được giải thích bởi JVM, nhưng mã được viết bằng ngôn ngữ như JavaScript không cần phải được được biên dịch và có thể chạy trực tiếp trong trình duyệt?Tại sao mã Java cần phải được biên dịch nhưng mã JavaScript không

Có cách nào dễ hiểu không?

Sự khác biệt cơ bản giữa cách hai ngôn ngữ này được viết, có thể giúp hiểu hành vi này là gì?

Tôi không phải là sinh viên CS, vì vậy hãy giải thích sự ngây thơ của câu hỏi.

+3

Javascript được diễn giải bởi trình duyệt, không phải bởi phần cứng thực tế của máy tính (như C assembly) cho một. – thatidiotguy

+2

@thatidiotguy wat. JavaScript hiếm khi được giải thích những ngày này (V8 của Chrome nổi tiếng thậm chí không * có * một thông dịch viên), "C lắp ráp" không có ý nghĩa gì cả, và mã lắp ráp không được thực hiện ở tất cả, nó chỉ đơn giản là biến thành mã máy. Mặc dù tôi phải cung cấp cho bạn đạo cụ để thực hiện mã máy cũng chỉ được diễn giải vào cuối ngày. – delnan

+1

bản sao có thể có của [Ngôn ngữ biên dịch so với phiên dịch] (http://stackoverflow.com/questions/3265357/compiled-vs-interpreted-languages) – jbabey

Trả lời

19

Trước đây, JavaScript là một ngôn ngữ diễn giải. Có nghĩa là một thông dịch viên chấp nhận mã nguồn và thực hiện tất cả trong một bước. Lợi thế ở đây là sự đơn giản và linh hoạt, nhưng thông dịch viên rất chậm. Trình biên dịch chuyển đổi ngôn ngữ cấp cao sang ngôn ngữ cấp thấp hơn, hoặc là bộ xử lý gốc hoặc máy ảo (trong trường hợp này, máy ảo Java) có thể thực thi trực tiếp. Điều này nhanh hơn nhiều.

JavaScript trong trình duyệt hiện đại hiện được biên dịch nhanh chóng. Vì vậy, khi kịch bản được tải, điều đầu tiên mà công cụ JavaScript làm là biên dịch nó thành một mã byte và sau đó thực thi nó. Lý do mà toàn bộ bước biên dịch bị thiếu từ quan điểm của người dùng cuối là bởi vì các nhà phát triển trình duyệt có (may mắn) duy trì yêu cầu JavaScript không được biên dịch một cách rõ ràng.

Java là từ getgo một ngôn ngữ luôn có bước biên dịch rõ ràng. Nhưng trong nhiều trường hợp, điều đó không còn đúng nữa. IDE của IntelliJ hoặc Eclipse có thể biên dịch Java một cách nhanh chóng và trong nhiều trường hợp loại bỏ bước biên dịch rõ ràng.

3

JavaScript và Java không giống nhau. Họ có thể chia sẻ một tên tương tự, nhưng tôi giới thiệu bạn đến số JS guru - Douglas Crockford để giúp làm sáng tỏ thực tế là họ thực sự không liên quan gì cả. Thực tế là không có gì ngăn chặn Java là một ngôn ngữ thông dịch, và không có gì ngăn cản JavaScript là một ngôn ngữ được biên dịch (công cụ javascript của Chrome không biên dịch để cải thiện tốc độ và thực hiện tốt công việc này).

Trong ngữ cảnh của trình duyệt, Java chạy theo cùng một cách như Flash hoặc Silverlight - plugin là bắt buộc và trình duyệt đóng vai trò như một máy chủ lưu trữ cho plugin đó; lưu trữ môi trường chạy Java.

Javascript được thiết kế để trở thành ngôn ngữ kịch bản cho trình duyệt và đó là lý do tại sao trình duyệt có thể hiểu được nguyên bản. Tuy nhiên, trình duyệt thực sự đạt được việc chạy mã đó, hoàn toàn phụ thuộc vào trình duyệt. Nghĩa là - nó có thể hoạt động hoàn toàn ở cấp độ tập lệnh, giả sử không có kiến ​​thức về dòng mã tiếp theo và chạy một ngăn xếp dựa trên phần mềm thuần túy; hoặc nó có thể thực hiện một số JIT để có được mã gần gũi hơn với phần cứng và (hy vọng) cải thiện tốc độ.

2

Mọi ngôn ngữ đều có thể được biên dịch và diễn giải. Trong cả hai trường hợp, một phần mềm phải đọc mã nguồn, tách nó ra, phân tích nó, vv để kiểm tra các yêu cầu nhất định và sau đó gán một ý nghĩa cho mọi phần của chương trình. Sự khác biệt duy nhất là trình biên dịch sau đó tiến hành tạo mã với (gần như) cùng ý nghĩa trong một ngôn ngữ khác (mã hóa JVM, hoặc JavaScript, hoặc mã máy, hoặc cái gì đó hoàn toàn khác) trong khi trình thông dịch thực hiện nghĩa của chương trình ngay lập tức.

Bây giờ, trong thực tế, nó đơn giản và phức tạp hơn.Nó đơn giản hơn trong nhiều ngôn ngữ cho vay tốt hơn với một trong hai ngôn ngữ - Java được đánh máy tĩnh và có ít động lực về ý nghĩa của một chương trình, do đó bạn có thể biên dịch nó và do đó thực hiện một số công việc cần thực hiện tại thời gian chạy. JavaScript được nhập động và bạn không thể quyết định nhiều thứ (chẳng hạn như liệu + là bổ sung hay nối) cho đến khi chạy, do đó việc biên dịch không đủ khả năng cho bạn hiệu suất. Tuy nhiên, một sự pha trộn của trình biên dịch và thông dịch (biên dịch để đại diện trung gian đơn giản, sau đó giải thích và/hoặc biên dịch) đang ngày càng phổ biến trong việc triển khai ngôn ngữ động. Và sau đó có thực tế là việc triển khai JavaScript hiện đại làm biên dịch và trên thực tế, động cơ V8 không bao giờ diễn giải bất cứ điều gì.

0

Do tính phức tạp của mức biên dịch giữa Java và Javascript, có một số hạn chế trong Javascript. Vì bytecode được thực thi trên nền tảng JVM được viết cho việc thực thi bytecode cụ thể của hệ điều hành và phần cứng có nhiều lợi thế hơn để truy cập tài nguyên hệ thống. Ngay cả mã C cũng có thể được nhúng vào mã Java bytecode. Mặt khác Vì Javascript chỉ chạy trên trình duyệt nên ít có liên quan đến nó.

có hai phần chính tại nền tảng Java. Ngôn ngữ lập trình Java và JVM. Nó làm cho mỗi phần chỉ tập trung vào khu vực riêng của họ. Đó là lý do tại sao JVM không loại trừ cú pháp lập trình Java. Nó tương tự như khi chạy liên kết mã C không đối phó với mã C nhưng lắp ráp.

Bytecode trong nền tảng JVM có khả năng một lắp ráp trong C.

Cuối cùng tất cả các cơ quan đại diện được chuyển đổi thành biểu diễn nhị phân và sau đó các tín hiệu electirical bằng cách nào đó. Nó chứng minh rằng chúng ta cần các cấp độ lập trình.

+0

Không thể nhúng mã C vào mã JVM. Vâng, nó có thể có thể nhưng nó sẽ không được thực hiện. CLR không cho phép mã 'không an toàn ', nhưng đó là một điều hoàn toàn khác. Ngoài ra, liên quan đến JS và thế giới bên ngoài, xem V8, node.js và common.js. – delnan

+0

Tôi muốn sử dụng JNI. Bạn có thể gọi bất kỳ phương thức nào trong các tệp đối tượng (dll, do đó) –

+0

Được rồi, đó là sự thật (tôi sẽ không gọi đó là "nhúng trong bytecode java"). Nhưng bạn cũng có thể hiển thị mã gốc thông qua bất kỳ công cụ JavaScript nào. – delnan

Các vấn đề liên quan