1. Trang chủ
  2. » Luận Văn - Báo Cáo

Đồ án tốt nghiệp đại học xây DỰNG hệ THỐNG hỗ TRỢ sửa lỗi CHƯƠNG TRÌNH sử DỤNG THUẬT TOÁN ‘rút gọn CHƯƠNG TRÌNH’

80 775 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Đồ án tốt nghiệp đại học xây dựng hệ thống hỗ trợ sửa lỗi chương trình sử dụng thuật toán ‘rút gọn chương trình’
Tác giả Nhóm tác giả
Người hướng dẫn Thầy Giáo Hướng Dẫn
Trường học Trường Đại học Xây Dựng
Chuyên ngành Khoa Học Máy Tính
Thể loại Đồ án tốt nghiệp
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 80
Dung lượng 7 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

DANH MỤC TỪ VIẾT TẮTTừ viết tắt Thuật ngữ tiếng anh Thuật ngữ tiếng việt CDe Control Dependence Phụ thuộc điều khiển CFG Control Flow Graph Đồ thị luồng điều khiển Def Set of Defined var

Trang 1

LỜI CẢM ƠN

Người đầu tiên tôi muốn gửi lời cảm ơn là thầy giáo hướng dẫn

của tôi Thầy đã dành nhiều thời gian quý báu để đóng góp nhiều ýkiến cũng như phương pháp làm việc cho tôi Làm việc với thầy tôi đãhọc hỏi được phương pháp nghiên cứu khoa học, cách tiếp cận và giảiquyết với những vấn đề mới và hơn hết là một cách làm việc nghiêmtúc và khoa học

Mặc dù đang nghiên cứu ở nước ngoài nhưng thầy đã dành nhiềuthời gian để gợi mở cho tôi những ý tưởng mới, hướng nghiên cứuthích hợp, luôn sẵn sàng giúp khi tôi cần sự giúp đỡ và đặc biệt là luônluôn động viên để tôi luôn tin vào chính mình

Tôi muốn gửi lời cảm ơn tới các thầy cô trong khoa Công nghệThông tin các bạn trong lớp đã giúp đỡ, chỉ bảo và động viên tôitrong suốt quá trình học tập tại trường cũng như làm đồ án tốt nghiệp.Cuối cùng, tôi muốn gửi lời cảm ơn tới những người thân và bạn

bè của tôi – những người đã luôn động viên tôi trong suốt quá trìnhhọc tập cũng như làm đồ án tốt nghiệp

Trang 2

MỤC LỤC

LỜI CẢM ƠN 1

MỤC LỤC 2

Chương 1 Giới Thiệu 6

1 Phát biểu bài toán 10

1.1 Khái niệm chung 10

1.2 Phân loại các thuật toán Rút gọn chương trình 11

1.3 Mục đích của đồ án 12

1.4 Giới hạn của đề tài 13

2 Kết quả đạt được 13

3 Bố cục của Đồ án 14

Chương 2: Các khái niệm liên quan 15

1 Luồng điều khiển (Control Flow) 15

1.1 Đồ thị luồng điều khiển (Control Flow Graph) 15

1.2 Khái niệm Điểm trội (Dominator) và Điểm trội sau (Post-dominator) 16

1.3 Phụ thuộc điều khiển (Control Dependence) 19

2 Luồng dữ liệu (Data Flow) 22

2.1 Phụ thuộc dữ liệu 22

2.2 Tính toán tập biến được định nghĩa và tập biến sử dụng 24

2.3 Xác định các phụ thuộc dữ liệu 25

3 Rút gọn chương trình (Program Slicing) 26

3.1 Sự khác nhau giữa các thuật toán Rút gọn chương trình 26

3.1.1 Rút gọn tĩnh (Static Slicing) và Rút gọn động (Dynamic Slicing) 26

3.1.2 Rút gọn lùi (Backward Slicing) và Rút gọn tiến (Forward Slicing) 27

Trang 3

3.1.3 Rút gọn đơn thủ tục và Rút gọn đa thủ tục 28

3.2 Những ứng dụng của Rút gọn chương trình 30

3.2.1 Bảo trì phần mềm (Software Maintenance) 30

3.2.2 Kiểm thử (Testing) 31

3.2.3 Sửa lỗi (Debugging) 32

Chương 3 Các thuật toán rút gọn chương trình cơ bản 33

1 Rút gọn chương trình sử dụng Đồ thị luồng điều khiển (Control Flow Graph) 33

1.1 Rút gọn các chương trình đơn giản 33

1.2 Rút gọn chương trình có cấu trúc 35

2 Rút gọn chương trình sử dụng Đồ thị phụ thuộc chương trình (Program Dependence Graph) 39

2.1 Rút gọn chương trình đơn thủ tục 39

2.2 Rút gọn chương trình đa phương thứcsử dụng SDG 41

Chương 4 Phân tích và cài đặt hệ thống 46

1 Sơ đồ hệ thống 47

1.1 Sơ đồ hệ thống ở mức 0 47

1.2 Sơ đồ hệ thống ở mức chi tiết 48

2 Ngôn ngữ lập trình Visual C# 49

2.1 Cách tổ chức và sắp xếp chương trình 49

2.2 Là một ngôn ngữ lập trình hướng đối tượng 49

2.3 C# là một ngôn ngữ mạnh mẽ và mềm dẻo 50

2.4 C# là ngôn ngữ ít từ khóa 51

2.5 C# là ngôn ngữ hướng mô-đun 51

2.6 Khoảng trắng trong C# (whilespace) 52

2.7 Phân loại câu lệnh 53

2.8 Khái niệm liên quan 54

Trang 4

2.8.1 Khái niệm về Predicate 54

2.8.2 Bậc của câu lệnh (Level) 56

2.8.3 Nhánh của câu lệnh (Branch) 59

2.9 Các vấn đề khác 61

3 Kỹ thuật chuẩn hóa chương trình 61

4 Xây dựng Đồ thị phụ thuộc chương trình 63

4.1 Kỹ thuật xác định tập Def và Ref tại một câu lệnh 65

4.1.1 Câu lệnh khai báo biến 65

4.1.2 Câu lệnh khởi tạo 65

4.1.3 Câu lệnh khai báo phương thức 66

4.1.4 Câu lệnh gọi phương thức 66

4.2 Xác định tập cung của Đồ thị phụ thuộc 66

4.2.1 Xác định phụ thuộc điều khiển (Control Dependence) 66

4.2.2 Xác định phụ thuộc dữ liệu (Data Dependence) 67

5.Cài đặt ……… 68

5.1 Xây dựng đối tượng tương ứng với biến chương trình 69

5.2 Cài đặt đối tượng đỉnh của đồ thị phụ thuộc 69

5.2.1 Các thuộc tính của đối tượng đỉnh 69

5.2.2 Các phương thức của đối tượng đỉnh 70

5.3 Cài đặt đối tượng Đồ thị phụ thuộc 72

5.3.1 Các thuộc tính của đối tượng Đồ thị phụ thuộc 72

5.3.2 Các phương thức của đối tượng Đồ thị phụ thuộc 72

5.4 Chạy chương trình và thử nghiệm hệ thống 73

HƯỚNG PHÁT TRIỂN 77

TÀI LIỆU THAM KHẢO 78

Trang 5

DANH MỤC TỪ VIẾT TẮT

Từ viết

tắt

Thuật ngữ tiếng anh Thuật ngữ tiếng việt

CDe Control Dependence Phụ thuộc điều khiển

CFG Control Flow Graph Đồ thị luồng điều khiển

Def Set of Defined variables Tập các biến được định nghĩaEPS Excutable Program Slicing Rút gọn chương trình thực thi

được

MDG Method Dependence Graph Đồ thị phụ thuộc phương thứcPDG Program Dependence Đồ thị phụ thuộc chương trình

Ref Set of Reference variables Tập các biến được sử dụngSDG System Dependence Graph Đồ thị phụ thuộc hệ thống

Trang 6

DANH MỤC HÌNH

Hình 2.1 Chương trình và đồ thị luồng điều khiển tương ứng 16

Hình 2.2 Chương trình và cây điểm trội của đồ thị trong Hình 2.1 18

