Câu trả lời:
Cú pháp là về cấu trúc hoặc ngữ pháp của ngôn ngữ. Nó trả lời câu hỏi: làm thế nào để tôi xây dựng một câu hợp lệ? Tất cả các ngôn ngữ, ngay cả tiếng Anh và các ngôn ngữ khác của con người (hay còn gọi là "tự nhiên") đều có ngữ pháp, tức là các quy tắc xác định câu có được cấu tạo đúng hay không.
Dưới đây là một số quy tắc cú pháp ngôn ngữ C:
Ngữ nghĩa là về ý nghĩa của câu. Nó trả lời các câu hỏi: câu này có hợp lệ không? Nếu vậy, câu đó có nghĩa là gì? Ví dụ:
x++; // increment
foo(xyz, --b, &qrs); // call foo
là các câu lệnh C hợp lệ về mặt cú pháp. Nhưng họ muốn nói gì? Liệu nó có hợp lệ khi cố gắng chuyển đổi các câu lệnh này thành một chuỗi hướng dẫn có thể thực thi được không? Những câu hỏi này là trọng tâm của ngữ nghĩa.
Hãy xem xét toán tử ++ trong câu lệnh đầu tiên. Trước hết, liệu nó có hợp lệ để thử điều này không?
Cuối cùng, lưu ý rằng một số ngữ nghĩa không thể được xác định tại thời điểm biên dịch và do đó phải được đánh giá tại thời điểm chạy. Trong ví dụ về toán tử ++, nếu x đã ở giá trị lớn nhất cho kiểu dữ liệu của nó, điều gì sẽ xảy ra khi bạn cố gắng thêm 1 vào nó? Một ví dụ khác: điều gì sẽ xảy ra nếu chương trình của bạn cố gắng bỏ qua một con trỏ có giá trị là NULL?
Tóm lại, cú pháp là khái niệm chỉ liên quan đến bản thân câu đó có hợp lệ với ngữ pháp của ngôn ngữ hay không. Ngữ nghĩa là về việc liệu câu có ý nghĩa hợp lệ hay không.
x
ở giá trị lớn nhất cho dữ liệu của nó và 1
được thêm vào nó thì nó dẫn đến một số đầu ra kỳ lạ ( 0
), đó có phải là lỗi ngữ nghĩa không?
UINT_MAX + 1 == 0
). Phần tràn đã ký là không xác định. Các trình biên dịch hiện đại thường có INT_MAX + 1 == INT_MIN
, nhưng có những trường hợp bạn không thể tin tưởng vào điều này (ví dụ: for (i = 0; i <= N; ++i) { ... }
đâu N
là INT_MAX
vô hạn tùy thuộc vào tối ưu hóa; xem blog.llvm.org/2011/05/what-every-c-programmer-should-know). html ).
Cú pháp đề cập đến cấu trúc của một ngôn ngữ, truy tìm từ nguyên của nó để biết cách mọi thứ được kết hợp với nhau.
Ví dụ, bạn có thể yêu cầu mã được ghép lại với nhau bằng cách khai báo một kiểu, sau đó là tên và sau đó là dấu chấm phẩy, phải đúng về mặt cú pháp.
Type token;
Mặt khác, ngữ nghĩa là về nghĩa. Một trình biên dịch hoặc thông dịch viên có thể phàn nàn về lỗi cú pháp. Đồng nghiệp của bạn sẽ phàn nàn về ngữ nghĩa.
Wikipedia có câu trả lời. Đọc trang wikipages cú pháp (ngôn ngữ lập trình) & ngữ nghĩa (khoa học máy tính) .
Hoặc suy nghĩ về công việc của bất kỳ trình biên dịch hoặc thông dịch viên nào . Bước đầu tiên là phân tích từ vựng trong đó mã thông báo được tạo ra bằng cách chia chuỗi thành các từ vựng sau đó phân tích cú pháp , xây dựng một số cây cú pháp trừu tượng (là một đại diện của cú pháp). Các bước tiếp theo liên quan đến việc chuyển đổi hoặc đánh giá các AST (ngữ nghĩa) này.
Ngoài ra, hãy quan sát rằng nếu bạn xác định một biến thể của C trong đó mọi từ khóa được chuyển thành từ khóa tương đương với tiếng Pháp của nó ( if
trở thành si
, do
trở thành faire
, else
trở thành , sinon
v.v.), bạn chắc chắn sẽ thay đổi cú pháp ngôn ngữ của mình, nhưng bạn sẽ không thay đổi nhiều ngữ nghĩa: lập trình bằng tiếng Pháp-C đó sẽ không dễ dàng hơn!
Ngữ nghĩa là ý nghĩa của mã của bạn - những gì bạn có thể mô tả trong mã giả. Cú pháp là cấu trúc thực tế - mọi thứ từ tên biến đến dấu chấm phẩy.
Cú pháp là cấu trúc hoặc hình thức của biểu thức, câu lệnh và đơn vị chương trình nhưng Ngữ nghĩa là ý nghĩa của các biểu thức, câu lệnh và đơn vị chương trình đó. Ngữ nghĩa theo sau trực tiếp từ cú pháp . Cú pháp đề cập đến cấu trúc / hình thức của mã mà một ngôn ngữ lập trình cụ thể chỉ định nhưng Ngữ nghĩa giải quyết ý nghĩa được gán cho các ký hiệu, ký tự và từ.
Các cú pháp của một ngôn ngữ lập trình là hình thức biểu hiện, báo cáo, và các đơn vị chương trình của mình. Ngữ nghĩa của nó là ý nghĩa của các biểu thức, câu lệnh và đơn vị chương trình đó. Ví dụ: cú pháp của câu lệnh while trong Java là
while (boolean_expr) statement
Ngữ nghĩa của dạng câu lệnh này là khi giá trị hiện tại của biểu thức Boolean là true thì câu lệnh nhúng sẽ được thực thi. Sau đó, điều khiển hoàn toàn trở lại biểu thức Boolean để lặp lại quá trình. Nếu biểu thức Boolean sai, điều khiển sẽ chuyển đến câu lệnh theo sau cấu trúc while.
Cú pháp: Nó đề cập đến cấu trúc ngữ pháp của ngôn ngữ .. Nếu bạn đang viết ngôn ngữ c. Bạn phải rất quan tâm đến việc sử dụng các kiểu dữ liệu, mã thông báo [nó có thể là chữ hoặc ký hiệu như "printf ()". Nó có 3 toke, "printf, (,)"]. Theo cách tương tự, bạn phải rất cẩn thận, cách bạn sử dụng hàm, cú pháp hàm, khai báo hàm, định nghĩa, khởi tạo và gọi nó.
Trong khi ngữ nghĩa, nó liên quan đến logic hoặc khái niệm của câu hoặc câu lệnh. Nếu bạn nói hoặc viết một cái gì đó ngoài khái niệm hoặc logic, thì bạn đã sai về mặt ngữ nghĩa.
Thông thường, phân tích cú pháp và ngữ nghĩa của mã được thực hiện trong phần 'giao diện người dùng' của trình biên dịch.
Cú pháp: Trình biên dịch tạo mã thông báo cho mỗi từ khóa và ký hiệu: mã thông báo chứa thông tin- loại từ khóa và vị trí của nó trong mã. Sử dụng các mã thông báo này, một AST (viết tắt của Cây cú pháp trừu tượng) được tạo và phân tích. Điều mà trình biên dịch thực sự kiểm tra ở đây là liệu mã có ý nghĩa từ vựng hay không, tức là 'chuỗi từ khóa' có tuân thủ các quy tắc ngôn ngữ không? Như đã đề xuất trong các câu trả lời trước, bạn có thể xem nó là ngữ pháp của ngôn ngữ (không phải ý nghĩa / ý nghĩa của mã). Lưu ý bên: Lỗi cú pháp được báo cáo trong giai đoạn này. (Trả về mã thông báo cùng loại lỗi cho hệ thống)
Ngữ nghĩa: Bây giờ, trình biên dịch sẽ kiểm tra xem các hoạt động mã của bạn có 'hợp lý' hay không. Ví dụ: Nếu ngôn ngữ hỗ trợ Type Inference, lỗi sematic sẽ được báo cáo nếu bạn đang cố gắng gán một chuỗi cho một float. HOẶC khai báo cùng một biến hai lần. Đây là những lỗi đúng về mặt ngữ pháp / cú pháp, nhưng không có ý nghĩa gì trong quá trình thao tác. Lưu ý bên: Để kiểm tra xem cùng một biến có được khai báo hai lần hay không, trình biên dịch quản lý một bảng ký hiệu
Vì vậy, đầu ra của 2 pha frontend này là một AST có chú thích (với các kiểu dữ liệu) và bảng ký hiệu.
Xem xét ngôn ngữ bình thường mà chúng ta sử dụng; tại đây, tiếng Anh:
ví dụ: He go to the school. - Ngữ pháp / cú pháp không chính xác, mặc dù anh ta muốn truyền đạt một ý nghĩa / ngữ nghĩa chính xác.
ví dụ: Anh ấy đi đến chỗ lạnh. - cold là một tính từ. Trong tiếng Anh, chúng ta có thể nói điều này không tuân thủ ngữ pháp, nhưng nó thực sự là ví dụ gần nhất cho ngữ nghĩa sai với cú pháp chính xác mà tôi có thể nghĩ ra.