0. Kiến thức cần có trước khi đọc:
- Đại số và Giải tích (các khái niệm cơ bản như toán tử, hàm số, đối số, tham số, các phép toán thông dụng (+, -, *, /, modulo), ...)
- Đại số Boole
- Hệ số nhị phân và thập lục phân
1. Giới thiệu:
1.1. Giới thiệu về ngôn ngữ lập trình:
Ngôn ngữ lập trình là một dạng ngôn ngữ nhân tạo, để viết chương trình máy tính.
Chương trình máy tính là một tập hợp các câu lệnh mà máy tính có thể thực hiện. Thông thường, các lệnh mà bộ vi xử lý thực hiện được rất đơn giản, chẳng hạn ADD, SUB, MUL, DIV (cộng, trừ, nhân, chia); tập hợp các lệnh này gọi là tập lệnh (instruction set) của bộ vi xử lý. Tập lệnh của các bộ vi xử lý khác nhau có thể khác nhau, tùy thuộc vào kiến trúc (architecture) của bộ vi xử lý đó (ví dụ, Intel Pentium 4 có tập lệnh dựa trên kiến trúc IA32).
Ngôn ngữ lập trình đơn giản nhất là ngôn ngữ máy, thường là các câu lệnh do chính kiến trúc của máy tính (bộ vi xử lý) đó cung cấp. Các câu lệnh này được biểu thị dưới dạng số (ví dụ ADD là 001, SUB là 002, MUL là 003). Vì thế, ngôn ngữ máy là ngôn ngữ chỉ bao gồm các số, máy tính (bộ vi xử lý) có thể đọc và hiểu trực tiếp các dãy số đó. Tất nhiên, ngôn ngữ máy rất khó hiểu đối với con người, vì nó chỉ toàn các số mà thôi.
Ngôn ngữ dễ hiểu hơn ngôn ngữ máy một chút là hợp ngữ (assembly language). Hợp ngữ bao gồm các câu lệnh được ánh xạ trực tiếp sang ngôn ngữ máy, tuy nhiên các câu lệnh biểu diễn dưới dạng ký tự dễ nhớ (gọi là Mnemonic), ví dụ lệnh cộng 1 vào thanh ghi EAX, "ADD EAX, 1" được hiểu là "83 C0 01" (các số hệ 16) ở ngôn ngữ máy (tập lệnh của IA32).
Hợp ngữ tuy dễ hiểu với con người hơn ngôn ngữ máy nhưng nhìn chung nó chỉ là việc ký hiệu lại các lệnh của ngôn ngữ máy bằng các từ tiếng Anh dễ nhớ. Người lập trình hợp ngữ vẫn phải thao tác trực tiếp với các lệnh đơn giản mà bộ vi xử lý cung cấp để viết chương trình. Ví dụ, lập trình viên không thể viết một câu lệnh mà thực hiện được lệnh phức tạp như "nếu EAX lớn hơn 1 thì cộng ECX với 2, ngược lại thì trừ ECX đi 3". Lập trình viên chỉ có thể viết các câu lệnh đơn giản như "so sánh EAX với 1", "kiểm tra nơi chứa kết quả của phép so sánh đó (thanh ghi cờ) xem có khác 0 hay không", ...
Như vậy, việc lập trình với ngôn ngữ máy hay hợp ngữ rất tốn công sức và hiệu quả thấp. Vì thế, các nhà khoa học máy tính đã nghĩ ra các ngôn ngữ dễ hiểu hơn, hiệu quả hơn để lập trình cho máy tính. Các ngôn ngữ này được gọi là ngôn ngữ bậc trung và cao (để phân biệt với các ngôn ngữ bậc thấp như ngôn ngữ máy và hợp ngữ). Các ngôn ngữ dễ hiểu hơn này cung cấp các lệnh ở cấp cao hơn (làm được nhiều việc hơn) các lệnh đơn giản mà máy tính có thể thực hiện. Tất nhiên, các lệnh cấp cao hơn này sẽ phải được chuyển về các lệnh của ngôn ngữ máy để máy tính có thể thực hiện. Việc chuyển này được làm tự động bởi chương trình máy tính, chứ không phải bởi lập trình viên. Chương trình máy tính cho phép chuyển một ngôn ngữ lập trình này sang một ngôn ngữ lập trình khác gọi là "trình biên dịch" (compiler). Các trình biên dịch thông dụng dịch ngôn ngữ bậc trung và cao về hợp ngữ và ngôn ngữ máy (cũng có nhiều trình biên dịch dịch từ ngôn ngữ bậc cao này sang ngôn ngữ bậc cao khác).
Ngôn ngữ lập trình bậc trung/cao đầu tiên là Fortran. Sau đó hàng loạt các ngôn ngữ khác ra đời như Lisp, COBOL, ALGOL, C, C++, Java, Python, Matlab programming language, ...
Ngôn ngữ lập trình là một dạng ngôn ngữ nhân tạo, để viết chương trình máy tính.
Chương trình máy tính là một tập hợp các câu lệnh mà máy tính có thể thực hiện. Thông thường, các lệnh mà bộ vi xử lý thực hiện được rất đơn giản, chẳng hạn ADD, SUB, MUL, DIV (cộng, trừ, nhân, chia); tập hợp các lệnh này gọi là tập lệnh (instruction set) của bộ vi xử lý. Tập lệnh của các bộ vi xử lý khác nhau có thể khác nhau, tùy thuộc vào kiến trúc (architecture) của bộ vi xử lý đó (ví dụ, Intel Pentium 4 có tập lệnh dựa trên kiến trúc IA32).
Ngôn ngữ lập trình đơn giản nhất là ngôn ngữ máy, thường là các câu lệnh do chính kiến trúc của máy tính (bộ vi xử lý) đó cung cấp. Các câu lệnh này được biểu thị dưới dạng số (ví dụ ADD là 001, SUB là 002, MUL là 003). Vì thế, ngôn ngữ máy là ngôn ngữ chỉ bao gồm các số, máy tính (bộ vi xử lý) có thể đọc và hiểu trực tiếp các dãy số đó. Tất nhiên, ngôn ngữ máy rất khó hiểu đối với con người, vì nó chỉ toàn các số mà thôi.
Ngôn ngữ dễ hiểu hơn ngôn ngữ máy một chút là hợp ngữ (assembly language). Hợp ngữ bao gồm các câu lệnh được ánh xạ trực tiếp sang ngôn ngữ máy, tuy nhiên các câu lệnh biểu diễn dưới dạng ký tự dễ nhớ (gọi là Mnemonic), ví dụ lệnh cộng 1 vào thanh ghi EAX, "ADD EAX, 1" được hiểu là "83 C0 01" (các số hệ 16) ở ngôn ngữ máy (tập lệnh của IA32).
Hợp ngữ tuy dễ hiểu với con người hơn ngôn ngữ máy nhưng nhìn chung nó chỉ là việc ký hiệu lại các lệnh của ngôn ngữ máy bằng các từ tiếng Anh dễ nhớ. Người lập trình hợp ngữ vẫn phải thao tác trực tiếp với các lệnh đơn giản mà bộ vi xử lý cung cấp để viết chương trình. Ví dụ, lập trình viên không thể viết một câu lệnh mà thực hiện được lệnh phức tạp như "nếu EAX lớn hơn 1 thì cộng ECX với 2, ngược lại thì trừ ECX đi 3". Lập trình viên chỉ có thể viết các câu lệnh đơn giản như "so sánh EAX với 1", "kiểm tra nơi chứa kết quả của phép so sánh đó (thanh ghi cờ) xem có khác 0 hay không", ...
Như vậy, việc lập trình với ngôn ngữ máy hay hợp ngữ rất tốn công sức và hiệu quả thấp. Vì thế, các nhà khoa học máy tính đã nghĩ ra các ngôn ngữ dễ hiểu hơn, hiệu quả hơn để lập trình cho máy tính. Các ngôn ngữ này được gọi là ngôn ngữ bậc trung và cao (để phân biệt với các ngôn ngữ bậc thấp như ngôn ngữ máy và hợp ngữ). Các ngôn ngữ dễ hiểu hơn này cung cấp các lệnh ở cấp cao hơn (làm được nhiều việc hơn) các lệnh đơn giản mà máy tính có thể thực hiện. Tất nhiên, các lệnh cấp cao hơn này sẽ phải được chuyển về các lệnh của ngôn ngữ máy để máy tính có thể thực hiện. Việc chuyển này được làm tự động bởi chương trình máy tính, chứ không phải bởi lập trình viên. Chương trình máy tính cho phép chuyển một ngôn ngữ lập trình này sang một ngôn ngữ lập trình khác gọi là "trình biên dịch" (compiler). Các trình biên dịch thông dụng dịch ngôn ngữ bậc trung và cao về hợp ngữ và ngôn ngữ máy (cũng có nhiều trình biên dịch dịch từ ngôn ngữ bậc cao này sang ngôn ngữ bậc cao khác).
Ngôn ngữ lập trình bậc trung/cao đầu tiên là Fortran. Sau đó hàng loạt các ngôn ngữ khác ra đời như Lisp, COBOL, ALGOL, C, C++, Java, Python, Matlab programming language, ...
1.2. Giới thiệu về trình xử lý ngôn ngữ:
Trình xử lý ngôn ngữ cho một ngôn ngữ lập trình là chương trình máy tính để xử lý các chương trình viết bằng ngôn ngữ ấy. Có 2 loại trình xử lý ngôn ngữ chính là trình biên dịch (compiler) và trình thông dịch (interpreter). Ngoài ra hiện nay xuất hiện nhiều trình xử lý ngôn ngữ kết hợp cả biên dịch lẫn thông dịch. Trình biên dịch, như đã nêu ở phần trên, là chương trình cho phép chuyển từ một ngôn ngữ này (ngôn ngữ nguồn) sang một ngôn ngữ khác (ngôn ngữ đích). Nếu ngôn ngữ đích là ngôn ngữ máy thì máy tính có thể chạy chương trình đích đó. Trình thông dịch là một chương trình máy tính cho phép thực hiện trực tiếp các lệnh của ngôn ngữ bậc cao, mà không biên dịch sang ngôn ngữ máy (tức là không output ra ngôn ngữ đích, mà thực hiện ngay các lệnh của ngôn ngữ bậc cao nhờ vào runtime system đi kèm với trình thông dịch) (thực ra các lệnh đơn giản của bộ vi xử lý đã được kèm sẵn trong runtime system).
Các ngôn ngữ có trình biên dịch ví dụ như Fortran, C, C++, Pascal, Basic, Lisp ... Các ngôn ngữ có trình thông dịch ví dụ như Python, Perl, PHP, Matlab Programming language, CBDL...
Trình xử lý ngôn ngữ cho một ngôn ngữ lập trình là chương trình máy tính để xử lý các chương trình viết bằng ngôn ngữ ấy. Có 2 loại trình xử lý ngôn ngữ chính là trình biên dịch (compiler) và trình thông dịch (interpreter). Ngoài ra hiện nay xuất hiện nhiều trình xử lý ngôn ngữ kết hợp cả biên dịch lẫn thông dịch. Trình biên dịch, như đã nêu ở phần trên, là chương trình cho phép chuyển từ một ngôn ngữ này (ngôn ngữ nguồn) sang một ngôn ngữ khác (ngôn ngữ đích). Nếu ngôn ngữ đích là ngôn ngữ máy thì máy tính có thể chạy chương trình đích đó. Trình thông dịch là một chương trình máy tính cho phép thực hiện trực tiếp các lệnh của ngôn ngữ bậc cao, mà không biên dịch sang ngôn ngữ máy (tức là không output ra ngôn ngữ đích, mà thực hiện ngay các lệnh của ngôn ngữ bậc cao nhờ vào runtime system đi kèm với trình thông dịch) (thực ra các lệnh đơn giản của bộ vi xử lý đã được kèm sẵn trong runtime system).
Các ngôn ngữ có trình biên dịch ví dụ như Fortran, C, C++, Pascal, Basic, Lisp ... Các ngôn ngữ có trình thông dịch ví dụ như Python, Perl, PHP, Matlab Programming language, CBDL...
1.3. Giới thiệu ngôn ngữ lập trình C:
Ngôn ngữ lập trình C được phát triển bởi Dennis Ritchie và Ken Thompson ở Bell Labs. Nó là ngôn ngữ bậc trung, và là ngôn ngữ biên dịch. C được dùng rộng rãi trong lập trình hệ thống, để viết phần nhân (kernel) của các hệ điều hành (Unix, Linux, Windows, ...). Nó là một trong những ngôn ngữ cung cấp khả năng gọi hàm hệ thống (của hệ điều hành) tốt nhất, vì bản thân hệ điều hành được viết bằng ngôn ngữ C.
Nếu bạn muốn lập trình hệ thống, tính toán với tốc độ nhanh, tối ưu hóa tốc độ làm việc của bộ vi xử lý, ... thì bạn nên học lập trình C.
Nếu bạn muốn tính toán với các phép tính phức tạp, giải các phương trình phức tạp, thực hiện các công việc vẽ đồ thị phức tạp, ... thì bạn nên học các ngôn ngữ bậc cao, hỗ trợ tốt các việc này (ví dụ Matlab).
Ngôn ngữ lập trình C được phát triển bởi Dennis Ritchie và Ken Thompson ở Bell Labs. Nó là ngôn ngữ bậc trung, và là ngôn ngữ biên dịch. C được dùng rộng rãi trong lập trình hệ thống, để viết phần nhân (kernel) của các hệ điều hành (Unix, Linux, Windows, ...). Nó là một trong những ngôn ngữ cung cấp khả năng gọi hàm hệ thống (của hệ điều hành) tốt nhất, vì bản thân hệ điều hành được viết bằng ngôn ngữ C.
Nếu bạn muốn lập trình hệ thống, tính toán với tốc độ nhanh, tối ưu hóa tốc độ làm việc của bộ vi xử lý, ... thì bạn nên học lập trình C.
Nếu bạn muốn tính toán với các phép tính phức tạp, giải các phương trình phức tạp, thực hiện các công việc vẽ đồ thị phức tạp, ... thì bạn nên học các ngôn ngữ bậc cao, hỗ trợ tốt các việc này (ví dụ Matlab).
2. Môi trường lập trình C:
Để viết chương trình, bạn cần trình soạn thảo văn bản (plain text) và để dịch chương trình C bạn cần trình biên dịch cho ngôn ngữ C. Trên các hệ thống GNU Linux, trình biên dịch thông dụng nhất là GNU Compiler Collection (GCC). Nó là một bộ các trình biên dịch mã mở (open source) được phát triển bởi dự án GNU. Bạn có thể dùng phần mềm này một cách tự do, hợp pháp.
2.1. Login vào shell
Bạn bắt đầu login vào Linux với PuTTy, khi login vào bạn sẽ có 1 màn hình terminal gọi là shell. Dấu nhắc lệnh của shell ký hiệu là "$". Bạn có thể gõ lệnh ở sau dấu nhắc lệnh để shell thực hiện.
2.2. Thực hiện các lệnh đơn giản ở shell :
Lệnh copy:
Lệnh xem thư mục:
Lệnh xem nội dung file:
Lệnh chuyển thư mục:
(thư mục cha ký hiệu là "..").
2.3. Thực hiện lệnh dịch file .c:
Lệnh này sẽ dịch chương trình C của bạn trong file my_prog.c và output ra file my_prog. File my_prog sẽ bao gồm mã máy để máy có thể thi hành được (nó là kết quả dịch file my_prog.c của bạn).
2.3. Trình soạn thảo Emacs
Trình soạn thảo thông minh rất hay được sử dụng trong Unix / Linux là Emacs. Muốn gọi trình soạn thảo này hãy gõ lệnh sau vào shell:
Trong emacs, các ký hiệu sau hay được nhắc đến:
Phím Ctrl : ký hiệu là
Phím Alt : ký hiệu là
. Muốn thoát khỏi emacs, hãy gõ: C-x C-c (tức là Ctrl + X và sau đó gõ tiếp Ctrl + C).
Nếu bạn đã thay đổi nội dung file, emacs sẽ hỏi có save file không, hãy trả lời Y, N, ...
Sau khi soạn thảo xong muốn save file thì gõ C-x C-s.
Để viết chương trình, bạn cần trình soạn thảo văn bản (plain text) và để dịch chương trình C bạn cần trình biên dịch cho ngôn ngữ C. Trên các hệ thống GNU Linux, trình biên dịch thông dụng nhất là GNU Compiler Collection (GCC). Nó là một bộ các trình biên dịch mã mở (open source) được phát triển bởi dự án GNU. Bạn có thể dùng phần mềm này một cách tự do, hợp pháp.
2.1. Login vào shell
Bạn bắt đầu login vào Linux với PuTTy, khi login vào bạn sẽ có 1 màn hình terminal gọi là shell. Dấu nhắc lệnh của shell ký hiệu là "$". Bạn có thể gõ lệnh ở sau dấu nhắc lệnh để shell thực hiện.
2.2. Thực hiện các lệnh đơn giản ở shell :
Lệnh copy:
$ cp file1.txt copy_of_file1.txt
Lệnh xem thư mục:
$ ls
(list directory)Lệnh xem nội dung file:
$ cat file_name
Lệnh chuyển thư mục:
$ cd directory_name
(thư mục cha ký hiệu là "..").
2.3. Thực hiện lệnh dịch file .c:
$ gcc -o my_prog my_prog.c
Lệnh này sẽ dịch chương trình C của bạn trong file my_prog.c và output ra file my_prog. File my_prog sẽ bao gồm mã máy để máy có thể thi hành được (nó là kết quả dịch file my_prog.c của bạn).
2.3. Trình soạn thảo Emacs
Trình soạn thảo thông minh rất hay được sử dụng trong Unix / Linux là Emacs. Muốn gọi trình soạn thảo này hãy gõ lệnh sau vào shell:
$ emacs
Trong emacs, các ký hiệu sau hay được nhắc đến:
Phím Ctrl : ký hiệu là
C
. Ví dụ Ctrl + G được ký hiệu là C-g
Phím Alt : ký hiệu là
M
. Ví dụ Alt + F ký hiệu là M-f
. Muốn thoát khỏi emacs, hãy gõ: C-x C-c (tức là Ctrl + X và sau đó gõ tiếp Ctrl + C).
Nếu bạn đã thay đổi nội dung file, emacs sẽ hỏi có save file không, hãy trả lời Y, N, ...
Sau khi soạn thảo xong muốn save file thì gõ C-x C-s.
3. Chương trình C đầu tiên:
Hãy gõ đoạn mã sau đây vào emacs và save lại (gõ C-x C-s, điền tên file là hello.c)
Sau khi thoát khỏi emacs ra shell bằng cách gõ C-x C-s, hãy thi hành lệnh dịch:
Nếu mọi việc tốt đẹp, bạn sẽ thấy file hello được tạo ra (dùng lệnh "ls" để xem thư mục).
Muốn chạy file "hello" mới được tạo ra, hãy gõ lệnh sau:
Nếu chạy tốt, bạn sẽ nhìn thấy dòng chữ "Hello, World" hiển thị ra màn hình.
Xin chúc mừng, bạn đã viết được chương trình C đầu tiên!.
Hãy gõ đoạn mã sau đây vào emacs và save lại (gõ C-x C-s, điền tên file là hello.c)
#include<stdio.h>
int main()
{
printf( "Hello, World!\n" );
return 0;
}
Sau khi thoát khỏi emacs ra shell bằng cách gõ C-x C-s, hãy thi hành lệnh dịch:
$ gcc -o hello hello.c
Nếu mọi việc tốt đẹp, bạn sẽ thấy file hello được tạo ra (dùng lệnh "ls" để xem thư mục).
Muốn chạy file "hello" mới được tạo ra, hãy gõ lệnh sau:
$ ./hello
(dấu chấm, dấu / và hello)Nếu chạy tốt, bạn sẽ nhìn thấy dòng chữ "Hello, World" hiển thị ra màn hình.
Xin chúc mừng, bạn đã viết được chương trình C đầu tiên!.
Các bài tiếp theo sẽ giới thiệu cụ thể ngôn ngữ C: các kiểu dữ liệu, câu lệnh, cấu trúc, ...
Câu hỏi ôn tập:
1. Ngôn ngữ lập trình là gì?. Có những loại ngôn ngữ nào?
2. Trình biên dịch là gì?.
3. Ngôn ngữ biên dịch là gì?. Ngôn ngữ thông dịch là gì?.
4. C là ngôn ngữ thông dịch hay biên dịch?.
5. Matlab là ngôn ngữ thông dịch hay biên dịch?
6. Hãy sửa đổi chương trình Hello để nó hiển thị ra màn hình nhiều dòng hơn, ví dụ:
Hello, I am CBD.
I like to write programs with C
1. Ngôn ngữ lập trình là gì?. Có những loại ngôn ngữ nào?
2. Trình biên dịch là gì?.
3. Ngôn ngữ biên dịch là gì?. Ngôn ngữ thông dịch là gì?.
4. C là ngôn ngữ thông dịch hay biên dịch?.
5. Matlab là ngôn ngữ thông dịch hay biên dịch?
6. Hãy sửa đổi chương trình Hello để nó hiển thị ra màn hình nhiều dòng hơn, ví dụ:
Hello, I am CBD.
I like to write programs with C
Nội Quy Khi Gửi Bình Luận: