Xõy dựng Đồ thị phụ thuộc chương trỡnh

Một phần của tài liệ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’ (Trang 62 - 66)

Trước khi chỳng ta cú thể tạo nờn một rỳt gọn của chương trỡnh, chỳng ta phải xõy dựng nờn một biểu diờn đồ thị của chương trỡnh gần với mụ hỡnh ngữ nghĩa của chương trỡnh. Nếu cú thể, chỳng ta rất muốn cú được cỏc thụng tin chớnh xỏc về quỏ trỡnh thực thi của chương trỡnh theo thời gian thực thi của nú. Núi chung đú là điều khụng thể bởi vỡ cỏc giỏ trị của tham số đầu vào là khụng xỏc định cũng như khụng thể xỏc định được nhỏnh nào của cõu lệnh rẽ nhỏnh sẽ được thực thi và một vòng lặp sẽ thực thi bao nhiờu lần. Nhưng khụng phải thế là chỳng ta khụng thể tớnh toỏn được cỏc thụng tin cho việc tớnh Rỳt gọn cũng như việc gỡ rối chương trỡnh, chỳng ta hoàn toàn cú thể xỏc định được tập cỏc biến được định nghĩa, tập cỏc biến được sử dụng tại mụ̃i cõu lệnh, tập hàm được gọi trong chương trỡnh, tập cỏc tham số được truyền cho một hàm, hay chỳng ta cũng cú thể xỏc định được số nhỏnh của cõu lệnh rẽ nhỏnh, vựng diều khiển của cỏc cõu lệnh điều khiển…Tất cả cỏc thụng tin chỳng ta cú thể cú đủ để cho một thuật toỏn Rỳt gọn chương trỡnh cú thể cài đặt.

Như đó trỡnh bày ở phần lý thuyết cơ sở, Đồ thị phụ thuộc chương trỡnh núi chung và Đồ thị phụ thuộc phương thức núi riờng là một đồ thị cú hướng bao gồm tập cỏc đỉnh và cỏc cung, trong đú một đỉnh của đồ thị biểu diờn một cõu lệnh của chương trỡnh (hoặc phương thức) còn cỏc cung của đồ thị biểu diờn mối quan hệ phụ thuộc điều khiển hoặc phụ thuộc dữ liệu giữa cỏc cõu lệnh.

Khi xõy dựng Đồ thị phụ thuộc thỡ phần việc khú khăn nhất đú là xỏc định cỏc cung của đồ thị một cỏch tối ưu, tức là cỏc cung được xỏc định phải phản ỏnh đỳng mối quan hệ phụ thuộc giữa cỏc cõu lệnh, để được như vậy

thỡ ngay từ đầu việc tớnh toỏn cỏc tập biến được định nghĩa (Def) và tập cỏc biến được sử dụng (Ref) cũng phải được tớnh toỏn một cỏch chớnh xỏc.

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

Cỏc cõu lệnh cú cỏc biến được định nghĩa đú là: cõu lệnh khai bỏo biến, cõu lệnh khởi tạo biến, cõu lệnh vừa khai bỏo vừa khởi tạo biến, cõu lệnh khai bỏo phương thức, cõu lệnh gọi phương thức.

Trong phần này chỳng tụi đưa ra một phương thức dựng để phỏt hiện và lấy ra cỏc biến cú mặt trong một Expression đó được cài đặt trong hệ thống (khỏi niệm Expression đó được để cập ở phần trờn), phương thức này lấy đầu vào là một Expression và trả về đầu ra tập cỏc biến cú mặt trong Expression đú, chỳng tụi gọi phương thức này là GetVar().

4.1.1. Cõu lệnh khai bỏo biến.

Cỳ phỏp: [modifier] DataType variablelist;

Trong đú: modifier là một trong cỏc từ khúa:public, protected, private, static.

DataType: kiểu dữ liệu của biến.

variablelist: danh sỏch cỏc biến được khai bỏo cỏch nhau bởi dấu “,”. Theo cỳ phỏp trờn thỡ phần cỏc biến được định nghĩa của cõu lệnh là variablelist, tập Def được tớnh một cỏch đơn giản bằng cỏch lấy variablelist làm tham số truyền vào phương thức GetVar(): Def = GetVar(variablelist).

Cõu lệnh khai bỏo khụng tồn tại cỏc biến được định nghĩa nờn tập Ref khụng được khởi tạo.

4.1.2. Cõu lệnh khởi tạo

Def = variable;

Ref = GetVar(Expression);

4.1.3. Cõu lệnh khai bỏo phương thức

Cỳ phỏp: [KeywordList] [DataType] MethodName(listofparameter); Trong cõu lệnh khai bỏo phương thức cỏc biến nằm trong vựng listofparameter dưới dạng cỏc tham số, cỏc biến này là cỏc biến được định nghĩa, vỡ thế:

Def = Getvar(listofparameter);

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

Cỳ phỏp: MethodName(passedparameter);

Trong đú passedparameter là danh sỏch cỏc giỏ trị, biến được dựng làm tham số để truyền vào phương thức. Trong trường hợp này cỏc tập Def và Ref được tớnh như sau:

Def = GetVar(passedparameter); Ref = GetVar(passrdparameter);

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

Xỏc định cỏc cung của đồ thị thực chất là xỏc định cỏc phụ thuộc điều khiển và phụ thuộc dữ liệu, theo phần lý thuyết đó trỡnh bày thỡ cỏc phụ thuộc điều khiển và phụ thuộc dữ liệu được tớnh như sau.

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

Phụ thuộc điều khiển xuất hiện trong cỏc cấu trỳc điều khiển, như vậy để xỏc định cỏc phụ thuộc điều khiển thỡ đầu tiờn chỳng ta phải xỏc định được sự cú mặt của cỏc cấu trỳc điều khiển. Xỏc định phụ thuộc điều khiển qua cỏc bước sau:

o Xỏc định cỏc cấu trỳc điều khiển.

o Cỏc cõu lệnh trực tiếp thuộc cấu trỳc trừ Predicate đều phụ thuộc vào Predicate.

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

Phụ thuộc dữ liệu xuất phỏt từ cõu lệnh cú tập Def khỏc rụ̃ng đến cõu lệnh cú tập Ref khỏc rụ̃ng, cỏc bước sau dựng để xỏc định phụ thuộc dữ liệu. Thuật toỏn sau dựng để kiểm tra xem cõu lệnh s2 cú phụ thuộc dữ liệu vào cõu lệnh s1 hay khụng. (adsbygoogle = window.adsbygoogle || []).push({});

Đầu vào: cõu lệnh s1, cõu lệnh s2 thuộc chương trỡnh P.

Đầu ra: trả về giỏ trị true nếu s2 phụ thuộc dữ liệu vào s1, trả về giỏ trị false nếu s2 khụng phụ thuộc dữ liệu vào s1.

Quy ước: s1.Def: tập Def của s1; s1.Ref: tập Ref của s1. s2.Def: tập Def của s2; s2.Ref: tập Ref của s2.

Nhập s1,s2

s1.Def != rụ̃ng && s2.Ref != rụ̃ng

s1 và s2 cựng thuộc một cấu trỳc rẽ nhỏnh

True

s1 và s2 cựng thuộc 1 nhỏnh

True

Tồn tại biến x thuộc s1.Def và thuộc s2.Ref True False Trả về giỏ trị False False False False Trả về giỏ trị True True

Một phần của tài liệ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’ (Trang 62 - 66)