Register-Based VM
Chuyển VM sang mô hình thực thi dựa trên thanh ghi để chạy nhanh hơn và có hình dạng VM khác với mặc định.
Tùy chọn vmRegisterBased chuyển VM từ bytecode dựa trên stack mặc định sang mô hình thực thi dựa trên thanh ghi. Trong một số trường hợp, điều này cải thiện hiệu năng chạy của VM khoảng 10-20%, đổi lại bundle đã làm rối lớn hơn một chút.
Bật tùy chọn này sẽ tắt Stateful Opcodes (vmStatefulOpcodes): hai tùy chọn này không tương thích, nên nếu vmStatefulOpcodes đang bật, bản dựng dựa trên thanh ghi sẽ âm thầm bỏ nó.
Dựa trên stack và dựa trên thanh ghi
VM dựa trên stack giữ các toán hạng trên một stack ngầm định: mỗi giá trị được đẩy vào, được lệnh tiếp theo sử dụng, và kết quả lại được đẩy trở lại. Ngược lại, VM dựa trên thanh ghi truy cập trực tiếp các toán hạng của nó, nên cùng một công việc được diễn đạt bằng ít lệnh hơn và không có thao tác push/pop giữa các lệnh. Đó là nguồn gốc của mức tăng tốc lúc chạy, và cũng là lý do bytecode lớn hơn một chút, vì giờ đây mỗi lệnh phải ghi rõ nó đọc và ghi những thanh ghi nào thay vì để chúng ngầm định trên stack.
Cả hai mô hình đều không thay đổi những gì mã của bạn làm hay những gì VM bảo vệ. Chúng là hai cách mã hóa của cùng một logic đã được ảo hóa; mô hình dựa trên thanh ghi chỉ đơn giản là đánh đổi một chút kích thước lấy một chút tốc độ.
Khi nào nên dùng
Hãy dùng nó khi chi phí chạy của VM là quan trọng. Mã đã ảo hóa vốn chậm hơn JavaScript thuần theo thiết kế, nên trên một đường chạy nóng (một vòng lặp hoạt ảnh, một handler chạy mỗi khung hình, một thủ tục phân tích cú pháp chặt chẽ), khoảng 10-20% mà bộ thực thi dựa trên thanh ghi có thể tiết kiệm được là xứng đáng với bundle lớn hơn. Với mã hiếm khi chạy, chi phí kích thước thường không đáng. Mức tăng phụ thuộc vào mã, nên hãy đo trên chính các đường chạy nóng của bạn.
Nó cũng làm thay đổi hình dạng của VM. Vì nó tạo ra bytecode và bộ thực thi có cấu trúc khác, đầu ra mang một dấu vân tay khác với VM dựa trên stack phổ biến. Các phân tích chung dựa trên mẫu được tinh chỉnh cho hình dạng dựa trên stack đó sẽ khó nhận ra một bản dựng dựa trên thanh ghi hơn, nên đây là một cách để đưa VM được phát hành ra xa khỏi dạng mặc định.
Cách hoạt động bên trong
Đây không phải là một trình biên dịch dựa trên thanh ghi nguyên bản. Trình biên dịch dựa trên stack thông thường vẫn tạo bytecode đúng như khi không có tùy chọn này; sau đó một giai đoạn biến đổi riêng viết lại bytecode đó sang dạng dựa trên thanh ghi. Vì mô hình dựa trên thanh ghi nằm ở phía sau tất cả các bước đó, phần lớn làm rối VM (nhắm mục tiêu, Bytecode Encoding, các tùy chọn dispatcher) không bị ảnh hưởng (ngoại trừ Stateful Opcodes, xem ở trên).
Yêu cầu
- Cần
vmObfuscation: tùy chọn này chỉ định hình lại VM màvmObfuscationtạo ra. - Phiên bản obfuscator 7.12.0 trở lên.
Tùy chọn này đang ở giai đoạn thử nghiệm. Bước viết lại dựa trên thanh ghi mới hơn và ít được kiểm chứng thực tế hơn so với đường dựa trên stack mặc định, vì vậy hãy kiểm thử để chắc chắn mã của bạn chạy đúng khi bật vmRegisterBased trước khi phát hành. Lời khuyên này áp dụng cho mọi tùy chọn VM, nhưng ở đây càng quan trọng gấp đôi.
Ví dụ
Thực thi dựa trên thanh ghi kết hợp được với phần còn lại của làm rối VM: Bytecode Encoding, Compact Dispatcher, VM Self Defending và VM Domain Lock đều hoạt động đúng như với VM dựa trên stack mặc định. Nó thay đổi cách bytecode được thực thi, không thay đổi các lớp bảo vệ bao quanh nó.
