Tải bản đầy đủ (.doc) (63 trang)

kỹ thuật phân tích mã nguồn và xây dựng ứng dụng chuyển đổi mã nguồn java sang cấu trúc điều khiển

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.41 MB, 63 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
──────── * ───────
ĐỒ ÁN
TỐT NGHIỆP ĐẠI HỌC
NGÀNH CÔNG NGHỆ THÔNG TIN
KỸ THUẬT PHÂN TÍCH MÃ NGUỒN VÀ
XÂY DỰNG ỨNG DỤNG CHUYỂN ĐỔI MÃ
NGUỒN JAVA SANG CẤU TRÚC ĐIỀU
KHIỂN
Sinh viên thực hiện : Vũ Đức Minh
Lớp CNPM- K51
Giáo viên hướng dẫn: PGS.TS Huỳnh Quyết Thắng
HÀ NỘI 6-2011
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
2
PHIẾU GIAO NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP
1. Thông tin về sinh viên
Họ và tên sinh viên: Vũ Đức Minh.
Điện thoại liên lạc 01687954897 Email:
Lớp: CNPM-K51 Hệ đào tạo: Đại học chính quy
Đồ án tốt nghiệp được thực hiện tại: Viện công nghệ thông tin và truyền thông
Thời gian làm ĐATN: Từ ngày 15 / 01 /2011 đến 28 / 05 /2011
2. Mục đích nội dung của ĐATN
Tìm hiểu về phân tích mã nguồn. Ứng dụng làm phần mềm chuyển đổi mã nguồn ngôn
ngữ java sang flow chart
3. Các nhiệm vụ cụ thể của ĐATN
• Tìm hiểu lý thuyết phân tích tĩnh chương trình
• Tìm hiểu cấu trúc hóa chương trình sử dụng cây AST (Astract Syntax Tree)
• Ứng dụng lý thuyết phân tích chương trình xây dựng phần mềm chuyển đổi mã
nguồn Java thành sơ đồ khối


4. Lời cam đoan của sinh viên:
Tôi – Vũ Đức Minh - cam kết ĐATN là công trình nghiên cứu của bản thân tôi dưới sự
hướng dẫn của và PGS.TS. Huỳnh Quyết Thắng
Các kết quả nêu trong ĐATN là trung thực, không phải là sao chép toàn văn của bất kỳ
công trình nào khác.
Hà Nội, ngày tháng năm
Tác giả ĐATN
Vũ Đức Minh
5. Xác nhận của giáo viên hướng dẫn về mức độ hoàn thành của ĐATN và cho phép bảo
vệ:
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
3
Hà Nội, ngày tháng năm
Giáo viên hướng dẫn
PGS.TS Huỳnh Quyết Thắng
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
4
MỤC LỤC
PHIẾU GIAO NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP 3
MỤC LỤC 5
LỜI CẢM ƠN 6
TÓM TẮT NỘI DUNG ĐỒ ÁN TỐT NGHIỆP 7
3.1.1. Mô tả 27
3.2.1. Thiết kế tổng quan của chương trình 28
Ứng dụng có đầu vào là một mã nguồn (source code) của một chương trình nào đó, đầu
ra là sơ đồ khối (flowchart) của mã nguồn đó. Để thực hiện được điều đó hệ thống sẽ
thực hiện 2 giai đoạn lớn 28
+ Giai đoạn 1: Tạo cây cú pháp trừu tượng (AST) từ mã nguồn 28
+ Giai đoạn 2: Từ cây AST vẽ sơ đồ khối lên màn hình 28
Ta có sơ đồ thực hiện của hệ thống như sau: 28

28
3.2.2. Chi tiết xây dựng chương trình 28
Như đã giới thiệu ở trên hệ thống xây dựng qua 2 giai đoạn lớn. Bây giờ ta sẽ đi chi tiết
từng giai đoạn 28
3.2.2.1. Xây dựng cây cú pháp trừu tượng (AST) từ mã nguồn 28
Đây là giai đoạn quan trọng mang tính quyết định của hệ thống. Nếu xây dựng được cấu
trúc cây tốt thì sẽ dễ dàng thực hiện bước tiếp theo là vẽ sơ đồ khối 28
a. Cấu trúc cây cú pháp trừu tượng 30
Dưới đây là định nghĩa một nút của cây: 30
public class Lg_TreeNode { 30
String label; 30
String content; 30
List<Lg_TreeNode>child=new ArrayList<Lg_TreeNode>(); 30
} 30
Child là các nút con của nút hiện tại. Nút có thể có 0,1, hoặc nhiều con 33
Nút có label= “normal” không có nút con 33
Nút có label= “while” có 2 nút con 33
Nút có label=”for” có 3 nút con 33
Nút có label= “if” có 2 nút con (nếu không có else) và có 3 nút con nếu có else 33
Nút có label= “if_body”, “for_body” hoặc “while_body” có một hoặc nhiều nút con 33
Nút có label = “decision” không có nút con 33
b. Thuật toán xây dựng cây cú pháp trừu tượng 33
3.2.2.2. Vẽ sơ đồ khối từ cây cú pháp trừu tượng 39
TÀI LIỆU THAM KHẢO 64
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
5
LỜI CẢM ƠN
Lời đầu tiên em xin phép được bày tỏ lòng biết ơn sâu sắc nhất tới PGS.TS. Huỳnh
Quyết Thắng, Viện Công nghệ thông tin và Truyền thông, trường Đại học Bách Khoa Hà
Nội. Thầy đã tận tình hướng dẫn và dìu dắt em trong thời gian thực tập tốt nghiệp cũng

