작동하는 C ++ 리팩토링 도구가 있습니까? [닫은]


161

누구든지 큰 코드 기반 (약 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 ++가 메인 페이지에 나열되지 않은 이유입니다.

제 생각에이 질문에 대한 답은 여전히 "아니오" 입니다.


11
이것을 좋아했습니다. C ++의 문제점은 매우 복잡하고 상황에 맞는 구문입니다. 실제로 전체 소스를 구문 분석하지 않으면 식별자의 의미를 확신 할 수 없습니다.
DevSolar

또한보십시오 : stackoverflow.com/questions/249827/… 그러나 제공 할 것이 많지 않습니다
dmckee --- 전 운영자 고양이 새끼

4
실제로 꽤 잘, 당신은 그냥 eclipse.ini 편집하여 더 많은 메모리를 사용할 수 있도록 할 필요가 작품 이클립스
n0rd

3
C ++에 대한 리팩토링 도구를 계속 모니터링하고 있다면 JetBrains는 현재 ReSharper 에서 C ++ 지원별도의 크로스 플랫폼 C ++ IDE에
Jura Gorohovsky

1
@RED SOFT ADAIR 당신은 유명합니다. this youtu.be/RT46MpK39rQ?t=1611
George C.

답변:


38

Visual Studio를 사용하는 Visual Assist X 가 매우 유용하다는 것을 알았습니다 . 또 다른 선택은 C ++에 대한 리 팩터입니다 .


8
불행히도 C ++ 용 리 팩터는 큰 코드베이스에서 제대로 작동하지 않습니다.
Daniel Rose

1
C ++ 및 대규모 코드 기반의 Refactor에서 구체적으로 어떤 일이 발생합니까?
Ira Baxter

2
@IraBaxter 그것은 단순히 고장입니다. 리팩토링 옵션이 표시되지 않거나 완료되지 않았습니다. 이상한 오류 메시지가 있거나 전혀 없습니다.
Daniel Rose

4
C ++ 용 리 팩터는 작은 코드베이스에서도 잘 작동하지 않으며 깨져서 전혀 사용할 수 없습니다.
kovarex

3
@ Nils : 이해하지 못하는 구체적인 예를 제공 할 수 있습니까?
Ira Baxter

41

Visual Assist 및 Visual Studio를 사용하면 큰 코드베이스를 훨씬 쉽게 처리 할 수 ​​있습니다. 시각적 지원은 클래스 나 멤버가 어떻게 사용되는지 추적하는 데 유용하며 검색 및 바꾸기보다 오탐없이 이름을 바꾸는 데 더 효과적입니다.


23

clang 은 앞으로 몇 년 동안 C ++ 리팩토링 도구의 환경을 크게 바꿀 것으로 기대 합니다. C ++ 코드를 구문 분석하고 의미 적으로 분석하기위한 API를 제공하는 오픈 소스 모듈 식 컴파일러입니다. IDE 및 기타 도구는 자체 파서 및 시맨틱 분석기를 작성하는 어려운 작업을 수행하는 대신이 API를 사용할 수 있습니다.

Google은 이미 clang을 사용하여 대규모 리팩토링 도구를 만들었습니다 .


2
그러나 Google 외부의 단순한 필사자가 사용할 수있는 결과가 있습니까?
Jan Hudec

1
@ JanHudec : 여기에서 링크 된 튜토리얼을 확인하십시오 : comments.gmane.org/gmane.comp.compilers.clang.devel/23203
HighCommander4

17

Mozilla에는 Pork ( Wiki , Developer Wiki ) 라는 자체 리팩토링 도구가 있습니다. 다음 은 Pork의 개발자 블로그입니다. 내가 읽은 내용에서 Pork는 Mozilla의 리팩토링에 성공적으로 사용되었습니다.

* 닉스 랜드에서 온 사람이라면 돼지 고기가 도움이 될 것입니다.


9

당사의 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 프론트 엔드 파서 / 변환 엔진이 잘 갖추어져 있습니다. 이 시점에서 꽤 안정적으로 이름을 바꾸더라도 :-}


다운로드 페이지에서이 도구를 평가할 수있는 링크가없는 것 같습니다. semanticdesigns.com/Products/RegisterEval.html 현재 VS2010 또는 VS2008의 평가판과 가격이 있습니까?
SmacL

리팩토링 도구의 경우 "서둘러 결과를 기대하지 마십시오". 우리의 Phase I R & D 과제는 끝났으며 Phase II 자금을 신청하고 있습니다. DMS 및이를 평가하는 방법에 대해 논의하려면 회사에 문의하십시오. Enterprise Oracle이 다운로드 항목이 아닌 것과 같은 방식으로 "평가하기 위해 다운로드"하는 것은 아닙니다.
Ira Baxter

