1. Trình biên dịch C#
Máy tính không hiểu ngôn ngữ của con người. Máy tính thậm chí không hiểu cả ngôn ngữ lập trình. Nó chỉ hiểu chương trình được viết bằng mã máy — toàn số 0 và 1 thôi.
Giống như chó có lệnh “Lại đây”, “Đưa chân” và các lệnh khác, nghe xong là nó làm gì đó quan trọng. Với máy tính, vai trò của các lệnh này là các con số: mỗi lệnh được mã hóa bằng một số nào đó (còn gọi là mã máy).
Viết chương trình toàn số thì khó lắm, nên con người mới nghĩ ra ngôn ngữ lập trình và trình biên dịch. Ngôn ngữ này, một mặt thì dễ hiểu với con người, mặt khác thì trình biên dịch cũng hiểu được. Trình biên dịch là một chương trình đặc biệt, nó chuyển đổi code bạn viết bằng ngôn ngữ lập trình thành tập hợp mã máy.
Bình thường lập trình viên viết code bằng ngôn ngữ lập trình, sau đó chạy trình biên dịch, nó sẽ dựa trên các file code bạn viết để tạo ra một file chứa mã máy — chương trình cuối cùng (đã biên dịch).
- Chương trình bằng ngôn ngữ C++
-
Trình biên dịch
- Chương trình gồm các mã máy
Chương trình tạo ra cuối cùng có thể chạy ngay trên máy tính. Nhược điểm là code của chương trình này phụ thuộc rất nhiều vào CPU và hệ điều hành. Chương trình biên dịch cho Windows sẽ không chạy được trên điện thoại Android đâu.
Nếu bạn viết chương trình cho Android, thì trên hệ điều hành Windows nó sẽ không chạy được!
Nhưng C# lại có cách tiếp cận sáng tạo hơn nhiều.
- Chương trình bằng ngôn ngữ C#
-
Trình biên dịch C#
- Chương trình gồmcác mã IL đặc biệt (byte-code)
-
CLR
- Chương trình gồm các mã máy
Trình biên dịch C# không biên dịch tất cả các class thành một chương trình mã máy duy nhất. Thay vào đó, nó biên dịch code của bạn thành mã trung gian đặc biệt gọi là IL-code (byte-code). Việc biên dịch sang mã máy sẽ diễn ra khi chương trình được chạy.
Vậy ai sẽ biên dịch chương trình thành mã máy khi nó chạy?
Để làm việc này có một chương trình đặc biệt tên là CLR (Common Language Runtime) — máy ảo C#. Đầu tiên bạn chạy nó, rồi mới chạy chương trình gồm byte-code. CLR sẽ biên dịch chương trình thành mã máy trước khi thực thi.
Nếu bạn có CPU xịn, hỗ trợ nhiều lệnh máy hơn, thì trong lần “biên dịch lần hai” sẽ sinh ra mã máy tối ưu cho đúng CPU và OS của bạn. Đó là lý do vì sao C# đôi khi còn nhanh hơn C++, vốn biên dịch thẳng sang mã máy và chỉ dùng các lệnh phổ biến nhất của CPU.
2. Các lỗi thường gặp khi biên dịch
Tốc độ và tối ưu code hiện tại chưa quan trọng lắm, cái quan trọng là trình biên dịch kiểm tra code của bạn xem có lỗi không. Nó kiểm tra code có hợp lệ không và sẽ không cho chạy tiếp nếu phát hiện dù chỉ một lỗi nhỏ.
Ví dụ lỗi:
Bạn thử gán số cho biến chỉ lưu được text.
string userName = 42; // Ôi! Không được đâu.
Trình biên dịch sẽ báo lỗi ngay, kiểu dữ liệu không khớp: "Cannot implicitly convert type 'int' to 'string'".
Ví dụ khác — gõ sai tên hàm WriteLine():
Console.WriteLin("Xin chào!"); // Lỗi ở tên hàm
Trình biên dịch sẽ bảo: "Không có hàm như vậy — kiểm tra lại cú pháp đi!"
Làm sao đọc lỗi?
Hầu hết các trình biên dịch đều chỉ ra vị trí lỗi trong code, thậm chí đôi khi còn gợi ý cách sửa. Đừng sợ lỗi: mỗi lỗi là một bước tiến hóa và vượt qua “boss” trong bạn.
3. Chú thích (comment)
Giả sử bạn đang viết một chương trình phức tạp. Mọi thứ chạy ngon, bạn đúng là thiên tài! Nhưng một tháng sau bạn mở lại code đó và... chẳng hiểu gì cả. Vài dòng code ở đây, biến lạ ở kia. Trong đầu chỉ nghĩ: “Cái này chắc chắn không phải mình viết!”. Đó là lúc comment cứu bạn.
Chú thích — giống như ghi chú bên lề sách giáo khoa hoặc dán lên tủ lạnh ("Bia. Đừng uống. Để sáng mai!"). Trình biên dịch bỏ qua chúng, còn người thì ngược lại. Comment giúp giải thích ý nghĩa code, đánh dấu chi tiết quan trọng, thậm chí “tắt” một đoạn code mà không xóa nó đi.
Lưu ý: Không có trình biên dịch nào đọc comment của bạn, chúng hoàn toàn bị bỏ qua!
Chú thích một dòng
Trong C# có hai loại comment — một dòng và nhiều dòng. Comment một dòng bắt đầu bằng hai dấu gạch chéo // và kéo dài đến hết dòng. Mọi thứ sau // đều là comment và hoàn toàn bị trình biên dịch bỏ qua.
Ví dụ:
Console.WriteLine("Xin chào, thế giới!"); // Dòng này in lời chào ra màn hình
Ở đây // Dòng này in lời chào ra màn hình — là comment. Nếu đoạn code nào khó hiểu, cứ comment như vậy nhé!
Ví dụ nữa:
int x = 42; // Giá trị tuổi của lập trình viên
Có thể viết comment một dòng trên dòng riêng:
// Khởi tạo biến tên người dùng
string userName = "Vasya";
Gần giống như lời thoại trong kịch bản: comment giải thích tại sao và để làm gì.
Chú thích nhiều dòng
Nếu bạn có nhiều thứ muốn ghi chú? Một câu chuyện dài? Dùng comment nhiều dòng, bắt đầu bằng /* và kết thúc bằng */. Mọi thứ giữa hai ký hiệu này đều bị trình biên dịch bỏ qua, kể cả nhiều dòng.
Ví dụ:
/*
Ở đây chúng ta in tên người dùng ra màn hình.
Nếu không có tên, sẽ ghi "Khách".
*/
Console.WriteLine("Nhập tên của bạn:");
Hoặc như này:
int age = 18; /* Giá trị tuổi khởi tạo
cho người dùng mới */
Chú ý: không thể lồng comment nhiều dòng vào nhau. Đừng cố qua mặt trình biên dịch — không ăn thua đâu.
Minh họa:
| Loại | Cú pháp | Ví dụ |
|---|---|---|
| Một dòng | // chú thích |
int x = 1; // giải thích |
| Nhiều dòng | /* gì cũng được */ |
/* ở đây bạn có thể giải thích bất cứ gì */ |
4. Ví dụ thực tế
“Tắt” một dòng code:
Đôi khi bạn muốn tạm thời không chạy một đoạn code nào đó. Comment là cứu cánh:
// Console.WriteLine("Dòng text tạm thời không cần");
Dòng code vẫn còn, nhưng trình biên dịch “không thấy” nó.
Ghi chú TODO và FIXME
Lập trình viên cũng là người, đôi khi cần tự nhắc mình code chưa xong, hoặc chỗ này có bug. Thường sẽ viết:
// TODO: kiểm tra nhập rỗng
// FIXME: hàm này tính tổng sai
Nhiều editor và IDE còn highlight mấy từ này luôn!
Lập trình viên pha trò
Và tất nhiên, đôi khi trong code có những comment rất hài hước:
// Tôi không chịu trách nhiệm cho đoạn code này. Tôi bị ép viết nó trái ý muốn.
// Gửi tương lai! Xin hãy tha thứ cho đoạn code này.
// Nếu tôi còn gặp lại kiểu này, chắc tôi phải mang vũ khí đi làm.
// Nếu điều kiện này từng xảy ra, làm ơn gọi số xxx-xxx-xxx, có thưởng.
// Lập trình viên thân mến:
//
// Khi bạn “tối ưu hóa” xong subroutine này
// và nhận ra đó là sai lầm lớn,
// hãy tăng biến đếm bên dưới như lời cảnh báo
// cho người tiếp theo:
//
// so_gio_mat_o_day = 42
// Khi tôi bắt đầu viết cái này, chỉ có Chúa và tôi hiểu tôi đang làm gì.
// Giờ chỉ còn Chúa thôi
// đôi khi tôi nghĩ trình biên dịch bỏ qua hết comment của tôi
// Tôi dành tặng toàn bộ code, toàn bộ công việc này cho vợ tôi, Darlin,
// người sẽ phải nuôi tôi, ba đứa con và con chó của chúng tôi
// khi cái này lên production.
Đúng vậy, comment có thể rất vui. Vì chúng được viết bởi những con người thật.
GO TO FULL VERSION