như thời gian làm đồ án tốt nghiệp.
Em xin chân thành cảm ơn các thầy cô trường Đại học Bách Khoa Hà Nội, đặc biệt là
các thầy cô trong viện Công nghệ thông tin và truyền thông.Các thầy cô đã chỉ bảo, dạy dỗ
em kể từ những ngày đầu tiên bước vào trường đại học cho đến khi tốt nghiệp.
Lời cuối cùng em xin được cảm ơn gia đình, bạn bè đã luôn ở bên cạnh động viên và tạo
điều kiện cho em trong suốt những năm học vừa qua.
Hà Nội, ngày 28 tháng 5 năm 2011.
Vũ Đức Minh
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
6
TÓM TẮT NỘI DUNG ĐỒ ÁN TỐT NGHIỆP
Phân tích chương trình là một giai đoạn quan trọng trong quá trình phát triển phần
mềm. Nó đem lại rất nhiều ứng dụng to lớn đối với sự phát triển của phần mềm. Phân tích
chương trình tĩnh và phân tích chương trình động là hai phần lớn trong quá trình phân tích
chương trình, và đều được phát triển rộng rãi. Phân tích tĩnh chỉ phân tích chương trình mà
không cần biết chương trình đó sẽ chạy như thế nào, do đó phân tích tĩnh chương trình có
khả năng đưa ra nhiều hướng giải quyết hơn so với phân tích động. Kết quả của quá trình
phân tích tĩnh được sử dụng vào nhiều ứng dụng từ việc phát hiện ra lỗi trong mã nguồn
đến cấu trúc hóa chương trình.
Nội dung nghiên cứu của đồ án tập trung vào tập trung tìm hiểu về lý thuyết phân tích
chương trình tĩnh và áp dụng lý thuyết đó vào ngôn ngữ java để xây dựng ứng dụng
chuyển đổi mã nguồn (source code) của java sang sang cấu trúc điều khiên hay còn gọi sơ
đồ khối (flowchart)
Luận văn gồm 3 chương:
Chương 1 giới thiệu chung về phân tích chương trình, giới thiệu lý thuyết phân tích
tĩnh.
Chương 2 giới thiệu về sơ đồ khối (flowchart) , đưa ra bài toán chuyển đổi mã nguồn
sang sơ đồ khối
Chương 3 là phần chương trình đã thực hiện được. Giới thiệu thiết kế và kết quả đạt
được

Cuối cùng là kết luận chung và hướng phát triển
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
7
ABSTRACT OF THESIS
Program analysis is an important stage in the process of software development. It
brings so many great applications for the development of software. Static analysis and
dynamic analysis are two main analysis programs. The are widely developed. The static
analysis program analysis program without knowing how it will run, so a static program
analysis can provide more solutions than the dynamic analysis. Results of static analysis
process is used in many applications since the discovery of errors in the source code to
structured programs.
The content of the research concentrates theoretical static analysis, and applies it to
build a software which can convert source code java language to flowchart.
The thesis consists of 3 chapters.
+ Chapter 1 is general information about program analysis, the theoretical static
analysis
+ Chapter 2 is the introduction of flowchart, and propose the problem to convert
source code to flowchart
+ Chapter 3 focuse on building the application : Convert source code java language to
flowchart
Finally, final chapter is used to conclusion; we will summarize the theory and the
implementation to get the final result of this thesis.
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
8
DANH MỤC TỪ VIẾT TẮT
STT Từ viết tắt Từ tiếng Anh Nghĩa tiếng Việt
1 AST Abstract Syntax Tree Cây cú pháp trừu tượng
2 IDEs Integrated Development
Environments
Môi trường phát triển tích

hợp
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
9
DANH MỤC HÌNH ẢNH
Hình 1: Ví dụ cây ngữ pháp 20
Hình 2: Cây ngữ pháp trừu tượng (Abstract Syntax Tree) [2] 21
Hình 3: Ví dụ sơ đồ khối 24
Hình 4: Ví dụ Visustin 25
Hình 5: Ví dụ Code visual to flowchart 26
Hình 6: Sơ đồ thực hiện phân tích chương trình 28
Hình 7: Sơ đồ chuyển từ source code sang cây AST 29
Hình 8: Ví dụ chuyển từ source code sang cây AST 34
Hình 9: Ví dụ 2 chuyển source code sang AST 35
Hình 10: Lớp Converter 36
Hình 11: Sơ đồ chuyển từ AST sang flowchart 40
Hinh 12: Lớp Flowchart 41
Hình 13: Ví dụ chuyển đổi từ AST sang Flowchart 42
Hình 14: Ví dụ chuyển đổi tử Source code sang AST đến Flowchart 42
Hình 15: Giao diện của chương trình 43
Hình 16: Giao diện ví dụ 3.3.1 44
Hình 17: Kết quả ví dụ 3.3.1 44
Hình 18: Giao diện ví dụ 3.3.2 45
Hình 19: Kết quả ví dụ 3.3.2 45
Hình 20: Giao diện ví dụ 3.3.3 46
Hình 21: Kết quả ví dụ 3.3.3 47
Hình 22: Giao diện ví dụ 3.3.4 48
Hình 23: Kết quả ví dụ 3.3.4 49
Hình 24: Giao diện ví dụ 3.3.5 50
Hình 25: Kết quả ví dụ 3.3.5 50
Hình 26: Giao diện ví dụ 3.3.6 51

