Có một công cụ tái cấu trúc C ++ đang hoạt động không? [đóng cửa]


161

Có ai biết một công cụ tái cấu trúc đầy đủ tính năng cho C ++ hoạt động đáng tin cậy với các cơ sở mã lớn (khoảng 100.000 dòng) không?

Tôi đã thử bất cứ thứ gì tôi có thể tìm thấy nhiều lần trong những năm qua: SlickEdit, Eclipse CDT. Tất cả đều không thể sử dụng được.

TÓM TẮT : Tôi đã dành thời gian và đánh giá "Visual Assistant X" cũng như "Refactor for C ++". Cả hai đều có một số tính năng ấn tượng, nhưng cả hai đều không hoàn hảo. Trích xuất một khối lớn mã thường không được thực hiện thỏa mãn nếu không sửa đổi thủ công - và do đó không được đền đáp.

"Visual Assistant X" có các tính năng hay như tự động hoàn thành nhiều hơn, v.v. Nhưng nó dẫn đến rất nhiều nhấp nháy và làm chậm nhiều ở một số điểm nhất định.

Do đó, theo ý kiến ​​của tôi, câu trả lời là: "Không, không có công cụ tái cấu trúc sẵn sàng sản xuất cho C ++"

CẬP NHẬT Tháng 3 năm 2015 Đối với hdoghmens trả lời hôm nay tôi đã thử Resharper cho C ++. Liên kết của anh ấy https://www.jetbrains.com/resharper/ không nói gì về C ++. Nhưng tôi đã tìm thấy Resharper C ++ đã được công bố hơn một năm trước tại đây:

https://www.jetbrains.com/resharper/features/cpp.html

Tôi đã dùng thử với VC2010 bằng cách sử dụng cơ sở mã 20MB.

Kiểm tra 1: Phương pháp trích xuất: dẫn đến ngoại lệ Resharper. Không có mã nguồn thay đổi.

Kiểm tra 2: Phương pháp trích xuất với các nguồn khác nhau: Hoạt động tốt

Kiểm tra 3: Thay đổi chữ ký của chức năng trích xuất: Kết quả mã C ++ bị hỏng:

bool myclass::do_work123(<unknown long Color>int& Filled*&, long, int&)

Có lẽ đó là lý do tại sao C ++ không được liệt kê trên trang chính.

Theo ý kiến ​​của tôi, câu trả lời cho câu hỏi này vẫn là "KHÔNG" .


11
Yêu thích cái này. Vấn đề với C ++ là cú pháp nhạy cảm theo ngữ cảnh rất phức tạp. Nếu không thực sự phân tích toàn bộ nguồn, bạn không thể chắc chắn ý nghĩa của một định danh.
DevSolar

Xem thêm: stackoverflow.com/questions/249827/, nhưng nó không có nhiều thứ để cung cấp
dmckee --- ex-moderator mèo con

4
Eclipse thực sự hoạt động khá tốt, bạn chỉ cần cho phép nó sử dụng nhiều bộ nhớ hơn bằng cách chỉnh sửa eclipse.ini
n0rd

3
Nếu bạn vẫn đang theo dõi các công cụ tái cấu trúc cho C ++, vui lòng xem xét rằng chúng tôi tại JetBrains hiện đang làm việc với hỗ trợ C ++ trong ReSharper và một C ++ IDE đa nền tảng riêng biệt
Jura Gorohovsky

1
@RED SOFT ADAIR bạn nổi tiếng. Kiểm tra youtu.be/RT46MpK39rQ?t=1611
George C.

Câu trả lời:


38

Tôi thấy Visual Assistant X với Visual Studio rất hữu ích. Một lựa chọn khác là Refactor cho C ++ .


8
Thật không may, Refactor cho C ++ không hoạt động tốt (nếu có) với các cơ sở mã lớn.
Daniel Rose

1
Điều gì đặc biệt xảy ra với Refactor cho C ++ và các cơ sở mã lớn?
Ira Baxter

2
@IraBaxter Đơn giản là nó bị hỏng. Các tùy chọn tái cấu trúc không hiển thị hoặc không hoàn thành. Có thông báo lỗi lạ hoặc không có gì cả.
Daniel Rose

4
Bộ tái cấu trúc cho C ++ không hoạt động tốt ngay cả đối với các cơ sở mã nhỏ, nó bị hỏng và không sử dụng được.
kovarex

