2012-05-29 14 views
8

Làm cách nào để tự động chuyển đổi mã nguồn c99 thành c89? Tôi muốn biên dịch các thư viện c99 với Visual C++, nhưng MSVC chỉ hỗ trợ c89. Nhiều thay đổi chỉ là cú pháp, chẳng hạn như khởi tạo cấu trúc và bạn có thể tự động viết một công cụ thành mã "de-c99". Trình tiền xử lý này có tồn tại không?Chuyển đổi mã C99 thành C89

+1

Tôi tin rằng lý do để tạo C99 là chính xác để tránh như vậy "preprocessors" :) Đối với "tương lai" (vâng, ý định chơi chữ) - tránh các tính năng hiện đại nếu bạn sử dụng các công cụ cũ. –

+1

Sẽ ít công việc hơn nếu bạn biên dịch nó thành C++ thay vì ... –

+2

Bạn có thể sử dụng trình biên dịch của bên thứ ba hiện đại như ICC của Intel có thể được cắm vào Visual Studio. –

Trả lời

1

Những gì bạn cần là program transformation system. Một công cụ đọc mã nguồn, xây dựng các cấu trúc dữ liệu trình biên dịch (chẳng hạn như abstract syntax trees, cho phép bạn áp dụng các phép biến đổi (nguồn-tới-nguồn) trên các cấu trúc đó, và sau đó có thể tạo lại nguồn từ các cấu trúc dữ liệu đã sửa đổi.

Bạn cần một có thể phân tích cú pháp C99 và chuyển đổi thành C89. DMS Software Reengineering Toolkit có thể thực hiện điều đó bằng cách sử dụng C Front End (có thể xử lý cả hai phương ngữ C, bao gồm MSVC 89, cũng như ObjectiveC).

Nhiều người có thể đề xuất rằng tất cả bạn cần là trình phân tích cú pháp C99.Đó là một vấn đề thực tế, điều đó không đúng, để thực hiện bất kỳ chuyển đổi thú vị nào trên các ngôn ngữ máy tính điển hình bạn cần dữ liệu bảng biểu tượng, một số luồng dữ liệu, v.v. Để biết thêm chi tiết, hãy xem bài viết của tôi trên Life After Parsing và cách DMS cung cấp cuộc sống đó.

Một khía cạnh như vậy là cách bạn mã hóa thay thế trình khởi tạo cấu trúc. Bạn có thể làm điều đó bằng mã tùy chỉnh mà đi một AST C99, tìm thấy khởi tạo cấu trúc như vậy, và thủ tục hacks cây. Vâng, nó hoạt động, nhưng nó không phải là dễ dàng và bạn phải biết một số lượng lớn về cấu trúc của cây. DMS cung cấp các ghi đè nguồn-nguồn, vì vậy bạn có thể viết các mẫu nhận ra các thành ngữ bạn muốn sửa đổi và các mẫu tạo ra các thành ngữ kết quả, tất cả đều sử dụng cú pháp bề mặt C.

3

Thương mại Comeau C/C++ compiler có thể thực hiện việc này.

Cách khác, sử dụng trình biên dịch C thích hợp (ví dụ GCC hoặc Clang qua MinGW, Pelles C, Intel) và liên kết các tệp đối tượng kết quả. Tuy nhiên, không phải tất cả những thứ này (đặc biệt là MinGW) đều hỗ trợ định dạng gỡ lỗi của Microsoft.