Hình 27: Kết quả ví dụ 3.3.6 52
Hình 28: Giao diện ví dụ 3.3.7 53
Hình 29: Kết quả ví dụ 3.3.7 54
Hình 30: Giao diện chương trình khi chạy thử nghiệm 1 55
Hình 31: Kết quả chương trình khi chạy thử nghiệm 1 56
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
10
Hình 32: Kết quả thực nghiệm 1 khi chạy bằng phần mềm visustin 57
Hình 33: Giao diện chương trình khi chạy thử nghiệm 1 59
Hình 34: Kết quả chương trình khi chạy thử nghiệm 2 60
Hình 35: Kết quả thực nghiệm 2 khi chạy bằng phần mềm visustin 61
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
11
LỜI NÓI ĐẦU
1. Lý do chọn đề tài
Công nghệ thông tin tuy còn non trẻ so với các ngành khác trên thế giới nhưng
nó đã và đang phát triển rất nhanh, mạnh mẽ. Ảnh hưởng của nó lan tới hầu hết các
lĩnh vực khác. Song song với đó là sự thay đổi trong cách thức phát triển phần
mềm. Cũng giống như các ngành sản xuất khác, việc phát triển phần mềm đang có
xu hướng chuyển dịch từ các nước phát triển như Mĩ, hoặc các nước Châu Âu sang
các nước đang phát triển như Trung Quốc, Ấn Độ , Việt Nam…
Phân tích chương trình là một giai đoạn quan trọng trong quá trình phát triển
phần mềm. Phân tích chương trình giúp cho người lập trình hiểu hơn về chương
trình được viết. Phân tích chương trình tĩnh và phân tích chương động là hai phần
lớn trong quá trình phân tích chương trình, và đều được phát triển rộng rãi.
Một trong những vấn đề lớn trong kĩ thuật phân tích chương trình đó là mô
hình hóa chương trình ở cấp độ cao hơn, thay vì ở mức độ bắt buộc. Dựa vào những
thể hiện ở mức cao của mã nguồn, bộ dịch có thể thực hiện tổ chức lại mã nguồn,
phân tích mã nguồn sâu hơn. Phân tích tĩnh chỉ phân tích chương trình mà không
cần biết chương trình đó sẽ chạy như thế nào, do đó phân tích tĩnh chương trình có

khả năng đưa ra nhiều hướng giải quyết hơn so với phân tích tĩnh. Kết quả của quá
trình phân tích tĩnh được sử dụng vào nhiều ứng dụng từ việc phát hiện ra lỗi trong
mã nguồn đến cấu trúc hóa chương trình.
Trên cơ sở đó, nội dung nghiên cứu của đồ án tập trung vào tập trung tìm hiểu
về lý thuyết phân tích chương trình tĩnh và áp dụng lý thuyết đó vào ngôn ngữ java
để xây dựng ứng dụng chuyển đổi mã nguồn (source code) của Java sang sang cấu
trúc điều khiên hay còn gọi sơ đồ khối (flowchart)
2. Bố cục của đồ án:
Đồ án được chia làm 3 chương bao gồm các nội dung sau:
Chương 1: Giới thiệu tổng quan về phân tích mã nguồn chương trình: Giới
thiệu chung về phân tích mã nguồn, phân tích lý thuyết về phương pháp phân tích
mã nguồn tĩnh
Chương 2: Đưa ra bài toán ứng dụng: chuyển đổi mã nguồn sang sơ đồ khối
(flowchart): Giới thiệu sơ qua về định nghĩa, lịch sử hình thành cũng như tầm quan
trong của sơ đồ khối và đưa ra bài toán ứng dụng
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
12
Chương 3: Xây dựng chương trình chuyển đổi mã nguồn Java sang sơ đồ khối:
Đưa ra phân tích thiết kế cũng như thuật toán cài đặt chương trình và kết quả đã đạt
được.
Phần cuối cùng là kết luận chung và hướng phát triển tiếp theo của đề tài
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
13
Chương 1: Giới thiệu tổng quan về phân tích mã nguồn chương trình
Nội dung của chương này sẽ trình bày các vấn đề sau:
• Giới thiệu chung vể phân tích mã nguồn
• Phương pháp phân tích mã nguồn tĩnh
• Sử dụng cây cú pháp trừu tượng (AST) để phân tích
1.1. Giới thiệu chung vể phân tích mã nguồn
Quá trình phân tích chương trình là quá trình phân tích các hành vi của một

