Cũng không hẳn là em cần phải học ASM, vì khi biên dịch ra ASM thì nó chuyển tất cả function, function pointer thành lệnh jump mất tiêu rồi, có mò cũng không biết, chưa kể dính tới bộ optimizer nữa.
Về cách chuyển từ method của OOP sang function hay procedure của lập trình thủ tục về ý tưởng là giống nhau, (kể C++ cũng thế), nhưng mỗi ngôn ngữ sẽ có cách làm hơi khác tí xíu.
Về C++, có 2 chỗ khác biệt, tất cả function và function pointer đều có address dưới dạng mã nhị phân, và 1 bảng gọi là symbol table sẽ trỏ tới các address này. Symbol table về lí thuyết sẽ lưu tất cả các token trong ngôn ngữ, từ biến, số, function, =, if, white, +, *,… nhưng thường nó chỉ lưu biến và function. Thay vì compiler chuyển từ ngôn ngữ C++ sang một ngôn ngữ đơn giản hơn (như C) thì nó sẽ chuyển tất cả method trong class, tất cả function sang address, và có các token tương ứng trong symbol table trỏ tới từng address.
Khác biệt thứ 2, là xử lí con trỏ this
, vì C++ có virtual function, nên có 1 bảng gọi là vtable để compiler biết là nên chọn method nào khi có nhiều virtual function. Sau khi nó chọn method phù hợp, compiler sẽ lấy address của method đó, rồi bỏ this
vào tham số đầu tiên như thường. Khi chuyển sang ASM, thì các bước vtable và gọi hàm nó toàn cho JUMP qua JUMP lại thì đọc hiểu thế nào được.
Mà cái chỗ xử lí this
cũng rắc rối cả ra, Python, JavaScript, Java, C++ mỗi thằng mỗi kiểu, chưa thống nhất được.