Mở đầu. Giới thiệu khái quát vấn đề nghiên cứu, phương pháp luận và bố cục của luận văn. Chương 2: Cơ sở lý thuyết. Trình bày các khái niệm, định lý, thuật toán cần được hiểu rõ để áp dụng mô hình ngôn ngữ ngữ nghĩa thống kê trong phát hiện lỗi cho ngôn ngữ PHP.
Chương 3: Áp dụng mô hình ngôn ngữ ngữ nghĩa thống kê trong phát hiện lỗi cho ngôn ngữ PHP. Chương này trình bày các bước cài đặt SLAMC cho PHP. Đầu tiên là việc đưa ra bảng nguyên tắc xây dựng ngữ nghĩa và phương pháp lưu trữ phạm vi cho ngôn ngữ PHP. Bước tiếp theo là cách thức chuyển đổi từ mã nguồn PHP sang cây cú pháp trừu tượng (AST).
Tiếp theo, các công việc cần cho phát hiện lỗi như duyệt cây cú pháp, huấn luyện mô hình n-gram chủ đề, kết hợp cặp giá trị và cách thức đưa ra danh sách các gợi ý phù hợp nhất. Bước cuối cùng, các sơ đồ thuật toán chính trong chương trình mô phỏng được đưa ra với mục đích làm rõ hướng cài đặt chương trình. Chương 4: Thực nghiệm chương trình mô phỏng. Trong chương này trình bày các thực nghiệm liên quan đến phát hiện lỗi và đánh giá độ chính xác khi áp dụng SLAMC cho ngôn ngữ PHP.
Thứ nhất, xem xét phát hiện lỗi đối với các tệp mã nguồn nhằm thấy được bước đầu chương trình mô phỏng đã phán đoán chính xác đoạn mã có khả năng gây lỗi. Sau đó chạy thử chương trình với các framework PHP hiện nay đang sử dụng rộng rãi và so sánh. Kết luận: Tóm tắt những kết quả thu được đánh gía các ưu nhược điểm trong luận văn và hướng phát triển trong tương lai. 3 2CHƯƠNG 2 CƠ SỞ LÝ THUYẾT 2.
Tổng quan về mô hình ngôn ngữ Các mô hình ngôn ngữ thống kê được sử dụng để ghi lại các quy tắc trong ngôn ngữ tự nhiên bởi việc gán xác suất xuất hiện các đơn vị ngôn ngữ học thí dụ như các từ, các cụm từ, các câu, và các tài liệu. Bởi vì một đơn vị ngôn ngữ học được trình bày như một chuỗi của một hoặc nhiều các ký tự cơ bản, mô hình hóa ngôn ngữ được thực thi thông qua việc tính xác suất của các chuỗi. Để tính xác suất của các chuỗi, một cách tiếp cận mô hình hóa cho rằng mỗi chuỗi được sinh ra bởi một tiến trình của mô hình tương ứng. Các khái niệm cơ bản sẽ được trình bày chi tiết như dưới đây.
Mô hình ngôn ngữ (Language Model) Mô hình ngôn ngữ là một phân bố xác suất trên các tập văn bản. Mô hình ngôn ngữ có thể cho biết xác suất một câu thuộc một ngôn ngữ là bao nhiêu. Một mô hình ngôn ngữ L là một thống kê, mô hình có khả năng sinh ra được định nghĩa thông qua ba thành phần: một tập từ vựng V của các đơn vị cơ bản, một tiến trình G có khả năng sinh ra các phần tử của một chuỗi, và một hàm có khả năng xảy ra P(s|L). Khi ngữ cảnh thảo luận liên quan đến mô hình ngôn ngữ L, chúng ta sử dụng P(s) để biểu diễn P(s|L) và gọi là xác suất sinh của chuỗi s.
Theo như đó, một mô hình ngôn ngữ có thể đơn giản được cân nhắc để có một sự phân phối xác suất của mỗi chuỗi có thể. P(s) có thể được ước lượng từ một tập hợp được cho của các chuỗi. Từ tố và chuỗi mã từ vựng Các mô hình ngôn ngữ thống kê đã được áp dụng tới công nghệ phần mềm, thí dụ như trong gợi ý và hoàn thành mã. Để áp dụng một mô hình ngôn ngữ thống kê cho mã nguồn, đầu tiên chúng ta cần định nghĩa tập từ vựng.
Một tập từ vựng có thể được cấu tạo thông qua việc thực thi phân tích từ vựng trên mã nguồn (như một chuỗi các ký tự). Các từ vị của các từ tố được thu thập như các đơn vị cơ bản trong tập từ vựng. Mã nguồn đầu vào được trình bày như một chuỗi của các từ vựng. Dưới đây là các định nghĩa về từ tố mã từ vựng, từ vị, và chuỗi mã từ vựng.
Từ tố mã từ vựng (Lexical Code Token). Một từ tố mã từ vựng là một đơn vị trong đại diện văn bản của mã nguồn và được kết hợp với một loại từ tố từ vựng khác bao gồm định danh, từ khóa, hoặc ký hiệu, được chỉ định bởi ngôn ngữ lập trình [7]. Từ vị của một từ tố là một chuỗi của các ký tự đại diện giá trị từ vựng cho từ tố này [7]. Chuỗi mã từ vựng (Lexical Code Sequence).
Một chuỗi mã từ vựng là một chuỗi của các từ tố mã từ vựng liên tiếp đại diện một phần của mã nguồn [7]. Ví dụ, sau khi phân tích từ vựng, đoạn mã “item = arSport.length();” được đại diện bởi một chuỗi mã từ vựng của 8 từ tố với các loại từ tố của chúng và các từ vị 4 được chỉ ra trong bảng 2. item, arSport, và length là ba từ tố định danh, trong khi các từ tố khác có các kiểu ký hiệu khác nhau. Trong phân tích từ vựng, không có thông tin ngữ nghĩa xuất hiện.
Ví dụ, arSport không được ghi nhận như một biến Array, và length không được ghi nhận như tên phương thức trong lớp Array. Các từ tố mã từ vựng từ đoạn mã Từ vị Loại từ tố Item Định danh = Ký hiệu ArSport Định danh. Ký hiệu length Định danh ( Ký hiệu ) Ký hiệu ; Ký hiệu 2. Mô hình n-gram từ vựng cho mã nguồn Mô hình n-gram là một mô hình ngôn ngữ với hai giả định.
Thứ nhất, mô hình n- gram cho rằng một chuỗi có thể được sinh ra từ trái qua phải. Thứ hai, xác suất sinh của một từ vựng trong một chuỗi phụ thuộc duy nhất trên ngữ cảnh cục bộ. Sự phụ thuộc được mô hình hóa dựa trên sự xuất hiện của các chuỗi từ vựng với chiều dài giới hạn. Một chuỗi của n các từ vựng được gọi là n-gram.
Khi n được cố định với các gía trị 1, 2, 3 mô hình lần lượt được gọi là unigram, bigram, trigram. N-gram từ vựng (Lexical n-gram). Từ vị của một chuỗi n các từ tố mã liên tiếp được gọi là một n-gram từ vựng [7]. Các giả định nêu ra sau đây là có lý cho mã nguồn.
Đó là, từ tố mã tiếp theo có thể phụ thuộc và được dự đoán dựa trên các từ tố mã đã viết trước đó. Ví dụ, trong một tệp mã nguồn, chuỗi mã “for(int i = 0 ; i < n;” được xem xét như ngữ cảnh cục bộ của từ tố tiếp theo. Đoạn mã này có thể ghi nhận như một vòng lặp for với i như một biến lặp, và theo như đó từ tố mã tiếp theo là i. Với giả định của việc sinh các từ tố từ trái qua phải, xác suất sinh của chuỗi mã s = w1w2….wm được tính như sau: P(s) = P(w1).1) Trong đó, Si là từ tố thứ i trong chuỗi mã S với i = 1, m.
Đây là xác suất sinh của một chuỗi mã được tính thông qua mỗi từ tố của nó. Theo đó, một mô hình ngôn ngữ 5 cần tính toán tất cả xác suất điều kiện có thể P(c|p) ở đó c là một từ tố mã và p là một chuỗi mã. Theo công thức 2.1, mô hình ngôn ngữ phải có một lượng bộ nhớ vô cùng lớn để có thể lưu trữ hết xác suất của tất cả các chuỗi có độ dài nhỏ hơn m. Rõ ràng, điều này là không thể khi m có thể tiến tới vô cùng.
Để có thể tính được xác suất của văn bản với lượng bộ nhớ chấp nhận được, ta sử dụng giả định Markov, xác suất điều kiện P(c| p) được tính như P(c|p) = P(c|Ɩ) trong đó c là một từ tố mã và Ɩ là một chuỗi con được tạo ra bởi n-1 từ tố trước đó của p. Với phép tính xấp xỉ này, một mô hình duy nhất cần tính toán và lưu trữ xác suất điều kiện bao gồm nhiều nhất n các từ tố liên tiếp. thường được ước lượng như sau: (2.2) Ở đây, lex là hàm xây dựng nên từ vị của một chuỗi mã. Ví dụ, chuỗi mã “i < n” có thể xuất hiện trong một phát biểu for hoặc if.
Các chuỗi từ vị giống nhau sẽ được tạo ra và được đếm như sự xuất hiện của các chuỗi mã giống nhau. V là kích cỡ của tập từ vựng, là một giá trị làm mịn cho trường hợp các giá trị đếm nhỏ. Mô hình ngôn ngữ ngữ nghĩa thống kê (SLAMC) SLAMC là một mô hình ngôn ngữ ngữ nghĩa thống kê được thiết kế cho mã nguồn. SLAMC mã hóa thông tin ngữ nghĩa của các từ tố bên trong các đơn vị ngữ nghĩa cơ bản, và ghi lại các quy tắc của chúng.
Bên cạnh đó, SLAMC kết hợp ngữ cảnh cục bộ với mối quan tâm toàn cục cũng như kết hợp cặp giá trị trong tiến trình mô hình hóa. Từ tố và chuỗi mã ngữ nghĩa Từ tố mã ngữ nghĩa (Semantic Code Token). Một từ tố mã ngữ nghĩa là một từ tố mã từ vựng với thông tin ngữ nghĩa được kết hợp bao gồm định danh (ID), vai trò, kiểu dữ liệu, ngữ nghĩa, phạm vi, cấu trúc và các sự phụ thuộc dữ liệu [7]. Vai trò của một từ tố mã ngữ nghĩa đề cập tới vai trò của từ tố trong một chương trình với khía cạnh một ngôn ngữ lập trình [7].
Các vai trò điển hình bao gồm: kiểu dữ liệu, biến, toán tử, từ khóa, lời gọi hàm, khai báo hàm. Ví dụ, trong “arSport.length()”, sau khi phân tích ngữ nghĩa, arSport ghi nhận như một từ tố mã ngữ nghĩa với vai trò của một biến, trong khi vai trò của length là một lời gọi hàm. Ngữ nghĩa của một từ tố mã ngữ nghĩa là một biểu diễn được cấu trúc đại diện giá trị hoặc thông tin ngữ nghĩa, bao gồm vai trò và kiểu dữ liệu của từ tố [7]. Tập từ vựng (Vocabulary).
Một tập từ vựng là một tập hợp các ngữ nghĩa riêng 6 biệt của tất cả các từ tố mã ngữ nghĩa [7]. Một phạm vi được kết hợp với từ tố mã ngữ nghĩa nhận dạng khối chứa từ tố [7]. Tập phụ thuộc (Dependency). Tập phụ thuộc của một từ tố mã ngữ nghĩa t là một tập hợp các ID của các từ tố mã khác có các sự phụ thuộc cấu trúc hoặc dữ liệu với t [7].
Các sự phụ thuộc cấu trúc được định nghĩa như các quan hệ cha con trong một cây cú pháp trừu tượng. Các sự phụ thuộc dữ liệu được định nghĩa giữa các phần tử chương trình và được tính toán thông qua việc phân tích dữ liệu trên các biến. Chuỗi mã ngữ nghĩa (Semantic Code Sequence).