Ngôn ngữ lập trình C

Soạn thảo, dịch và thực thi chương trình C

Bạn nên hoàn thành cài đặt và cấu hình môi trường phát triển theo hướng dẫn của bài học trước để có thể thực hành nội dung của bài học này.

  1. Soạn thảo chương trình C

    Một chương trình C thường bao gồm nhiều tập tin, được chia thành hai loại chính:

    • Tập tin .h (header): Thường chứa khai báo hằng số, macro, định nghĩa kiểu dữ liệu, nguyên mẫu hàm (function prototypes), và đôi khi là khai báo extern cho biến toàn cục.
    • Tập tin .c (source): Chứa mã nguồn thực thi, bao gồm các lệnh, khối lệnh và phần định nghĩa hàm (function implementation).

    Soạn thảo là quá trình sử dụng trình soạn thảo để tạo hoặc chỉnh sửa các tập tin (.c, .h), công việc này thường được gọi là viết mã nguồn (coding). Nội dung của các tập tin phải tuân thủ cú pháp của ngôn ngữ C nhằm mô tả các thao tác mà chương trình cần thực hiện. Đây là bước đầu tiên trước khi mã nguồn được biên dịch và liên kết để tạo ra chương trình thực thi.

    Giả sử chúng ta cần viết một chương trình tính tổng hai số và in ra kết quả. Để soạn thảo chương trình, hãy làm theo các bước sau:

    • Trong thư mục \src, tạo một tập tin đặt tên là main_thread.c (tên của tập tin phải tuân thủ quy tắc của hệ điều hành, nên sử dụng tiếng Anh và có ý nghĩa).
    • Mở tập tin main_thread.c và nhập nội dung sau:
    
    	/**
    	* @file    main_thread.c
    	* @brief   Entry point of the program.
    	*
    	* @project Learn C
    	* @version 1.0
    	* @author  hoctotlamhay.vn
    	*/
    	#include<stdio.h>
    	int main() {
    		int x = 10;						//Khai báo biến nguyên x, giá trị = 10
    		int y = 5;							//Khai báo biến nguyên y, giá trị = 5
    		int z = x + y;						//Khai báo biến nguyên z, giá trị = x + y
    		printf("Sum(x + y) = %d\n", z);		//In ra giá trị của biến z
    		printf("Press Enter to continue...");		//Thông báo cho người dùng nhấn phím Enter
    		getchar();							//Đọc ký tự từ bàn phím
    		return 0;							//Trả về kết quả thực thi hàm main()
    	}
    	

    Chương trình trên sử dụng cấu trúc và một số thành phần của ngôn ngữ C, nếu bạn chưa biết cũng đừng lo lắng vì chúng ta sẽ thảo luận trong các bài học sau.

  2. Dịch chương trình

    Sau khi hoàn thành soạn thảo, chương trình cần được dịch từ mã nguồn sang mã máy; quá trình này thường trải qua nhiều bước, chẳng hạn như tiền biên dịch, biên dịch, hợp dịch, liên kết,v.v. và được thực hiện bởi trình biên dịch (tham khảo thêm tại địa chỉ Khái niệm cơ sở).

    Đối với cấu hình đã thiết lập ở bài trước, để biên dịch tập tin main_thread.c chúng ta có thể sử dụng một trong các phương pháp dưới đây:

    1. Dịch bằng tổ hợp phím Ctrl + Shift + B

      Trong Visual Studio Code, đây là phương pháp biên dịch đơn giản nhất; bạn chỉ cần nhấn tổ hợp phím Ctrl + Shift + B, nếu không có lỗi chúng ta sẽ nhận được tập tin LearnC.exe trong thư mục \build.

      Learn C Language
    2. Dịch bằng chức năng Debug C/C++ File

      Visual Studio Code cung cấp chức năng Debug C/C++ File, nằm ở góc trên, bên phải màn hình. Chức năng này trước tiên sẽ dịch mã nguồn sang mã máy, nếu không có lỗi chương trình sẽ chạy ở chế độ gỡ lỗi (debug).

      Learn C Language

      Hãy chú ý rằng, theo cấu hình chúng ta phải nhận được tập tin LearnC.exe trong thư mục \build, nhưng ở đây lại nhận được tập tin main_thread.exe trong thư mục \src. Điều này là do ở lần đầu tiên chạy chức năng Debug C/C++ File, Visual Studio Code tự động sinh thêm cấu hình mặc định trong tập tin task.json như sau:

      
      	{
      		"type": "cppbuild",
      		"label": "C/C++: gcc.exe build active file",
      		"command": "C:/winlibs/mingw64/bin/gcc.exe",
      		"args": [
      			"-fdiagnostics-color=always",
      			"-g",
      			"${file}",
      			"-o",
      			"${fileDirname}\\${fileBasenameNoExtension}.exe"
      		],
      		"options": {
      			"cwd": "C:/winlibs/mingw64/bin"
      		},
      		"problemMatcher": [
      			"$gcc"
      		],
      		"group": {
      			"kind": "build",
      			"isDefault": true
      		},
      		"detail": "Task generated by Debugger."
      	}
      	

      Để nhận được kết quả biên dịch như mong đợi, hãy cập nhật lại phần cấu hình tự sinh:

      
      	{
      		"type": "cppbuild",
      		"label": "C/C++: gcc.exe build active file",
      		"command": "C:/winlibs/mingw64/bin/gcc.exe",
      		"args": [
      			"-fdiagnostics-color=always",
      			"-g",
      			"${workspaceFolder}/src/*.c",
      			"-I${workspaceFolder}/include",
      			"-o",
      			"${workspaceFolder}/build/LearnC.exe"
      		],
      		"options": {
      			"cwd": "C:/winlibs/mingw64/bin"
      		},
      		"problemMatcher": [
      			"$gcc"
      		],
      		"group": {
      			"kind": "build",
      			"isDefault": true
      		},
      		"detail": "Task generated by Debugger."
      	}
      	
    3. Dịch bằng chức năng Run C/C++ File

      Dịch bằng chức năng Run C/C++ File tương tự như Debug C/C++ File, nhưng sau khi biên dịch, chương trình sẽ được thực thi ở chế độ bình thường thay vì chạy trong chế độ gỡ lỗi.

    4. Dịch ở chế độ dòng lệnh

      Trong Visual Studio Code, bạn có thể dùng gcc để biên dịch chương trình ngay trong Terminal theo các bước:

      • Mở Terminal bằng Terminal → New Terminal hoặc nhấn Ctrl + Shift + `.
      • Chuyển đến thư mục chứa mã nguồn, ví dụ:
      • 
        		cd D:\project\LearnC\src
        	
      • Thực hiện lệnh biên dịch.
      • 
        		D:\project\LearnC\src gcc main_thread.c -o ../build/LearnC.exe
        	
      • Kết quả biên dịch.
      • Learn C Language

      Phương pháp dịch ở chế độ dòng lệnh tương đối phức tạp, nhất là đối với các dự án lớn.

  3. Thực thi chương trình

    Để chạy chương trình trong Visual Studio Code, bạn chỉ cần nhấn phím F5. Nếu chạy trực tiếp trong Windows Explorer, hãy mở tập tin LearnC.exe như một ứng dụng Windows thông thường. Kết quả khi chạy chương trình tính tổng của hai số như sau:

    Learn C Language