Khái quát
Cú pháp là tập hợp quy tắc xác định cách viết câu lệnh hợp lệ trong một ngôn ngữ lập trình. Trình biên dịch hoặc thông dịch chỉ chấp nhận mã nguồn tuân theo đúng cú pháp của ngôn ngữ đó.
Khi mới học, ba điểm cần quan tâm nhất là:
- Khối lệnh — nhóm nhiều câu lệnh thành một đơn vị.
- Kết thúc câu lệnh — cách báo hiệu một câu lệnh đã hoàn chỉnh.
- Định danh — quy tắc đặt tên biến, hàm, lớp.
Cấu trúc khối lệnh
score = 8
if score >= 5:
print("Dat")
else:
print("Chua dat")
program BasicSyntax;
var
score: Integer;
begin
score := 8;
if score >= 5 then
Writeln('Dat')
else
Writeln('Chua dat');
end.
#include <stdio.h>
int main(void) {
int score = 8;
if (score >= 5) {
printf("Dat\n");
} else {
printf("Chua dat\n");
}
return 0;
}
#include <iostream>
using namespace std;
int main() {
int score = 8;
if (score >= 5) {
cout << "Dat" << endl;
} else {
cout << "Chua dat" << endl;
}
return 0;
}
int score = 8;
if (score >= 5)
{
Console.WriteLine("Dat");
}
else
{
Console.WriteLine("Chua dat");
}
const score = 8;
if (score >= 5) {
console.log("Dat");
} else {
console.log("Chua dat");
}
const score: number = 8;
if (score >= 5) {
console.log("Dat");
} else {
console.log("Chua dat");
}
package main
import "fmt"
func main() {
score := 8
if score >= 5 {
fmt.Println("Dat")
} else {
fmt.Println("Chua dat")
}
}
fn main() {
let score = 8;
if score >= 5 {
println!("Dat");
} else {
println!("Chua dat");
}
}
Kết thúc câu lệnh
Mỗi ngôn ngữ có cách riêng để nhận biết điểm kết thúc một câu lệnh:
- Dấu chấm phẩy — nhiều ngôn ngữ dùng
;bắt buộc hoặc tùy chọn để kết thúc câu lệnh. - Xuống dòng — một số ngôn ngữ tự động nhận biết kết thúc câu lệnh khi gặp ký tự xuống dòng.
- Từ khóa phân tách — một số ngôn ngữ dùng từ khóa như
begin/endthay vì ký tự ngoặc.
Từ khóa (Keywords)
Từ khóa là các tên được ngôn ngữ dành riêng cho mục đích cú pháp. Không được dùng từ khóa để đặt tên biến hay hàm.
Ví dụ một số từ khóa phổ biến: if, else, while, for, return, true, false.
Mỗi ngôn ngữ có tập từ khóa riêng và số lượng khác nhau, nhưng nhiều từ khóa có cùng tên và ý nghĩa tương đương. Khi IDE hiển thị tên bằng màu khác, thường đó là từ khóa của ngôn ngữ.
Quy tắc đặt tên định danh
Định danh (identifier) là tên tự đặt cho biến, hàm, lớp… Hầu hết ngôn ngữ đều theo quy tắc chung:
- Chỉ gồm chữ cái, chữ số và dấu gạch dưới
_. - Không được bắt đầu bằng chữ số.
- Phân biệt chữ hoa và thường:
score,Score,SCORElà ba định danh khác nhau. - Không trùng với từ khóa của ngôn ngữ.
Quy ước đặt tên phổ biến để mã dễ đọc:
| Quy ước | Ví dụ | Dùng thường cho |
|---|---|---|
snake_case |
student_name |
Biến, hàm trong Python, Rust, C |
camelCase |
studentName |
Biến, hàm trong JavaScript, Java |
PascalCase |
StudentName |
Lớp, kiểu dữ liệu trong nhiều ngôn ngữ |
UPPER_CASE |
MAX_VALUE |
Hằng số |
Quy tắc chung
- Dùng tên phản ánh đúng vai trò của dữ liệu —
studentAgerõ hơna. - Nên dùng thụt dòng ổn định để biểu thị quan hệ giữa các khối lệnh.
- Mỗi câu lệnh nên thực hiện một ý rõ ràng để giảm lỗi và thuận tiện cho kiểm thử.
Ghi chú theo ngôn ngữ
Python dùng khoảng trắng đầu dòng để xác định phạm vi khối lệnh. Nếu thụt dòng không nhất quán, chương trình sẽ báo lỗi cú pháp. Câu lệnh không kết thúc bằng ; mà kết thúc khi xuống dòng.
Pascal dùng từ khóa begin và end để mở và đóng khối lệnh. Toán tử gán là :=, còn = được dùng cho so sánh — điểm khác biệt quan trọng so với nhiều ngôn ngữ khác. Chương trình kết thúc bằng end. với dấu chấm.
C dùng cặp dấu {} để xác định khối lệnh. Dấu ; bắt buộc ở cuối mỗi câu lệnh đơn — bỏ sót ; là lỗi cú pháp rất phổ biến. Tên biến thường dùng quy ước snake_case.
C++ kế thừa cú pháp của C: {} cho khối lệnh, ; kết thúc câu lệnh. Thêm vào đó, C++ có không gian tên (namespace) giúp tránh trùng tên định danh trong dự án lớn.
C# dùng {} và ; giống C/C++. Quy ước tên trong C# là PascalCase cho phương thức và lớp, camelCase cho biến cục bộ. C# phân biệt hoa thường chặt chẽ.
JavaScript không bắt buộc dùng ; nhưng khuyến nghị dùng để tránh hành vi không mong muốn khi code bị nén. Tên biến theo camelCase. JavaScript phân biệt hoa thường.
TypeScript kế thừa cú pháp JavaScript và bổ sung khai báo kiểu. Quy tắc về ; và phân biệt hoa thường giống JavaScript.
Go không dùng ; tường minh — trình biên dịch tự chèn dựa trên quy tắc xuống dòng. Từ khóa go fmt tự định dạng lại mã theo chuẩn của ngôn ngữ. Go dùng camelCase hoặc PascalCase.
Rust dùng {} và ;. Điểm đặc biệt: biểu thức không có ; ở cuối là giá trị trả về của khối. Tên biến và hàm theo snake_case, tên kiểu và enum theo PascalCase.
Khuyến nghị thực hành
Khi học một cú pháp mới, nên thử thay đổi từng thành phần rất nhỏ rồi chạy lại chương trình. Cách này giúp nhận ra thành phần nào là bắt buộc và thành phần nào chỉ là quy ước về phong cách viết.
Bình luận