chương trình. Phân tích chương trình bao gồm các động cơ, cách thức cơ bản và các
phương thức. Có hai cách cơ bản để tiếp cận quá trình phân tích chương trình đó là
phân tích tĩnh và quá trình phân tích động. Mỗi phương pháp tiếp cận khác nhau sẽ
khác nhau về phương pháp cụ thể nhưng đều cung cấp những cái nhìn dưới các góc
độ khác nhau về chương trình được phân tích. Phân tích tĩnh là quá trình phân tích
được thực hiện mà chương trình được phân tích chưa thực sự được chạy [7]. Quá
trình phân tích động được thực hiện khi mã nguồn được chạy thực sự trong một hệ
thống nào đó. Để quá trình phân tích động hiệu quả, đầu vào cần một là chương
trình đầy đủ, chính xác về mặt ngữ pháp của ngôn ngữ chương trình. Mục đích của
quá trình phân tích động là tìm ra lỗi khi chương trình được chạy hơn là khi chương
trình chưa được thực hiện[8]. Để có thể tìm được toàn bộ lỗi trong chương trình,
cần thực hiện đầy đủ các quá trình phân tích tĩnh lẫn phân tích động, điều này giúp
cho người sử dụng giảm chi phí gỡ lỗi cũng như bảo dưỡng chương trình.
1.2. Phương pháp phân tích mã nguồn tĩnh
Phân tích tĩnh là quá trình phân tích có thể xác định được lỗi một các nhanh
chóng ngay cả khi chương trình chưa được chạy. Việc phát hiện được lỗi sớm
không những giảm chi phí cho việc gỡ lỗi mà nó còn có thể sớm đưa ra các phản
hồi để người lập trình có thể sớm có phương pháp để gỡ lỗi.[7]
Lý thuyết của quá trình phân tích tĩnh là tìm hiểu cách thức hoạt động của từng
câu lệnh. Thông tin thu được trong quá trình phân tích sẽ được dùng để làm rõ
những phần trong mã nguồn gây lỗi.
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
14
1.2.1. Các loại phân tích tĩnh
Các công cụ sử dụng phương pháp phân tích tĩnh được sử dụng rộng rãi trong
các chương trình dịch. Các công cụ được phân làm nhiều loại như phân tích tĩnh để
xác định kiểu, phân tích ngữ pháp, phân tích để hiểu chương trình, phân tích tìm lỗi,
…[2]
+Phân tích kiểu
Phân tích kiểu sẽ giúp người lập trình biết được các lỗi lập trình như gán nhầm

biến, bằng việc bắt các lỗi trong thời gian dịch việc phân tích tĩnh có thể tránh được
các lỗi về thời gian chạy. Phân tích kiểu hạn chế bằng việc phân tích để tìm ra các
lỗi dựa vào quá trình khẳng định sai và phủ nhận sai. Phân tích kiểu là một phần
trong quá trình phân tích mã nguồn, do đó kết quả đưa ra sau quá trình phân tích
kiểu chưa thể nào là hoàn thiện để phân tích chương trình.[3]
+Phân tích ngữ pháp
Phân tích ngữ pháp là quá trình phân tích kĩ lưỡng hơn quá trình phân tích kiểu.
Phân tích ngữ pháp sẽ đưa ra những vấn đề liên quan đến khoảng cách, chính tả,
ngữ pháp, …Trong quá trình lập trình, lập trình viên sẽ phải tuân thủ theo một cấu
trúc ngữ pháp nhất định tùy thuộc vào từng ngôn ngữ. Trong quá trình phân tích
tĩnh dùng để phân tích ngữ pháp sẽ quy định các chuẩn ngữ pháp của ngôn ngữ đó.
Phân tích ngữ pháp của chương trình sẽ đưa ra lỗi có khả năng đọc và những lỗi khả
năng bảo dưỡng của mã nguồn chứ không chỉ ra được những lỗi có thể xảy ra khi
chạy chương trình.
Các bộ dịch khác nhau sẽ có các tùy chọn khác nhau dành cho phân tích ngữ
pháp của mã nguồn. Các bộ dịch có thể sử dụng cờ khác nhau để báo lỗi khi xảy ra
sự cố với ngữ pháp. Để tìm ra lỗi ngữ pháp trong một chương trình lớn thì rất khó.
Do đó để quá trình phân tích ngữ pháp hiệu quả, khi chương trình bắt đầu quá trình
phân tích tĩnh thì cần thu hẹp dần đầu vào cho quá trình phân tích tĩnh. Quá trình
phân tích tĩnh cho một chương trình lớn cần được tiến hành dần dần, từ nhỏ đến
lớn.
+ Phân tích chương trình tổng quan
Phân tích tổng quan chương trình giúp cho người sử dụng có cái nhìn tổng quát
về mã nguồn đã được viết. Môi trường phát triển tích hợp (Integrated Development
Environments-IDEs) luôn bao gồm ít nhất một vài hàm để xác định tổng quan của
chương trình. Một số ví dụ về quá trình phân tích tổng quan như là “Tìm các cách
sử dụng của phương thức này” hay “Tìm giá trị của biến được khai báo chung
này”. Một số công cụ sử dụng quá trình phân tích này có thể còn được tích hợp
thêm các chức năng như tự động xử lý các hàm, thủ tục trong chương trình như thay
tên biến hoặc là chia các hảm đơn lẻ vào các chương trình con.[1] Một số chương

Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
15
trình dịch còn cho phép người dùng sinh mã hoặc một số chương trình còn cho phép
người dùng sử dụng phương pháp kĩ thuật ngược để tìm hiểu về mã nguồn, nhờ đó
đã đưa cho người lập trình một cái nhìn tổng quát về mã nguồn, đặc biệt là mã
nguồn lớn. Điều này rất cần thiết cho những người lập trình muốn có cái nhìn khái
quát nhất về một chương trình lớn với nhiều dòng lệnh mà không phải do chính họ
viết ra.
+ Phân tích thẩm định và phân tích thuộc tính chương trình:
Phân tích thẩm định chương trình bằng phương pháp phân tích tĩnh là quá trình
tìm hiểu một phần của chương trình hoặc một đoạn mã nguồn và cần phải chứng
minh rằng đoạn mã nguồn được phân tích là đúng theo tiêu chuẩn đặc tả của thiết kế
ban đầu. Nếu như đặc tả chương trình quy định tất cả những gì mà chương trình cần
phải làm theo đúng thế thì quá trình phân tích thẩm định cần phải cần phải có đủ
chức năng tương ứng để kiểm tra tình đúng đắn của chương trình so với đặc tả thiết
kế ban đầu.
Trong quá trình phân tích thẩm định, người ta có thể sẽ cần đến việc kiểm tra
tương đương để kiểm tra chính xác từng dòng lệnh khớp với yêu cầu ban đầu. Tuy
nhiên khái niệm kiểm tra tương đương là khái niệm thường được dùng trong kiểm
tra phần cứng. Hiếm khi nào người lập trình có được bản thiết kế chi tiết, đầy đủ để
tiến hành kiểm tra tương đương, hơn nữa công việc để viết đặc tả chi tiết đến cùng
còn mất nhiều thời gian và công sức hơn cả công việc lập trình. Do đó, kiểu kiểm
tra này thường không được dùng đến, cùng với đó là quá trình kiểm tra tương
đương không phải có thể áp dụng cho tất cả các chương trình được viết với kích
thước khác nhau.
Một loại phân tích khác được dùng nhiều hơn trong thực tế là phân tích các
thuộc tính của chương trình hay còn được gọi là kiểm tra thuộc tính. Các công cụ sử
dụng phương pháp phân tích này tập trung tìm hiểu các thành phần của chương
trình theo thứ tự thời gian. Kiểu kiểm tra này sẽ tìm ra thứ tự các thành phần trong
chương trình được thực hiện hay chưa được thực hiện. Ví dụ như “thành phần lưu

