
1. **Programming language**
1.1. Truyền thống
1.1.1. **Tính tương thích:** Mỗi CPU mới sẽ viết 1 CT dịch mới
1.1.2. **Đặc điểm:** tạo ra 1 file executable -> phụ thuộc CPU và OS (không thể lấy file .exe sang máy khác sử dụng)
1.2. **Hiện đại ** (Java, C#)
1.2.1. **Đặc điểm:** tạo ra file **abstract executable** (độc lập CPU và OS); nhưng file này chưa chạy được, MT cần có máy ảo thì mới chạy được (Vd: Java -> JVM (Java Virtual Machine)
2. CT dịch
2.1. Compiler
2.1.1. Kiểm cú phép, chặt chẽ **cả file source code**
2.1.2. Tạo ra file .exe (sau này có chạy thì không phụ thuộc source code)
2.2. Interpreter
2.2.1. Kiểm cú pháp **line by line** -> OK thì nạp vào RAM chạy
2.2.2. Không tạo ra file .exe
3. Memory layout
3.1. Text Segment
3.1.1. Code: contains executable instructions
3.2. Initialized data segment
3.2.1. Initialized global/ static variable
3.3. **Uninitialized data segment** (bss - block started by symbol)
3.3.1. Uninitialized global/ static variable
3.4. Heap
3.4.1. Dynamic memory
3.5. Stack
4. **Assembly language**
4.1. Overall
4.1.1. Low-level language
4.1.2. Cần **Assembler** dịch -> Mỗi assembler chỉ dùng cho 1 CPU
4.2. Feature
4.2.1. Tính tương thích không cao (lệ thuộc CPU)
5. **Machine Code** (Binary code/ 1s & 0s code)
5.1. Step
5.1.1. **B1: End User: ** ra lệnh chạy CT
5.1.2. **B2: OS: ** nhận y/c -> tìm, nạp file excecutable vào RAM; bộ đếm lệnh CPU trỏ đến lệnh đầu tiên
5.1.3. **B3: CPU: ** thực hiện tuần tự từng chỉ thị: copy -> tăng bộ đếm -> thực thi
5.2. Feature
5.2.1. **Machine code: ** các chỉ thị viết theo lệnh CPU -> lệ thuộc CPU (họ máy)
5.2.2. **OS:** phải cấu trúc hóa theo OS để OS tìm nạp được -> lệ thuộc OS
5.2.3. **Tóm lại: ** Khó viết, tính tương thích không cao (lệ thuộc OS và CPU)