Hình 2.3 Cây điểm trội sau của đồ thị luồng điều khiển trong Hình 2.1. .19

Hình 2.4 Các phụ thuộc điều khiển của chương trình trong Hình 2.1 20

Hình 2.5 Chương trình và Đồ thị phụ thuộc điều khiển tương ứng 21

Hình 2.6 Chương trình và Đồ thị phụ thuộc dữ liệu tương ứng 22

Hình 2.7 Đồ thị phụ thuộc chương trình của chương trình trong Hình 2.6 23

Hình 2.8 Tập các biến được định nghĩa và sử dụng của một chương trình 24

Hình 2.9 Rút gọn tĩnh được tính cho câu lệnh cuối cùng (bên trái) và Rút gọn động cho đầu vào op = “sin” 27

Hình 2.10 Rút gọn tiến và rút gọn lùi 28

Hình 2.11 Đồ thị phụ thuộc hệ thống (System Dependence Graph) 29

Hình 3.1 Chương trình và Đồ thị phụ thuộc chương trình tương ứng 41

Hình 3.2 Đồ thị phụ thuộc hệ thống System Depedence Graph 44

Hình 3.3: SDG rút gọn từ SDG trong hình 3.2 45

Hình 4.1 Sơ đồ hệ thống ở mức đơn giản 47

Hình 4.2 Sơ đồ hệ thống ở mức chi tiết 48

Hình 4.3 Danh sách các từ khóa của ngôn ngữ Visual C# 51

Hình 4.4 Thuật toán xác định cung nối giữa hai đỉnh của Đồ thị phụ thuộc 67

Hình 4.5 Giao diện chính của hệ thống 74

Trang 7

Hình 4.6 Giao diện chương trình thực hiện chức năng rút gọn chương trình đối với phương thức có lời gọi phương thức 75 Hình 4.7 Giao diện cho phép xem thông tin câu lệnh 75

Chương 1 Giới Thiệu

Bảo trì phần mềm là một quá trình phức tạp và tốn kém, thống kê chothấy các tổ chức lớn phải bỏ ra 50% chi phí lập trình của họ vào việc bảo trìnhững hệ thống tin học của họ Theo thời gian sống của sản phẩm phầnmềm, chi phí và công sức bảo trì trong thời gian đó nếu có thể thống kêđược thì đó quả thực là một con số không nhỏ Vì thế mục tiêu muôn thủacủa các nhà sản xuất phần mềm là làm giảm giá thành bảo trì bằng việc tăngkhả năng của việc bảo trì Điều đó chỉ có thể thực hiện được trên một môitrường phần mềm tích hợp nhiều công cụ hỗ trợ cho việc tìm và sửa lỗichương trình

Rút gọn chương trình (Program Slicing - PS) là một kỹ thuật phân tích

chương trình, kỹ thuật này trích rút những câu lệnh của chương trình mà cáccâu lệnh đó có liên quan đến việc tính toán cụ thể nào đó Một rút gọn trả lờicâu hỏi “Những câu lệnh nào của chương trình có khả năng ảnh hưởng đến

giá trị của biến v nào đó tại câu lệnh s?”, Mark Weiser đã giới thiệu PS bởi

vì ông ta nhận thấy rằng những lập trình viên còn gặp nhiều khó khăn trongquá trình gỡ rối (hay còn gọi là quá trình tìm và sửa lỗi chương trình -

Debugging) Khi gỡ rối chương trình giả sử lập trình viên nhận thấy giá trị

Trang 8

của một biến nào đó tại câu lệnh s là không đúng, theo kinh nghiệm họ sẽ rà soát những câu lệnh có thể liên quan đến việc tính toán tại s để tìm lỗi Kinh

nghiệm đó của họ vô tình đưa ra một bài toán, đó là làm sao để không phảimất nhiều thời gian rà soát lại các câu lệnh phụ thuộc Hay nói cách khác làlàm sao để có một chương trình đơn giản hơn mà chỉ có các câu lệnh phụ

thuộc vào câu lệnh s Rút gọn chương trình được đề cập từ đó, PS xác định

các phụ thuộc một cách tự động và vì thế nó sẽ hỗ trợ cho lập trình viên rấtnhiều trong các nhiệm vụ liên quan đến chương trình như: sửa lỗi

(Debugging), tích hợp chương trình (Program Integration), bảo trì phần mềm (Software Maintenance), kiểm thử (Testing) và đánh giá chất lượng phần mềm (Software Quality Assurance).

Program Slicing (Rút gọn chương trình – PS) tạo ra một công cụ hữuích như đã nói ở trên cho người lập trình để hỗ trợ họ trong việc bảo trì phần

mềm Chúng ta tiếp cận với khái niệm sau: một rút gọn (Slice) của một

chương trình P tại điểm p liên quan đến biến v (là biến được định nghĩa hoặc sử dụng tại điểm p) là tập tất cả các câu lệnh của P mà việc thực thi của các câu lệnh đó ảnh hưởng đến biến v PS có thể được sử dụng theo nhiều

cách khác nhau trong các hệ thống hỗ trợ cho việc bảo trì phần mềm

Mark Weiser, người đầu tiên đưa ra khái niệm Rút gọn chương trìnhnăm 1979 Để đưa ra được ý tưởng này ông đã có một quá trình quan sátviệc tìm và sửa lỗi của các lập trình viên trong thực tế Giả sử chúng ta đang

có một chương trình tương đối lớn và phức tạp, chương trình thực hiện đểtrả về một kết quả nào đó, trong quá trình kiểm thử người ta thấy rằng kếtquả mà chương trình đó trả về là không chính xác hoặc không ổn đỉnh Theo

Trang 9

truyền thống, để tìm ra lỗi lập trình viên phải thực hiện những bước thủ côngsau:

Bước 1:Tìm ra biến x nào trong chương trình dùng để trả về kết quả của

chương trình

Bước 2: Tìm ra vị trí n gần cuối chương trình nhất mà ở đó có định

nghĩa biến x, giả sử biến x được định nghĩa dưới dạng: x = P(y1 ,y 2 ,…y m), trong đó y1 ,y 2 ,…y m là các biến của chương trình tham gia vào việc tính giá trị biến x tại câu lệnh n.

Bước 3: Duyệt tất cả các câu lệnh trước n mà câu lệnh đó có chứa các

biến ảnh hưởng đến quá trình tính toán giá trị biến x tại n

Xuất phát từ việc quan sát các bước trên, Mark Weiser đã nảy sinh ýtưởng đó là các chương trình được rút gọn chỉ có các câu lệnh ảnh hưởng

đến việc tính toán của biến x tại câu lệnh n.

Những ngôn ngữ lập trình hướng đối tượng ( Object-oriented Programming Language) được quan tâm và sử dụng rất nhiều trong những

năm gần đây bởi vì chúng cho phép lập trình viên viết các chương trình dễkiểm thử hơn, dễ sử dụng lại hơn và linh hoạt hơn so với những ngôn ngữhướng cấu trúc trước đó Tuy vậy với nhiều khái niệm mới của lập trình

hướng đối tượng như: tính đóng gói, tính kế thừa (Inheritance), tính tương ứng bội (Polymorphism) đã làm xuất hiện các chiến lược mới cho việc phân tích chương trình tĩnh mà tiêu biểu là Rút gọn chương trình tĩnh ( Static Prgram Slicing).

Trước ý nghĩa to lớn và thực trạng của việc nghiên cứu bài toán rút gọn chương trình đó, chúng tôi quyết định chọn đề tài này Mục tiêu của chúng tôi là nghiên cứu các thuật toán Rút gọn chương trình, sau đó lựa chọn một

Trang 10

thuật toán phù hợp để cài đặt hệ thống hỗ trợ sửa lỗi cho các chương trình viết bằng ngôn ngữ lập trình hướng đối tượng Visual C Sharp.

1 Phát biểu bài toán

1.1 Khái niệm chung

Có nhiều khái niệm về Rút gọn chương trình (Program Slicing) Khái

niệm Rút gọn chương trình đầu tiên được đưa ra bởi Weiser[93,94,97] bây

giờ được gọi là Rút gọn tĩnh lùi thực thi được (Executable Backward Static Slice) Gọi là thực thi được vì việc rút gọn sẽ tạo ra chương trình thực thi