trữ bộ nhớ trong chương trình cần được đọc trước khi được giải phóng”. Hầu hết
các chương trình phân tích thuộc tính đều cho phép người lập trình tự viết đặc tả
của họ để kiểm tra các thành phần trong chương trình họ viết. Khi quá trình kiểm
tra phát hiện ra mã nguồn không đúng với đặc tả của người lập trình thì nó sẽ đưa ra
thông báo với người lập trình bằng các bảng lỗi. Ví dụ như khi chương trình mặc lỗi
về bộ nhớ nó sẽ đưa ra thông báo: “allocate memory should always be freed”.
+ Phân tích tìm lỗi:
Phân tích tìm lỗi không phải là quá trình phân tích để tìm ra các vấn đề về định
dạng chương trình, các lỗi ngữ pháp như phân tích ngữ pháp hay kiểm tra chương
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
16
trình có được viết đúng đặc tả hay không như quá trình phân tích thuộc tính, hay
phân tích thẩm định. Thay vào đó phân tích tìm lỗi sẽ tìm ra những vị trí nào trong
mã nguồn có sự thể hiện của nó không đúng như ý định ban đầu của người lập trình.
Các chương trình phân tích tĩm lỗi thì dễ dàng được sử dụng bởi vì nó bao gồm một
bộ các luật, được coi như các mẫu thử của chương trình và từ đó tìm ra lỗi dựa trên
các mẫu thử đó.
Một số công cụ tìm lỗi sử dụng cùng một giải thuật sắp xếp, tuy nhiên các công
cụ tìm lỗi khi phát hiện ra lỗi trong chương trình nó sẽ đưa ra thông báo lỗi cùng
với đó là các phương án khả thi có thể thực hiện để sửa lỗi đó trong chương trình.
1.2.2. Quá trình phân tích chương trình tĩnh
Quá trình phân tích là quá trình phân chia chương trình nguồn thành các đoạn
mã nguồn và xử lý trên từng đoạn mã nguồn đó, cùng với đó là đưa ra dạng thể hiện
trung gian cho từng đoạn mã nguồn. Quá trình phân tích sẽ tập trung vào việc phân
tích ngữ pháp của ngôn ngữ cần được dịch. Phần này, ta tập trung việc tìm hiểu
phân tích ngữ pháp của chương trình [7]
Ngữ pháp của ngôn ngữ lập trình sẽ thể hiện các quy tắc đúng đắn của một
chương trình được viết bằng ngôn ngữ đó, còn các thành phần thuộc về từ ngữ học
(semantic) có nghĩa là chương trình đó sẽ thế nào sau khi chạy. Để đặc tả ngữ pháp
chúng ta sử dụng kí pháp Backus (BNF-Backus Naur Form). Khi các kí tự để thể