3
@Nils: bạn có thể cung cấp một ví dụ cụ thể về những gì nó không hiểu?
Ira Baxter

41

Visual Assistant và Visual Studio giúp việc xử lý các cơ sở mã lớn dễ dàng hơn nhiều. Hỗ trợ trực quan rất tốt trong việc theo dõi cách một lớp hoặc thành viên được sử dụng và hiệu quả hơn trong việc đổi tên nó mà không có kết quả sai so với tìm kiếm và thay thế.


23

Tôi hy vọng clang sẽ thay đổi đáng kể cảnh quan của các công cụ tái cấu trúc C ++ ngoài kia trong vài năm tới. Đó là một trình biên dịch mô-đun nguồn mở, hiển thị API để phân tích cú pháp và phân tích ngữ nghĩa mã C ++. IDE và các công cụ khác sẽ có thể sử dụng API này thay vì thực hiện công việc khó khăn khi viết trình phân tích cú pháp và phân tích ngữ nghĩa của riêng chúng.

Google đã tạo ra một công cụ tái cấu trúc quy mô lớn bằng cách sử dụng tiếng kêu .


2
Nhưng có một số kết quả của nó mà một người phàm trần bên ngoài Google có thể sử dụng?
Jan Hudec

1
@JanHudec: Kiểm tra hướng dẫn được liên kết từ đây: Comments.gmane.org/gmane.comp.compilers.clang.devel/23203
HighCommander4

17

Mozilla có công cụ tái cấu trúc riêng của họ có tên là Pork ( Wiki , Developer Wiki ). Đây là blog của nhà phát triển đằng sau Thịt lợn. Từ những gì tôi đã đọc Thịt lợn đã được sử dụng thành công trong tái cấu trúc tại Mozilla.

Thịt lợn sẽ giúp nếu bạn đến từ * nix đất, đối với Visual Studio tôi cũng khuyên bạn nên sử dụng Visual Assistant.


9

Bộ công cụ tái cấu trúc phần mềm DMS của chúng tôi là một công cụ chuyển đổi được thiết kế để thực hiện các biến đổi phức tạp trên các khối mã lớn, bao gồm cả C ++. Nó đã được sử dụng để thực hiện các thay đổi đáng tin cậy trên các hệ thống của hàng triệu dòng mã. Nó hoạt động bằng cách sử dụng các máy phân tích và biến thế langauges chính xác của trình biên dịch.

Nó có một trình phân tích cú pháp C ++ đầy đủ với độ phân giải tên và kiểu, xây dựng AST mã, có thể áp dụng các phép biến đổi thủ tục hoặc nguồn-nguồn (với cú pháp bề mặt C ++) để sửa đổi các cây đó và tái tạo đầu ra có thể biên dịch được với các bình luận được bảo tồn. (Chỉnh sửa: 7/1/2011: Bây giờ C ++ 1X đến mức chúng tôi hiểu tiêu chuẩn :)

Nó đã được sử dụng trong các dự án tái cấu trúc quy mô lớn, bao gồm kiến ​​trúc lại thành phần C ++ và bản dịch hoàn toàn tự động 100% giữa các langauges. Bạn có thể đọc về điều này tại trang web.

DMS cũng được sử dụng để xây dựng các công cụ phân tích nguồn tùy ý. Các ví dụ bao gồm phát hiện bản sao, phạm vi kiểm tra, sự khác biệt thông minh (so sánh các cấu trúc mã nguồn và các hoạt động chỉnh sửa trừu tượng thay vì các dòng với thao tác chèn và xóa đơn giản), v.v.

Những gì nó không (hiện tại) là một công cụ tái cấu trúc tương tác. Chúng tôi tin rằng để thực hiện tốt hầu hết các phép tái cấu trúc, bạn cần kiểm soát sâu và phân tích dữ liệu. DMS có máy móc chung để hỗ trợ điều này và máy móc đó được triển khai cho C, COBOL và Java vào thời điểm này, với C ++ là dòng tiếp theo. Đây là một công việc khó khăn. Bạn sẽ không thấy nhiều công cụ tái cấu trúc C ++ nghiêm trọng từ bất kỳ ai cho đến khi loại vấn đề này được giải quyết tốt. Trước tiên, bạn cần một trình phân tích cú pháp C ++ đầy đủ: -}

