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íchchương trình tĩnh và áp dụng lý thuyết đó vào ngôn ngữ java để xây dựng ứng dụngchuyển đổi mã nguồn s
Trang 1TRƯỜ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
Trang 2HÀ NỘI 6-2011
Trang 3PHIẾ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: minhvd88@gmail.com
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ảovệ:
Trang 4Hà Nội, ngày tháng năm
Giáo viên hướng dẫn
PGS.TS Huỳnh Quyết Thắng
Trang 5MỤ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 7
TÓM TẮT NỘI DUNG ĐỒ ÁN TỐT NGHIỆP 8
ABSTRACT OF THESIS 9
DANH MỤC TỪ VIẾT TẮT 10
DANH MỤC HÌNH ẢNH 11
LỜI NÓI ĐẦU 13
1 Lý do chọn đề tài 13
2 Bố cục của đồ án: 13
Chương 1: Giới thiệu tổng quan về phân tích mã nguồn chương trình 15
1.1 Giới thiệu chung vể phân tích mã nguồn 15
1.2 Phương pháp phân tích mã nguồn tĩnh 15
1.2.1 Các loại phân tích tĩnh 16 1.2.2 Quá trình phân tích chương trình tĩnh 18 1.2.3 Cây phân tích 20 1.2.4 Sử dụng cây phân tích các câu lệnh trong chương trình 21 1.3 Sử dụng cây cú pháp trừu tượng (AST) để phân tích 21
Kết chương 1 22
Chương 2: Bài toán chuyển đổi mã nguồn sang sơ đồ khối 24
2.1 Tầm quan trọng của sơ đồ khối ( flowchart) 24
2.2 Giới thiệu bài toán chuyển đổi mã nguồn sang sơ đồ khối 25
2.3 Một số phần mềm tiêu biểu chuyển đổi mã nguồn sang flowchart 26
2.3.1 Visustin 26 2.3.2 Code visual to flowchart 26 Kết chương 2 27
Chương 3: Xây dựng chương trình chuyển đổi mã nguồn java sang flowchart .28
Trang 63.1 Mô tả phần mềm và giới hạn chương trình 28
3.1.1 Mô tả 28
3.1.2 Giới hạn chương trình 28
3.2 Thiết kế và xây dựng chương trình 29
3.2.1 Thiết kế tổng quan của chương trình 29
3.2.2 Chi tiết xây dựng chương trình 29
3.3 Kết quả chương trình 45 3.4 Thử nghiệm đánh giá so sánh 56
Trang 7LỜ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ũngnhư 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
Trang 8TÓ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ầnmề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íchchươ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íchchươ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ìnhphâ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íchchương trình tĩnh và áp dụng lý thuyết đó vào ngôn ngữ java để xây dựng ứng dụngchuyể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ồnsang 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
Trang 9ABSTRACT OF THESIS
Program analysis is an important stage in the process of software development Itbrings so many great applications for the development of software Static analysis anddynamic analysis are two main analysis programs The are widely developed The staticanalysis program analysis program without knowing how it will run, so a static programanalysis can provide more solutions than the dynamic analysis Results of static analysisprocess is used in many applications since the discovery of errors in the source code tostructured programs
The content of the research concentrates theoretical static analysis, and applies it tobuild 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 staticanalysis
+ Chapter 2 is the introduction of flowchart, and propose the problem to convertsource code to flowchart
+ Chapter 3 focuse on building the application : Convert source code java language toflowchart
Finally, final chapter is used to conclusion; we will summarize the theory and theimplementation to get the final result of this thesis
Trang 10DANH 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íchhợp
Trang 11DANH 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 35
Hình 9: Ví dụ 2 chuyển source code sang AST 36
Hình 10: Lớp Converter 37
Hình 11: Sơ đồ chuyển từ AST sang flowchart 41
Hinh 12: Lớp Flowchart 42
Hình 13: Ví dụ chuyển đổi từ AST sang Flowchart 43
Hình 14: Ví dụ chuyển đổi tử Source code sang AST đến Flowchart 43
Hình 15: Giao diện của chương trình 44
Hình 16: Giao diện ví dụ 3.3.1 45
Hình 17: Kết quả ví dụ 3.3.1 45
Hình 18: Giao diện ví dụ 3.3.2 46
Hình 19: Kết quả ví dụ 3.3.2 46
Hình 20: Giao diện ví dụ 3.3.3 47
Hình 21: Kết quả ví dụ 3.3.3 48
Hình 22: Giao diện ví dụ 3.3.4 49
Hình 23: Kết quả ví dụ 3.3.4 50
Hình 24: Giao diện ví dụ 3.3.5 51
Hình 25: Kết quả ví dụ 3.3.5 51
Hình 26: Giao diện ví dụ 3.3.6 52
Hình 27: Kết quả ví dụ 3.3.6 53
Trang 12Hình 28: Giao diện ví dụ 3.3.7 54
Hình 29: Kết quả ví dụ 3.3.7 55
Hình 30: Giao diện chương trình khi chạy thử nghiệm 1 56
Hình 31: Kết quả chương trình khi chạy thử nghiệm 1 57
Hình 32: Kết quả thực nghiệm 1 khi chạy bằng phần mềm visustin 58
Hình 33: Giao diện chương trình khi chạy thử nghiệm 1 61
Hình 34: Kết quả chương trình khi chạy thử nghiệm 2 62
Hình 35: Kết quả thực nghiệm 2 khi chạy bằng phần mềm visustin 63
Trang 13LỜ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áclĩnh vực khác Song song với đó là sự thay đổi trong cách thức phát triển phầnmề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 sangcá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ểnphầ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ươngtrì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ầnlớ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ữngthể 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ôngcầ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ấutrú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
Trang 14Chươ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
Trang 15Chươ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ộtchươ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ácphươ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ươngtrì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ủaquá 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ươngtrì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úpcho 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 nhanhchóng ngay cả khi chương trình chưa được chạy Việc phát hiện được lỗi sớmkhô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ảnhồ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ừngcâ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
Trang 161.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 trongcá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ầmbiế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 đượccá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áclỗ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ầntrong quá trình phân tích mã nguồn, do đó kết quả đưa ra sau quá trình phân tíchkiể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ấutrú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íchtĩ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 khichạ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ìnhphâ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ìnhphâ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 DevelopmentEnvironments-IDEs) luôn bao gồm ít nhất một vài hàm để xác định tổng quan củachươ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 chungnà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ợpthê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ư thaytê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ươngtrì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
Trang 17ngườ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áiquá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ìnhtì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ứngminh 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ầnphả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 tratươ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 Tuynhiên khái niệm kiểm tra tương đương là khái niệm thường được dùng trong kiểmtra 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ùngcò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ểmtra 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íchthướ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ácthuộ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ươngtrì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 trongchương trình được thực hiện hay chưa được thực hiện Ví dụ như “thành phần lưutrữ bộ nhớ trong chương trình cần được đọc trước khi được giải phóng” Hầu hếtcá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ểmtra 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 rathô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ề địnhdạ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ươngtrình có được viết đúng đặc tả hay không như quá trình phân tích thuộc tính, hay
Trang 18phâ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êncá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ệntrung 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ântí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ểuphâ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ộtchươ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ápchú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 đếncá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 BNFhoặc hay con gọi là kí pháp phi nội dung (context-free grammar) Ngữ pháp bảnchấ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:
Stmt if (epr) stmt else stmt
Trang 19Trong đó 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úcnà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ởingô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ươngtrì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ênphả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ấtvớ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úcgiố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ỗiphâ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ểudiễn trong BNF bằng luật sản xuất sau:
digit 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 (a4)
Trang 20Phí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ạinhư sau:
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:
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ó
Trang 21nhã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áccâ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ệnhgọ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ệnhtrong 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ônngữ lập trình này như sau:
stmt id = expression ; | if (expression) statement | if (expression) stmt else
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
Trang 22Phâ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áptrừ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ủacâ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ủangô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 Tuynhiê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úcngữ 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áptrừ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ếthợ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ểnthà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ôngbá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ìnhhướ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à đốitượ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ướctiế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ủachươ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]
Trang 23Kế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ủachươ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 quagiữ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ủachươ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ệcphá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 ứngdụng của phân tích mã nguồn để chuyển đổi mã nguồn về dạng sơ đồ khối
Trang 24Chươ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ôngnghệ 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 đọcnắ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ậttoán tính N! bằng sơ đồ khối như sau:
Trang 25Hì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ặpnhữ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ủamì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ờigian để 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
Trang 26Vì 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ổibậ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 sangflowchart: 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++(VisualC++ .NET), VB(Visual Basic), VBA, Qbasic(quickbasic), GWBasic,VBScript(VBS), ASP, Visual C# (C sharp), Visual Basic NET(VB.NET), VisualJ# .NET, VC++.NET, ASP.NET, Java, JSP, JavaScript(JScript), Delphi(Object
Pascal), PowerBuilder(PowerScript), PHP, Perl, Unix Bourne shell Script ( sh ),
Trang 27Bourne 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
Trang 28Chương 3: Xây dựng chương trình chuyển đổi mã nguồn java sang flowchart
Nội dung của chương này sẽ trình bày các vấn đề sau:
Mô tả phần mêm và giới hạn chương trình
Chi tiết xây dựng chương trình
Kết quả chương trình
Thử nghiệm đánh giá và so sánh
3.1. Mô tả phần mềm và giới hạn chương trình
3.1.1 Mô tả
Ứng dụng có tên gọi là : chuyển đổi mã nguồn java sang biểu đồ flowchart Do
đó ta có thể dễ dàng hình dung công dụng của nó đó là từ mã nguồn (java) khó đọccho người không viết ra nó chuyển đổi về biểu đồ flowchart rất dễ dàng để đọchiểu
Ngôn ngữ java rất phổ biến hiện nay, rất nhiều người làm việc, nghiên cứu, họctập sử dụng java Trong lúc học tập, nghiên cứu hay làm việc nhiều khi ta phải đọccode do người khác viết để hiểu một vấn đề hay một thuật toán nào đó Sẽ là rất khóhoặc rất tốn thời gian để hiểu đoạn code đó nếu không có giải thích (comment) hoặccode viết không theo định dạnh thông thường (như xuống dòng không theo chuẩn,viết tất cả trên một dòng, … ) Khi đó ứng dụng này sẽ rất hữu hiệu để giải quyếtvấn đề đó Ứng dụng sẽ chuyển đoạn code khó hiểu đó về dạng sơ đồ khối(flowchart), từ đó người sử dụng sẽ có thể dễ dàng đọc và hiểu ý tưởng của ngườiviết
3.1.2 Giới hạn chương trình.
Do java là một ngôn ngữ lập trình với những câu lệnh phong phú, rất nhiều từkhóa, cấu trúc lệnh, mà chương trình được giới hạn trong phạm vi đồ án tốt nghiệp,nên không thể chuyển đổi tất các câu lệnh của java sang sơ đồ khối (flowchart)được Do đó trong ứng dụng đồ án này chỉ chuyển đổi những câu lệnh, cấu trúc lệnhhay sử dụng nhất của ngôn ngữ java đó là:
+ Cấu trúc if – then – else
+ Vòng lặp while
Trang 29+ Vòng lặp for
Đó là những cấu trúc cơ bản của ngôn ngữ java
3.2. Thiết kế và xây dựng chương trình
3.2.1 Thiết kế tổng quan của chương trình
Ứng dụng có đầu vào là một mã nguồn (source code) của một chương trìnhnà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
+ Giai đoạn 1: Tạo cây cú pháp trừu tượng (AST) từ mã nguồn
+ Giai đoạn 2: Từ cây AST vẽ sơ đồ khối lên màn hình
Ta có sơ đồ thực hiện của hệ thống như sau:
GetSourceCode
MakeAST
DrawFlowChart
Hình 6: Sơ đồ thực hiện phân tích chương trình
3.2.2 Chi tiết xây dựng chương trình
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ẽ đichi tiết từng giai đoạn
3.2.2.1. Xây dựng cây cú pháp trừu tượng (AST) từ mã nguồn
Đâ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
Trang 30Hình 7: Sơ đồ chuyển từ source code sang cây AST
Trong phần này chúng ta sẽ tìm hiểu 2 vấn đề chính là:
+ Cấu trúc cây cú pháp trừu tượng
+ Thuật toán xây dựng cây cú pháp trừu tượng
Trang 31a Cấu trúc cây cú pháp trừu tượng
Dưới đây là định nghĩa một nút của cây:
public class Lg_TreeNode {
String label;
String content;
List<Lg_TreeNode>child=newArrayList<Lg_TreeNode>();
}
Mỗi nút của cây có 3 thành phần:
+ label: nhãn của nút
+ content: phần mã nguồn được chèn tới nút đó với nhãn tương ứng
+ child: các nút con của nút đó Một nút có thể có một hoặc nhiều con
Label của một nút bao gồm các nhãn sau:
- “normal” dùng để chỉ các đoạn lệnh chứa các câu lệnh tuần tự
Ví dụ: Đoạn lệnh sau chứa nhãn “normal”
Int n;
Int m;
m=23;
n=m+3;
- “if” dùng để chỉ cấu trúc lệnh if then else
Ví dụ: đoạn lệnh sau có nhãn “if”
Trang 32}
- “for” dùng để chỉ đoạn lệnh for
Ví dụ: Đoạn lệnh sau có nhãn “for”
- “while” dùng để chỉ đoạn lệnh while
Ví dụ: Đoạn lệnh sau có nhãn “while”
- “if_body” dùng để chỉ đoạn lệnh thực hiện bên trong của if
Ví dụ: Trong đoạn lệnh của ví dụ nhãn “if” đoạn lệnh có nhãn “if_body” là:
n=n+5;
m++;
- “else_body” dùng để chỉ đoạn lệnh thực hiện bên trong của else
Ví dụ: Trong đoạn lệnh của ví dụ nhãn “if” đoạn lệnh có nhãn “else_body” là:
n=n-4;
m ;