2010-05-19 17 views
7

Tôi vừa được giao một nhiệm vụ mới có vẻ như là một thử thách thú vị.Phân tích mã tĩnh cho ngôn ngữ mới. Bắt đầu từ đâu?

Khách hàng muốn có công cụ kiểm tra kiểu mã được phát triển cho ngôn ngữ lập trình nội bộ (sắp được nguồn mở) chạy trên JVM. Cú pháp ngôn ngữ rất giống Java.

Khách hàng về cơ bản muốn tôi sản xuất một cái gì đó như checkstyle.

Vì vậy, câu hỏi của tôi là vấn đề này, bạn sẽ tiếp cận vấn đề này như thế nào? Với một phương tiện sạch sẽ, bạn sẽ đưa ra các khuyến nghị nào cho khách hàng?

Tôi nghĩ rằng tôi có 3 lựa chọn

  1. Viết một cái gì đó từ đầu. Id không muốn làm điều này vì dường như loại vấn đề công cụ phân tích mã này đã được giải quyết nhiều lần đến mức phải có cách tiếp cận định hướng "khung" hoặc "nền tảng" hơn.

  2. Fork một mã phong cách kiểm tra công cụ hiện có và sửa đổi các phân tích cú pháp để phù hợp với ngôn ngữ này mới vv vv

  3. Mở rộng hoặc cắm vào một công cụ phân tích mã tĩnh hiện có. (Có thể viết một plugin cho Yasca?)

Trả lời

4

công cụ như vậy về cơ bản phải thực hiện một trình biên dịch front-end cho ít nhất một tập hợp con của ngôn ngữ. Điểm bắt đầu dễ nhất thường thích ứng với một trình biên dịch front-end hiện có, vì vậy bạn chắc chắn nên bắt đầu bằng cách xem trình biên dịch của khách hàng của bạn. Nếu bạn may mắn, nó sẽ có một sự tách biệt rõ ràng giữa front-end và back-end và sẽ có thể sử dụng nó như là-và sử dụng AST hoặc IR bất kỳ front-end tạo ra để làm phân tích bổ sung của bạn.

+0

Có, hoặc sử dụng trình tạo trình phân tích cú pháp nếu điều này là không thể. –

0

Hãy xem FindBugs

+0

Yep, FindBugs, kiểu kiểm tra PMD, v.v. Trạng thái tài liệu có thể mở rộng, nhưng có vẻ như tất cả phép thuật được thực hiện ở cấp mã byte. Vì vậy, ra khỏi hộp này có thể phát hiện các vấn đề trong mã byte được tạo ra nhưng sau đó nó có thể là khá khó khăn để ánh xạ các lỗi này vào mã nguồn của ngôn ngữ mới này. – tinny

1

Bạn không muốn viết tất cả nội dung này từ đầu.

Xem DMS Software Reengineeering Toolkit. Điều này có máy móc biên dịch tổng quát để phân tích cú pháp, xây dựng các AST, xây dựng các bảng biểu tượng, xây dựng/truyền tải luồng điều khiển và biểu đồ luồng dữ liệu và các cây gọi.

DMS có thể thu được với một giao diện người dùng Java hoàn chỉnh, xây dựng các AST, các bảng biểu tượng và phân tích luồng ở trên. DMS xử lý các phương ngữ ngôn ngữ với sự tự tin, do đó, nó phải đơn giản như thực tế để sửa đổi giao diện người dùng này để khớp với ngôn ngữ biến thể Java của khách hàng của bạn và thu được tất cả các máy phân tích này.

0

Còn PMD thì sao? Ive đã sử dụng PMD trong nhiều năm nhưng chưa bao giờ thực sự khoan vào các hoạt động bên trong của nó trước đây.

PMD có thể được mở rộng bằng cách viết trình phân tích cú pháp ngôn ngữ tùy chỉnh, được thực hiện bằng cách cung cấp các cách thực hiện sau đây trong một JAR trên đường dẫn lớp.

net.sourceforge.pmd.cpd.Language
net.sourceforge.pmd.cpd.Tokenizer

http://pmd.sourceforge.net/cpd-parser-howto.html

Sau đó, bằng cách sử dụng các PMD rule designer tôi có thể xác định quy tắc từ AST kết quả.

Điều tôi thích về PMD là công cụ phân tích mã được công nhận rộng rãi trong không gian Java nên có rất nhiều sự hỗ trợ của bên thứ ba. Ví dụ: plugin Eclipse, plugin Hudson CI, v.v.