được

Khái niệm “lùi” (Backward) được sử dụng bởi vì khi xác định Rút gọntheo phương pháp Đồ thị phụ thuộc người ta phải duyệt từ đỉnh rút gọn chođến đỉnh đầu tiên của đồ thị

Gọi là rút gọn tĩnh vì bài toán rút gọn được tính giống như kết quả của

bài toán phân tích tĩnh (Static Analysis Problem), cụ thể hơn đó là các bài

toán chỉ cho một kết quả đầu ra tương ứng với một kết quả đầu vào

Sự phát triển của Rút gọn chương trình được phát triển qua các giaiđoạn và các tác giả như sau:

Đầu tiên, Weiser sử dụng một Đồ thị luồng điều khiển (Control Flow Graph) như là một biểu diễn trung gian cho Thuật toán rút gọn của ông ta.

Sau đó tác giả Ottenstein[26,73] cũng đã cho thấy các Rút gọn “lùi” cũng cóthể được tính toán một cách hiệu quả bằng việc dùng Đồ thị phụ thuộc

chương trình (Program Dependence Graph) làm biểu diễn trung gian Kết

Trang 11

quả đó sau đó cũng được Horwitz[40, 41, 42, 43, 44, 46, 47, 48, 82, 83, 86]tiếp tục phát triển với cài đặt cụ thể.

Gần đây, Korel và Laski đã giới thiệu khái niệm Rút gọn động(Dynamic Slicing) [53,55]: là một rút gọn được tính cho một đầu vào cốđịnh Cũng giống như Weiser, thuật toán của Korel và Laski cũng sử dụng

đồ thị luồng điều khiển làm biểu diễn trung gian, sau đó hai tác giả Agrawal

và Horgan đã giải quyết thuật toán Rút gọn động bằng cách lấy Đồ thị phụthuộc làm biểu diễn trung gian [5,6]

Trong đồ án này, khi nói đến khái niệm Rút gọn chương trình chúng

ta sẽ hiểu đó là rút gọn lùi (khái niệm rút gọn “tiến” (Foreward Slice)

không được đề cập trong đồ án này)

1.2 Phân loại các thuật toán Rút gọn chương trình

Theo từng thời kỳ phát triển của Rút gọn chương trình sẽ có các thuậttoán Rút gọn chương trình tương ứng

Ở giai đoạn đầu khi Weiser mới đưa ra khái niệm Rút gọn chươngtrình thì thuật toán được đề cập đó là thuật toán dựa trên Đồ thị luồng điều

khiển (Control Flow Graph).

Việc tính toán trên Đồ thị luồng điều khiển có điểm hạn chế và phứctạp nên một số nhà nghiên cứu đưa ra thuật toán rút gọn dựa trên Đồ thị phụ

thuộc dữ liệu (Data Dependence Gaph) Thuật toán này dễ cài đặt và độ

phức tạp của thuật toán có thể chấp nhận được song khi mới ra đời thuậttoán này mới chỉ áp dụng cho việc Rút gọn tĩnh cho các chương trình đơngiản

Rút gọn động được ra đời sau đó nhằm khắc phục những hạn chế của

rút gọn tĩnh đó là kích thước của Chương trình rút gọn (Slied program)

Trang 12

trong Rút gọn tĩnh lớn hơn kích thước của chương trình rút gọn trong Rútgọn động Một ứng dụng rất lớn của rút gọn động đó là nó được dùng đểđịnh vị lỗi của chương trình một cách tự động mà trong Rút gọn tĩnh khôngthể làm được điều đó.

1.3 Mục đích của đồ án

Mục đích của công việc trong phạm vi đồ án này là nhằm nghiên cứu

các thuật toán rút gọn tĩnh chương trình (Static Program Slicing) qua đó

lựa chọn một thuật toán phù hợp mà có thế cài đặt một cách hiệu quả chomột ngôn ngữ lập trình hướng đối tượng Từ đó h ướng tới xây dựng hệthống hỗ trợ sửa lỗi chương trình viết bằng ngôn ngữ hướng đối tượng tươngứng Chúng tôi sử dụng những mục tiêu sau để cài đặt hệ thống hỗ trợ sửalỗi chương trình sử dụng thuật toán rút gọn chương trình:

o Hệ thống phải có khả năng hỗ trợ cho toàn bộ các đặc điểm củangôn ngữ lập trình bao gồm: các kiểu dữ liệu khai báo, dữ liệu đặcbiệt (như mảng, kiểu liệt kê…),các hàm và biến toàn cục, cácphương thức nội tại, các kiểu dữ liệu mở rộng, các kiểu đóng góiđộng (phương thức), biến con trỏ, lớp (Class) Các đặc điểm củangôn ngữ lập trình hướng đối tượng như: thừa kế, đóng gói, vàtương ứng bội cũng được hỗ trợ đầy đủ

o Các cấu trúc dữ liệu bên trong của hệ thống phải được mô tả mộtcách gần gũi với ngữ nghĩa của chương trình

o Việc tính toán một rút gọn phải nhanh mà kết quả rút gọn đó vẫn cóthể chấp nhận được

Trang 13

o Trình rút gọn phải hỗ trợ rút gọn cho các hệ thống Module, kết quảcủa việc tính rút gọn cho một Module sẽ được sử dụng lại trongtương lai khi có một Module nào đó cần sử dụng đến Module đãđược rút gọn rồi.

o Trình rút gọn sử dụng trong hệ thống phải là một công cụ có khảnăng tích hợp, nó sẽ làm đơn giản hóa chương trình cho phép lậptrình viên có khả năng dễ dàng tìm ra lỗi một cách trực quan

Ứng dụng chính của trình rút gọn chương trình đó là hỗ trợ cho lập trìnhviên trong việc tìm và sửa lỗi chương trình, bảo trì phần mềm, kiểm thửchương trình

1.4 Giới hạn của đề tài

Như chúng ta biết, hiện nay với xu hướng phát triển của Công nghệ phầnmềm các ngôn ngữ lập trình đã có nhiều thay đổi Vẫn là ngôn ngữ bậc caosong những ngôn ngữ lập trình như Pascal, C, Visual Basic lại ít được dùng

để phát triển ứng dụng, trong khi những ngôn ngữ lập trình khác như VisualC#, Visual Basic NET, Java, C++… vẫn được dùng và có ứng dụng rộngrãi Như vậy, ngôn ngữ lập trình thì rất đa dạng, các ngôn ngữ lập trình lại có

cú pháp khác nhau vì thế việc xây dựng một hệ thống hỗ trợ sửa lỗi chươngtrình cho tất cả các ngôn ngữ là rất khó khăn và phức tạp

Trong phạm vi đồ án này chúng tôi sẽ cố gắng cài đặt và xây dựng hệ thống hỗ trợ sử lỗi chương trình cho chương trình được viết bởi ngôn ngữ Visual C# Lý do chúng tôi chọn ngôn ngữ C# bởi vì: thứ nhất,Visual C# là

một ngôn ngữ phổ biến và được sử dụng để xây dựng nhiều ứng dụng trong

thực tế; thứ hai,Visual C# là một ngôn ngữ lập trình hướng đối tượng vì thế

sẽ có nhiều điểm mới so với ngôn ngữ lập trình hướng cấu trúc truyền thống;

Trang 14

thứ ba, với những gì mà chúng tôi đã tìm hiểu được thì hiện nay chưa có hệ

thống cài đặt thuật toán rút gọn chương trình cho ngôn ngữ Visual C#

2 Kết quả đạt được

Như đã trình bày ở trên, Rút gọn chương trình là một bài toánphức tạp theo từng mức độ khác nhau Tuy nhiên, trong một thời giannghiên cứu không dài chúng tôi cũng đã thu được những kết quả nhấtđịnh Những kết quả chúng tôi đã đạt được gồm có:

 Xây dựng Module chuẩn hóa chương trình đầu vào với mụcđích là chuẩn hóa câu lệnh trước khi rút gọn chương trình

 Cài đặt các cấu trúc dữ liệu liên quan như: Đồ thị phụ thuộc,câu lệnh, biến, phương thức, lớp

 Cài đặt thuật toán rút gọn chương trình sử dụng Đồ thị phụthuộc cho các chương trình đơn thủ tục, đa thủ tục, cácchương trình cơ bản trong ngôn ngữ Visual C#

 Tích hợp các Module để hoàn thiện hệ thống Hỗ trợ sửa lỗichương trình đảm bảo mục tiêu đề ra