hiện phần ngữ pháp trong chương trình sẽ được dùng trong kí pháp BNF có thể
được xử lý dễ dàng nhưng các thành phần thuộc về từ ngữ nghĩa của chương trình
(semantic) thì rất khó biểu diễn. Để biểu diễn các thành phần này, chúng ta cần đến
cách biểu diễn phi hình thức và các ví dụ có tính gợi ý.
+ Định nghĩa ngữ pháp:
Để phân tích ngữ pháp của chương trình, chúng ta sẽ sử dụng kí pháp BNF
hoặc hay con gọi là kí pháp phi nội dung (context-free grammar). Ngữ pháp bản
chất đã miêu tả cấu trúc phân cấp của ngôn ngữ lập trình được sử dụng[3].
Ví dụ: câu lệnh if-else của ngôn ngữ lập trình Java:
If (biểu thức) câu lệnh else câu lệnh
Cấu trúc ngữ pháp trên thể hiện câu lệnh if-else từ khóa if là từ khóa thể hiện
câu lệnh if bắt đầu. Dấu mở ngoặc đơn thể hiện bắt đầu biểu thức, đóng ngoặc đơn
kết thúc biểu thức bắt đầu câu lệnh đầu tiên, từ khóa else bắt đầu là sự kết thúc của
câu lệnh đầu, bắt đầu của câu lệnh tiếp theo. Để phân tích câu lệnh này, ta sẽ sử
dụng biến epr để thể hiện cho biểu thức, biến stmt biểu thị cho câu lệnh thì cấu trúc
ngữ pháp của câu lệnh trên có thể được thể hiện như sau:
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
17
Stmt if (epr) stmt else stmt
Trong đó mũi tên ” có thể được đọc là “có thể có dạng như sau”. Mũi tên
còn được hiểu là luật sản xuất, trong kí pháp BNF thì if, else là các ký tự kết thúc
(terminal) còn epr, stmt là các kí tự không kết thúc (nonterminal).
+ Kí pháp phi nội dung có bốn thành phần chính:
• Bộ các kí tự kết thúc còn được gọi là các kí hiệu kết thúc. Các kí tự kết thúc
này là các từ khóa của câu lệnh, từ khóa của chương trình được được quy định bởi
ngôn ngữ lập trình.
• Bộ các kí hiệu không kết thúc hay còn được gọi là các biến kí pháp. Mỗi kí
hiệu không kết thúc là chuỗi các kí tự đầu cuối mà người ta dùng để biểu chương
trình chạy.
• Bộ các luật sản xuất bao gồm các kí tự được gọi là phía bên trái hoặc bên

phải của luật sản xuất, mũi tên ”, dãy các kí tự kết thúc và không kết thúc.
• Một kí tự bắt đầu
+ Để đặc tả ngữ pháp của chương trình, chúng ta sẽ sử dụng các luật sản xuất
với kí tự bắt đầu sẽ được miêu tả đầu tiên. Các kí tự toán học như <, >=, hoặc các từ
khóa được in đậm như while sẽ là các kí tự cuối. Các từ viết in nghiêng là các kí tự
không kết thúc, còn các kí tự không in nghiêng còn lại sẽ được xếp vào các loại kí
tự kết thúc. Để cho thuận tiện, các luật sản xuất có cùng kí hiệu không kết thúc
giống như phần đầu thì có thể được nhóm lại, các thành phần sẽ cách nhau bởi dấu
|, được đọc là “hoặc”
Ví dụ 2.2.1 : Để đơn giản, ở đây ta sẽ sử dụng ví dụ về chuỗi phép cộng trừ. Vì
các cộng, trừ liên quan đến các con số do đó chúng ta sẽ có những chuỗi cộng,
chuỗi trừ. Các dấu cộng hoặc trừ xuất hiện giữa các số do đó ta sẽ có các “chuỗi
phân chia bởi dấu cộng hoặc trừ“. Cấu trúc ngữ pháp cho các số này sẽ được biểu
diễn trong BNF bằng luật sản xuất sau:
list list + digit (a1)
list list – digit (a2)
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
18
list digit (a3)
digit 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 (a4)
Phía bên phải của luật sản xuất giống với phía bên trái do đó ta có thể nhóm lại
như sau:
list
Trong ví dụ này thì các kí hiệu kết thúc là các kí tự:
+ - 0 1 2 3 4 5 6 7 8 9
Các kí tự không kết thúc được in nghiêng là list, digit với list là kí tự bắt đầu.
1.2.3. Cây phân tích
Cây phân tích là hình ảnh cụ thể của quá trình phân tích, thể hiện kí tự bắt đầu
làm thế nào để thu được chuỗi bằng các luật sản xuất. Nếu như kí tự không kết thúc
A có luật sản xuất A X Y Z, do đó cây phân tích sẽ có node xuất phát nhãn A với