... DMS는 VS2008 / VS2010을 변환 할 수 있지만 대화식 도구로는 사용할 수 없으며 전 처리기 지시문과 관련하여 제한이 있습니다. (좋은 소식은 우리가 이것으로 중요한 문제를 해결했으며 Phase II R & D 프로그램에 적용 할 것이라고 생각합니다).
Ira Baxter

의견을 보내 주셔서 감사합니다. 그러나 제가 따르는 도구 유형과는 다릅니다. 인터랙티브 할 필요가 없습니다. 팔과 다리 비용을 들이지 않고 큰 코드 기반에서 합리적으로 간단한 변환을 수행 할 수있는 것입니다. VisualAssist는 가까이 있지만 조금 더 나아가면됩니다.
SmacL

3
... DMS의 목적은 "리팩토링"또는 "비"의 코드 변환을 코딩하고 오류없이 적용 할 수 있도록하는 것입니다. 예, 힘들고 아직 없습니다. 우리는 C ++에서 본 다른 툴보다 IMNSHO에 더 가깝고 툴 기초에는 아무런 문제가 없습니다. 남은 것은 전 처리기, 코드 스케일 및 이러한 변환을 허용하기 위해 C ++의 의미를 코딩하기위한 노력에 심한 문제가 있습니다. 그리고 이것이 가장 큰 프로젝트라고 말하는 첫 번째 사람이 될 것입니다.
Ira Baxter

8

emacs를 사용하는 경우 Xrefactory를 사용해보십시오 . 메소드 추출, 클래스 / 함수 / 변수 이름 변경 및 매개 변수 삽입 / 삭제 / 이동을 지원하며 매우 우수한 / 빠른 코드 완성 엔진을 갖추고 있습니다.


6

현재 내가 추천 할 수 있는 C에 대한 리팩토링 도구 ++, 확실히 100,000 라인 위의 큰 코드베이스합니다. 나는 OP와 같이 이것이 바뀔 것이라고 기대했고 언젠가 뭔가가 있기를 바랍니다. 정말 좋은 도구를보기 전에 언어 자체가 크게 바뀌어야 할까봐 걱정됩니다.

btw, SlickEdit가 리팩토링 기능을 떨어 뜨렸습니까?


