1. Trình biên dịch Java
Nhân tiện, bạn sẽ còn nhiều lần nghe rằng ưu thế không thể chối cãi của Java so với các ngôn ngữ khác — đó là tính đa nền tảng. Vậy nó là gì và “ăn” thế nào? Hãy bắt đầu từ xa.
Sự thật là máy tính chỉ biết thực thi những lệnh đơn giản nhất.
Với chó có các lệnh như “Lại gần”, “Đưa chân” và những lệnh khác; nghe thấy là nó làm điều gì đó quan trọng. Với máy tính, vai trò những lệnh đó là các con số: mỗi lệnh được mã hóa bằng một con số nhất định (còn gọi là mã máy).
Viết chương trình dưới dạng các con số là rất khó, vì vậy con người đã nghĩ ra ngôn ngữ lập trình và trình biên dịch. Một ngôn ngữ như vậy một mặt dễ hiểu với con người, mặt khác — với trình biên dịch. Trình biên dịch là một chương trình đặc biệt chuyển đổi văn bản chương trình viết bằng ngôn ngữ lập trình thành tập hợp các mã máy.
Thường thì lập trình viên viết chương trình bằng ngôn ngữ lập trình, sau đó chạy trình biên dịch, và dựa trên các tệp mã đã viết, nó tạo ra một tệp duy nhất 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 thu được sau cùng có thể chạy ngay trên máy tính. Nhược điểm của cách tiếp cận này là mã của chương trình phụ thuộc rất nhiều vào bộ xử lý và hệ điều hành. Chương trình biên dịch cho Windows sẽ không hoạt động trên điện thoại Android.
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!
Nhưng Java có cách tiếp cận sáng tạo hơn nhiều.
- Chương trình bằng ngôn ngữ Java
-
Trình biên dịch Java
- Chương trình, gồm các mã đặc biệt (bytecode)
-
Java VM
- Chương trình, gồm các mã máy
Trình biên dịch Java không biên dịch tất cả các lớp thành một chương trình mã máy duy nhất. Thay vào đó, nó biên dịch từng lớp riêng lẻ, và không phải thành mã máy mà là thành mã trung gian đặc biệt (bytecode). Việc biên dịch sang mã máy được thực hiện khi chạy chương trình.
Vậy ai biên dịch chương trình thành mã máy khi nó được chạy?
Cho việc này có một chương trình đặc biệt tên là JVM (Java Virtual Machine) — Máy ảo Java. Trước tiên chạy nó, rồi — chương trình gồm bytecode. Và chính JVM, trước khi thực thi chương trình cần chạy, sẽ biên dịch nó thành mã máy.
Nếu bạn có bộ xử lý “xịn” hỗ trợ nhiều tập lệnh máy hơn, thì trong “lần biên dịch thứ hai” sẽ tạo ra mã máy phù hợp đúng với CPU và HĐH của bạn. Đó là lý do đôi khi Java còn nhanh hơn C++, vốn được biên dịch thẳng sang mã máy và chỉ có thể dùng các lệnh CPU phổ biến nhất.
2. Lỗi thường gặp khi biên dịch
Tốc độ và tối ưu hóa mã hiện giờ chưa quá quan trọng với chúng ta, điều quan trọng là trình biên dịch kiểm tra chương trình của bạn để tìm lỗi. Nó kiểm tra tính hợp lệ của mã và sẽ không cho qua nếu phát hiện dù chỉ một lỗi nhỏ.
Ví dụ về lỗi:
Bạn đang cố gán một số cho biến chỉ có thể chứa văn bản.
String userName = 42; // Ôi! Không được làm vậy.
Trình biên dịch sẽ ngay lập tức báo lỗi rằng kiểu không khớp: Cannot implicitly convert type 'int' to 'string'.
Một ví dụ khác — gõ sai khi gọi println:
System.out.printline("Xin chào!"); // Lỗi trong tên phương thức
Trình biên dịch sẽ nói: “Không có phương thức như vậy — hãy kiểm tra cú pháp!”
Cách đọc lỗi?
Hầu hết các trình biên dịch cho biết lỗi nằm ở đâu trong mã và đôi khi còn gợi ý cách sửa. Đừng sợ lỗi: mỗi lỗi là một bước hướng tới sự khai sáng và chinh phục “con boss” bên trong bạn.
3. Chú thích
Hãy tưởng tượng: bạn đang viết một chương trình phức tạp. Mọi thứ chạy ngon, bạn — thiên tài! Nhưng một tháng sau bạn mở lại đúng đoạn mã ấy và... chẳng hiểu gì cả. Vài dòng mã ở đây, một biến kỳ lạ ở kia. Trong đầu chỉ có: “Chắc chắn ai đó viết chứ không phải tôi!”. Lúc này chú thích sẽ cứu bạn.
Chú thích giống như ghi chú bên lề sách giáo khoa hoặc mẩu dán trên tủ lạnh (“Bia. Đừng uống. Để sáng mai!”). Trình biên dịch bỏ qua chúng, còn con người thì ngược lại. Chú thích giúp giải thích ý nghĩa của mã, đánh dấu chi tiết quan trọng và thậm chí “tắt” các đoạn chương trình mà không cần xóa.
Quan trọng: không có trình biên dịch nào đọc chú thích của bạn; chúng hoàn toàn bị bỏ qua!
Chú thích một dòng
Trong Java có hai loại chú thích — một dòng và nhiều dòng. Loại một dòng bắt đầu bằng hai dấu gạch chéo // và kéo dài đến cuối dòng. Mọi thứ sau // được coi là chú thích và hoàn toàn bị trình biên dịch bỏ qua.
Ví dụ:
System.out.println("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à chú thích. Nếu một dòng mã có vẻ khó hiểu, không rõ để làm gì, thì hãy viết chú thích như vậy!
Ví dụ nữa:
int x = 42; // Giá trị tuổi của lập trình viên
Bạn cũng có thể viết chú thích một dòng trên những dòng riêng biệt:
// Khởi tạo biến tên người dùng
String userName = "Vasya";
Gần như lời thoại trong kịch bản: chú thích giải thích “để làm gì và tại sao”.
Chú thích nhiều dòng
Nếu bạn có nhiều điều cần nói? Cả một câu chuyện? Khi đó dùng chú thích 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ả khi đó là 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ẽ in "Khách".
*/
System.out.println("Nhập tên của bạn:");
Hoặc như thế này:
int age = 18; /* Giá trị tuổi ban đầu
cho người dùng mới */
Lưu ý: không thể lồng chú thích nhiều dòng này vào chú thích nhiều dòng khác. Đừng cố thông minh hơn trình biên dịch — điều đó sẽ không hiệu quả.
Minh họa:
| Loại | Cú pháp | Ví dụ |
|---|---|---|
| Một dòng | |
|
| Nhiều dòng | |
|
4. Ví dụ thực tế
“Tạm vô hiệu hóa” một dòng mã:
Đôi khi bạn tạm thời muốn không thực thi một đoạn mã nào đó. Chú thích là phù hợp ở đây:
// System.out.println("Đoạn văn bản tạm thời không cần");
Dòng vẫ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à con người, và đôi khi cần tự nhắc mình rằng mã vẫn chưa hoàn thiện, hoặc ở đây có lỗi. Vì vậy người ta thường viết:
// TODO: thêm kiểm tra đầu vào rỗng
// FIXME: hàm này tính tổng sai
Nhiều trình soạn thảo và IDE thậm chí còn tô sáng những từ như vậy!
Lập trình viên nói đùa
// Tôi không chịu trách nhiệm về đoạn mã này. Tôi bị buộc phải viết nó trái với ý muốn của mình.
// Này, tôi_đến_từ_tương_lai! Làm ơn tha thứ cho tôi vì đoạn mã này.
// Nếu tôi còn thấy thứ này một lần nữa, có lẽ tôi sẽ phải mang vũ khí đến công ty.
// Nếu điều kiện này từng xảy ra, làm ơn báo cho tôi theo số điện thoại xxx-xxx-xxx để nhận thưởng.
// Gửi lập trình viên thân mến:
//
// Khi bạn “tối ưu hóa” xong thủ tục con này
// và nhận ra đó là một sai lầm to đến mức nào,
// làm ơn tăng bộ đếm phía dưới như một lời cảnh báo
// cho người đến sau:
//
// kolichestvo_chasov_potrachennykh_zdes’ = 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ờ thì chỉ còn mỗi Chúa
// Đôi khi tôi cảm thấy trình biên dịch bỏ qua hết mọi chú thích của tôi
// Tôi xin dành tặng toàn bộ mã của mình, toàn bộ công việc của tôi 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
// thứ này lên production.
Vâng, chú thích có thể rất hài hước. Bởi chúng do con người viết.
GO TO FULL VERSION