3 node con nhãn là X, Y, Z từ trái qua phải. [2]
Cây phân tích sẽ bao gồm các thành phần sau:
1. Node rễ là các kí tự bắt đầu
2. Các node trong sẽ là các node thể hiện các kí tự không kết thúc.
3. Node lá là các các kí tự kết thúc hoặc các kí tự kết thúc
4. Nếu như các node trong cây phân tích có nút A là node rễ và các node lá có
nhãn lần lượt là X1, X2, X3, … Xn theo thứ tự từ trái sang phải thì phải có luật
A
Trong đó kí hiệu X1, X2 có thể được thay thế bằng cả kí tự kết thúc hoặc kí
hiệu chưa kết thúc.
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
19
Trong trường hợp A thì node A sẽ có 1 lá nhãn là .
Quay trở lại với với ví dụ 2.1.2b. Để xây dựng cây phân tích cho biểu thức 9-5
+2 thì mỗi node trong cây sẽ là các kí hiệu ngữ pháp. Các node trong và lá của nó
để thể hiện các luật sản xuất. Trong ví dụ sau đây, list là node bắt đầu, node lá sẽ có
nhãn là list, +, digit. Kết quả của cây phân tích sẽ là chuỗi cần được phân tích 9 – 5
+2.
Hình 1: Ví dụ cây ngữ pháp
1.2.4. Sử dụng cây phân tích các câu lệnh trong chương trình
Các từ khóa trong câu lệnh cho phép chúng ta nhận ra chúng bởi vì đa số các
câu lệnh đều bắt đầu bằng các từ khóa hoặc kí tự đặc biệt. Chỉ có các lệnh gán, lệnh
gọi hàm, thủ tục thì sẽ nằm ngoài quy luật này. Do đó để phân tích các loại câu lệnh
trong ngôn ngữ lập trình, người ta cũng dùng đến cây phân tích ngữ pháp. Biến
stmts có thể rỗng nên trong luật sản xuất, chúng ta sử dụng đến kí tự rỗng. Luật sản
xuất đầu tiên đã thể hiện điều này[2].
Ví dụ trong ngôn ngữ Java, chúng ta có thể phân tích các câu lệnh trong ngôn
ngữ lập trình này như sau:
stmt id = expression ; | if (expression) statement | if (expression) stmt else
stmt

| while (expression) stmt | do stmt while (expression) | {stmt}
Stmts stmts stmt |
Trong ví dụ trên dấu chấm phẩy để thể hiện mỗi khi kết thúc một đoạn chương
trình chứ không phải kết thúc từng câu lệnh. Trong biểu thức trên dấu chấm phẩy
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
20
xuất hiện để tránh việc dấu chấm phẩy sẽ xuất hiện ở cuối mỗi câu lệnh if- và
while- khi xuất hiện các câu lệnh lồng nhau. Dấu chấm phẩy sẽ xuất hiện khi các
câu lệnh con xuất hiện lồng bên trong chương trình.
1.3. Sử dụng cây cú pháp trừu tượng (AST) để phân tích
Phân tích chương trình sử dụng cây ngữ pháp là một phương pháp miêu tả mã
nguồn một cách trực quan. Các chương trình được phân tích bằng cây ngữ pháp
trừu tượng thì mã nguồn của chương trình sẽ được thể hiện trực tiếp trên node của
cây. Node trong cây ngữ pháp trừu tượng có được là từ luật sản xuất ngữ pháp của
ngôn ngữ lập trình. Những luật sản xuất này sẽ đưa ra các kí tự có trong ngôn ngữ
lập trình để hỗ trợ cho quá trình phân tích dễ dàng và không có nhập nhằng. Tuy
nhiên, với mục tiêu xây dựng cây ngữ pháp dễ dàng phân tích như vậy thì cây ngữ
pháp trừu tượng có thể trở nên rất khó để hiểu. Cây ngữ pháp trừu tượng là cấu trúc
ngữ pháp được sử dụng để phân tích chương trình tĩnh. Mục đích của cây ngữ pháp
trừu tượng là cung cấp một phiên bản chuẩn của chương trình phù hợp để chuẩn bị
cho quá trình phân tích. Cây ngữ pháp trừu tượng được xây dựng dựa trên sự kết
hợp giữa cấu trúc của mã nguồn chương trình và luật sản xuất ngữ pháp.
Ví dụ việc sử dụng cây phân tích ngữ pháp để phân tích cây ngữ pháp trừu
tượng để phân tích cấu trúc ngữ pháp của câu lệnh if-then-else. Cần để ý rằng trong
câu lệnh if-then-else có thể có hoặc không có thành phần else do đó trong ví dụ này
ta sẽ xét phần chính của câu lệnh if-then:
Hình 2: Cây ngữ pháp trừu tượng (Abstract Syntax Tree) [2]
Tùy thuộc vào yêu cầu của từng trường hợp mà cây ngữ pháp trừu tượng có thể
có ít cấu trúc hơn mã nguồn. Ví dụ như trong phương thức gọi thì có thể chuyển
thành hàm gọi, hoặc là vòng lặp for-do-loop có thể chuyển thành vòng lặp while-do.

Quá trình phân tích tĩnh có thể đưa ra thông báo lỗi hoặc không đưa ra thông
báo lỗi về kiểu theo cách mà các bộ dịch vẫn thông báo bởi vì thông tin về kiểu là
thông kin rất quan trọng khi phân tích các chương trình viết bằng ngôn ngữ lập trình
hướng đối tượng. Kiểu của một đối tượng sẽ xác định bộ các phương thức mà đối
tượng đó có thể gọi. Sử dụng cây ngữ pháp trừu tượng người ta có thể phân tích ngữ
nghĩa của chương trình. Sau quá trình phân tích ngữ nghĩa của chương trình, bước
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
21
tiếp theo của quá trình phân tích tĩnh sẽ là xây dựng dạng thể hiện trung gian của
chương trình nguồn. Dạng thể hiện trung gian của chương trình nguồn là dạng thể
hiện dễ dàng để tối ưu việc phân tích mã nguồn, sau đó dạng thể hiện sẽ được thay
đổi tiếp tùy theo các bước phân tích mã nguồn của quá trình phân tích tĩnh. [2]
Kết chương 1
Trong quá trình phân tích chương trình, việc tìm hiểu các dạng biến đổi của
chương trình ban đầu để hỗ trợ cho quá trình phân tích là quá trình quan trọng. Để
phân tích chương trình thì việc phân tích từng câu lệnh, các khối dữ liệu chuyển qua
giữa các thành phần trong chương trình cần dùng đến biểu đồ luồng điều khiển của
chương trình đó
Kết quả của quá trình phân tích tĩnh được sử dụng vào nhiều ứng dụng từ việc
phát hiện ra lỗi trong mã nguồn đến cấu trúc hóa chương trình
Trong chương tiếp theo ta sẽ tìm hiểu về sơ đồ khối và đưa ra bài toán ứng
dụng của phân tích mã nguồn để chuyển đổi mã nguồn về dạng sơ đồ khối.
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
22
Chương 2: Bài toán chuyển đổi mã nguồn sang sơ đồ khối
Nội dung của chương này sẽ trình bày các vấn đề sau:
• Tầm quan trọng của sơ đồ khối (flowchart)
• Giới thiệu bài toán chuyển đổi mã nguồn sang sơ đồ khối
• Một số phần mềm chuyển đổi mã nguồn sang sơ đồ khối
2.1. Tầm quan trọng của sơ đồ khối ( flowchart)

