Cygwin là môi trường *nix trong Windows bằng cách tạo một Lớp tương thích. Thông qua đó người dùng Windows có thể chạy các ứng dụng mà vốn vẫn phổ biến trên LinuxUnix sau khi chương trình đó được chuyển qua Cygwin.
Link tham khảo: https://vi.wikipedia.org/wiki/Cygwin
Download:
http://www.mediafire.com/file/7sttt6i2mhmyfwi/cygwin.zip/file copy vào ổ C Or https://cygwin.com/install.html

Compiler hay còn gọi là trình biên dịch có thể được hiểu là công việc dịch chuỗi câu lệnh được viết từ một ngôn ngữ lập trình thành chương trình tương đương dưới dạng ngôn ngữ máy tính, thường là ngôn ngữ ở cấp thấp hơn, ngôn ngữ máy. Đơn giản dễ hiểu thì có thể tạm nói là nhờ Complier này mà file .c chúng ta viết mới được dịch thành file .hex .bin để nạp được xuống một MCU bất kỳ.

Makefile là một tập script chứa các thông tin : Cấu trúc project ( file, dependence), và các lệnh để tạo ra file. Các file được tạo ra gọi là Target, các file phụ thuộc được gọi là Dependence , lệnh được dùng để compile source code được gọi là Action. 1  cú pháp bao gồm Target,dependence , Action được gọi là 1 Rule.
Link tham khảo : https://www.gnu.org/software/make/manual/make.html#Recipe-Syntax

Tạo 1 file main.c sau đó dùng makefile để build ra file HelloWorld.exe sau đó chạy file HelloWorld.exe này :
build: main.c
[1Tab] gcc main.c -o HelloWorld.exe
or
main.o: main.c
[1Tab]gcc -c main.c
build: main.o
[1Tab] gcc main.o -o HelloWorld.exe
[1Tab]./HelloWorld.exe

Quá trình biên dịch một chương trình:

  • Giai đoàn tiền xử lý (Pre-processor)
  • Giai đoạn dịch NNBC sang Asembly (Compiler)
  • Giai đoạn dịch asembly sang ngôn ngữ máy (Asember)
  • Giai đoạn liên kết (Linker)

II. HOẠT ĐỘNG

1. Giai đoạn tiền xử lý – Preprocessor
Giai đoạn này sẽ thực hiện:

  • Nhận mã nguồn
  • Xóa bỏ tất cả chú thích, comments của chương trình
  • Chỉ thị tiền xử lý (bắt đầu bằng #) cũng được xử lý

Ví dụ: chỉ thị #include cho phép ghép thêm mã chương trình của một tệp tiêu để vào mã nguồn cần dịch. Các hằng số được định nghĩa bằng #define sẽ được thay thế bằng giá trị cụ thể tại mỗi nơi sử dụng trong chương trình.

2. Cộng đoạn dịch Ngôn Ngữ Bậc Cao sang Assembly

  • Phân tích cú pháp (syntax) của mã nguồn NNBC
  • Chuyển chúng sang dạng mã Assembly là một ngôn ngữ bậc thấp (hợp ngữ) gần với tập lệnh của bộ vi xử lý.

3. Công đoạn dịch Assembly

  • Dich chương trình => Sang mã máy 0 và 1
  • Một tệp mã máy (.obj) sinh ra trong hệ thống sau đó.

4. Giai đoạn Linker

  • Trong giai đoạn này mã máy của một chương trình dịch từ nhiều nguồn (file .c hoặc file thư viện .lib) được liên kết lại với nhau để tạo thành chương trình đích duy nhất
  • Mã máy của các hàm thư viện gọi trong chương trình cũng được đưa vào chương trình cuối trong giai đoạn này.
  • Chính vì vậy mà các lỗi liên quan đến việc gọi hàm hay sử dụng biến tổng thể mà không tồn tại sẽ bị phát hiện. Kể cả lỗi viết chương trình chính không có hàm main() cũng được phát hiện trong liên kết.