Tải bản đầy đủ - 0 (trang)
Chương 1. Cơ sở nền tảng

Chương 1. Cơ sở nền tảng

Tải bản đầy đủ - 0trang

1.1.1.



Xử lý mã nguồn Java



Mã nguồn Java đầu tiên cần được chuyển đổi sang một cấu trúc mã trung gian để

phục vụ cho q trình phân tích. Hiện tại ta chỉ xét hai cấu trúc mã trung gian tiêu

biểu: dạng bytecode hoặc cây cú pháp trừu tượng (Abstract Syntax Tree – AST), đơn

giản là cây cú pháp. Còn với cây cú pháp, mã nguồn được phân tích và lưu trữ theo

cấu trúc cú pháp cấp bậc, theo cấu trúc dữ liệu dạng cây [3].

Mã nguồn 1.1. Ví dụ một đoạn mã nguồn do-while của Java

public void doWhileLoop() {

int i = 0;

do {

i++;

}

while (i < 10);

}



Mã nguồn 1 mô tả một phương thức trong Java. Để xây dựng AST ta có thể sử

dụng thư viện JDT3. Với đầu vào là mã nguồn java, cùng với cú pháp của Java, JDT sẽ

phân tích từng câu chữ của mã nguồn để tạo ra AST. JDT là một một thành phần trong

Eclipse IDE4 – cơng cụ lập trình mã nguồn mở cho Java và các ngơn ngữ lập trình

khác. Hình 1-1 minh họa cấu trúc AST ứng với Mã nguồn 1.1.



Hình 1.1. Cấu trúc mã trung gian AST của mã nguồn Java



3 https://www.eclipse.org/jdt/

4 http://www.eclipse.org/



15



Hình 1.2. Cấu trúc mã trung gian bytecode của Mã nguồn 2.1.

Ở cấu trúc dạng bytecode, mã nguồn được mã hóa và lưu trữ dưới dạng tập thứ tự

các mã chỉ thị. Trình biên dịch của Java dịch các đoạn mã nguồn do người dùng viết để

tạo ra các tệp bytecode [6]. Các tệp bytecode sẽ được máy áo Java (JVM) thơng dịch

sang ngơn ngữ máy để máy tính có thể thực hiện. Hình 2.2 minh họa dạng bytecode

ứng với Mã nguồn 1.1.

Do mã trung gian dạng bytecode lưu các chỉ thị ở dạng mã nhị phân, nên nó giúp

chương trình thực thi nhanh hơn, nhưng khiến ta khó phân tích và xử lý. Ngược lại, mã

trung gian dạng AST hướng đối tượng và có cấu trúc dữ liệu dạng cây, nên có khả

năng đọc và phân tích tốt hơn hẳn. Chính vì lí do này, cấu trúc AST được chọn để tiến

hành phân tích xây dựng JDG. Tồn bộ q trình xử lý mã nguồn Java được mơ tả như

Hình 1.3



Hình 1.3. Q trình xử lí mã nguồn tệp Java

Đầu vào của q trình này là một nút chứa thơng tin của tệp Java trong JDG. Các

thành phần con của nút này chưa được xử lí thành JDG mà mới chỉ chứa mã nguồn.

Để xây dựng JDG, đầu tiền JDT phân tích mã nguồn để hình thành cây AST. Các

16



thơng tin cần thiết trong AST sẽ được trích xuất và được lưu vào một nút biểu diễn lớp

là JavaClassNode. Các thuộc tính cơ bản về các lớp trong AST sẽ được lấy ra như: tên

lớp, các trạng thái static, final, abstract hay là phạm vi truy câp của lớp. Ngoài ra,

thông tin về các lớp cha và các lớp interface cũng là những thông tin quan trọng cần

thiết cho JDG. Mỗi phương thức, hoặc mỗi trường có trong lớp sẽ được lưu như là một

nút trong JDG, là nút con của JavaClassNode. Các nút phương thức chứa thông tin về

tham số, kiểu trả về, trạng thái. Còn các nút trường chứa thông tin về kiểu dữ liệu, tên

