2013-07-29 78 views

Trả lời

113

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 để 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 xây dựng đúng cách hay không.

Dưới đây là một số quy tắc cú pháp ngôn ngữ C:

  • báo cáo riêng biệt với một dấu chấm phẩy
  • kèm theo biểu thức điều kiện của một câu lệnh IF bên trong ngoặc
  • nhóm nhiều lệnh thành một câu lệnh bằng cách kèm theo trong các dấu ngoặc nhọn
  • loại dữ liệu và biến phải được khai báo trước câu lệnh thực thi đầu tiên (tính năng này đã bị loại bỏ trong C99. C99 và sau đó cho phép khai báo kiểu hỗn hợp.)

Ngữ nghĩa là về nghĩa là 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 này có ý nghĩa gì? Ví dụ:

x++;     // increment 
foo(xyz, --b, &qrs); // call foo 

là các câu lệnh C hợp lệ về cú pháp. Nhưng họ muốn nói gì? Nó thậm chí có hiệu lực để cố gắng chuyển đổi các câu lệnh này thành một chuỗi các lệnh thực thi? Những câu hỏi này là trọng tâm của ngữ nghĩa.

Hãy xem toán toán tử ++ trong câu lệnh đầu tiên. Trước hết, nó thậm chí còn hợp lệ để thử điều này?

  • Nếu x là một kiểu dữ liệu float, tuyên bố này không có ý nghĩa (theo các quy tắc ngôn ngữ C) và do đó nó là một lỗi mặc dù tuyên bố là đúng cú pháp.
  • Nếu x là một con trỏ đến một số kiểu dữ liệu, ý nghĩa của tuyên bố là để "thêm sizeof (một số kiểu dữ liệu) với giá trị tại địa chỉ x và lưu trữ kết quả vào vị trí tại địa chỉ x ".
  • Nếu x là vô hướng, ý nghĩa của câu lệnh là "thêm một giá trị vào địa chỉ x và lưu kết quả vào vị trí tại địa chỉ x".

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 gian biên dịch và do đó phải được đánh giá tại thời gian chạy. Trong ví dụ toán tử ++, nếu x đã có 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 dereference một con trỏ có giá trị là NULL?

Tóm lại, cú pháp là khái niệm chỉ quan tâm đến việc câu đó có hợp lệ cho ngữ pháp của ngôn ngữ hay không. Ngữ nghĩa là liệu câu đó có ý nghĩa hợp lệ hay không.

+0

OK. Nếu '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 lạ ('0'), không phải là lỗi ngữ nghĩa? – haccks

+0

Hãy xem xét một đồng hồ đo đường trong một chiếc xe - nó có một loạt các bánh xe có liên quan với các chữ số 0 đến 9 được in trên mỗi chiếc xe. Bánh xe ngoài cùng bên phải quay nhanh nhất; khi nó kết thúc tốt đẹp từ 9 trở về không, bánh xe để tiến bộ trái ngay lập tức của nó bằng một. Khi bánh xe này tiến từ 9 đến 0, bánh xe tiến lên trái, và cứ thế. –

+0

Điều đó có nghĩa là gì? – haccks

6

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ừ các tên biến đến bán dấu hai chấm.

+4

http://c2.com/cgi/wiki?SyntaxVsSemantics – thumbtackthief

9

Cú pháp đề cập đến cấu trúc của ngôn ngữ, truy tìm số etymology của chúng tôi với mọi thứ.
Ví dụ: bạn có thể yêu cầu mã phải được đặt cùng nhau bằng cách khai báo một loại, sau đó nhập tên và sau đó là dấu chấm phẩy, để có cú pháp chính xác.

Type token; 

Mặt khác, ngữ nghĩa là về ý nghĩa. Trình biên dịch hoặc thông dịch viên có thể khiếu nại về các lỗi cú pháp. Đồng nghiệp của bạn sẽ phàn nàn về ngữ nghĩa.

+0

Ngữ nghĩa đồng nghĩa với logic? –

+0

@Talespin_Kit có nghĩa là thay vì cấu trúc: logic là một trừu tượng hơn, ví dụ: P => Q, vv hoặc !! P = P, nhưng khi bạn thêm ngữ nghĩa, mọi thứ có thể có sự tinh tế, nếu P là "hạnh phúc", thì P là "Tôi không hài lòng"! = "Tôi hạnh phúc " – doctorlove

+1

+1 cho" Trình biên dịch hoặc thông dịch viên có thể khiếu nại về lỗi cú pháp. Đồng nghiệp của bạn sẽ phàn nàn về ngữ nghĩa. " – JagsVG

5

Wikipedia có câu trả lời. Đọc syntax (programming languages) & semantics (computer science) wikipages.

Hoặc suy nghĩ về công việc của bất kỳ compiler hoặc interpreter. Bước đầu tiên là lexical analysis nơi mã thông báo được tạo bằng cách chia chuỗi thành từ vựng sau đó parsing, tạo số abstract syntax tree (đây là biểu diễn 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, quan sát rằng nếu bạn đã định nghĩa một biến thể của C, nơi mỗi từ khóa được chuyển thành tương đương Pháp của nó (vì vậy if trở si, do trở faire, else trở sinon etc etc ...), bạn chắc chắn sẽ thay đổi cú pháp của ngôn ngữ của bạn, 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!

0

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 kiểu dữ liệu, mã thông báo [nó có thể là chữ hoặc biểu tượng như "printf()". Nó có 3 tokes, "printf, (,)"]. Trong cùng một cách, 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âu hoặc câu. Nếu bạn nói hoặc viết một cái gì đó ra khỏi khái niệm hoặc logic. Sau đó, bạn ngữ nghĩa sai.

1

Cú pháp là cấu trúc hay hình thức biểu hiện, báo cáo, và các đơn vị chương trình nhưng Semantics là ý nghĩa của những biểu thức, báo cáo, và các đơn vị chương trình. Ngữ nghĩa theo dõi trực tiếp từ cú pháp . Cú pháp đề cập đến cấu trúc/dạng mã mà một ngôn ngữ lập trình cụ thể chỉ định nhưng Ngữ nghĩa đối phó với ý nghĩa được gán cho ký hiệu, ký tự và từ.

Các vấn đề liên quan