EDIT 7/5/2011: Có vẻ như chúng ta sẽ chạy ở phiên bản tương tác. Chúng tôi đã giành được Bộ năng lượng giai đoạn I SBIR để điều tra cách thực hiện việc này. Xem http://science.energy.gov/sbir/awards-and-general-stats/fy-2011/phase-i-by-state/?p=1#tx (Tìm kiếm các thiết kế ngữ nghĩa trong "Texas"). Đừng mong đợi một kết quả vội vàng; đây chỉ là khởi đầu của chương trình 3 năm nhiều giai đoạn để có được một công cụ.

EDIT 8/11/2011: Tiến trình đầu tiên ... chúng tôi hiện xử lý tất cả các chỉ thị C ++ 0x và OpenMP.

EDIT 1/4/2012: Không kiểm soát hoàn toàn phân tích dòng mã C ++.

EDIT 9/15/2014: Bây giờ đã có trong tay công cụ chuyển đổi / phân tích cú pháp kết thúc C ++ 14. Ngay cả việc đổi tên khá đáng tin cậy vào thời điểm này: -}


Dường như không có liên kết để đánh giá công cụ này trên trang tải xuống của bạn semanticdesigns.com/ Products / ResisterEval.html Phiên bản dùng thử và giá cả có sẵn tại thời điểm này cho VS2010 hoặc VS2008?
SmacL

Đối với một công cụ tái cấu trúc, "đừng mong đợi kết quả vội vàng". Nhiệm vụ R & D giai đoạn I của chúng tôi đã kết thúc và chúng tôi đang xin tài trợ cho Giai đoạn II. Để thảo luận về DMS và phương tiện để đánh giá nó, liên hệ với công ty. Đây không phải là thứ bạn "tải xuống để đánh giá", giống như cách Enterprise Oracle không phải là mục tải xuống.
Ira Baxter

... DMS có thể chuyển đổi VS2008 / VS2010, nhưng không phải là một công cụ tương tác và có những hạn chế đối với các chỉ thị tiền xử lý. (Tin tốt là chúng tôi nghĩ rằng chúng tôi đã giải quyết được một vấn đề lớn với những vấn đề này và sẽ áp dụng điều đó trong chương trình R & D giai đoạn II).
Ira Baxter

Cảm ơn phản hồi, nhưng nó không giống như loại công cụ tôi đang theo đuổi. Tôi không cần tương tác, chỉ cần một cái gì đó có thể thực hiện các phép biến đổi đơn giản hợp lý trên cơ sở mã lớn, mà không tốn một cánh tay và chân, ví dụ như thay đổi số lượng tham số cuộc gọi, thay đổi tham số con trỏ thành tham chiếu. VisualAssist gần nhưng chỉ cần đi xa hơn một chút.
SmacL

3
... mục đích của DMS là cho phép ứng dụng mã hóa và ứng dụng chuyển đổi mã không có lỗi, cho dù là "tái cấu trúc" hay "không". Vâng, nó khó và chúng tôi chưa có. Chúng tôi gần IMNSHO hơn bất kỳ công cụ nào tôi từng thấy cho C ++ và không có gì sai với nền tảng công cụ của chúng tôi. Những gì còn lại là những vấn đề khó chịu với bộ tiền xử lý, thang mã và nỗ lực mã hóa ngữ nghĩa của C ++ một cách ngẫu nhiên để cho phép các phép biến đổi như vậy. Và tôi sẽ là người đầu tiên nói đây là một dự án LỚN.
Ira Baxter

8

Nếu bạn đang sử dụng emacs, hãy thử Xrefactory . Nó hỗ trợ trích xuất phương thức, đổi tên các lớp / hàm / biến và chèn / xóa / di chuyển các tham số. Nó cũng có công cụ hoàn thành mã rất tốt / nhanh.


6

Hiện tại tôi không thể đề xuất bất kỳ công cụ tái cấu trúc nào cho C ++, chắc chắn không dành cho các cơ sở mã lớn từ 100k dòng trở lên. Tôi đã hy vọng điều này sẽ thay đổi, như OP, và tôi hy vọng một ngày nào đó sẽ có thứ gì đó. Tôi sợ rằng ngôn ngữ có thể phải thay đổi đáng kể trước khi chúng ta thấy bất kỳ công cụ thực sự tốt.

btw, SlickEdit đã bỏ các tính năng tái cấu trúc của nó chưa?