trường và giá trị khởi tạo của chúng. Cuối cùng, nút JavaClassNode chứa nội dung của

lớp Java với các thành phần con được thêm vào JDG.

1.1.2.



Xử lý mã nguồn tệp XML và JSP



XML (Extensible Markup Language) là ngôn ngữ đánh dấu, được dùng để mô tả

dữ liệu. Các thẻ (tag) trong XML không được xác định trước mà do người dùng tự

định nghĩa. Tệp XML bao gồm các phần tử có dạng: nội

dung
. Mỗi phần tử có một thẻ bắt đầu và một thẻ kết thúc, ở giữa hai thẻ là nội

dung. Nội dung của phân tử có thể bao gồm văn bản và các phần tử con khác. Mỗi tệp

XML chỉ được có một phần tử gốc (phần tử chứa tất cả các phần tử khác).

Mã nguồn 1.2. Ví dụ về nội dung của một tệp XML









Alan

Turing



computer scientist







Hai công cụ DOMParser và SAXParser là các thư viện có sẵn của Java, được sử

dụng để xử lý mã nguồn XML. DOMParser phân tích mã nguồn XML về một kiểu dữ

liệu dạng cây với các nút là các đối tượng Java. Còn SAXParser tính tốn tọa độ (số

hàng, số cột) của từng thẻ để phục vụ cho yêu cầu định danh và tìm kiếm nút. Cấu trúc

cây của Mã nguồn 1.2 được mơ tả như hình Hình 1.4. Nút lớn nhất của cây là đối

tượng lớp Document, mơ tả tồn bộ nội dung của một tệp XML. Mỗi một cặp thẻ được

đại diện bởi lớp Element. Trong nút kiểu Element có thể có các nút con như nút Text

(văn bản) hoặc các nút Element khác. Ngoài ra, nút Attr (thuộc tính của thẻ) cũng được

xếp vào tập nút con của Element. Mỗi một nút trong cây còn chứa tọa độ (x:y) với x là

17



số thứ tự theo dòng của thẻ, y là vị trí ký tự đầu tiên của thẻ trong dòng đó. Ví dụ trong

Hình 1.4, nút kiểu Element có tên là person, kí hiệu (3:4) nghĩa là thẻ person nằm ở

dòng 3, và bắt đầu từ ký tự thứ 4 của dòng.

Sau khi có được cây dữ liệu, việc tiếp theo là thêm các nút tương ứng với các thẻ

XML vào JDG. Các nút này chỉ cần lưu trữ các giá trị về tên thẻ, tọa độ thẻ, và danh

sách các thẻ chứa trong nó. Dữ liệu sinh ra bởi DOMParser và SAXParser là các đối

tượng như Document, Element. Attr, v.v. chứa nhiều thông tin không cần thiết và

không phù hợp với các nút trong JDG đã nêu ở trên. Do đó, bộ xử lý XML sẽ loại bỏ

các thông tin không cần thiết, giữ lại các thông tin liên quan để tạo thành nút

XmlTagNode cho JDG.



Hình 1.4. Cấu trúc cây của mã nguồn XML

JSP (JavaServer Page) là một công nghệ phát triển Web hỗ trợ thiết kế các nội

dung động. Điểm đặc biệt của cơng nghệ này là người sử dụng có thể chèn trực tiếp

mã nguồn Java vào trang JSP, để truy xuất các nội dung động. JSP gồm hai thành phần

chính là: nội dung tĩnh (HTML, SVG, XML) và nội dung động (thể đặc biệt của JSP).

Các thẻ đặc biệt trong JSP có hai kiểu. Một là các thẻ nội dung kiểu XML theo chuẩn



18



được quy định sẵn, gọi là JSTL (JavaServer Pages Standard Tag Library). Kiểu thứ hai

là các thẻ kịch bản. Các thẻ kịch bản tương tự XML đều có ký hiệu bắt đầu và kết

thúc, nhưng chỉ chứa nội dung bên trong mà khơng có tên thẻ. JSP có năm kiểu thẻ

