Javascript là ngôn ngữ thông dịch nhưng từ khi có nodejs nó thành biên dịch?

mình có đọc là javascript là ngôn ngữ thông dịch nhưng từ khi có nodejs nó thành biên dịch. ai hiểu dõ về cái này có thể giải thích cho mình được không

bạn chỉ cho mình thấy lý do bạn gọi nó là biên dịch được không?

3 Likes

Bản chất của Node.js vừa là trình biên dịch, vừa là trình thông dịch nhưng dạng biên dịch của nó khá đặc biệt, nó được gọi là Biên dịch tại chỗ (Just-in-time compilation) giống Java, mà tất nhiên Node.js không tạo ra từ Java, nó được tạo ra dựa trên V8 Engine của Chrome (đây là phần mềm dùng để biên dịch code Javascript trên Chrome nói riêng và các trình duyệt nhân Chronium nói chung). Mà V8 Engine lại được tạo ra bằng C và C++ :kissing:.

Ngoài ra, Node.js là một Javascript runtime được xây dựng dựa trên V8 Engine, chính trang chủ của nó đã ghi rất rõ ràng.

5 Likes

Từ độ dài câu trả lời và cách hỏi hời hợt của bạn, mình chỉ đưa hint, còn lại bạn nên tự search Google.

JavaScript trên V8 là biên dịch, không có thông dịch, và runtime có 2 loại runtime khác nhau: 1 JS runtime chạy lúc bắt đầu Event Loop, các JS runtime phát sinh chạy trong các lần Event Loop sau.

5 Likes

@hungsteve Và có một điếm vô lí (chắc thế?) là Javascript là một ngôn ngữ thông dịch mặc dù V8 và SpiderMoney là trình biên dịch, nó biên dịch Javascript thành bytecode, mà khoan bytecode hình như được dùng trong trình thông dịch thì phải và nó không phải là mã máy :thinking: ? Dù sao thì cơ chế hoạt động của Javascript trên V8 hay SpiderMonkey cũng khá giống Java. Và cách Node.js chạy code Javascript lại theo hướng thông dịch? Mà dù sao thì có trang này có câu hỏi liên quan đến chủ đề của topic này

https://www.quora.com/Is-Node-js-compiled-or-interpreted

3 Likes

Tựu chung lại thế này, ai bảo Javascript là ngôn ngữ biên dịch vậy :thinking:? Nó vẫn là ngôn ngữ thông dịch, Wikipedia có dùng từ “theo phiên bản hiện hành” rồi:

Đúng là JavaScript được biên dịch trên V8, SpiderMonkey,…nhưng không phải là biên dịch thành mã máy mà là biên dịch thành bytecode, có lẽ vì thế nó vẫn được gọi là ngôn ngữ thông dịch, ngoài cái lí do cái khái niệm đó xuất hiện từ lâu rồi và nó là một ngôn ngữ kịch bản ra (để ý chữ “script” trong Javascript). Còn Node.js là một Javascript runtime dựa trên V8, nó vừa là trình biên dịch, vừa là trình thông dịch. Còn muốn tìm hiểu kĩ hơn thì bạn nên lên Google tìm như @hungsteve nói.

3 Likes

Mô hình chia thành Front Compiler và Back Compiler có từ lâu rồi, Front Compiler nhận input là source code, compile/interpret thành output là intermediate code, Back Compiler nhận input là intermediate code, compile/interpret thành output là destination code.

Các compiler có 2 pha front và back trước đây như: LLVM (Clang) của C++, .NET của C#, JVM của Java. V8 cũng là compiler có 2 pha, front compiler là Ignition, back compiler là TurboFan, intermediate code thì gọi là bytecode.

Còn nhập nhằng biên dịch hay thông dịch thường đến từ back compiler, hay TurboFan của V8 engine. TurboFan dựa trên lịch sử runtime trước đó mà chọn khối bytecode mà compile ra machine code. Do các bước compile 1 khối bytecode tương tự như quá trình compile toàn bộ mã nguồn 1 file, khác với interpreter chỉ cần phân tích 1 câu lệnh (không cần kiểm tra ngữ nghĩa giữa biến, biểu thức, hàm), nên đa số vẫn xem back compiler, hay TurboFan, là compiler hơn là interpreter. Với 2 phần front-end và back-end đều là compiler nên tựu chung nó vẫn là compiler, tức là biên dịch.

Về lý do việc nêu lên 2 cái runtime trước và sau Event Loop, là để cho thấy có 1 phần JavaScript sẽ trực tiếp biên dịch ra mã máy, không dựa vào optimization plan nào cả, hay không phụ thuộc vào TurboFan.

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