### Nguyên lý hoạt động của quá trình biên dịch trong C++
Quá trình biên dịch trong C++ là quy trình chuyển đổi mã nguồn (source code) thành mã máy (machine code) để tạo ra tệp thực thi (executable file). Quá trình này thường bao gồm nhiều bước, mỗi bước có vai trò riêng. Dưới đây là các bước chính trong quá trình biên dịch:
### Các bước trong quá trình biên dịch
1. **Viết mã nguồn**:
- **Mô tả**: Người lập trình viết mã nguồn bằng ngôn ngữ C++ và lưu vào tệp với phần mở rộng `.cpp`.
- **Vai trò**: Đây là giai đoạn đầu tiên, nơi lập trình viên phát triển ứng dụng hoặc chương trình.
2. **Tiền xử lý (Preprocessing)**:
- **Mô tả**: Trình biên dịch thực hiện tiền xử lý các chỉ thị như `#include`, `#define`, và `#ifdef`.
- **Vai trò**: Kết quả của bước này là một mã nguồn đã được mở rộng, không còn chứa các chỉ thị tiền xử lý. Nó giúp chuẩn bị mã nguồn cho bước biên dịch tiếp theo.
3. **Biên dịch (Compilation)**:
- **Mô tả**: Mã nguồn đã qua tiền xử lý được chuyển đổi thành mã hợp ngữ (assembly code).
- **Vai trò**: Trình biên dịch kiểm tra cú pháp và ngữ nghĩa của mã, phát hiện lỗi cú pháp nếu có. Kết quả là một tệp mã hợp ngữ.
4. **Lắp ráp (Assembly)**:
- **Mô tả**: Mã hợp ngữ được chuyển đổi thành mã máy thông qua trình lắp ráp (assembler).
- **Vai trò**: Kết quả của bước này là một tệp đối tượng (`.o` hoặc `.obj`), chứa mã máy nhưng chưa thể thực thi độc lập.
5. **Liên kết (Linking)**:
- **Mô tả**: Tệp đối tượng được liên kết với các thư viện cần thiết để tạo ra tệp thực thi cuối cùng.
- **Vai trò**: Liên kết có thể bao gồm cả việc kết nối nhiều tệp đối tượng và thư viện bên ngoài. Kết quả cuối cùng là một tệp thực thi (`.exe` trên Windows hoặc không có phần mở rộng trên Unix/Linux).