kịch bản, được liệt kê trong Bảng 1.1. Thẻ chú thích là những thẻ định nghĩa các câu

chú thích trong trang JSP. Thẻ chỉ thị thơng báo thơng tin cho trang JSP như cách mã

hóa kí tự, danh sách các thư viện thẻ (Tag Library) để sử dụng trong trang, v.v. Thẻ

khai báo và Thẻ mã lệnh đều là hai thẻ có thể nhúng trực tiếp mã nguồn Java. Nhưng

thẻ khai báo có phạm vi sử dụng hẹp hơn, nội dung chỉ là những câu lệnh khởi tạo các

biến và phương thức của Java. Trong khi đó, ngoài khả năng nhúng được câu lệnh khai

báo, thẻ mã lệnh còn có thể gồm các câu lệnh phục vụ việc thực thi và xử lý giá trị

trong Java. Thẻ cuối cùng trong các thẻ kich bản là thẻ hiển thị. Thẻ này dùng để hiển

thị giá trị của một biểu thức, hoặc một biến của Java trên giao diện người dùng.

Bảng 1.1. Danh sách các thẻ kịch bản trong JSP

Thẻ kịch bản

Thẻ chú thích

(Comment Tag)

Thẻ chỉ thị

(Directive Tag)



Cú pháp



Ví dụ



<%-- nội dung --%>



<%-- This is a comment --%>



<%@ nội dung %>



<%@ page

contentType="text/html;charset=

UTF-8" %>

<%!

int count = 0;

int getCount() {

return count;

}

%>

<%

int count = 0;

out.print(++count);

%>

<%= (2*5) %>

<%= count %>

<%= user.name %>



Thẻ khai báo

(Declaration Tag)



<%! nội dung %>



Thẻ mã lệnh

(Scriplet Tag)



<% nội dung %>



Thẻ hiển thị

(Expression Tag)



<%= nội dung %>



Mã nguồn 1.3 là ví dụ về nội dung của một trang JSP. Nội dung của trang này là

khi bắt đầu hiển thị lấy ngẫu nhiên một số thập phân trong khoảng từ 0 đến 1 và hiển

thị số đó trên giao diện. Nếu số đó lớn hơn 0.95 thì màn hình hiển thị dòng chữ “ You'll

have a luck day!”. Ngược lại. màn hình hiển thị “Well, Bad luck.” . Dòng đầu tiên là

thẻ <%@ page … %>, định nghĩa các thông tin cơ bản của trang. Thẻ <%@ taglib

… %> thông báo sử dụng thư viện thẻ JSTL-Core 5. Trong một trang JSP có thể dùng

5 https://docs.oracle.com/javaee/5/jstl/1.1/docs/tlddocs/c/tld-summary.html



19



được nhiều thư viện thẻ. Mỗi một thư viện thẻ đều phải được khai báo trong một thẻ <

%@ taglib … %> riêng rẽ. Thẻ khai báo một thuộc tính của trang

có tên title và giá trị là chuỗi “Welcome to JSP”. Thẻ có chức năng giống thẻ

<%= … %>, hiển thị giá trị của thuộc tính title bằng cách đặt trong cặp dấu “${“và

“}“. Các thẻ kịch bản có thẻ sử dụng tại bất cứ vị trí nào trong trang JSP, vừa có thể xử

lý độc lập, vừa có thể là thành phần của một thẻ khác.

Mã nguồn 1.3. Ví dụ về nội dung của một tệp JSP

<%@ page contentType="text/html; charset=UTF-8" %>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>





<c:out value=“${title}”/>





<%



%>



double num = Math.random();

if (num > 0.95) {

You'll have a luck day!





<% } else { %>



Well, Bad luck.



<% } %>

Your number is <%= num %>.

Try Again









Hiện nay, để phân tích nội dung các tệp giao diện được viết bằng HTML, JSP,

v.v. thư viện có khả năng xử lý tối ưu nhất là Jsoup6. Jsoup là một thư viện Java dùng

để trích xuất và thao tác trên các tệp HTML. Đầu vào của JSoup là đường dẫn trang