Sơ đồ khối có vai trò rất quan trọng trong các lĩnh vực và đặc biệt trong công
nghệ thông tin. Ngay từ khi mới bắt đầu học tin học ta đã làm quen với sơ đồ khối
để biểu diễn một thuật toán. Nó rất dễ quan sát và hình dung khiến cho người đọc
nắm bắt nhanh hơn, người viết dễ dàng biểu diễn được ý tưởng của mình
Ví dụ khi phải viết một chương trình tính N!  trước tiên ta mô phỏng thuật
toán tính N! bằng sơ đồ khối như sau:
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
23
Hình 3: Ví dụ sơ đồ khối
Sau khi vẽ sơ đồ khối, sẽ rất dễ dàng để triển khai công việc qua các ngôn ngữ
lập trình.
2.2. Giới thiệu bài toán chuyển đổi mã nguồn sang sơ đồ khối
Như ta đã thấy ở trên vai trò của sơ đồ khối trong công nghệ thông tin rất lớn.
Thông thường trước khi lập trình đều vẽ trước sơ đồ khối để quan sát và đánh giá.
Vấn đề là trong khi học tập, nghiên cứu, cũng như làm việc chúng ta rất hay gặp
những trường hợp phải đọc mã nguồn của người khác để phục vụ cho công việc của
mình. Vì không phải là người trực tiếp viêt ra mã nguồn đó nên rất khó và tốn thời
gian để hiểu nội dung cũng như ý tưởng của nó.
Do đó thật là tiện lợi nếu như có thể chuyển đổi những mã nguồn phức tạp đó
về dạng sơ đồ khối. Lúc đó ta sẽ tiết kiệm được rất nhiều thời gian và tiền bạc.
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
24
Vì lý do đó nên em đưa ra bài toán chuyển đổi mã nguồn sang sơ đồ khối để
làm ứng dụng trong đồ án này
2.3. Một số phần mềm tiêu biểu chuyển đổi mã nguồn sang flowchart
Trên thị trường hiện nay cũng có một vài phần mềm có chức năng tương tự, nổi
bật là 2 phần mềm sau
2.3.1. Visustin
Phần mềm có thể tự động chuyển mã nguồn của hơn 30 ngôn ngữ lập trình sang
flowchart: Ada, ASP, assembler, BASIC, C, C++, C#, Clipper, COBOL,

ColdFusion, Delphi, Fortran, Java, JavaScript, JCL, JSP, LotusScript, Matlab,
Pascal, Perl, PHP, PL/I, PL/SQL, PowerScript, PureBasic, Python, QB, REALbasic,
REXX, SAS, TSQL, VB, VBA, VBScript, VB.NET, Visual FoxPro and XSLT.
Hình 4: Ví dụ Visustin
2.3.2. Code visual to flowchart
Có thể chuyển đổi rất nhiều ngôn ngữ sang flowchart: C, C++, VC++(Visual
C++ .NET), VB(Visual Basic), VBA, Qbasic(quickbasic), GWBasic,
VBScript(VBS), ASP, Visual C# (C sharp), Visual Basic .NET(VB.NET), Visual
J# .NET, VC++.NET, ASP.NET, Java, JSP, JavaScript(JScript), Delphi(Object
Pascal), PowerBuilder(PowerScript), PHP, Perl, Unix Bourne shell Script ( sh ),
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
25
Bourne Again shell(BASh), Korn shell (K shell, ksh ), pdksh, POSIX shell, C shell
( csh ), tcsh, Fortran, Visual Foxpro, Peoplesoft SQR, PL/SQL, T-SQL(Transact-
sql)
Hình 5: Ví dụ Code visual to flowchart
Kết chương 2
Trong chương này ta đã tìm hiểu sơ lược về sơ đồ khối, tầm quan trọng của nớ
đối với công nghệ thông tin. Và cũng trong chương này ta đã đưa ra bài toán chuyển
đổi mã nguồn sang sơ đồ khối
Trong chương kế tiếp sẽ là phần ứng dụng chuyển đổi mã nguồn sang sơ đồ
khối thực hiện với ngôn ngữ java
Sinh viên thực hiện: Vũ Đức Minh – Khóa 51 - Lớp Công nghệ phần mềm
26

×