Tôi nghĩ thuật ngữ cú pháp chỉ ra một cú pháp thay thế để diễn tả cùng một ngữ nghĩa cơ bản.
Lấy ví dụ một ngôn ngữ lập trình A có một hoạt động sum
có thể thêm một danh sách các số nguyên có độ dài tùy ý. Trong ngôn ngữ này, chúng ta có thể viết các biểu thức
sum []
sum [3, 4, 5, 1]
sum [2, 7]
có kết quả lần lượt là 0, 13 và 9.
Bây giờ, giả sử rằng chúng tôi nhận ra rằng 90% số lần chúng tôi sử dụng sum
với hai đối số và do đó chúng tôi giới thiệu, để thuận tiện, ký hiệu mới
2 + 7
mà chỉ là cú pháp đường cho sum [2, 7]
.
Bây giờ hãy sử dụng ngôn ngữ thứ hai B không có thao tác bổ sung nào. Chúng tôi có thể có các toán tử như <
, =
cho phép chúng tôi so sánh các số, nhưng không có cách nào để thêm số. Trong phiên bản 2 của ngôn ngữ B, chúng tôi giới thiệu một hoạt động bổ sung mới với cú pháp
2 + 7
trong đó thêm số như bình thường.
Trong ngữ cảnh của ngôn ngữ A, +
ký hiệu là đường cú pháp (nó là một ký hiệu thay thế, đơn giản hóa và đặc biệt có thể được sử dụng thay cho sum [...]
ký hiệu). Tương tự, như đã được chỉ ra trong câu trả lời của Hoa Long Tâm, trong C, ký hiệu p->field
là đường cú pháp cho (*p).field
.
Trong ngữ cảnh của ngôn ngữ B, +
ký hiệu không phải là cú pháp đường (nó là cú pháp hợp lệ duy nhất được sử dụng cho phép toán tổng). Tương tự, nếu C chỉ có thể truy cập các thành viên cấu trúc thông qua các con trỏ và nếu không có ký hiệu (*p).field
thì ký hiệu p->field
sẽ không phải là đường cú pháp.
Theo tôi, có một số hiểu lầm về đường cú pháp có thể bắt nguồn từ một sự nhầm lẫn liên quan đến ngữ nghĩa ngôn ngữ lập trình. Lý do diễn ra như thế này:
- Các ngữ nghĩa của một chương trình là những gì một chương trình tính toán.
- Sức mạnh biểu cảm của một ngôn ngữ lập trình được thể hiện bằng các tính toán có thể được mô tả bằng ngôn ngữ đó.
- Hai ngôn ngữ lập trình có thể mô tả tất cả các chức năng tính toán (như được xác định bằng máy Turing) có cùng sức mạnh biểu cảm ...
- ... và do đó chỉ khác nhau về cú pháp.
- Hệ quả: bất kỳ phần mở rộng nào của ngôn ngữ Turing-Complete chỉ là cú pháp (đường cú pháp) vì bạn không thay đổi sức mạnh biểu cảm của ngôn ngữ.
Dòng lý luận trên dẫn đến những khẳng định chung chung như "đường cú pháp không thể được định nghĩa đúng", đó là "vấn đề của hương vị", hay "tất cả các tính năng ngôn ngữ lập trình, xét cho cùng, chỉ là đường cú pháp".
Tôi nghĩ vấn đề chính trong lập luận trên là ngữ nghĩa không chỉ là về những gì có thể được tính toán bởi một chương trình, mà còn về cách nó được tính toán , tức là những cấu trúc nguyên thủy nào được sử dụng và cách chúng được kết hợp.
Vì vậy, ví dụ, các đối tượng không phải là cú pháp cú pháp cho các cấu hình bit và biến đổi bit cơ bản, chúng là một cấu trúc cho phép mô hình hóa dữ liệu và hoạt động và để mô tả các tính toán. Tính toán với các đối tượng, phương thức, lệnh gọi phương thức, không giống như tính toán với byte, thanh ghi bộ xử lý, địa chỉ bộ nhớ (ngay cả khi hai phép tính có cùng kết quả và ngay cả khi tính toán thứ hai được sử dụng để thực hiện lần đầu tiên).
Tôi đã thực hiện mô tả này một chút dài nhưng tôi nghĩ rằng đó là một khía cạnh quan trọng mà tôi chưa thấy giải quyết trong các câu trả lời khác.
Điểm mấu chốt: đường cú pháp là một cú pháp thay thế (có thể thuận tiện hơn) cho một cấu trúc đã có trong ngôn ngữ và đã có một cú pháp và ngữ nghĩa được xác định rõ. Cú pháp mới (đường cú pháp) khác với cú pháp hiện có nhưng có cùng ngữ nghĩa . Nếu bạn giới thiệu một cấu trúc mới trong một ngôn ngữ và cú pháp mới cho nó, thì bạn không có cú pháp cú pháp.