Syntax and semantic in programing language, syntax, sematic, cú pháp, ngữ nghĩa
Trang 1ĐẠI HỌC QUỐC GIA TP.HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA KHOA HỌC MÁY TÍNH
BÀI BÁO CÁO
Môn: Nguyên lý và phương pháp lập trình
Đề tài: Cú pháp và ngữ nghĩa trong ngôn ngữ lập trình
Giảng viên: Ths.Trịnh Quốc Sơn
Nhóm sinh viên:
Phạm Quốc Đạt MSSV:11520529 Đoàn Thành Nam MSSV:11520601
TP Hồ Chí Minh 11/2013
Trang 2Contents
Lời cảm ơn 2
Nhận xét của giáo viên 3
I CÚ PHÁP VÀ NGỮ NGHĨA 4
II.Những phương thức chính mô tả cú pháp (Formal Methods of Describing Syntax) 6
2.1 Cú pháp trừu tượng ( Abstract syntax) 6
2.2 Cú pháp cụ thể (concrete syntax) 7
Cây phân tích cú pháp (Parse Tree) 9
Sự mơ hồ (hay sự nhập nhằng) của văn phạm 11
Đồ thị cú pháp (Syntax Graphs) 12
2.3 Cú pháp cảm ngữ cảnh (context-sensitive syntax) 12
III.NGỮ NGHĨA 13
3.1 Ngữ nghĩa tác vụ(Operational Semantics): 15
Máy rút gọn (reduction machine) 16
Luật rút gọn cho biểu thức 16
5.2 Ngữ nghĩa biểu thị( Denotational semantics): 19
Ngôn ngữ số nhị phân 19
Ngôn ngữ lập trình đơn giản 20
Môi trường 22
5.3 Ngữ nghĩa tiên đề (Axiomatic semantics) : 24
Hệ luật HOARE 25
IV.ỨNG DỤNG CỦA NGỮ NGHĨA HÌNH THỨC 27
1.Chứng minh chương trình 27
2.Cú pháp cảm ngữ cảnh 28
3.Hiện thực và thiết kế ngôn ngữ 28
VI, TÀI LIỆU THAM KHẢO VÀ CHÚ THÍCH 29
Những tài liệu tham khảo 29
M ột số từ tiếng anh dùng trong đề tài 29
Chú thích 29
Trang 3Lời cảm ơn
Trên thực tế không có sự thành công nào mà không gắn liền với những sự hỗ trợ, giúp đỡ dù ít hay nhiều, dù trực tiếp hay gián tiếp của người khác Trong suốt thời gian từ khi bắt đầu học tập ở giảng đường đại học đến nay chúng em đã nhận được rất nhiều sự quan tâm, giúp đỡ của quý Thầy Cô, gia đình và bạn bè
Với lòng biết ơn sâu sắc nhất, em xin gửi đến quý Thầy Cô ở Khoa Khoa Học Máy Tính – Trường Đại Học Công Nghệ Thông Tin đã cùng với tri thức và tâm huyết của mình để truyền đạt vốn kiến thức quý báu cho chúng em trong suốt thời gian học tập tại trường Và đặc biệt, trong học kỳ này, Khoa đã tổ chức cho chúng em được tiếp cận với môn học mà theo em là rất hữu ích đối với sinh viên ngành Khoa Học Máy Tính cũng như tất cả các sinh viên thuộc các chuyên ngành Khoa Học Kĩ Thuật khác Đó là môn học “Nguyên Lý và Phương pháp lập trình”
Em xin chân thành cảm ơn thầy Ths.Trịnh Quốc Sơn đã tận tâm hướng dẫn chúng em qua từng buổi học trên lớp cũng như những buổi nói chuyện, thảo luận về đề tài Nếu không có những lời hướng dẫn, dạy bảo của thầy thì em nghĩ đè tài này chúng em rất khó có thể hoàn thiện được Một lần nữa,chúng em xin chân thành cảm ơn thầy
TP Hồ Chí Minh 11/2013
(Nhóm sinh viên thực hiên)
Trang 4Nhận xét của giáo viên
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
……….………
………
……….………
………
………
Trang 5I CÚ PHÁP VÀ NGỮ NGHĨA
Ngôn ngữ lập trình là hệ thống gồm các ký hiệu và các qui tắc kết hợp các ký hiệu thành các cấu trúc có ý nghĩa,Ngoài ra ngôn ngữ lập trình cung cấp một phương tiện để
mô tả một thuật toán mà máy tính có thể hiểu được nó
Để có thể mô tả ngôn ngữ lập trình để máy tính có thể hiểu được nó chúng ta cần xác định hai phương thức sau:
Cú pháp:
o Những qui tắc mà chương trình có thể hiểu,
o Hình thức hoặc cấu trúc của biểu thức, câu lệnh và chương trình
Ngữ nghĩa:
o Ý nghĩa của các chương trình, bao gồm tất cả ý nghĩa
o Theo sau cú pháp (Syntax), hình thức của câu lệnh phải rõ ràng, ngụ ý những gì câu lệnh thực hiện hoặc dùng như thế nào,Chương trình làm gì?
Những người sử dụng định nghĩa ngôn ngữ:
o Những người thiết kế ngôn ngữ khác
o Những người thực hiện
o Lập trình viên( những người sử dụng ngôn ngữ)
Chúng ta thật sự phải có một sự định nghĩa ngôn ngữ rõ ràng, bởi nếu không chúng ta thấy rằng một ngôn ngữ có lẽ khó học, khó thực hiện, và 1 số thì mơ hồ trong đặc điểm
có thể dẫn đến những sự khác biệt
Việc mô tả cú pháp dễ hơn mô tả ngữ nghĩa.Một phần do kí hiệu ngắn gọn để mô tả
cú pháp.Nhưng nó chưa được phát triển cho ngữ nghĩa
Pascal Sử dụng dấu “chấm phẩy” giữa câu lênh;C sử dụng “chấm phẩy” sau câu lệnh
Pascal:Sử dụng begin…end nhóm các câu lệnh,C sử dụng { and }
Pascal: sử dụng từ khóa integer; C sử dụng int
Trang 6– Nhưng cú pháp của một ngôn ngữ có ảnh hưởng rất lớn:
o Làm thế nào để viết chương trình một cách dễ dàng
o Làm thế nào để đọc và hiểu chương trình dễ dàng
o Thật dễ để tạo ra những lỗi cú pháp khó hiểu
Cú pháp là đánh máy (Syntax is typographical)
– Cú pháp mô tả cách chúng ta viết chương trình như là một chuỗi ký tự
– Cú pháp có thể chính xác và chính thức được định nghĩa bởi BNF (Backus-Naur Form)
– Một ngôn ngữ theo nghĩa thông thường là một chuỗi các ký tự (hoặc âm thanh) và đòi hỏi cú pháp
– Nhưng bạn có thể làm nhiều thứ ngôn ngữ giống như với một giao diện và không
có cú pháp thực
Mô tả cú pháp (Describing Syntax) i
Trang 7– Sentence: là chuỗi ký tự trong bảng chữ cái alphabet
– Language là tập hợp các câu
– Lexeme là cú pháp thấp nhất trong hệ thống lệnh(e.g.,*,+,=,sum,begin)
– Token: là 1 loại của lexeme
II.Những phương thức chính mô tả cú pháp (Formal Methods of Describing Syntax)
Cú pháp của một ngôn ngữ lập trình có thể được xác định một cách hình thức bằng cách sử dụng một hệ thống các ký hiệu khác, mà về thực chất cũng là một ngôn
ngữ.Ngôn ngữ dùng để xác định cú pháp hoặc ngữ nghĩa của một ngôn ngữ lập trình
được gọi là siêu ngôn ngữ (meta-language) Trong nội dung của đề tài này sẽ đề cập đến
Cú pháp trừu tượng( abstract syntax), Cú pháp cụ thể (concrete syntax) và Cú pháp cảm ngữ cảnh (context-sensitive syntax)
2.1 Cú pháp trừu tượng ( Abstract syntax)
– cú pháp trừu tượng phân các yếu tố của ngôn ngữ lập trình ra thành các lớp cú
Trang 8command program
Ví dụ: biểu thức a-b-c có thể biểu diễn theo hai cách
L::=I | L.I| L[E] | E^
E::=B| I |OE | EOE | I(…,E,…) | L.I |L[E] | E^I
[…,E,…,E E, ] | (E)
K::=B | I | OK
T::= I | (…,I,…) | K K | ^I |set of T I
Array [T] of T | file of T | record…;I: T;…end I
Record …;I:T;…case I:I of…;K:(…;I:T;…);…end
P::=I:I | var I:I
D::=const I=K; l type I=T;| var I:T; |
Procedure I(…;P;…);C;l function I(…;P…):I;C;
C::=L:=E | I | I(…,E,…) | C;C |
If E then C l if E then C else C |
Case E of…;K:C;…end |
While E do C l repeat C until E |
For I:=E to E do C | for I:=E downto E do C |
With L do C |…D…begin C end | begin C end
M::=program I(…,I,…); C.
Ưu điểm: của cú pháp trừu tượng là đơn giản, cho thấy một cách nhìn khái quát về cấu
trúc cú pháp của ngôn ngữ
Nhược điểm:không đề cập đến ký hiệu của ngôn ngữ mà nó mô tả, với cú pháp trừu
tượng chúng ta không thể xác định được một chuỗi ký hiệu có phải là một chương trình hợp lệ hay không, cũng như cấu trúc của sự kết hợp các kí hiệu trong chuỗi
2.2 Cú pháp cụ thể (concrete syntax)
Trang 9Cú pháp cụ thể khắc phục được các nhược điểm của cú pháp trừu tượng.Nó cho phép xác định cấu trúc kết hợp của chuỗi ký hiệu và cho biết chuỗi ký hiệu đó có hợp lệ hay không
Văn phạm phi ngữ cảnh( Context Free Grammars)
Được phát triển bởi Noam Chomsky giữa thập niên 1950
Language generators : miêu tả cú pháp của ngôn ngữ tự nhiên
CFG là một văn phạm hình thức mà trong đó các luật là ở dạng V → w
Ðể xác định cú pháp của một ngôn ngữ, người ta dùng văn phạm phi ngữ cảnh CFG (Context Free Grammar) hay còn gọi là văn phạm BNF (Backers Naur Form)
Văn phạm phi ngữ cảnh (CFG) là một hệ thống gồm bốn thành phần, ký hiệu là văn
phạm G (V, T, P, S), trong đó:
-T: Một tập hợp các token các ký hiệu kết thúc (terminal symbols)
Ví dụ: Các từ khóa, các chuỗi, dấu ngoặc đơn…
-V: Một tập hợp các ký hiệu chưa kết thúc (nonterminal symbols), còn gọi là các
biến (variables)
Ví dụ: Câu lệnh, biểu thức…
-P: Một tập hợp các luật sinh (productions) trong đó mỗi luật sinh bao gồm một ký
hiệu chưa kết thúc - gọi là vế trái, một mũi tên và một chuỗi các token và / hoặc các ký hiệu chưa kết thúc gọi là vế phải
- S Một trong các ký hiệu chưa kết thúc được dùng làm ký hiệu bắt đầu của văn
phạm (start symbol)
BNF - Backus Normal Form (1959) là một siêu ngôn ngữ phổ biến để xay dựng cú
pháp cụ thể
Được tạo ra bởi John ackus để miêu tả cho Algol 58
NF tương đương với CFG (context-free grammars)
Metalanguage là một dạng ngôn ngữ dùng để miêu tả cho một ngôn ngữ khác
Ví dụ 1: Văn phạm G ({S, A, B}, {a, b}, P, S ), trong đó P gồm các luật sinh sau:
Trang 10– Các chữ in hoa A, B, C, D, E, và S ký hiệu các biến (S thường được dùng làm
ký hiệu bắt đầu )
– Các chữ nhỏ a, b, c, d, e, ; các chữsốvà một số ký hiệu khác ký hiệu cho các ký hiệu kết thúc
– Các chữ in hoa X, Y, Z là các ký hiệu có thể là ký hiệu kết thúc hoặc biến
– Các chữ Hi-lạp α, β, γ, biểu diễn cho chuỗi các ký hiệu kết thúc và biến
Ta sẽ biểu diễn văn phạm một cách tóm tắt bằng cách chỉliệt kê các luật sinh của nó Nếu A → α1, A → α2, , A → αklà các luật sinh của biến A trong văn phạm nào
– Mô tả văn phạm bằng cách liệt kê các luật sinh
– Luật sinh chứa ký hiệu bắt đầu sẽ được liệt kê đầu tiên
– Nếu có nhiều luật sinh có cùng vế trái thì nhóm lại thành một luật sinh duy nhất, trong đó các vế phải cách nhau bởi ký hiệu “|”đọc là “hoặc”
–
Ví dụ:để định nghĩa một biểu thức số học (expression) bao gồm các danh biểu
(identifier) tham gia vào các phép toán +, * hoặc biểu thức con lồng trong dấu ngoặc đơn , ta viết :
<expression> ::= <expression> + <expression> <expression> ::= <expression> *
<expression> <expression> ::= (<expression> )
<expression> ::= <identifier>
Cây phân tích cú pháp (Parse Tree)
– Để dễ hình dung sự phát sinh ra các chuỗi trong văn phạm phi ngữ cảnh, ta thường diễn tả một chuỗi dẫn xuất qua hình ảnh một cây (cây phân tích cú pháp)
– Cây phân tích cú pháp có thể được xem nhưmột dạng biểu diễn hình ảnh của một dẫn xuất Ta nói rằng αAβ dẫn xuất ra αγβ (ký hiệu: αAβ ⇒ αγβ) nếu A → γ là một luật sinh, αvà β là các chuỗi tùy ý các ký hiệu văn phạm
– Nếu α1 ⇒ α2 ⇒ ⇒ ta nói α1 dẫn xuất ra (suy ra)
Định nghĩa: Cho văn phạm G (V, T, P, S) hay cây phân tích cú pháp
i) Mỗi nút (đỉnh) có một nhãn, là một ký hiệu ∈(V ∪T ∪{ε})
ii) Nút gốc có nhãn là ký hiệu bắt đầu S
iii) Nếu nút trung gian có nhãn A thì A ∈V
Trang 11iv) Nếu nút n có nhãn A và các đỉnh n1, n2, , nk là con của n theo thứ tự từ trái
sang phải có nhãn lần lượt là X1, X2, , Xkthì A →X1X2 Xk là một luật sinh trong tập luật sinh P
v) Nếu nút n có nhãn là từrỗng εthì n phải là nút lá và là nút con duy nhất của nút
cha của nó
Vi dụ : Xét văn phạm G ({S, A}, {a, b}, P, S), trong đó P gồm:
S →aAS | a
A →SbA | SS | ba
S ⇒aAS ⇒aSbAS ⇒aabAS ⇒aabbaS ⇒aabbaa
Ví dụ : xây dựng cây phân tích cú pháp từ dẫn xuất
E ⇒-E ⇒- (E) ⇒- (E + E) ⇒- (id + E) ⇒- (id + id)
Trang 12Cây phân tích cú pháp minh họa ký hiệu ban đầu của một văn phạm dẫn đến một chuỗi trong ngôn ngữ
– Nếu ký hiệu chưa kết thúc A có luật sinh A → XYZ thì cây phân tích cú pháp có thể có một nút trong có nhãn A và có 3 nút con có nhãn tương ứng từ trái qua phải
là X, Y,Z
– Cây cú pháp (syntax - tree) là dạng rút gọn của cây phân tích cú pháp dùng để
biểu diễn cấu trúc ngôn ngữ
– Trong cây cú pháp các toán tử và từ khóa không phải là nút lá mà là các nút trong
Ví dụ: với luật sinh S ( if then S1 else S2 được biểu diễn bởi cây cú pháp:
Một kiểu rút gọn khác của cây cú pháp là chuỗi các luật sinh đơn được rút gọn lại Chẳng hạn ta có:
Sự mơ hồ (hay sự nhập nhằng) của văn phạm
Khái niệm: một văn phạm phi ngữ cảnh G được gọi là văn phạm nhập nhằng hay
còn gọi là mơ hồ (ambiguity) nếu nó có nhiều hơn một cây dẫn xuất cho cùng một chuỗi
w
Ví dụ: xét văn phạm với luật sinh: E-> E+E | E*E | (E) | a
Với chuỗi a+a*a ta có thể vẽ 2 cây dẫn xuất khác nhau:
Trang 13Điều này có nghĩa là biểu thức a+a*a có thể hiểu theo 2 cách khác nhau (a+a)*a hoặc a+(a*a)
– Một ngôn ngữ có thể được sinh ra từ văn phạm nhập nhằng hoặc văn phạm không nhập nhằng
– Ngôn ngữ được gọi là nhập nhằng (nhập nhằng cố hữu – không nghiên cứu) nếu mọi văn phạm sinh ra nó đều nhập nhằng
const i=32;
begin
i:=i+1;
Trang 14Hiện chưa có một phương tiện được thừa nhận rộng rãi để xác định những ràng buộc về ngữ cảnh như trên, và chúng thường được diễn đạt một cách không hình thức việc mô tả không hình thức thường không đầy đủ và không chính xác
Ngữ nghĩa :Cú pháp Mô hình tính toán (computational model)
Cách tiếp cận này gọi là ngữ nghĩa theo cú pháp
Ngữ nghĩa mức độ thấp (Low level semantics)
Ngữ nghĩa có thể ảnh hưởng đến mọi thứ ở mức rất thấp:
Ví dụ:
C: do { x = 2*x; } while (x < 100);
Pascal: repeat x := 2*x until x >= 100;
Nhận thấy ý nghĩa của 2 dòng lệnh khác nhau:
C: Thoát khỏi vòng lặp khi điều kiện sai, Pascal: khi nó đúng
Ngữ nghĩa mức độ cao ( High-level semantics)
Ngữ nghĩa có thể ảnh hưởng tới mức rất cao:
– C là 1 ngôn ngữ thủ tục; mô tả 1 tập hợp thủ tục
– Java là 1 ngôn ngữ hướng đối tượng; mô tả các đối tượng và trạng thái của
chúng – Prolog là 1 ngôn ngữ logic; mô tả các sự việc và mối quan hệ logic giữa chúng
Cú pháp hỗ trợ ngữ nghĩa
– Một ngôn ngữ không thể có ngữ nghĩa mà không có cú pháp để hỗ trợ ngữ nghĩa
Trang 15 C: không có thể có vòng lặp for mà không có cú pháp
Java: không thể có các đối tượng mà không có cú pháp cho việc tạo ra và sử dụng chúng
Điều này không có nghĩa là vòng lặp for và các đối tượng là cấu trúc cú pháp!
Ngữ nghĩa là cơ bản
– Ngữ nghĩa ảnh hưởng đến cách chúng ta nghĩ về rất lập trình
– Một số người nói, “ ạn có thể viết một chương trình FORTRAN trong bất kì ngôn ngữ.”
o Đây là một chương trình nghèo
o Bạn có thể sử dụng 1 ngôn ngữ hoặc bạn có thể chiến đấu với nó
o Nếu bạn chiến đấu với ngôn ngữ ,bạn cần cả hai:
Sử dụng sai ngôn ngữ
Sử dụng ngôn ngữ sai
Vai trò của ngữ nghĩa ngôn ngữ lập trình (The Role of Programming Language Semantics)
Trang 16 Những lợi thế của định nghĩa chính thức: rõ ràng điều mà các chương trình có thể chứng minh là đúng và máy dịch xác nhận để thành 1 hành vi chính thức
Định nghĩa chính thức đối với ngữ nghĩa không được đáp ứng hoàn toàn
Nhiều phương pháp tiếp cận được đẩy và nhiều người không hiểu rõ và không sử dụng phổ biến
Điều thú vị là ngữ nghĩa chính thường sau thực tế một ngôn ngữ hoặc có thể không
áp dụng cho toàn bộ ngôn ngữ (Trường hợp về HTML và SGML)
Để định nghĩa của một ngôn ngữ lập trình rõ ràng và chính xác, ngữ nghĩa của ngôn ngữ lập trình cũng cần được mô tả một cách hình thức.Ngữ nghĩa hình thức không chỉ là
cơ sở cho việc chứng minh tính đúng đắn của chương trình,mà còn có ích trong quá trình thiết kế và thực hiện ngôn ngữ lập trình
Một số ngữ nghĩa phổ biến bao gồm: ngữ nghĩa tĩnh (Static semantic) và ngữ nghĩa
Nhưng trong nội dung của đề tài này sẽ đề cập tới 3 phần chính của ngữ nghĩa động
đó là Denotational semantics, Operational semantics và Axiomatic semantics
3.1 Ngữ nghĩa tác vụ(Operational Semantics):
– Mô tả nghĩa của một chương trình bằng các câu lệnh trên máy, mô phỏng hoặc thực tế.Sự thay đổi trạng thái của máy xác định nghĩa của câu lệnh
– Dùng ngữ nghĩa tác vụ cho 1 ngôn ngữ cấp cao 1 máy ảo cần thiết
– Dựa vào một máy ảo mà tập các tác vụ của nó đã được định nghĩa chính xác – Ngữ nghĩa của mỗi phần tử chương trình được đặc tả bằng 1 tập các tác vụ của máy ảo