작동하는 C ++ 리팩토링 도구가 있습니까?
누구든지 큰 코드 기반 (약 100.000 줄)에서 안정적으로 작동하는 C ++ 용 리팩토링 툴을 알고 있습니까?
지난 몇 년 동안 SlickEdit, Eclipse CDT와 같이 다시 찾을 수있는 모든 것을 시도했습니다. 그들은 모두 사용할 수 없었습니다.
요약 : 시간이 걸리고 "Visual Assist X"와 "C ++의 리 팩터"를 평가했습니다. 둘 다 인상적인 기능이 있지만 완벽하지는 않습니다. 큰 코드 블록을 추출하는 것은 일반적으로 수동 수정 없이는 만족스럽지 않으므로 보상하지 않습니다.
"Visual Assist X"는 훨씬 더 완전한 자동 완성 등과 같은 멋진 기능을 가지고 있습니다. 그러나 특정 지점에서는 깜박임이 많이 발생하고 속도가 느려집니다.
제 생각에는 "아니오, C ++를위한 프로덕션 리팩토링 툴이 없습니다"라는 대답입니다.
2015 년 3 월 업데이트 hdoghmens의 답변에 대해서는 오늘 C ++ 용 Resharper를 사용해 보았습니다. 그의 링크 https://www.jetbrains.com/resharper/ 는 C ++에 대해 아무 말도하지 않습니다. 그러나 1 년 전에 발표 된 Resharper C ++을 발견했습니다.
https://www.jetbrains.com/resharper/features/cpp.html
20MB의 코드베이스를 사용하여 VC2010을 사용해 보았습니다.
테스트 1 : 추출 방법 : Resharper 예외가 발생합니다. 소스 코드가 변경되지 않았습니다.
테스트 2 : 소스가 다른 추출 방법 : 제대로 작동
테스트 3 : 추출 된 함수의 서명 변경 : C ++ 코드가 손상됨 :
bool myclass::do_work123(<unknown long Color>int& Filled*&, long, int&)
아마 그 이유는 C ++가 메인 페이지에 나열되지 않은 이유입니다.
제 생각에이 질문에 대한 답은 여전히 "아니오" 입니다.
Visual Studio를 사용하는 Visual Assist X 가 매우 유용하다는 것을 알았습니다 . 또 다른 선택은 C ++에 대한 리 팩터입니다 .
Visual Assist 및 Visual Studio를 사용하면 큰 코드베이스를 훨씬 쉽게 처리 할 수 있습니다. 비주얼 어시스트는 클래스 나 멤버의 사용 방식을 추적하는 데 유용하며 검색 및 바꾸기보다 오탐없이 이름을 바꾸는 데 더 효과적입니다.
clang 은 앞으로 몇 년 동안 C ++ 리팩토링 도구의 환경을 크게 바꿀 것으로 기대 합니다. C ++ 코드를 구문 분석하고 의미 적으로 분석하기위한 API를 제공하는 오픈 소스 모듈 식 컴파일러입니다. IDE 및 기타 도구는 자체 파서 및 시맨틱 분석기를 작성하는 어려운 작업을 수행하는 대신이 API를 사용할 수 있습니다.
Google은 이미 clang을 사용하여 대규모 리팩토링 도구를 만들었습니다 .
Mozilla에는 Pork ( Wiki , Developer Wiki ) 라는 자체 리팩토링 도구가 있습니다. 다음 은 Pork의 개발자 블로그입니다. 내가 읽은 내용에서 Pork는 Mozilla의 리팩토링에 성공적으로 사용되었습니다.
* 닉스 랜드에서 온 사람이라면 돼지 고기가 도움이 될 것입니다. Visual Studio의 경우 Visual Assist도 권장합니다.
당사의 DMS 소프트웨어 리엔지니어링 툴킷 은 C ++를 포함한 대규모 코드를 통해 복잡한 변환을 수행하도록 설계된 변환 엔진입니다. 수백만 줄의 코드 시스템을 안정적으로 변경하는 데 사용되었습니다. 컴파일러 정확한 언어 분석기 및 변압기를 사용하여 작동합니다.
여기에는 이름 및 유형 확인 기능이있는 전체 C ++ 파서가 있으며 AST 코드를 빌드하고 절차 적 또는 소스 간 변환 (C ++ 표면 구문 사용)을 적용하여 해당 트리를 수정하고 주석이 보존 된 컴파일 가능한 출력을 재생성 할 수 있습니다. (편집 : 2011 년 7 월 1 일 : 이제 표준을 이해하는 한 C ++ 1X를 수행합니다.)
C ++ 구성 요소 재구성 및 언어 간 100 % 완전 자동화 된 번역 등 대규모 리엔지니어링 프로젝트에 사용되었습니다. 웹 사이트에서 이에 대해 읽을 수 있습니다.
DMS는 또한 임의의 소스 분석 도구를 구축하는 데 사용됩니다. 복제 감지, 테스트 범위, 스마트 차이 (삽입 및 삭제가 단순한 행이 아닌 소스 코드 구조 비교 및 추상 편집 작업) 등이 있습니다.
현재가 아닌 것은 대화식 리팩토링 도구입니다. 우리는 대부분의 리팩토링을 잘 수행하기 위해서는 철저한 제어와 데이터 흐름 분석이 필요하다고 생각합니다. DMS는이를 지원하는 일반 기계를 갖추고 있으며이 시점에서 C, COBOL 및 Java에 대해 기계가 구현되며 C ++가 다음 라인에 있습니다. 이것은 힘든 일입니다. 이런 종류의 문제가 잘 해결 될 때까지는 아무도 심각한 C ++ 리팩토링 도구를 많이 볼 수 없습니다. 먼저 완전한 C ++ 파서가 필요합니다 :-}
2011 년 7 월 5 일 편집 : 대화 형 버전에서 실행하는 것처럼 보입니다. 우리는이를 수행하는 방법을 조사하기 위해 에너지 부 I 상 SBIR을 수상했습니다. http://science.energy.gov/sbir/awards-and-general-stats/fy-2011/phase-i-by-state/?p=1#tx ( "텍사스"에서 시맨틱 디자인을 찾으십시오)를 참조 하십시오 . 서둘러 결과를 기대하지 마십시오. 이것은 3 단계 다년간 프로그램의 시작일뿐입니다.
2011 년 8 월 11 일 수정 : 첫 번째 진행 ... 이제 모든 C ++ 0x 및 OpenMP 지시문을 처리합니다.
1/4/2012 편집 : C ++ 코드의 모든 제어 흐름 분석을 수행합니다.
2014 년 9 월 15 일 편집 : 이제 C ++ 14 프론트 엔드 파서 / 변환 엔진이 잘 갖추어져 있습니다. 이 시점에서 꽤 안정적으로 이름을 바꾸더라도 :-}
emacs를 사용하는 경우 Xrefactory를 사용해보십시오 . 메소드 추출, 클래스 / 함수 / 변수 이름 변경 및 매개 변수 삽입 / 삭제 / 이동을 지원하며 매우 우수 / 빠른 코드 완성 엔진도 있습니다.
현재 내가 추천 할 수 있는 C에 대한 리팩토링 도구 ++, 확실히 100,000 라인 위의 큰 코드베이스합니다. 나는 OP와 같이 이것이 바뀔 것이라고 기대했고 언젠가 뭔가가 있기를 바랍니다. 정말 좋은 도구를보기 전에 언어 자체가 크게 바뀌어야 할까봐 걱정됩니다.
btw, SlickEdit가 리팩토링 기능을 떨어 뜨렸습니까?
내가 생각 하는 DMS 소프트웨어 리엔지니어링 툴킷 . 대규모로 설계되었으며 C ++를 처리하는 코드 변환 엔진입니다. 그래도 출력이 얼마나 우아한 지 모릅니다.
emacs를 사용하고 아직 시도하지 않은 경우 rtags 를 사용해 보는 것이 좋습니다 ( vim 용 패키지 도 있습니다). C / C ++ 코드를 색인화하는 Clang 기반 클라이언트 / 서버 애플리케이션이며 다음과 같은 기능이 포함됩니다.
- 정의 / 선언으로 이동
- 모든 참조를 찾고 다음 / 이전으로 이동
- 이름 바꾸기 기호
- clang의 "fixits"와 통합
나는 rtags (및 emacs)를 소개 한이 이야기 를 본 후에 그것을 시도하기로 결정했습니다 .
(QtCreator가 일부 심볼의 이름을 올바르게 바꾸지 못한 후에 만 지금까지 갔다고 말해야합니다.이 훌륭한 IDE를 지금 사용하는 데 큰 도움이됩니다)
rtags가 지원하는 것 외에도 다음과 같은 추가 기능이 필요합니다.
- 함수 정의 / 시제품 생성
- 추출 기능
- 게터 / 세터 메소드 작성
For these, I recommend to use a semantic-refactor package for emacs (not sure if there are alternatives for vim)
Generally, clang based tools looks very promising. If you are interested in more information about clang tools for C++ refactoring, including for projects with large codebase, there are some great talks by Chandler Carruth.
One surely has to mention Klocwork as a commercial code refactoring suite. It does look very promising when you go through the demo video.
If you are using Visual C++ (Express Edition is free), you can use Visual Assist from www.wholetomato.com (link to the C++ refactoring features).
It has a 30 day trial period and we have found it to be faster and more feature-full that the built-in intellisense in the Visual C++ product itself.
If your looking to reengineer your codebase: MOOSE. But that's a large collection of analysis and reengineering tools, not an editor.
There is now a C++ refactoring extension for Visual Studio 2013 from Microsoft: http://visualstudiogallery.msdn.microsoft.com/164904b2-3b47-417f-9b6b-fdd35757d194
CLion looks very promising.
Disclaimer: I've not tried it yet as I need to convert my projects to CMake format in order to use it.
I recommend you try Lattix. It allows you to analyze large C/C++ codebases to discover the archtecture, identify problematic dependencies, and re-engineer the code to improve modularity and reduce technical debt. Lattix also provides a number of algorithms to help in the refactoring process. These algorithms help you figure out how to move elements from one part of the hierarchy to another, to break cycles and to move subsystems so that the coupling and cohesion of subsystems can be improved. Here are the results of Lattix analyzing the Android Kernel (1.6 million LOC of C/C++). Full disclosure: I work for Lattix
Sorry to only find this question so late. My students and assistants work on C++ refactoring since about 2006. Most of CDTs refactoring infrastrucure was built by my team at IFS institute of software. since a couple of years we provide Cevelop our version of CDT with support for C++ code modernization refactorings etc. Cevelop can work with large code bases, if workspace is set up correctly. Free available at https://cevelop.com
The problem are C++ templates. As of 2019 I'm not aware of any refactoring tool that supports C++ templates. I've tried VS2019, VisualAssist, Clion, QtCreator.
Consider example:
#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;
}
If I run Rename Refactoring on foo::print
, bar::print
should be also renamed automatically. Because they are linked through call_print
function template instantiations.
Definetely Resharper Ultimate is the way to go. Happiness guaranteed :)
In Beta version as of march 2015.
I found the following plugin for Visual Studio 2013: Visual C++ Refactoring by Microsoft.
It is just a simple rename tool but it works flawlessy. It adds the following context menu after right-clicking on a symbol:
참고URL : https://stackoverflow.com/questions/1388469/is-there-a-working-c-refactoring-tool
'Programming' 카테고리의 다른 글
이것을 이해하도록 도와 줄 수 있습니까? (0) | 2020.06.03 |
---|---|
null XML 요소를 나타내는 올바른 방법은 무엇입니까? (0) | 2020.06.03 |
.vcxproj.filter 파일을 소스 제어에 추가해야합니까? (0) | 2020.06.03 |
node.js 대 ASP.NET Core 성능 테스트의 예기치 않은 결과 (0) | 2020.06.03 |
디버거는 어떻게 작동합니까? (0) | 2020.06.03 |