Trang 15

 Chương 3: Trình bày và so sánh một số thuật toán Rút gọnchương trình cơ bản.

 Chương 4: Phân tích chi tiết hệ thống và trình bày các bước càiđặt hệ thống

Chương 2: Các khái niệm liên quan

1 Luồng điều khiển (Control Flow)

Trong các ngôn ngữ bậc cao, các cấu trúc điều khiển (như if, while,for…) biểu diễn luồng của điều khiển Ví dụ như Biểu thức logic của một

cấu trúc if sẽ quyết định nhánh nào của cấu trúc đó được thực hiện Những cấu trúc điều khiển đó có thể được biên dịch thành lệnh nhảy (Jump) trong

các ngôn ngữ bậc thấp Một số cấu trúc dữ liệu đã được đề nghị để mô hình

ngữ nghĩa (Semantic) của luồng điều khiển tại các mức độ trừu tượng khác

nhau sẽ được trình bày sau đây

1.1 Đồ thị luồng điều khiển (Control Flow Graph)

Định nghĩa 1: Đồ thị (Graph), một đồ thị có hướng G là tập các nút

(Node) hay còn gọi là các đỉnh (Vertex) và tập các cung (Edge) E NxN.Cung (n,m) thuộc E, m được gọi là nút con của n và n được gọi là nút chacủa m G chứa hai loại nút đặc biệt đó là ninitial (hay START) là nút không cónút cha và nfinal (STOP) là nút không có nút con

Định nghĩa 2: Đồ thị luồng điều khiển (Control Flow Graph), một đồ

thị luồng điều khiển cho một chương trình P là một đồ thị trong đó mỗi nútđược kết hợp với một câu lệnh của chương trình P và các cung biểu diễn

Trang 16

luồng điều khiển trong P Gọi V là tập các biến của chương trình P Với mỗi

nút n (tương ứng với một câu lệnh trong chương trình P) ta định nghĩa hai tập: REF(n) là tập các biến được sử dụng tại n, DEF(n) là tập các biến được

khai báo và khởi tạo tại n

Hình 2.1 Chương trình và đồ thị luồng điều khiển tương ứng

1.2 Khái niệm Điểm trội (Dominator) và Điểm trội sau dominator)

