V8 là tên của công cụ JavaScript hỗ trợ Google Chrome. Đó là thứ lấy JavaScript của chúng tôi và thực thi nó trong khi duyệt bằng Chrome
V8 cung cấp môi trường thời gian chạy trong đó JavaScript thực thi. DOM và các API nền tảng web khác do trình duyệt cung cấp
Điều thú vị là công cụ JavaScript độc lập với trình duyệt mà nó được lưu trữ. Tính năng chính này đã kích hoạt sự phát triển của Node. js. V8 được chọn là động cơ được chọn bởi Node. js trở lại vào năm 2009 và sự phổ biến của Node. js bùng nổ, V8 trở thành công cụ hiện hỗ trợ một lượng mã phía máy chủ đáng kinh ngạc được viết bằng JavaScript
nút. js rất lớn và nhờ đó, V8 cũng cung cấp năng lượng cho các ứng dụng dành cho máy tính để bàn, với các dự án như Electron
Các công cụ JS khác
Các trình duyệt khác có công cụ JavaScript của riêng họ
- Firefox có Spidermonkey
- Safari có JavaScriptCore [còn gọi là Nitro]
- Cạnh có Chakra
và nhiều người khác cũng tồn tại
Tất cả các công cụ đó đều triển khai tiêu chuẩn ECMA ES-262, còn được gọi là ECMAScript, tiêu chuẩn được sử dụng bởi JavaScript
Động cơ Chrome V8
- Công cụ V8 được viết bằng C ++ và được sử dụng trong Chrome và Nodejs
- Nó triển khai ECMAScript như được chỉ định trong ECMA-262
- Động cơ V8 có thể chạy độc lập, chúng tôi có thể nhúng nó vào chương trình C++ của riêng mình
Hãy để chúng tôi hiểu điểm cuối cùng tốt hơn một chút. V8 có thể chạy độc lập và đồng thời chúng tôi có thể thêm triển khai chức năng của riêng mình trong C++ để thêm các tính năng mới cho JavaScript
Ví dụ. print['hello world']
không phải là một câu lệnh hợp lệ trong Node. js. Nó sẽ báo lỗi nếu chúng ta biên dịch nó. Nhưng chúng ta có thể thêm triển khai chức năng in của riêng mình trong C++ trên V8, mã nguồn mở tại Github, do đó làm cho chức năng in hoạt động nguyên bản. Điều này cho phép JavaScript hiểu nhiều hơn những gì tiêu chuẩn ECMAScript chỉ định mà JavaScript nên hiểu
Đây là một tính năng mạnh mẽ vì C ++ có nhiều tính năng hơn với tư cách là ngôn ngữ lập trình so với JavaScript, vì nó gần với phần cứng hơn như xử lý các tệp và thư mục trên ổ cứng
Việc cho phép chúng tôi viết mã bằng C++ và cung cấp mã đó cho JavaScript giúp chúng tôi có thể thêm nhiều tính năng hơn vào JavaScript
Nút. js tự nó là một triển khai C++ của công cụ V8 cho phép lập trình phía máy chủ và các ứng dụng mạng
Bây giờ chúng ta hãy xem xét một số mã nguồn mở bên trong công cụ. Để làm điều này, bạn cần vào v8/samples/shell. thư mục cc
Tại đây, bạn có thể thấy việc triển khai các chức năng khác nhau, chẳng hạn như Print
và Read,
vốn không có sẵn trong Node. js
Tìm kiếm hiệu suất
V8 được viết bằng C++ và nó liên tục được cải tiến. Nó có thể di động và chạy trên Mac, Windows, Linux và một số hệ thống khác
Trong phần giới thiệu V8 này, tôi sẽ bỏ qua các chi tiết triển khai của V8. chúng có thể được tìm thấy trên các trang web có thẩm quyền hơn [e. g. trang web chính thức của V8] và chúng thay đổi theo thời gian, thường là triệt để
V8 luôn phát triển, giống như các công cụ JavaScript khác xung quanh, để tăng tốc Web và Nút. hệ sinh thái js
Trên web, có một cuộc đua về hiệu suất đã diễn ra trong nhiều năm và chúng tôi [với tư cách là người dùng và nhà phát triển] được hưởng lợi rất nhiều từ cuộc cạnh tranh này vì chúng tôi nhận được các máy nhanh hơn và tối ưu hơn qua từng năm
biên soạn
JavaScript thường được coi là một ngôn ngữ được giải thích, nhưng các công cụ JavaScript hiện đại không còn chỉ giải thích JavaScript, chúng biên dịch nó
Điều này xảy ra từ năm 2009 khi trình biên dịch JavaScript SpiderMonkey được thêm vào Firefox 3. 5, và mọi người đã làm theo ý tưởng này
JavaScript được V8 biên dịch nội bộ với trình biên dịch just-in-time [JIT] để tăng tốc độ thực thi
Điều này có vẻ phản trực giác, nhưng kể từ khi Google Maps ra đời vào năm 2004, JavaScript đã phát triển từ một ngôn ngữ thường thực thi vài chục dòng mã thành các ứng dụng hoàn chỉnh có hàng nghìn đến hàng trăm nghìn dòng chạy trong trình duyệt
Các ứng dụng của chúng tôi hiện có thể chạy hàng giờ bên trong trình duyệt, thay vì chỉ là một vài quy tắc xác thực biểu mẫu hoặc tập lệnh đơn giản
Trong thế giới mới này, việc biên dịch JavaScript có ý nghĩa hoàn hảo bởi vì mặc dù có thể mất thêm một chút thời gian để JavaScript sẵn sàng, nhưng sau khi hoàn thành, nó sẽ hiệu quả hơn nhiều so với mã được diễn giải thuần túy
Javascript nổi tiếng trong giới lập trình viên là một ngôn ngữ tệ hại. Nó không có lớp, gõ lỏng lẻo và bị cản trở bởi các vấn đề về trình duyệt chéo. Douglas Crockford, tác giả của JavaScript. The Good Parts, cho biết “JavaScript chứa một số ý tưởng hay nhất từng được đưa vào ngôn ngữ lập trình và nó chứa một số ý tưởng tồi tệ nhất từng được đưa vào ngôn ngữ lập trình. ” Nó được tạo ra chỉ trong 10 ngày vào năm 1995 và không được tiêu chuẩn hóa bởi ECMA cho đến gần 3 năm sau. Microsoft ban đầu quyết định không triển khai các tiêu chuẩn mới, gần như đặt dấu chấm hết cho ngôn ngữ sơ khai
Công cụ JavaScript đầu tiên, có tên mã là SpiderMonkey, được xây dựng cho Netscape Navigator và chỉ đơn giản là một trình thông dịch đọc và thực thi mã nguồn. Vào thời điểm đó và trong nhiều năm sau đó, Javascript thường bao gồm một số chức năng được viết vào phần đầu của trang web hoặc một số sự kiện nội tuyến. Phiên dịch mã khi cần là thỏa đáng, nếu không nhanh
Chúng ta sẽ bỏ qua 10 năm đầy biến động tiếp theo, đến năm 2004, khi Google giới thiệu một ứng dụng mới; . Đối với Javascript và các nhà phát triển ở khắp mọi nơi, đó là một công cụ thay đổi cuộc chơi. Một người thay đổi cuộc chơi rất, rất chậm. Các trình duyệt bị sa lầy vì công cụ JavaScript chỉ đơn giản là cày xới tất cả mã đó.
Đã có vô số trang và bit dành riêng cho việc giải thích và mô tả về các công cụ JavaScript, hãy xem phần 'Tìm hiểu thêm" ở cuối bài đăng này để biết ví dụ. Và đó là một chủ đề mà ngay cả hầu hết các nhà phát triển JS chuyên nghiệp cũng không hiểu rõ về nó. Vì vậy, tôi muốn cung cấp cho bạn một cái nhìn tổng quan rất ngắn gọn về động cơ, đặc biệt là món đồ chơi bóng bẩy nhất hiện nay, động cơ V8
Hầu hết các công cụ Javascript xử lý mã trong một vài bước. Đầu tiên, phân tích từ vựng chia mã thành các mã thông báo để xác định ý nghĩa của chúng. Sau đó, mã thông báo được phân tích bởi trình phân tích cú pháp và được tích hợp vào cây cú pháp bằng ngôn ngữ trung gian, chẳng hạn như mã byte. Cuối cùng, trình biên dịch JIT khởi động và thực thi mã
Vào năm 2008, Google đã giới thiệu phiên bản cải tiến của động cơ, V8
Động cơ V8 sử dụng một số luồng. Chủ đề chính làm những gì bạn mong đợi. nó tìm nạp mã của bạn, biên dịch mã và thực thi mã đó. Ngoài ra còn có một luồng riêng biệt để biên dịch, để luồng chính có thể tiếp tục thực thi trong khi luồng này đang tối ưu hóa mã và một luồng trình lược tả sẽ cho bộ thực thi biết phương thức nào chúng ta dành nhiều thời gian, để trình biên dịch có thể tối ưu hóa chúng. Ngoài ra còn có một số chủ đề để xử lý thu gom rác và loại bỏ mã chết
V8 có 2 trình biên dịch là Full-Codegen và Crankshaft. Full-Codegen phân tích cú pháp JavaScript trực tiếp thành mã máy mà không cần ngôn ngữ trung gian, cho phép nó bắt đầu thực thi sớm hơn. Trình biên dịch JIT có tên là Crankshaft tạo mã được tối ưu hóa cho các phương thức nóng. Điều này có nghĩa là trong cùng một chương trình V8, các mức mã được tối ưu hóa khác nhau cùng tồn tại cùng một lúc
Trục khuỷu là nơi tốc độ thực sự bắt nguồn. Trong khi Full-Codgen đang chạy, trình cấu hình thời gian chạy xác định "mã nóng", mã được thực thi nhiều lần. Tại thời điểm này, chuỗi hiện tại ngừng thực thi mã của bạn và chuyển nó tới Trục khuỷu. Cơ sở ở đây cho tất cả các tối ưu hóa là bộ nhớ đệm nội tuyến, một kỹ thuật được tiên phong bởi Smaltalk. Nó bao gồm việc vá mã bằng mã tốt hơn ngay lập tức
JS được phân tích cú pháp trước tiên được biên dịch thành một biểu diễn cấp cao có tên là Hydrogen, nơi hầu hết các tối ưu hóa được thực hiện. Đây là nơi chuyên môn hóa xảy ra. Chuyên môn hóa loại bỏ cái mà JavaScript gọi là thao tác đóng hộp và mở hộp. Vì vậy, ví dụ: nếu tập lệnh của bạn thường chạy một hàm trên một tập hợp các số nguyên, thì nó sẽ tránh sắp xếp qua tất cả các bước cần thiết để phân tích chuỗi và số float, đồng thời lưu các bước cần thiết để phân tích cú pháp các số nguyên của bạn để nó không phải chạy chúng
Vì JS không được nhập, nên không có gì đảm bảo rằng mã được tạo chuyên biệt sẽ tiếp tục hoạt động. Hàm của bạn có thể được gọi để hoạt động với chuỗi hoặc nhân đôi. Mã này hiện phải được hủy tối ưu hóa, rút ra khỏi chuỗi đang chạy và thay thế bằng mã thời gian chạy ban đầu. Điều này được thực hiện bằng một kỹ thuật gọi là thay thế trên ngăn xếp [OSR]. OSR là cơ chế duy trì ngữ nghĩa của khung ngăn xếp hiện tại trong khi chuyển đổi giữa mã được tối ưu hóa và mã không được tối ưu hóa. Sử dụng OSR, khi các loại đối số chức năng của bạn chuyển đổi, mã được tối ưu hóa sẽ được kéo và chuỗi của bạn được đưa trở lại chuỗi được tạo Hydrogen ban đầu để biên dịch lại
Công việc cuối cùng của trục khuỷu là hạ thấp biểu diễn xuống một mức gọi là Lithium, là kiến trúc cụ thể. Lithium là đại diện cuối cùng được dịch thành mã máy. Ở đây, chúng ta lại thấy OSR. Mã đã chạy trong trình duyệt hoặc ứng dụng của bạn trong khi tất cả các bước này đang diễn ra và bây giờ chúng tôi đã có phiên bản được biên dịch và tối ưu hóa đầy đủ, chúng tôi có thể chuyển sang phiên bản được tối ưu hóa ở giữa quá trình thực thi
Chỉ cần chạy đồng thời hai trình biên dịch sẽ tăng hiệu suất lên 27%. Và nó không được thực hiện. Cứ sau sáu tuần, nhóm V8 lại phát hành một nhánh mới. Vào ngày 11 tháng 9, nhóm đã công bố phiên bản 6. 2, sẽ được phát hành cùng với Chrome 62 sau vài tuần nữa. Phiên bản tiếp theo này bao gồm cái mà nhóm gọi là “tất cả các loại tiện ích dành cho nhà phát triển” và tối ưu hóa hiệu suất. Bạn có thể đọc về bản phát hành tiếp theo TẠI ĐÂY
Tìm hiểu thêm
Kênh nhà phát triển Chrome V8. https. // nhà phát triển. Google. com/v8/
Chương trình lập trình viên mũ đỏ. Công cụ Javascript & So sánh hiệu suất [V8, Chakra, Chakra Core]. https. // nhà phát triển. Mũ đỏ. com/blog/2016/05/31/javascript-engine-performance-comparison-v8-charkra-chakra-core-2/