Taming architecture complexity in V8 — the CodeStubAssembler
Bài tóm tắt V8 (Google) 2017 4. Điều chỉnh Độ khó: Nâng cao
V8 (Google) · 2017 · 4. Điều chỉnh · Độ khó: Nâng cao — bài gốc
Bối cảnh
- Builtin là các hàm có sẵn trong mọi chương trình JavaScript (
Array.prototype.*...). V8 viết chúng theo hai cách, cả hai đều có giá:- Self-hosted bằng một phương ngữ JavaScript nội bộ: dễ viết, nhưng phải qua giai đoạn khởi động, thu type feedback rồi mới được TurboFan tối ưu, nên lần gọi đầu chậm.
- Assembly viết tay cho các trường hợp phổ biến: nhanh ngay lần đầu, gọi theo ABI riêng của V8 không qua trampoline sang C++. Qua nhiều năm tích luỹ hàng chục nghìn dòng assembly cho mỗi kiến trúc, khó bảo trì và dễ lỗi khi chuẩn ngôn ngữ thêm tính năng mới.
Thay đổi chính
- Khi có TurboFan, backend của nó có một IR máy dùng chung cho mọi kiến trúc, cùng instruction selector, register allocator, scheduler, và đã biết các mẹo của assembly viết tay (ABI theo thanh ghi, tail call, bỏ stack frame cho hàm lá).
- CodeStubAssembler (CSA): API C++ sinh thẳng IR máy của TurboFan, bỏ qua bước parse JavaScript và các tối ưu riêng cho JS. Có lệnh nguyên thuỷ gần một-một với assembly và "macro" C++ tái dùng được (
TaggedIsSmi,LoadStringLength). - CSA kiểm kiểu ở mức IR lúc build (không thể dùng con trỏ object làm đầu vào phép nhân 32-bit), tự cấp phát thanh ghi và spill, hiểu cả ABI C++ lẫn ABI nội bộ, có khung test viết bằng C++.
- Bytecode handler của interpreter Ignition cũng sinh bằng CSA, nên builtin viết bằng CSA được inline thẳng vào handler.
Vì sao
- Theo đội V8, CSA giữ hiệu năng của assembly viết tay mà bỏ được phần dễ vỡ, nên tăng tốc độ tối ưu các tính năng mới của ngôn ngữ (bài liệt kê vài cải thiện hiệu năng lớn ở các bản trước đó, như Proxy).
Bài học cho SWE
- Code hiệu năng cao viết riêng cho từng nền tảng là nợ nhân theo số nền tảng; khi đã có một IR chung tốt (ở đây là backend compiler sẵn có), đưa code đó về IR là bước rút nợ.
- Một DSL nhúng (C++ sinh IR) có kiểm kiểu và test chặn được lớp lỗi mà ngôn ngữ thấp hơn không chặn được.
Liên quan
- Đổi ngôn ngữ và runtime
- Cùng công ty: V8 (Google) 2019 · V8 (Google) 2019 · V8 (Google) 2021 (compiler không tối ưu sinh thẳng từ bytecode, cùng ý giảm chi phí khởi động)
#builtins#self-hosted JavaScript#hand-written assembly#CodeStubAssembler#TurboFan backend#machine IR#Ignition bytecode handlers#register allocation#cross-platform
Được nhắc tới trong
Chủ đề (1)
Công ty (1)
Bài tóm tắt (1)