web muốn trích xuất HTML (online) hoặc mã nguồn HTML muốn trích xuất (offline).

JSoup sẽ xây dựng mã nguồn HTML thành cấu trúc dạng cây tương tự như khi phân

tích XML Giống với cây dữ liệu của XML, kết quả khi phân tích được chứa trong đối

tượng Document. Cấu trúc của JSP khá tương tự HTML, ngồi việc có thể nhúng mã

nguồn Java thơng qua thẻ <% %>. Việc phân tích mã nguồn Java được nhúng trong

trang JSP cực kỳ khó khăn do các nội dung này phần lớn chỉ là xử lý lơ-gíc, khơng liên

quan đến một lớp hay đối tượng Java nào cả. Do vậy, nhằm mục đích đơn giản hóa

việc phân tích. các thẻ <% %> đều được loại bỏ trong tệp JSP để có thể sử dụng được

với Jsoup.



6 https://jsoup.org/



20



Phân tích sâu mã nguồn theo cơng nghệ và xây dựng



Chương 2.



phụ thuộc

2.1.Phân tích phụ thuộc mã nguồn Java Core



Các thành phần mã nguồn Java có ba loại phụ thuộc chính: thừa kế, sử dụng trường

và gọi phương thức. Phụ thuộc thừa kế là phụ thuộc khi một lớp kế thừa một lớp hoặc

một interface khác. Như vậy, phụ thuộc thừa kế được chia thành hai kiểu: phụ thuộc

thừa kế lớp và phụ thuộc thừa kế interface. Hình 2.5 mô tả quan hệ phụ thuộc thừa kế

ở hai kiểu. Lớp B và lớp A có quan hệ phụ thuộc thừa kế lớp do lớp B thừa kế lớp A

qua từ khóa extends. Còn phụ thuộc thừa kế interface là phụ thuộc mà lớp B thừa kế

lớp A qua từ khóa implement.



Hình 2.5. Quan hệ phụ thuộc thừa kế trong mã nguồn Java

Quan hệ phụ thuộc sử dụng trường là quan hệ khi phương thức sử dụng một

trường của lớp nào đó. Lưu ý rằng, trong Java, có bốn cách để phương thức có thể sử

dụng một trường. Các trường hợp được mơ tả như Hình 2.6. Đầu tiên, cách đơn giản

nhất để phương thức sử dụng được trường là cả hai đều thuộc một lớp. Ngồi ra, nếu

một lớp



21



Hình 2.6. Quan hệ phụ thuộc sử dụng trường trong mã nguồn Java

thừa kế lớp cha mà lớp cha có trường được khai báo phạm vi protected hoặc default,

khi đó các phương thức trong lớp con có thể sử dụng trường đó. Ví dụ trong Hình 2.6,

lớp C thừa kế lớp A, lớp A có trường a1 với phạm vi protected và trường a2 với phạm

vi default. Khi đó, phương thức getSuperA1() và getSuperA2() của lớp C có thể sử

dụng trường a1, a2. Ngồi phạm vi protected và default, trường có phạm vi public có

thể được truy cập bởi mọi phương thức khác. Tiếp tục với Hình 2.6, phương thức

getPublicB() có thẻ sử dụng trường b của lớp B do trường b được khai báo phạm vi là

public.

Quan hệ phụ thuộc cuối cùng trong Java là quan hệ phụ thuộc gọi phương thức.

Đây là phụ thuộc giữa hai phương thức khi phương thức này được sử dụng trong

phương thức kia. Hình 2.7 là ví dụ minh họa cho một phụ thuộc gọi phương thức.

Phương thức hello() trả về một chuỗi “Hello World!”. Phương thức sayHello() sử

dụng hello() để in chuỗi “Hello World!” đó ra màn hình.



Hình 2.7. Quan hệ sử dụng phụ thuộc gọi phương thức trong mã nguồn Java

2.2.Phân tích phụ thuộc mã nguồn Struts



22



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Chương 1. Cơ sở nền tảng

Tải bản đầy đủ ngay(0 tr)

×