Ngôn ngữ đã thay đổi đáng kể, với việc phát hành tiêu chuẩn C ++ 2011. Các biến chứng bổ sung làm cho vấn đề trở nên khó khăn hơn, không dễ dàng hơn, bởi vì tất cả người dùng sẽ muốn tất cả các tính năng ngôn ngữ nâng cao khả năng tái cấu trúc: - {
Ira Baxter

2
Gần đây đã đọc về các khả năng của Slickedit, có vẻ như nó xác định định nghĩa tương ứng với việc sử dụng tên theo phương pháp heuristic. Nó không thực hiện tra cứu tên C ++ "chính xác". Điều này có nghĩa là bạn không thể tin tưởng các biến đổi của nó là chính xác. Nếu bạn không ngại kiểm tra công việc của nó, điều này có thể ổn với bạn. Trên các gói phần mềm thực sự lớn, điều này có lẽ không tốt. Ý kiến ​​cá nhân của tôi.
Ira Baxter

3

Bộ công cụ chuyển đổi phần mềm DMS thực hiện điều này tôi nghĩ. Nó là một công cụ chuyển đổi mã, được thiết kế cho quy mô lớn và xử lý C ++. Không có ý tưởng làm thế nào thanh lịch đầu ra là mặc dù.


1
DMS đã được sử dụng để tự động hóa việc tìm kiếm lại các khối lớn của mã C ++. Xem Akers, R., Baxter, I., Mehlich, M., Ellis, B., Luecke, K., Nghiên cứu trường hợp: Tái cấu trúc các mô hình thành phần C ++ thông qua chuyển đổi chương trình tự động, Công nghệ thông tin & phần mềm 49 (3): 275 -291 2007. Có sẵn từ nhà xuất bản
Ira Baxter

Bạn không có ý gì bởi "đầu ra thanh lịch". Đầu ra bạn nhận được từ DMS rõ ràng phụ thuộc vào những gì bạn cung cấp cho nó và những biến đổi bạn áp dụng. Nếu phép chuyển đổi không chạm vào một phần của mã, thì phần đó của mã có thanh lịch hay không như ở vị trí đầu tiên. Nếu nó chạm vào mã, sự tao nhã được xác định bằng cách biến đổi thông minh như thế nào, giống như những thay đổi thủ công của người viết mã. Tôi không nghĩ đây là sự thanh lịch, nhưng định dạng của kết quả có thể là in "độ trung thực" (định dạng ban đầu) hoặc kiểu in đẹp được xác định.
Ira Baxter

3

Tôi khuyên bạn nên thử rtags nếu bạn sử dụng emacs và chưa thử nó (cũng có một gói cho vim có sẵn). Đây là một ứng dụng máy khách / máy chủ dựa trên clang lập chỉ mục mã C / C ++, với các tính năng này bao gồm:

  • đi đến định nghĩa / khai báo
  • tìm tất cả các tài liệu tham khảo, đi đến tiếp theo / trước
  • đổi tên biểu tượng
  • tích hợp với bản sửa lỗi của clang

Tôi quyết định thử lại sau khi xem bài nói chuyện này giới thiệu rtags (và emacs) cho tôi.

(Tôi phải nói rằng tôi đã đi xa đến mức này chỉ sau khi QtCreator của tôi không đổi tên đúng một số biểu tượng, đây là công cụ chặn hiển thị cho việc tôi sử dụng IDE tuyệt vời này ngay bây giờ)

Bên cạnh những gì được hỗ trợ bởi rtags, tôi cũng cần một số tính năng gọn gàng bổ sung, bao gồm:

  • tạo định nghĩa hàm / nguyên mẫu
  • chức năng giải nén
  • tạo phương thức getter / setter

Đối với những điều này, tôi khuyên bạn nên sử dụng gói tái cấu trúc ngữ nghĩa cho emacs (không chắc có các lựa chọn thay thế cho vim không)

Nói chung, các công cụ dựa trên clang trông rất hứa hẹn. Nếu bạn quan tâm đến nhiều thông tin hơn về các công cụ clang cho tái cấu trúc C ++, bao gồm cả các dự án với cơ sở mã lớn, có một số cuộc thảo luận tuyệt vời của Chandler Carruth.


2

Chắc chắn phải nhắc đến Klocwork như một bộ tái cấu trúc mã thương mại. Nó trông rất hứa hẹn khi bạn xem qua video demo.


2

Vấn đề là các mẫu C ++. Kể từ năm 2019, tôi không biết về bất kỳ công cụ tái cấu trúc nào hỗ trợ các mẫu C ++. Tôi đã thử VS2019, VisualAssist, Clion, QtCreator.

Xem xét ví dụ:

#include <iostream>

struct foo { void print() {} };
struct bar { void print() {} };

template <typename T>
void call_print(T&& v) { v.print(); }

void print() {}

int main()
{
    call_print(foo{});
    call_print(bar{});
    return 0;
}

Nếu tôi chạy Đổi tên Tái cấu trúc trên foo::print, bar::printcũng sẽ được đổi tên tự động. Bởi vì chúng được liên kết thông qua call_printcác mẫu chức năng tức thời.


1

Nếu bạn đang sử dụng Visual C ++ (Express Edition miễn phí), bạn có thể sử dụng Visual Assistant từ www.wholetomato.com (liên kết đến các tính năng tái cấu trúc C ++).

Nó có thời gian dùng thử 30 ngày và chúng tôi đã tìm thấy nó nhanh hơn và đầy đủ tính năng hơn mà tính năng tích hợp sẵn trong chính sản phẩm Visual C ++.


2
Tôi không nghĩ bạn có thể sử dụng plugin với phiên bản express
Yacoby

3
Trước đây tôi chắc chắn đã thử cài đặt VA với VS C ++ express và nó không hoạt động.
quamrana

Bạn không thể cài đặt các plugin Visual Studio ở chế độ cách ly (tất cả các phiên bản Express đều chạy IDE ở chế độ tách biệt). Nếu bạn là sinh viên, bạn có thể tải xuống các phiên bản đầy đủ của Visual Studio từ DreamSpark hoặc MSDNAA.
Billy ONeal

1

Nếu bạn đang tìm cách tái cấu trúc cơ sở mã của mình: MOOSE. Nhưng đó là một bộ sưu tập lớn các công cụ phân tích và tái cấu trúc, không phải là một trình soạn thảo.




1

CLion trông rất hứa hẹn.

Tuyên bố miễn trừ trách nhiệm: Tôi chưa thử nó vì tôi cần chuyển đổi các dự án của mình sang định dạng CMake để sử dụng nó.


1

Tôi khuyên bạn nên thử Lattix . Nó cho phép bạn phân tích các cơ sở mã C / C ++ lớn để khám phá kiến ​​trúc, xác định các phụ thuộc có vấn đề và tái thiết kế mã để cải thiện tính mô đun và giảm nợ kỹ thuật. Lattix cũng cung cấp một số thuật toán để trợ giúp trong quá trình tái cấu trúc. Các thuật toán này giúp bạn tìm ra cách di chuyển các phần tử từ một phần của hệ thống phân cấp sang phần khác, để phá vỡ các chu kỳ và di chuyển các hệ thống con để có thể cải thiện sự liên kết và gắn kết của các hệ thống con. Dưới đây là kết quả của Lattix phân tích Hạt nhân Android (1,6 triệu LỘC của C / C ++). Tiết lộ đầy đủ: Tôi làm việc cho Lattix


1

Xin lỗi vì chỉ tìm thấy câu hỏi này quá muộn. Các sinh viên và trợ lý của tôi làm việc về tái cấu trúc C ++ kể từ khoảng năm 2006. Hầu hết các cơ sở hạ tầng tái cấu trúc CDT được xây dựng bởi nhóm của tôi tại viện phần mềm IFS. kể từ một vài năm, chúng tôi cung cấp cho Cevelop phiên bản CDT của chúng tôi với sự hỗ trợ cho tái cấu trúc hiện đại hóa mã C ++, vv Cevelop có thể làm việc với các cơ sở mã lớn, nếu không gian làm việc được thiết lập chính xác. Có sẵn miễn phí tại https://cevelop.com


Rất thú vị. Tôi đã tải về nó và nó sẽ không bắt đầu. Vui lòng xem github.com/Cevelop/Issues/issues/84
QUẢNG CÁO PHẦN MỀM ĐỎ

0

Tôi đã tìm thấy plugin sau cho Visual Studio 2013: Tái cấu trúc Visual C ++ của Microsoft.

Nó chỉ là một công cụ đổi tên đơn giản nhưng nó hoạt động hoàn hảo. Nó thêm menu ngữ cảnh sau khi nhấp chuột phải vào biểu tượng:

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.