(Post-Khái niệm cây Dominator biểu diễn mối quan hệ “trội” hơn

(Dominance) giữa các nút của đồ thị có hướng.

Trang 17

Định nghĩa 1: Trong một đồ thị có hướng với nút bắt đầu START

(n-initial), chúng ta nói rằng một nút A trội hơn nút B nếu tất cả đường đi P trên

đồ thị nối từ nút START đến nút B đều thỏa mãn A thuộc P A được gọi là

một điểm trội (Dominator) của B.

Khái niệm A trội hơn B trong đồ thị luồng điều khiển tương ứng vớiviệc trong chương trình trong tất cả các trường hợp thực thi, nếu B đượcthực thi thì chắc chắn A cũng phải được thực thi trước đó

Quan hệ trội hơn có tính:

o Phản xạ: mỗi nút trội hơn chính nó

o Tính bắc cầu: Nếu nút A trội hơn nút B và nút B trội hơn nút Ckhi đó nút A trội hơn nút C

o Tính phi đối xứng: nếu nút A trội hơn nút B và nút B trội hơn nút

A thì A=B

Định nghĩa 2: Chúng ta gọi A là trội hơn trực tiếp (Immediate Dominator) của B nếu A trội hơn B, A≠B, và không có một nút C khác thỏa

mãn C trội hơn nút B, A trội hơn C

Định nghĩa 3: Cây điểm trội (Dominator Tree) của một đồ thị có

hướng G với nút bắt đầu START là một cây bao gồm các nút của đồ thị G,

có một nút gốc là nút START, và có một cung giữa nút A và nút B nếu Atrội trực tiếp hơn B

Trang 18

Hình 2.2 Chương trình và cây điểm trội tương ứng với đồ thị trong Hình 2.1

Định nghĩa 4: Trong một đồ thị có hướng với nút kết thúc STOP, chúng

ta có thể nói một nút là điểm trội sau của B (Post-Dominates) nếu tất cả cácđường từ B đến nút kết thúc STOP đều thỏa mãn A thuộc P Chúng ta gọi A

là điểm trội sau của B

Định nghĩa 5: Chúng ta gọi A là điểm trội sau trực tiếp của B nếu A là

một điểm trội sau của B, A≠B, không tồn tại nút C nào lấy A làm điểm trộisau và chính C là điểm trội sau của B

Định nghĩa 6: Cây điểm trội sau (Post-Dominator Tree) của một đồ thị

có hướng G với nút kết thúc STOP là một cây bao gồm các nút của G, cómột nút gốc STOP và có một cung nối giữa nút A và nút B nếu A là điểmtrội sau trực tiếp của B

Trang 19

Hình 2.3 Cây điểm trội sau của đồ thị luồng điều khiển trong Hình 2.1.

1.3 Phụ thuộc điều khiển (Control Dependence)

Định nghĩa 1:Gọi G là một Đồ thị luồng điều khiển Gọi A và B là các

nút trong G, B phụ thuộc điều khiển lên A nếu thỏa mãn:

i Có một đường đi trực tiếp P từ A đến B.

ii B là điểm trội sau của bất kì nút C thuộc P (trừ A và B).

iii B không là điểm trội sau của A.

Nếu B là phụ thuộc điều khiển lên A, khi đó A có thể có nhiều nút con

Định nghĩa 2: Đồ thị phụ thuộc điều khiển (Control Dependence Graph) thừa kế từ Đồ thị luồng điều khiển G là một đồ thị bao gồm các nút

của G và trong đó một cung có hướng từ nút A đến nút B nếu B là phụ thuộcđiều khiển lên A Đồ thị phụ thuộc điều khiển có thể được xây dựng từ Đồthị luồng điều khiển và cây điểm trội sau sử dụng một thuật toán với độ phứctạp O(N2), với N là số nút trong đồ thị luồng điều khiển

Định nghĩa 3:Vùng điều khiển của một câu lệnh điều khiển C là tập các

câu lệnh phụ thuộc điều khiển vào C

Trang 20

Định nghĩa 4:Gọi Đồ thị luồng điều khiển G là một cây cú pháp trìu tượng (Abstract Syntax Tree) của một chương trình có cấu trúc Các nút

của G biểu diễn các câu lệnh và biểu thức của chương trình thành các nút

Đồ thị phụ thuộc điều khiển tạo bởi Đồ thị luồng dữ liệu G chứa một cungphụ thuộc dữ liệu từ nút A đến nút B nếu thỏa mãn:

i A là một Entry Node (START), B biểu diễn một thành phần màthành phần đó không nằm trong bất kỳ vòng lặp hoặc vùng điều

kiện nào cả Cung này được gán nhãn là True

ii A biểu diễn một nút điều khiển (Predicate Node) và B biểu diễn

một thành phần nằm trực tiếp trong vùng điều khiển của A Nếu

A tương ứng với câu lệnh lặp thì cung nối A với B được gán nhãn

là True, nếu A tương ứng với câu lệnh điều kiện nhiều nhánh thìcung nối A với B được gán nhãn là True hay False phụ thuộc vào

B thuộc nhánh nào của câu lệnh điều kiện

Hình 2.4 Các phụ thuộc điều khiển của chương trình trong Hình 2.1

Trang 21

Hình 2.5 Chương trình và Đồ thị phụ thuộc điều khiển tương ứng.

Trang 22

2 Luồng dữ liệu (Data Flow)

2.1 Phụ thuộc dữ liệu

Một phụ thuộc dữ liệu từ một nút A đến nút B có nghĩa rằng việc tínhtoán của chương trình có thể bị thay đổi nếu quan hệ thứ tự của các nút bịđảo ngược

Định nghĩa 1:Một Đồ thị phụ thuộc dữ liệu được định nghĩa qua một

cây cú pháp trừu tượng của một chương trình chứa một phụ thuộc dữ liệu từnút D đến nút U nếu thỏa mãn tất cả những điều kiện sau:

i Nút D định nghĩa biến x

ii Nút U sử dụng biến x

iii Không có một định nghĩa nào của biến x giữa D và U

Hướng của phụ thuộc dữ liệu biểu thị luồng thay đổi giá trị của biếnđược định nghĩa Giá trị được tính tại U phụ thuộc vào tất cả các nút mà Dphụ thuộc vào chúng

Hình 2.6 Chương trình và Đồ thị phụ thuộc dữ liệu tương ứng

Trang 23

Định nghĩa 2: Đồ thị phụ thuộc chương trình là đồ thị phụ thuộc điều

khiển nhưng có thêm các cung phụ thuộc dữ liệu( hoặc là đồ thị phụ thuộc

dữ liệu nhưng có thêm các cung phụ thuộc điều khiển)

Hình 2.7 Đồ thị phụ thuộc chương trình của chương trình trong Hình 2.6

Trang 24

2.2 Tính toán tập biến được định nghĩa và tập biến sử dụng

a Xác định các biến sử dụng

Tập các biến được sử dụng (kí hiệu Ref(n), n là vị trí câu lệnh) bởi mộtcâu lệnh của đồ thị phụ thuộc được tính toán một cách dễ dàng bằng mộtphép duyệt đồ thị tương ứng với chương trình Đó là các biến tham gia tínhtoán làm thay đổi giá trị của một biến nào đó trong câu lệnh

Hình 2.8 Tập các biến được định nghĩa và sử dụng của một chương trình

b Xác định tập biến được định nghĩa:

Biến được định nghĩa là biến tại câu lệnh đó nó được khai báo hoặckhởi tạo, tập các biến được định nghĩa tại câu lệnh n kí hiệu là Def(n)

Chỉ có hai khả năng làm thay đổi giá trị của biến:

o Thứ nhất, biến được gán một giá trị bằng một câu lệnh gán.Trong trường hợp này thì biến xuất hiện ở bên trái câu lệnh gán

là biến được định nghĩa và biến xuất hiện ở phía bên phải câulệnh gán là biến được sử dụng

o Một biến có thể được làm tham số để truyền đến một hàm khi cólời gọi hàm Trong C#, nếu biến đó được truyền dưới dạng thamtrị thì giá trị của biến đó không bị thay đổi, nhưng nếu biến đó

Trang 25

được truyền dưới dạng truyền tham chiếu thì giá trị của biến đó

sẽ bị thay đổi

Ngoài ra trong một số trường hợp đặc biệt việc xác định các biến đượcđịnh nghĩa và các biến được sử dụng có khác đi, đó là khi chúng ta sử dụngbiến mảng, biến đối tượng và trong ngôn ngữ hướng đối tượng đó là khi biếnđối tượng gọi đến một phương thức làm thay đổi giá trị của đối tượng

Đối với biến mảng, bản thân nó là một biến và các phần tử trong mảng

đó cũng là biến vì thế chúng ta sẽ đi đến một tiếp cận đơn giản như sau:Xem mỗi phép gán mảng bao gồm cả hai phép gán và sử dụng mảng Vídụ:

Trang 26

Trong ví dụ này thì sẽ không có phụ thuộc dữ liệu giữa các câu lệnh giữahai nhánh 1 và 2.

Nói một cách dễ hiểu, phụ thuộc dữ liệu đơn giản chỉ là quan hệ giữa haicâu lệnh trong đó một câu lệnh định nghĩa biến x và câu lệnh khác sử dụng biến

x nào đó Để có thể hiểu và xác định được phụ thuộc dữ liệu một cách chínhxác hơn, chúng tôi sẽ trình bày ở phần “Các kỹ thuật cơ bản để chuẩn hóachương trình” trong chương sau

3 Rút gọn chương trình (Program Slicing)

3.1 Sự khác nhau giữa các thuật toán Rút gọn chương trình

3.1.1 Rút gọn tĩnh (Static Slicing) và Rút gọn động (Dynamic Slicing)

Rút gọn tĩnh được tính không quan tâm đến giá trị đầu vào, một rút gọntĩnh chứa tất cả các câu lệnh có thể ảnh hưởng đến giá trị của một biến tạimột điểm chương trình cho tất cả các lần thực thi Với Rút gọn tĩnh, các câulệnh trên các nhánh của câu lệnh rẽ nhánh có thể tồn tại đồng thời, điều này

sẽ làm tăng kích thước của chương trình rút gọn

Rút gọn động sử dụng thông tin của một lần thực thi cụ thể của chươngtrình Trong rút gọn động những lần thực thi của chương trình sẽ được lưu

lại thành nhật kí thực thi (Execution History) và các rút gọn động được tính

ra dựa trên nhật kí thực thi đó Một rút gọn động chứa tất cả các câu lệnhảnh hưởng thực sự đến giá trị của một biến chương trình tại một điểmchương trình cho một lần thực thi cụ thể

Hình 2.9 mô tả sự khác nhau giữa rút gọn tĩnh và rút gọn động trong một

ví dụ đơn giản:

Trang 27

Hình 2.9 Rút gọn tĩnh được tính cho câu lệnh cuối cùng (bên trái) và Rút

gọn động cho đầu vào op = “sin” (bên phải)

3.1.2 Rút gọn lùi (Backward Slicing) và Rút gọn tiến (Forward Slicing)

Rút gọn chương trình được giới thiệu lần đầu tiên bởi Weiser, bây giờgọi là Rút gọn lùi bởi vì chúng chứa phần câu lệnh phía trên chương trìnhtính từ câu lệnh được dùng để rút gọn Ngược lại, Rút gọn tiến chứa phầnchương trình mà câu lệnh được lấy làm rút gọn ảnh hưởng đến Hình 2.10cho thấy các Rút gọn tiến và rút gọn lùi cho câu lệnh x := 3;

Trang 28

Hình 2.10 Rút gọn tiến và rút gọn lùi

3.1.3 Rút gọn đơn thủ tục và Rút gọn đa thủ tục

Rút gọn đơn thủ tục là rút gọn trong một chương trình chỉ có một thủtục mà trong thủ tục đó không có lời gọi đến một hàm và thủ tục khác Nếuchương trình có nhiều thủ tục thì Rút gọn đa thủ tục được sử dụng

Trong rút gọn đa thủ tục, trong thủ tục đang rút gọn có câu lệnh gọi đếnmột thủ tục khác của chương trình khi đó nội dung của thủ tục được gọicũng phải xét đến Các thủ tục được xét đến phải theo thứ tự thời điểm thựcthi Như vậy thuật toán xác định Rút gọn đa thủ tục cũng tương tự như thuậttoán đơn thủ tục song cần có thêm một số bổ sung mới như: xử lí lời gọihàm, xử lí hàm được gọi, xử lí việc truyền tham số

Trang 29

Hình 2.11 Đồ thị phụ thuộc hệ thống (System Dependence Graph)

Trang 30

3.2 Những ứng dụng của Rút gọn chương trình

3.2.1 Bảo trì phần mềm (Software Maintenance)

Bảo trì phần mềm là bước không thể thiếu trong việc tạo ra một phầnmềm hoàn thiện, công việc đó có thể hiểu đơn giản đó là việc hiểu phầnmềm đang có và tạo ra những sự thay đổi mà không làm ảnh hưởng đếnnhững phần không thể thay đổi được của phần mềm Trong phần này có sửdụng đến một khái niệm rút gọn chương trình mới đó là Rút gọn phân tích(Decomposition Slice)

Trong khi một rút gọn lấy giá trị của một biến tại điểm chương trìnhhiện thời (câu lệnh), còn một Rút gọn phân tích lấy tất cả tính toán của mộtbiến và độc lập với câu lệnh đang xét Một Rút gọn phân tích rất tiện íchtrong bảo trì phần mềm, ví dụ như một biến v nào đó được xác định mà giátrị của nó đã bị thay đổi Trong các ứng dụng sử dụng Rút gọn phân tích,việc phân tách một chương trình được chia làm ba phần như sau:

Phần độc lập: các câu lệnh trong Rút gọn phân tích với biến v khôngnằm trong một Rút gọn phân tích khác

Phần phụ thuộc:Các câu lệnh trong Rút gọn phân tích với biến v nằmtrong một Rút gọn phân tích nào đó

Compliment: Các câu lệnh không độc lập (các câu lệnh trong một sốRút gọn phân tích nhưng không phải thuộc Rút gọn phân tích của biến v).Các biến có thể được phần loại một cách tương tự như sau:

Có thể thay đổi: tất cả các câu lệnh gán vào một biến là thuộc phần độclập

Không thể thay đổi: Có ít nhất một câu lệnh gán biến nằm trong mộtphần phụ thuộc

Sử dụng: Các biến được sử dụng trong Compliment mà không thuộcphần Độc lập và Phụ thuộc

Trang 31

3.2.2 Kiểm thử (Testing)

Phần này sẽ đề cập đến một khái niệm đó là Kiểm thử hồi quy(Regression Testing): đó là lặp lại quá trình kiểm thử sau một thao tác làmthay đổi phần mềm đó Quá trình này bao gồm việc chạy chương trình đãsửa đổi trên nhiều trường hợp cho dù sự thay đổi của chương trình là rất nhỏ.Một số thuật toán dựa trên Rút gọn chương trình đã được đề nghị sử dụng

để làm giảm chi phí của việc Kiểm thử hồi quy Trong khi Rút gọn phân tích

sẽ rút ra những thành phần cần thiết cho quá trình kiểm thử hồi quy, có thểvẫn còn một số lần kiểm thử để chạy trên các phần Đã thay đổi, phần Phụthuộc và phần Độc lập

Trong thuật toán sau sẽ coi các chương trình được kiểm thử sử dụngtiêu chuẩn đầy đủ về dữ liệu kiểm thử, đó là: tối thiểu một bộ dữ liệu kiểmthử (một tập các trường hợp dùng để kiểm thử) phải thỏa mãn Một ví dụ đó

là “chuẩn tất cả câu lệnh”, chuẩn này yêu cầu tất cả câu lệnh trong chươngtrình phải được thực thi bởi ít nhất một trường hợp kiểm thử trong bộ dữ liệukiểm thử

Một số thuât toán đã được giới thiệu với mục đích là làm giảm giáthành của việc kiểm thử hồi quy có sử dụng Rút gọn chương trình để xácđịnh các thành phần ảnh hưởng gián tiếp bởi việc sửa tại một điểm p nào đó.Trong thuật toán đó người ta xét các trạng thái của các thao tác sửa khácnhau (thêm câu lệnh, xóa câu lệnh, sửa đổi các biến sử dụng trong câulệnh…) Đầu tiên, rút gọn là một rút gọn được tính bằng việc quay lui từđiểm p, các câu lệnh định nghĩa trong rút gọn (Def) đó của các biến sử dụngtại điểm p được ghi lại Rút gọn thứ hai là một Rút gọn theo chiều ngược lạicũng được bắt đầu từ p, câu lệnh sử dụng các biến được định nghĩa tại p(Use) trong Rút gọn này được lưu lại Các cặp Def-Use được lưu lại ở cácbước trên đều bị ảnh hưởng bởi sự thay đổi nên tất cả phải được kiểm thửlại

Trang 32

3.2.3 Sửa lỗi (Debugging)

Rút gọn chương trình được khám phá giống như là một công cụ đượctạo ra bởi các lập trình viên có nhiều kinh nghiệm khi họ tìm và sửa lỗichương trình Những người lập trình, họ có một đoạn mã có lỗi ở trong đó,

họ được yêu cầu là phải mô tả đoạn mã đó sau khi đã loại bỏ lỗi trong đó…Công việc đó của họ đã đưa họ đến với khái niệm Rút gọn chương trình(Program Slicing) mà chúng ta đang tìm hiểu

Có nhiều loại Rút gọn chương trình được sử dụng trong tìm và sửa lỗi(Debugging) Đầu tiên, Rút gọn động (Dynamic Static) là một sự biến đổicủa Rút gọn tĩnh được giới thiệu để hỗ trợ cho việc tìm và sửa lỗi Khi tìm

và sửa lỗi, bình thường một người lập trình thực hiện một lần kiểm thử lênchương trình bị lỗi Một Rút gọn động sẽ tạo ra chương trình nhỏ hơn khithực hiện rút gọn tĩnh, hơn nữa rút gọn động còn phù hợp hơn để hỗ trợ chongười lập trình trong việc định vị lỗi đặc biệt là các lỗi là nguyên nhân củacon trỏ và chỉ số của mảng gây ra

Rút gọn chương trình cũng có hữu ích trong việc tìm và sửa các lỗi vềthuật toán, để làm được điều đó phải dựa vào quá trình: Bắt đầu từ một kếtquả lỗi, thuật toán tìm và sửa lỗi sẽ định vị lỗi trong một phương thức bằngviệc hỏi người lập trình một loạt những câu hỏi Những câu hỏi đó liên quanđến bản chất của một thủ tục, ví dụ như: “Hàm Add(4,2) có trả về giá tri 6hay không?”, dựa trên những câu hỏi đó những phương thức có đầu ra thỏamãn sẽ được coi là làm việc tốt còn những phương thức có đầu ra khôngthỏa mãn thì sẽ được mở ra Điều đó có nghĩa là các trình gỡ rối (Debugger)

cố gắng xác định nếu các lời gọi trong phương thức tạo ra những kết quảthỏa mãn thì sẽ không cần kiểm tra phương thức đó nữa và ngược lại thìchúng ta sẽ sử dụng Rút gọn chương trình để giải quyết phần còn lại của bàitoán

Trang 33

Chương 3 Các thuật toán Rút gọn chương trình cơ bản.

1 Rút gọn chương trình sử dụng Đồ thị luồng điều khiển (Control Flow Graph)

Phần này trình bày việc xác định một rút gọn như là kết quả của bài toán

luồng dữ liệu sử dụng đồ thị luồng điều khiển (Control Flow Graph)

Việc tính một rút gọn từ đồ thị luồng điều khiển qua hai bước xử lí: Đầu tiên thông tin luồng dữ liệu cần thiết được xác định Thông tin

luồng dữ liệu là tập các biến liên quan (Relevant Set) tại mỗi nút n Xét rút

gọn với chuẩn <s,v>, tập liên quan cho mỗi nút chứa các biến mà giá trị củachúng ảnh hưởng đến việc tính toán của biến v tại nút s

Bước thứ hai là xác định các câu lệnh của rút gọn, chúng bao gồm tất cảcác nút (các câu lệnh) n có các biến được định nghĩa thuộc tập các biến liênquan tại câu lệnh s và các nút điều khiển trực tiếp việc thực thi của nútchúng

1.1 Rút gọn các chương trình đơn giản

Các chương trình đơn giản là chương trình chỉ có câu lệnh khai báo vàcâu lệnh gán Giả sử chúng ta cần tính rút gọn theo chuẩn <s,v>, đối với các

chương trình như thế thì tập liên quan relevant tại mỗi nút được tính qua các

bước như sau:

i Khởi tạo tất cả các tập liên quan bằng rỗng

ii.Thêm v vào tập liên quan của nút n relevant(n).

Trang 34

iii.Với m là nút cha của n, gán relevant(m) giá trị:

iv.Thực hiện quay lui từ trên xuốn dưới, lặp lại bước (iii) cho đến khi

nút cha của m là nút đầu tiên của đồ thị luồng điều khiển ninitial

Ví dụ 2 : Hình 2 cho thấy các tập liên quan cho một rút gọn với chuẩn

<8,a> Các tập liên quan được tính từ dòng thứ 8 xuống dòng 1:

Trang 35

1.2 Rút gọn chương trình có cấu trúc

Đối với chương trình đơn giản mỗi câu lệnh có duy nhất một nút cha,trong luồng điều khiển có cấu trúc một câu lệnh có thể có nhiều nút cha Đốivới chương trình có cấu trúc thuật toán rút gọn sẽ có 3 thay đổi: thứ nhất làxuất hiện các tập điều khiển là tập chứa các câu lệnh điều khiển, thứ hai làphải có một quy tắc cho việc kết hợp các tập liên quan tại các điểm liên kếtđiều khiển, và cuối cùng là tính toán tập liên quan cho các cấu trúc lặp.Tương ứng với những thay đổi trên sẽ có những giải pháp tương ứng nhưsau:

Thứ nhất đó là xác định tập điều khiển Tập điều khiển control(n) kếthợp với nút n là tập các câu lệnh điều khiển mà chúng điều khiển trực tiếpviệc thực thi của n, Đối với một chương trình có cấu trúc, control(n) luônchứa ninitial, câu lệnh điều kiện (Conditional), câu lệnh lặp (Loop) và rỗng

khi n là ninitial Như vậy để xác định tập điều khiển tại mỗi câu lệnh, kiểm traxem câu lệnh đó có thuộc vùng điều khiển của câu lệnh điều khiển nàokhông, nếu có thì thêm đỉnh điều khiển đó vào tập điều khiển

Ví dụ 3: Xác định tập điều khiển:

Trang 36

Câu lệnh 6 thuộc vùng điều khiển của câu lệnh 5 Control(6) = {5}

Thứ hai, xác định tập liên quan tại các điểm liên kết Tại một điểm liênkết (ở đó có hai nút cùng chung một nút cha) tập liên quan được tínhbằng hợp của các tập liên quan của các nút lấy điểm liên kết làm nút

cha

Ví dụ 4: Xác định tập liên quan tại các nút liên kết tương ứng với Rút gọn

Trang 37

tại <11,a>.

Ví dụ 5: Xác định tập liên quan tại các nút liên kết tương ứng với Rút

Trang 38

gọn tại <5,a>.

Thứ ba, đối với cấu trúc lặp của chương trình Một vòng lặp trongchương trình sẽ tạo ra một luồng điều khiển mà trong luồng đó có sự lặp đilặp lại các câu lệnh Người ta đã tính được số lần duyệt cho mỗi vòng lặp đểtính tập liên quan đó là duyệt đến khi tập liên quan của các câu lệnh ổn định,trên thực tế người ta tính ra số lần duyệt bằng số câu lệnh khai báo và khởitạo trong cấu trúc lặp

Trang 39

2 Rút gọn chương trình sử dụng Đồ thị phụ thuộc chương trình (Program Dependence Graph)

2.1 Rút gọn chương trình đơn thủ tục

PDG cho chương trình P, kí hiệu là GP là một đồ thị có hướng, các đỉnhcủa nó được nối bởi các loại cung Các đỉnh của GP biểu diễn các câu lệnhgán và câu lệnh điều khiển xuất hiện trong chương trình P GP có đỉnh đặcbiệt gọi là Entry Vertex

GP là một đa đồ thị, tức là có thể có nhiều loại cung nối giữa hai đỉnh.Các cung trong GP biểu diễn các phụ thuộc trong các thành phần của chương

trình Một cung biểu diễn hoặc là phụ thuộc điều khiển ( Control Dependence) hoặc là phụ thuộc luồng (hay còn gọi là phụ thuộc dữ liệu) (Flow Dependence) Các cung phụ thuộc điều khiển được gán nhãn là True

hoặc False và gốc của một cung phụ thuộc điều khiển luôn là một EntryVertex hoặc một đỉnh điều khiển Một cung phụ thuộc điều khiển từ đỉnh uđến đỉnh v kí hiệu là ucv có nghĩa là trong quá trình thực thi bất cứ khi nào

u được thực thi và giá trị của nó trùng khớp với nhãn trên cung đến v khi đóthành phần chương trình được biểu diễn bởi v sẽ được thực hiện nếu chươngtrình kết thúc Xét PDG GP chứa một cung phụ thuộc điều khiển từ đỉnh uđến đỉnh v của GP nếu và chỉ nếu các điều kiện sau được thỏa mãn:

i u là Entry Vertex và v biểu diễn một thành phần của P mà thành phần

đó không nằm trong bất kì vòng lặp hoặc vùng lệnh điều kiện nào cả,

cung đó được gán nhãn True.

ii u biểu diễn một câu lệnh điều khiển và v biểu diễn một thành phần

của P nằm trực tiếp trong vòng lặp hoặc vùng câu lệnh điều kiện

Nếu u là điều khiển của vòng lặp while, for khi đó cung ucv được gán nhãn là true; nếu u là điều khiển của câu lệnh điều kiện khi đó cung uc v

được gán nhãn là true hay false tùy thuộc vào v xuất hiện trong nhánh then

hay nhánh else.

Trang 40

Các cung phụ thuộc luồng của một PDG được xác định sử dụng cácphân tích luồng dữ liệu Một PDG chứa một cung phụ thuộc luồng từ đỉnh uđến đỉnh v kí hiệu là ufv nếu và chỉ nếu thỏa mãn các điều kiện sau:

i u là một đỉnh mà tại đó có định nghĩa một biến x nào đó.

ii v là một đỉnh mà tại đó có sử dụng biến x.

iii Giữa hai đỉnh u và v không tồn tại đỉnh nào có định nghĩa biến x.

Các phụ thuộc luồng có thể được định nghĩa cụ thể hơn bằng việc phânloại thành loop carried và loop independent Một phụ thuộc u fv được

mang theo bởi vòng lặp L được kí hiệu ulc(L) v nếu thỏa mãn (i),(ii),(iii) và

các điều kiện sau:

iv Có một đường thực thi (EP) thỏa mãn (iii) và có cung quay lui lại

phía câu lệnh điều khiển

v Cả hai u và v đều nằm trong vòng lặp L.

Một phụ thuộc luồng ufv là một loop independent kí hiệu là u livnếu thỏa mãn (i),(ii),(iii), có một đường thực thi thỏa mãn (iii) và không cócung quay lui, u và v đều nằm trong vòng lặp

Với đỉnh s của PDG G, rút gọn của G tại đỉnh s kí hiệu là Slice(G,s) làmột đồ thị chứa tất cả các đỉnh trên đó s có một phụ thuộc điều khiển hoặcphụ thuộc luồng:

Ngày đăng: 19/06/2014, 21:16

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
[1] H. Agrawal. Towards automatic debugging of computer programs. Technical Report SERC-TR-40-P, Purdue University, 1989 Khác
[9] Barendergt, Eekelen, Glauert, Kennawar, and Plasneijer. Term graph rewriting. In In proceedings of the PARLE Conference, Vol II: Parallel Languages, 1987 Khác
Communications of the Association for Computing Machinery, 21(9):724{726, September 1978 Khác
[11] S. Bates and S. Horwitz. Incremental program testing using program dependence graphs.In Conference Record of the Twentieth ACM Symposium on Principles of Programming Languages,. ACM, 1993 Khác
[12] J. Beck. Program and interface slicing for reverse engineering. In Proceeding of the Fifteenth International Conference on Software Engineering, 1993. also in Proceedings of theWorking Conference on Reverse Engineering Khác
[13] J-F. Bergeretti and B. Carr_e. Information-ow and data-ow analysis of while-programs. ACM Transactions on Programming Languages and Systems, 7(1):37{61, January 1985 Khác
[14] V. Berzins. On merging software extensions. Acta Informatica, 23:607{619, 1985 Khác
[15] V. Berzins. Software merge: Models and methods for combining changes to programs. International Journal on Systems Integration, 1:121{141, August 1991 Khác
[16] J. Bieman and L. Ott. Measuring functional cohesion. IEEE Transactions on Software Engineering, 20(8):644{657, August 1994 Khác
[17] D. Binkley. Using semantic di_erencing to reduce the cost of regression testing. In Pro-ceedings of the Conference on Software Maintenance - 1992, pages 41{50, November 1992 Khác
[18] D. Binkley. Slicing in the presence of parameter aliasing. In Software Engineering Research Forum, Orlando, FL, November 1993 Khác
[19] D. Binkley. Precise executable interprocedural slices. ACM Letters on Programming Languages and Systems, 1-4(2), 1994 Khác
[20] D. Binkley. Reducing the cost of regression testing by semantics guided test case selection. In IEEE International Conference on Software Maintenance, 1995 Khác
[21] D. Binkley, S. Horwitz, and T. Reps. Prograom integration for languages with procedure calls. ACM Transactions on Software Engineering and Methodology, 4(1):3{35, January 1995 Khác
[22] J. Choi and J. Ferrante. Static slicing in the presence of goto statements Khác
ACM Transacton on Programming Languages and Systems, 16(4):1097{1113, July 1994 Khác
[23] J-D. Choi, B. Miller, and P. Netzer. Techniques for debugging parallel programs with owback analysis. Technical Report 786, University of Wisconsin - Madison, August 1988 Khác
[24] F. Cutillo, R. Fiore, and G. Visaggio. Identi_cation and extraction of domain independent components in large programs. In Proceedings of the Working Conference on Reverse Engineering, pages 83{92, June 1993 Khác
[25] D. E. Denning and P. J. Denning. Certi_cation of programs for secure information ow. Communications of the Association for Computing Machinery, 20(7):504{513, July 1977 Khác
[26] J. Ferrante, K. Ottenstein, and J. Warren. The program dependence graph and its use in optimization. ACM Transactions on Programming Languages and Systems, 9(3):319{349, July 1987 Khác

HÌNH ẢNH LIÊN QUAN

Hình 2.1. Chương trình và đồ thị luồng điều khiển tương ứng...............16 Hình 2.2 - Đồ án tốt nghiệp đại học xây DỰNG hệ THỐNG hỗ TRỢ sửa lỗi CHƯƠNG TRÌNH sử DỤNG THUẬT TOÁN ‘rút gọn CHƯƠNG TRÌNH’
Hình 2.1. Chương trình và đồ thị luồng điều khiển tương ứng...............16 Hình 2.2 (Trang 5)
Hình 2.1. Chương trình và đồ thị luồng điều khiển tương ứng. - Đồ án tốt nghiệp đại học xây DỰNG hệ THỐNG hỗ TRỢ sửa lỗi CHƯƠNG TRÌNH sử DỤNG THUẬT TOÁN ‘rút gọn CHƯƠNG TRÌNH’
Hình 2.1. Chương trình và đồ thị luồng điều khiển tương ứng (Trang 16)
Hình 2.2. Chương trình và cây điểm trội tương ứng với đồ thị trong Hình 2.1 - Đồ án tốt nghiệp đại học xây DỰNG hệ THỐNG hỗ TRỢ sửa lỗi CHƯƠNG TRÌNH sử DỤNG THUẬT TOÁN ‘rút gọn CHƯƠNG TRÌNH’
Hình 2.2. Chương trình và cây điểm trội tương ứng với đồ thị trong Hình 2.1 (Trang 18)
Hình 2.4. Các phụ thuộc điều khiển của chương trình trong Hình 2.1. - Đồ án tốt nghiệp đại học xây DỰNG hệ THỐNG hỗ TRỢ sửa lỗi CHƯƠNG TRÌNH sử DỤNG THUẬT TOÁN ‘rút gọn CHƯƠNG TRÌNH’
Hình 2.4. Các phụ thuộc điều khiển của chương trình trong Hình 2.1 (Trang 20)
Hình 2.5. Chương trình và Đồ thị phụ thuộc điều khiển tương ứng. - Đồ án tốt nghiệp đại học xây DỰNG hệ THỐNG hỗ TRỢ sửa lỗi CHƯƠNG TRÌNH sử DỤNG THUẬT TOÁN ‘rút gọn CHƯƠNG TRÌNH’
Hình 2.5. Chương trình và Đồ thị phụ thuộc điều khiển tương ứng (Trang 21)
Hình 2.6. Chương trình và Đồ thị phụ thuộc dữ liệu tương ứng. - Đồ án tốt nghiệp đại học xây DỰNG hệ THỐNG hỗ TRỢ sửa lỗi CHƯƠNG TRÌNH sử DỤNG THUẬT TOÁN ‘rút gọn CHƯƠNG TRÌNH’
Hình 2.6. Chương trình và Đồ thị phụ thuộc dữ liệu tương ứng (Trang 22)
Định nghĩa 2: Đồ thị phụ thuộc chương trình là đồ thị phụ thuộc điều - Đồ án tốt nghiệp đại học xây DỰNG hệ THỐNG hỗ TRỢ sửa lỗi CHƯƠNG TRÌNH sử DỤNG THUẬT TOÁN ‘rút gọn CHƯƠNG TRÌNH’
nh nghĩa 2: Đồ thị phụ thuộc chương trình là đồ thị phụ thuộc điều (Trang 23)
Hình 2.8. Tập các biến được định nghĩa và sử dụng của một chương trình. - Đồ án tốt nghiệp đại học xây DỰNG hệ THỐNG hỗ TRỢ sửa lỗi CHƯƠNG TRÌNH sử DỤNG THUẬT TOÁN ‘rút gọn CHƯƠNG TRÌNH’
Hình 2.8. Tập các biến được định nghĩa và sử dụng của một chương trình (Trang 24)
Hình 2.10. Rút gọn tiến và rút gọn lùi - Đồ án tốt nghiệp đại học xây DỰNG hệ THỐNG hỗ TRỢ sửa lỗi CHƯƠNG TRÌNH sử DỤNG THUẬT TOÁN ‘rút gọn CHƯƠNG TRÌNH’
Hình 2.10. Rút gọn tiến và rút gọn lùi (Trang 28)
Ví dụ 2: Hình 2 cho thấy các tập liên quan cho một rút gọn với chuẩn - Đồ án tốt nghiệp đại học xây DỰNG hệ THỐNG hỗ TRỢ sửa lỗi CHƯƠNG TRÌNH sử DỤNG THUẬT TOÁN ‘rút gọn CHƯƠNG TRÌNH’
d ụ 2: Hình 2 cho thấy các tập liên quan cho một rút gọn với chuẩn (Trang 34)
Hình 3.1. Chương trình và Đồ thị phụ thuộc chương trình tương ứng. - Đồ án tốt nghiệp đại học xây DỰNG hệ THỐNG hỗ TRỢ sửa lỗi CHƯƠNG TRÌNH sử DỤNG THUẬT TOÁN ‘rút gọn CHƯƠNG TRÌNH’
Hình 3.1. Chương trình và Đồ thị phụ thuộc chương trình tương ứng (Trang 41)
Hình 3.2. Đồ thị phụ thuộc hệ thống System Depedence Graph. - Đồ án tốt nghiệp đại học xây DỰNG hệ THỐNG hỗ TRỢ sửa lỗi CHƯƠNG TRÌNH sử DỤNG THUẬT TOÁN ‘rút gọn CHƯƠNG TRÌNH’
Hình 3.2. Đồ thị phụ thuộc hệ thống System Depedence Graph (Trang 44)
1. Sơ đồ hệ thống - Đồ án tốt nghiệp đại học xây DỰNG hệ THỐNG hỗ TRỢ sửa lỗi CHƯƠNG TRÌNH sử DỤNG THUẬT TOÁN ‘rút gọn CHƯƠNG TRÌNH’
1. Sơ đồ hệ thống (Trang 47)
1.2. Sơ đồ hệ thống ở mức chi tiết - Đồ án tốt nghiệp đại học xây DỰNG hệ THỐNG hỗ TRỢ sửa lỗi CHƯƠNG TRÌNH sử DỤNG THUẬT TOÁN ‘rút gọn CHƯƠNG TRÌNH’
1.2. Sơ đồ hệ thống ở mức chi tiết (Trang 48)
Hình 4.3. Danh sách các từ khóa của ngôn ngữ Visual C# - Đồ án tốt nghiệp đại học xây DỰNG hệ THỐNG hỗ TRỢ sửa lỗi CHƯƠNG TRÌNH sử DỤNG THUẬT TOÁN ‘rút gọn CHƯƠNG TRÌNH’
Hình 4.3. Danh sách các từ khóa của ngôn ngữ Visual C# (Trang 51)
Hình 4.5. Giao diện chính của hệ thống. - Đồ án tốt nghiệp đại học xây DỰNG hệ THỐNG hỗ TRỢ sửa lỗi CHƯƠNG TRÌNH sử DỤNG THUẬT TOÁN ‘rút gọn CHƯƠNG TRÌNH’
Hình 4.5. Giao diện chính của hệ thống (Trang 71)

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w