Thursday, 2 June 2011

Viết một chương trình C đơn giản

Khác với những chương trình được viết bằng một số ngôn ngữ, Chương trình C yêu cầu theo một mẫu - một chương trình hoàn chỉnh có thể chỉ vài dòng.
Chương trình: Hiển thị một thông báo lên màn hình (printing a pun)
Chương trình đầu tiên trong Kernighan and Ritchie's classic The C Programming Language là rất ngắn. Nó không làm gì cả nhưng hiện ra thông báo “hello, word”. Không giống các tác giả khác, Tôi sẽ không sử dụng chương trình này ở ví dụ đầu tiên. Tôi sẽ nêu cao tính truyền thống của C: the bad pun (chả biết dịch thế nào @@). Thông báo như sau:
To C, or not to C: that is the question.


Chương trình bên dưới sẽ được đặt tên là pun.c, Hiển thị thông báo này mỗi lần chạy.
Pun.c #include
int main(void)
{
printf(“To C, or not to C: that is the question.\n”);
return 0;
}
Mục 2.2 giải thích khuôn dạng của chương trình này chi tiết hơn. Bây giờ, Tôi sẽ đưa ra giải thích ngắn gọn. Dòng:
#include
là cần thiết để “include” thông tin về thư viện vào ra chuẩn của C (standard input/output library). Phần mã chương trình thực thi nằm bên trong main, được gọi là chương trình chính. Chỉ một dòng bên trong main là thực hiện hiển thị thông báo, printf là hàm nằm trong thư viện vào ra chuẩn (stdio.h). Mã \n báo cho printf xuống dòng tiếp theo sau khi hiện thông báo. Dòng:
return 0;
cho biết chương trình trả về (return) giá trị 0 cho hệ điều hành khi nó kết thúc.

Compile và Link
Mặc dù chương trình ngắn gọn, việc chạy pun.c lại phức tạp hơn là bạn tưởng tượng. Đầu tiên, chúng ta cần tạo một file tên là pun.c chứa chương trình (dùng bất cứ trình soạn thảo văn bản nào để viết). Tên file không quan trọng, nhưng phần đuôi mở rộng .c được yêu cầu bởi trình biên dịch.
Tiếp theo, chúng ta sẽ chuyển đổi chương trình thành dạng mà máy tính có thể thực hiện. Để có một chương trình C thường phải làm theo 3 bước:
Preprocessing: Chương trình được thực hiện bởi bộ tiền sử lý (preprocessor), mà tuân theo yêu cầu mà bắt đầu bằng kí tự # (gọi là các dẫn hướng-directives). Bộ tiền sử lý giống như trình soạn thảo, nó có thể thêm vài thứ vào chương trình và tạo nên sự thay đổi.
Compiling: Trình biên dịch (compiler) tiếp nhận chương trình đã sửa đổi và dịch thành mã máy (mã đối tượng-object code). Tuy nhiên, chương trình vẫn chưa thể chạy.
Link: Bước cuối cùng, bộ liên kết (linker) kết hợp mã đối tượng cung cấp bởi trình biên dịch với các mã phụ cần thiết để tạo thành một chương trình thực thi hoàn chỉnh. Các mã phụ này là các thư viện hàm (như printf) được sử dụng trong chương trình.
Thật may mắn, quá trình là tự động, vì vậy chúng ta bớt được phiền hà. Trong thực tế, các chương trình tiền sử lý thường được tích hợp cùng trình biên dịch, vì vậy bạn hầu như không cần để ý khi làm.
Những lệnh cần thiết để dịch và liên kết, phụ thuộc vào trình biên dịch và hệ điều hành. Ở UNIX, trình biên dịch C thường là cc. Để dịch và liên kết chương trình pun.c, nhập lệnh sau vào terminal hoặc command-line ở window:
cc pun.c
Liên kết được thực hiện tự động khi dùng cc không cần phải dùng lệnh liên kết riêng.
Sau khi dịch và liên kết chương trình, cc tạo ra một chương trình thực thi tên là a.out theo mặc định. cc có nhiều tùy chọn, một trong số đó cho phép chúng ta lựa chọn tên chương trình thực thi. Ví dụ, nếu chúng ta muốn tên của chương trình thực thi là pun, chúng ta sẽ nhập vào lệnh sau:
cc -o pun pun.c
Trình biên dịch GCC
Một trong những trình biên dịch C phổ biến nhất là GCC, có sẵn trong LINUX nhưng vẫn sử dụng tốt trên các nền tảng khác. Sử dụng trình biên dịch này giống như trình biên dịch cc truyền thống của UNIX. Ví dụ, để dịch chương trình pun.c, chúng ta sẽ dùng lệnh sau:
gcc -o pun pun.c
Môi trường phát triển tích hợp (IDE)
Ở trên, chúng ta đã sử dụng trình biên dịch dòng lệnh bằng cách nhập vào một lệnh trong một cửa sổ đặc biệt được cung cấp bởi hệ điều hành. Một cách khác là sử dụng một bộ IDE, một gói phần mềm cho phép chúng ta soạn thảo, biên dịch, liên kết, thực thi và gỡ lỗi chương trình mà không cần rời khỏi môi trường. Sự cấu thành của một IDE được thiết kế để cùng làm mọi việc. Ví dụ, khi trình biên dịch phát hiện một lỗi trong chương trình, nó có thể báo cho trình soạn thảo để đánh dấu dòng chứa lỗi. Có rất nhiều biết thể IDE khác nhau, vì vậy tôi sẽ không so sánh chúng trong cuốn sách này. Tuy nhiên, tôi khuyên bạn nên tìm một IDE phù hợp với nền tảng máy tính của bạn.