C ++ 2011 표준이 릴리스되면서 언어 크게 변경되었습니다. 추가 문제는 모든 사용자가 모든 고급 언어 기능 리팩토링 기능을 원하기 때문에 문제를 더 어렵고 어렵게 만듭니다 .- {
Ira Baxter

2
최근 Slickedit의 기능을 읽은 후 휴리스틱 방법으로 이름 사용에 해당하는 정의를 결정하는 것으로 보입니다. "올바른"C ++ 이름 조회는 수행하지 않습니다. 즉, 변환이 정확하다는 것을 신뢰할 수 없습니다. 작업을 검사하는 것이 마음에 들지 않으면 괜찮습니다. 실제로 큰 소프트웨어 패키지에서는 이것이 좋지 않을 수 있습니다. 내 의견
Ira Baxter

4

emacs를 사용하고 아직 시도하지 않은 경우 rtags 를 사용해 보는 것이 좋습니다 ( vim 용 패키지 도 있습니다). C / C ++ 코드를 색인화하는 Clang 기반 클라이언트 / 서버 애플리케이션이며 다음과 같은 기능이 포함됩니다.

  • 정의 / 선언으로 이동
  • 모든 참조를 찾고 다음 / 이전으로 이동
  • 이름 바꾸기 기호
  • clang의 "fixits"와 통합

나는 rtags (및 emacs)를 소개 한이 이야기 를 보고 나서 시도해보기로 결정했습니다 .

(QtCreator가 일부 심볼의 이름을 올바르게 바꾸지 못한 후에 만이 말을해야한다고 말해야합니다.

rtags가 지원하는 것 외에도 다음과 같은 추가 기능이 필요합니다.

  • 함수 정의 / 시제품 생성
  • 추출 기능
  • 게터 / 세터 메소드 작성

이를 위해 emacs에 시맨틱 리 팩터 패키지 를 사용하는 것이 좋습니다 (vim에 대한 대안이 있는지 확실하지 않음)

일반적으로 clang 기반 도구는 매우 유망합니다. 당신은 C에 대한 그 소리 도구 ++, 리팩토링 큰 코드베이스로 프로젝트를 포함에 대한 자세한 내용에 관심이 있다면, 거기에 몇 가지 챈들러 Carruth 회담은.


3

내가 생각 하는 DMS 소프트웨어 리엔지니어링 툴킷 . 대규모로 설계되었으며 C ++를 처리하는 코드 변환 엔진입니다. 그래도 출력이 얼마나 우아한 지 모릅니다.


1
DMS는 대량의 C ++ 코드 본문을 자동으로 재구성하는 데 사용되었습니다. Akers, R., Baxter, I., Mehlich, M., Ellis, B., Luecke, K., 사례 연구 : 자동 프로그램 변환, 정보 및 소프트웨어 기술을 통한 C ++ 구성 요소 모델 리엔지니어링 49 (3) : 275 참조 -291 2007. 출판사
Ira Baxter

"우아한 출력"이 의미하는 바는 없습니다. DMS에서 얻은 결과는 제공 한 내용과 적용 할 변환에 따라 다릅니다. 변환이 코드의 일부에 닿지 않으면 코드의 해당 부분이 처음부터 우아하거나 그렇지 않은 것입니다. 코드에 닿으면 우아함은 코더의 수동 변경과 마찬가지로 변환이 얼마나 영리한 지에 따라 결정됩니다. 나는 이것이 우아함을 생각하지 않지만 결과 의 형식 은 "충실도"인쇄 (원래 형식)이거나 정의 된 prettyprinting 스타일 일 수 있습니다.
Ira Baxter

2

상업 코드 리팩토링 제품군으로 Klocwork 를 언급해야 합니다 . 데모 비디오를 볼 때 매우 유망한 것으로 보입니다.


2

문제는 C ++ 템플릿입니다. 2019 년 현재 C ++ 템플릿을 지원하는 리팩토링 도구를 알지 못합니다. VS2019, VisualAssist, Clion, QtCreator를 사용해 보았습니다.

예를 들어 보자.

#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;
}

나는에 이름 바꾸기 리팩토링을 실행하면 foo::print, bar::print자동으로 이름을 변경해야합니다. call_print함수 템플릿 인스턴스화를 통해 연결되기 때문 입니다.


1

Visual C ++ (Express Edition은 무료)를 사용하는 경우 www.wholetomato.com에서 Visual Assist를 사용할 수 있습니다 (C ++ 리팩토링 기능 링크).

평가 기간은 30 일이며 Visual C ++ 제품 자체에 내장 된 인텔리전스보다 더 빠르고 기능이 가득합니다.


2
익스프레스 버전에서 플러그인을 사용할 수 있다고 생각하지 않았습니다
Yacoby

3
과거에 VS C ++ Express로 VA를 설치하려고 시도했지만 작동하지 않았습니다.
quamrana

Visual Studio 플러그인은 격리 모드로 설치할 수 없습니다 (Express 에디션은 모두 격리 모드에서 IDE를 실행합니다). 학생이라면 DreamSpark 또는 MSDNAA 에서 Visual Studio의 정식 버전을 다운로드 할 수 있습니다 .
Billy ONeal

1

코드베이스를 리엔지니어링하려는 경우 : MOOSE. 그러나 이것은 편집자가 아닌 대규모 분석 및 리엔지니어링 도구 모음입니다.




1

CLion 은 매우 유망 보입니다.

면책 조항 : 사용하기 위해 프로젝트를 CMake 형식으로 변환해야하므로 아직 시도하지 않았습니다.


1

Lattix 시도해 보는 것이 좋습니다 . 대규모 C / C ++ 코드베이스를 분석하여 아키텍처를 발견하고 문제가되는 종속성을 식별하며 코드를 다시 엔지니어링하여 모듈성을 개선하고 기술 부채를 줄일 수 있습니다. Lattix는 또한 리팩토링 프로세스에 도움이되는 많은 알고리즘을 제공합니다. 이 알고리즘을 사용하면 서브 시스템의 커플 링 및 결속력을 향상시킬 수 있도록 계층의 한 부분에서 다른 부분으로 요소를 이동하고,주기를 중단하고, 서브 시스템을 이동하는 방법을 알아낼 수 있습니다. Lattix가 Android 커널 (160 만 LOC of C / C ++)을 분석 한 결과는 다음과 같습니다 . 전체 공개 : 저는 Lattix에서 일합니다.


1

이 질문을 너무 늦게 찾아서 죄송합니다. 저의 학생과 조교는 2006 년경부터 C ++ 리팩토링 작업을하고 있습니다. 인프라 스트럭처 리팩토링 CDT의 대부분은 IFS 소프트웨어 연구소의 팀에 의해 구축되었습니다. 몇 년 동안 우리는 C ++ 코드 현대화 리팩토링 등을 지원하는 CDT 버전의 Cevelop을 제공합니다. Cevelop은 작업 공간이 올바르게 설정된 경우 큰 코드 기반으로 작업 할 수 있습니다. https://cevelop.com 에서 무료 이용 가능


매우 흥미로운. 다운로드했는데 시작되지 않습니다. github.com/Cevelop/Issues/issues/84
RED SOFT ADAIR를

0

Visual Studio 2013에 대한 다음 플러그인을 찾았습니다 . Microsoft의 Visual C ++ 리팩토링 .

그것은 단순한 이름 바꾸기 도구 일 뿐이지 만 결함이 있습니다. 심볼을 마우스 오른쪽 버튼으로 클릭 한 후 다음 컨텍스트 메뉴를 추가합니다.

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.