Hướng dẫn how does the javascript v8 engine work? - công cụ javascript v8 hoạt động như thế nào?
Từ chế độ xem cấp cao, việc thực hiện động cơ JavaScript V8 bao gồm 5 bước. Show
1. Khởi tạo môi trườngVề mặt kỹ thuật, đây không phải là một phần của công việc V8. Đó là quá trình kết xuất của trình duyệt khởi tạo hai mục sau:
Một trình duyệt có nhiều quy trình kết xuất. Thông thường, mỗi tab Trình duyệt có quy trình kết xuất và khởi tạo một thể hiện V8. Nếu bạn quan tâm đến quy trình kết xuất và nhiều hơn về cách thức hoạt động của trình duyệt, hãy kiểm tra bài đăng này. Môi trường chủ là gì? Trong bối cảnh của chúng tôi, đó là trình duyệt. Do đó, chúng tôi sẽ sử dụng trình duyệt trên mạng và môi trường máy chủ có thể thay thế cho nhau trong bài đăng này. Tuy nhiên, hãy nhớ rằng trình duyệt chỉ là một trong những môi trường máy chủ cho JavaScript. Một người nổi tiếng khác là môi trường chủ của nút. Có gì trong môi trường chủ?Môi trường máy chủ cung cấp mọi thứ mà động cơ JavaScript dựa trên, bao gồm:
Tương tác người dùng trên trang web kích hoạt một loạt các sự kiện. Trình duyệt đã thêm chúng vào hàng đợi gọi lại cùng với các chức năng gọi lại liên quan. Vòng lặp sự kiện hoạt động giống như một vòng lặp vô hạn trong khi vòng lặp tiếp tục lấy lại một cuộc gọi lại từ hàng đợi. Sau đó, JavaScript trong cuộc gọi lại được biên dịch và thực thi. Một số dữ liệu trung gian được lưu trữ trong ngăn xếp cuộc gọi. Một số được lưu trong đống, chẳng hạn như một mảng hoặc một đối tượng. Tại sao trình duyệt lưu trữ dữ liệu ở hai nơi khác nhau?
Theo tôi, ngăn xếp cuộc gọi và vòng lặp sự kiện là hai cơ chế quan trọng để hiểu cách thức hoạt động của JavaScript, vượt ra ngoài bài đăng này.
Động cơ V8 dựa vào và trao quyền cho môi trường máy chủMôi trường máy chủ của V8 giống như hệ điều hành máy tính của bạn thành phần mềm. Softwares dựa vào hệ điều hành để chạy. Trong khi đó, họ trao quyền cho hệ thống của bạn để thực hiện rất nhiều nhiệm vụ nâng cao. Lấy Photoshop, ví dụ. Nó cần được chạy trên Windows hoặc MacOS. Trong khi đó, hệ điều hành của bạn không thể tạo ra một poster đẹp cho bạn, nhưng Photoshop có thể. Giống như động cơ V8, nó cung cấp các tính năng bổ sung trên đầu môi trường máy chủ:
Khi môi trường máy chủ và động cơ V8 đã sẵn sàng, động cơ V8 khởi động bước tiếp theo. 2. Biên dịch mã JavaScriptỞ bước này, động cơ V8 chuyển đổi mã JavaScript thành Cây cú pháp trừu tượng (AST) và tạo phạm vi. Động cơ V8 không nói ngôn ngữ JavaScript. Kịch bản cần được cấu trúc trước khi xử lý. AST là một cấu trúc cây, dễ dàng để V8 tiêu hóa. Trong khi đó, phạm vi được tạo ra ở bước này, bao gồm phạm vi toàn cầu và nhiều phạm vi hơn ở đầu nó được lưu trữ trong môi trường máy chủ. Phạm vi tự nó có giá trị một bài khác để giải thích. Bạn có thể bỏ qua nó một cách an toàn ở đây. Làm thế nào một AST trông như thế nào? Hãy để kiểm tra một ví dụ đơn giản bằng cách hiển thị JavaScript sau ở định dạng AST. const medium = 'good ideas'; Mỗi dòng của mã JavaScript của bạn sẽ được chuyển đổi thành AST, giống như ví dụ ở bước này. 3. Tạo mã byteỞ bước này, động cơ V8 lấy AST và phạm vi và đầu ra byte. Làm thế nào để các byte trông như thế nào? Hãy cùng sử dụng cùng một ví dụ, lần này, với D8, vỏ phát triển của Chrome V8. Để cài đặt D8 trong macOS, hãy chạy lệnh sau trong thiết bị đầu cuối. brew install v8 Lưu mã ví dụ của chúng tôi trong tệp JavaScript d8 --print-bytecode v8.js D8 in các byte được tạo dựa trên AST và phạm vi từ bước cuối cùng. [generated bytecode for function: (0x0ee70820ffed
4. Giải thích và thực thi BytecodesCác byte là một tập hợp các hướng dẫn. Ở bước này, trình thông dịch sẽ thực thi từng dòng byte từ trên xuống dưới. Trong ví dụ trước, chúng ta thấy 4 byte sau đây. LdaConstant [0] Mỗi dòng của các byte giống như một khối Lego được đúc sẵn. Cho dù mã của bạn ưa thích đến mức nào, tất cả đều được xây dựng với các khối cơ bản phía sau cảnh. Các chi tiết của mỗi mã byte nằm ngoài phạm vi của bài đăng này. Nếu bạn quan tâm đến nó, đây là danh sách đầy đủ các byte V8. 5. Biên dịch và thực thi mã máyBước này song song với bước trước. Khi thực hiện các byte, V8 tiếp tục giám sát các mã và tìm kiếm cơ hội để tối ưu hóa chúng. Khi một số mã byte được sử dụng thường xuyên được sử dụng, V8 đánh dấu chúng là nóng. Mã nóng sau đó được chuyển đổi thành mã máy hiệu quả và được CPU tiêu thụ. Điều gì sẽ xảy ra nếu tối ưu hóa thất bại? Trình biên dịch khử tối ưu hóa mã và để trình thông dịch thực thi các byte bản gốc. Bytecodes so với mã máyNhưng tại sao V8 không sử dụng mã máy nhanh hơn trực tiếp? Willn giới thiệu các byte trung gian làm chậm toàn bộ quá trình? Về mặt lý thuyết, vâng. Nhưng đó không phải là toàn bộ câu chuyện. Thật thú vị, đó chính xác là cách nhóm V8 ban đầu thiết kế động cơ JavaScript. Ở độ tuổi của V8, các bước như sau:
Mặc dù ngày nay, cấu trúc V8 V8 phức tạp hơn, ý tưởng cơ bản vẫn giữ nguyên. Tuy nhiên, nhóm V8 giới thiệu các byte khi động cơ phát triển. Tại sao? Bởi vì sử dụng mã máy dọc theo mang lại một số rắc rối. 1. Mã máy đòi hỏi một lượng bộ nhớ lớnĐộng cơ V8 được lưu trữ mã máy tuân thủ trong bộ nhớ để sử dụng lại chúng khi tải trang. Khi được biên dịch vào mã máy, JavaScript 10K có thể thổi vào mã máy 20m. Đó là khoảng 2.000 lần không gian bộ nhớ lớn hơn. Làm thế nào về kích thước của các byte trong cùng một trường hợp? Đó là khoảng 80k. Bytecodes vẫn còn lớn hơn so với JavaScript ban đầu, nhưng nó nhỏ hơn mã máy tương ứng của nó. Ngày nay, người ta thường thấy các tệp JavaScript trên 1M. Tiêu thụ bộ nhớ 2G cho mã máy không phải là một ý tưởng tốt. Nhờ giảm kích thước, một trình duyệt có thể lưu trữ tất cả các byte được biên dịch, bỏ qua tất cả các bước trước đó và thực hiện trực tiếp chúng. 2. Mã máy không phải lúc nào cũng nhanh hơn các mã byteMã máy mất nhiều thời gian hơn để biên dịch, mặc dù nó đang chiếu sáng nhanh về mặt thực thi. Bytecodes cần một thời gian ngắn hơn để biên dịch, nhưng sự đánh đổi là bước thực hiện chậm hơn. Một thông dịch viên cần phải giải thích bytecodes trước khi thực hiện chúng. Khi chúng ta đo cả hai tùy chọn từ đầu đến cuối, cái nào nhanh hơn? Nó phụ thuộc. Nghệ thuật đang tìm kiếm sự cân bằng giữa hai tùy chọn này trong khi phát triển một trình thông dịch mạnh mẽ và trình biên dịch tối ưu hóa thông minh cho các mã byte. Đánh lửa, phiên dịch V8 sử dụng, là người nhanh nhất trên thị trường. Trình biên dịch tối ưu hóa trong V8 là Turbofan nổi tiếng, biên dịch các mã máy được tối ưu hóa cao từ byte. 3. Mã máy làm tăng sự phức tạp trong phát triểnCPU khác nhau có thể có các cấu trúc khác nhau. Mỗi người chỉ có thể hiểu một loại mã máy. Có rất nhiều thiết kế cấu trúc bộ xử lý trên thị trường. Đến tên một vài:
Nếu trình duyệt chỉ sử dụng mã máy, nó cần phải chăm sóc rất nhiều trường hợp riêng biệt. Là một nhà phát triển, chúng tôi biết rằng, không phải là một thực tiễn tốt bằng trực giác. Chúng ta cần một bản tóm tắt. Bytecodes là bản tóm tắt giữa JavaScript và CPU. Bằng cách giới thiệu các byte trung gian, nhóm V8 sẽ giảm khối lượng công việc để biên dịch mã máy. Trong khi đó, nó giúp V8 di chuyển đến các nền tảng mới một cách dễ dàng. TakeawaysĐặt mọi thứ lại với nhau, bây giờ chúng ta có thể thấy một phiên bản hoàn thành về cách Chrome V8 hoạt động từ chế độ xem cấp cao. Tài nguyên và tài liệu tham khảo
Động cơ JavaScript hoạt động như thế nào?Động cơ JavaScript hoạt động như thế nào? Công cụ JavaScript hoạt động trên mã nguồn JavaScript và đặt nó và sau đó thực thi việc biên dịch cho các hướng dẫn nhị phân (mã máy) dễ dàng hiểu được bởi CPU.works on the JavaScript source code and puts it and then executes the compilation to binary instructions (machine code) that are easily understandable by the CPU.
Tại sao động cơ V8 JavaScript nhanh?Khi lần đầu tiên thực hiện mã JavaScript, V8 tận dụng toàn bộ mã hóa trực tiếp dịch JavaScript được phân tích cú pháp vào mã máy mà không có bất kỳ chuyển đổi nào.Điều này cho phép nó bắt đầu thực thi mã máy rất nhanh.V8 leverages full-codegen which directly translates the parsed JavaScript into machine code without any transformation. This allows it to start executing machine code very fast.
JavaScript chạy trên động cơ nào?V8 từ Google là công cụ JavaScript được sử dụng nhiều nhất.Google Chrome và nhiều trình duyệt dựa trên crom khác sử dụng nó, cũng như các ứng dụng được xây dựng với CEF, electron hoặc bất kỳ khung nào khác nhúng crom.Sử dụng khác bao gồm nút.Hệ thống thời gian chạy của JS và Deno. is the most used JavaScript engine. Google Chrome and the many other Chromium-based browsers use it, as do applications built with CEF, Electron, or any other framework that embeds Chromium. Other uses include the Node. js and Deno runtime systems.
Tại sao nó được gọi là động cơ V8 JavaScript?Chrome V8 là một công cụ JavaScript, có nghĩa là nó thực thi mã JavaScript.Ban đầu, JavaScript được viết để được thực hiện bởi các trình duyệt web.Chrome V8, hoặc chỉ V8, có thể thực thi mã JavaScript trong hoặc ngoài trình duyệt, điều này làm cho kịch bản phía máy chủ có thể.it executes JavaScript code. Originally, JavaScript was written to be executed by web browsers. Chrome V8, or just V8, can execute JavaScript code either within or outside of a browser, which makes server-side scripting possible. |