Biên dịch chương trình trong C/C++ như thế nào

Nhiều bạn trong quá trình mới tiếp xúc hoặc đang lập trình chắc hẳn đã nghe thấy cụm từ “compiler” hay còn gọi là trình biên dịch. Vậy các bạn có tò mò làm cách nào máy tính có thể “chạy” được từ những dòng code ta viết ra không? Ở bài này mình sẽ nói về quá trình này trong ngôn ngữ C/C++ nhé (vì chúng khá giống nhau về compiler).

  • Vậy, Trình biên dịch là gì?

Trình biên dịch (compiler) là một phần mềm giúp chuyển các đoạn mã, câu lệnh viết bằng ngôn ngữ lập trình sang một đoạn mã, chương trình khác (thường là ngôn ngữ bậc cao sang bậc thấp hơn, hay mã máy (các bit 0 và 1 mà máy tính, vi xử lý có thể hiểu được)).
Quá trình biên dịch trong C/C++ được chia làm 4 giai đoạn chính:

  • Tiền xử lý (Preprocessor)
  • Dịch sang mã Assembly (Compiler)
  • Dịch mã Assembly sang ngôn ngữ máy (Assembler)
  • Liên kết (Linker)

Preprocessor

Nghe chữ “tiền” thôi mọi người cũng có thể đoán được hành động này, “tiền” tức là trước, nghĩa là trước khi compile source code, các chỉ thị bắt đầu với ký hiệu # sẽ được xử lý, cùng với việc các comments trong đoạn code sẽ được loại bỏ.
Khi ta #include <stdio.h>, tức là chương trình dịch sẽ tìm đến file stdio.h (file này thường có sẵn trong các trình biên dịch C/C++), và copy toàn bộ nội dung trong file này, và đặt vào vị trí thay cho cụm “#include <stdio.h>”. Vì vậy khi include các file này, ta có thể sử dụng các hàm, các macro được định nghĩa sẵn trong đó. Ngoài ra còn có #define, macro,…. mình sẽ nói kỹ hơn về bài sau!!

Compiler

Sau khi preprocessor, lúc này ta đã có những file source code hoàn chỉnh (thường là những file .c, .cpp, .h, .hpp,…), trình biên dịch sẽ dịch sang mã Assembly (hợp ngữ), một ngôn ngữ cấp thấp, rất gần với phần cứng.

Assembler

Khi đã có những mã assembly tương ứng, lúc này chương trình mới dịch tiếp sang mã máy, là những file nhị phân (.o, .obj,…). Thường những file như hello.cpp -> hello.o (trên UNIX) hoặc hello.obj (trên Windows).

Linker

Khi đã có những mã máy (thường mỗi file code sẽ dịch thành một file mã máy), Làm cách nào để máy tính có thể chạy, thực thi được chương trình bởi có rất nhiều file mã máy? Điều đó được giải quyết trong quá trình linker, giúp liên kết các file mã máy trên lại thành một file thực thi duy nhất (trên Windows là .exe, còn trên UNIX là .out).
Ngoài ra, trong giai đoạn linker, các file mã máy của các thư viện (.lib, .a) cũng được liên kết cùng, nên khi gọi những hàm không có trong các thư viện nào, chương trình dịch sẽ tìm sẽ lỗi ngay 😃.
Bài viết chỉ gồm những kiến thức cơ bản nhất khi học ngôn ngữ lập trình C/C++. Bài tiếp theo mình sẽ nói kỹ hơn về Tiền xử lý (Proprocessor) gồm chỉ thị include, define và các macro nhé, mong các bạn ủng hộ 😃.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *