C++ Internals ám chỉ cách trình biên dịch C++ xử lý mã nguồn .cpp và tạo ra file thực thi. C++ là ngôn ngữ phổ biến cho phần mềm hệ thống, mở rộng từ C. C++ là ngôn ngữ biên dịch (compiled language). Trình biên dịch dịch mã C++ thành file object hoặc file thực thi chứa các lệnh máy và metadata.
Cách điển hình để biên dịch chương trình C++: chạy trình biên dịch trên mã nguồn. Trình biên dịch sinh ra lệnh máy - tập hợp lệnh CPU hỗ trợ. Điều này có nghĩa là các khái niệm Hướng đối tượng (OOP) được triển khai bằng các lệnh máy. Các trình biên dịch C++ khác nhau có thể dùng chiến lược khác nhau, viết bằng ngôn ngữ khác, nhưng có mẫu chung.
Người muốn hiểu cách biên dịch code nên nắm C++ internals. Hiểu cách trình biên dịch hoạt động giúp viết code tốt hơn.
Lập trình viên viết code chế độ hỗn hợp (C, C++, assembly) sẽ thấy rất hữu ích.
Các thành phần chính của C++ Internals
- Function Overloading - Nhiều định nghĩa cho cùng một tên hàm.
- Class - Thực thể gom dữ liệu và hàm liên quan.
- Structure - Thực thể chứa dữ liệu các kiểu khác nhau.
- Constructor - Hàm mặc định của class được gọi khi tạo đối tượng.
- Destructor - Hàm mặc định của class được gọi khi hủy đối tượng.
- Inheritance - Kế thừa: sử dụng thành viên của class khác.
- Multiple Inheritance - Một class kế thừa nhiều base class.
- Multilevel Inheritance - A kế thừa B, B kế thừa C.
- Virtual Functions - Hàm được định nghĩa lại trong class con.
- Virtual Base Class - Ngăn nhiều instance của cùng base class trong kế thừa đa cấp.
Quy trình biên dịch tổng quát
- Preprocessing - Xử lý #include, #define, macro.
- Compilation - Dịch sang Assembly.
- Assembly - Dịch sang Object code (.o/.obj).
- Linking - Liên kết các object file, thư viện thành executable.
Name Mangling
C++ hỗ trợ function overloading, nên trình biên dịch phải mã hóa tên hàm (name mangling) để phân biệt các overload dựa trên tham số. Đây là lý do C++ không thể link trực tiếp với C nếu không dùng extern "C".
V-Table (Virtual Table)
Cơ chế triển khai đa hình (polymorphism) qua virtual function. Mỗi class có virtual function có một v-table con trỏ (vptr) trỏ đến bảng hàm ảo.