본문으로 건너뛰기
cd /languages
  • 대규모 네이티브
  • 프로그래밍
  • AST 및 심볼 지원

Maguyva의 C++ 지원: 대규모 코드를 위한 클래스와 호출 그래프

Maguyva는 AST, 심볼, 그래프로 C++를 지원하여, AI 에이전트가 대규모 C++ 코드베이스에서 클래스, 네임스페이스, 가상 함수 오버라이드, 호출자를 따라갈 수 있게 합니다.

C++에 텍스트 검색이 아니라 구조가 필요한 이유

C++에서 이름은 고유하지 않습니다. send는 자유 함수이면서, 세 클래스의 멤버이고, 네 번째 클래스에서는 오버라이드일 수 있습니다. 네임스페이스, 템플릿, 그리고 .cpp 파일 안의 Socket::send 같은 클래스 외부 정의가 한 타입을 여러 파일로 나눕니다. 텍스트 검색은 모든 일치를 돌려주지만, 호출이 그중 어디에 닿는지는 에이전트에게 알려 주지 않습니다.

Maguyva는 클래스, 멤버, 호출을 소유자와 함께 인덱싱하므로, 에이전트는 편집하기 전에 실제 구조를 따라갈 수 있습니다.

Maguyva가 C++에서 추출하는 것

Maguyva는 .cpp, .cc, .cxx, .hpp, .hh, .hxx를 포함한 일반적인 C++ 소스·헤더 확장자를 지원합니다. 클래스, 구조체, 함수가 추출되며, void Socket::send() 같은 클래스 외부 정의는 소유 클래스와 네임스페이스에 귀속됩니다. 가상 멤버도 기록되고, 템플릿 매개변수는 시그니처의 일부가 됩니다.

리시버 타입 추론은 매개변수, 지역 선언, 필드, 범위 기반 for 루프, auto를 따라가며 unique_ptr, shared_ptr, optional 안까지 들여다보므로, conn->send() 같은 호출을 올바른 클래스로 해석할 수 있습니다. 베이스 클래스 절은 상속으로 이어지고, new 표현식은 인스턴스화로 계산됩니다.

C와 같은 익스포트·어노테이션 매크로 마스킹이 적용됩니다. 약 273개의 표준 라이브러리 이름(std::cout, std::endl, printf 등)은 관계에서 걸러집니다. 그래프는 호출, include, 상속, 오버라이드, 인스턴스화, 타입 참조, 읽기와 쓰기, throw 엣지를 기록합니다.

에이전트 프롬프트 예시

  • “Renderer::draw를 오버라이드하는 클래스는 무엇이고, 누가 그것을 호출하나요?” (dependency_search)
  • “OrderBook::match와 그 모든 호출자를 보여 줘.” (find_symbol)
  • “시장 데이터 메시지가 전략 엔진에 어떻게 도달하는지 설명해 줘.” (get_task_context)

알려진 한계

  • .h는 C, C++, Objective-C의 확장자 목록에 모두 들어 있어서, C와 C++가 섞인 트리의 헤더는 이 프로필들이 공유합니다.
  • 객체형 매크로의 본문은 파싱되지 않으며, 필터링된 표준 라이브러리 이름에 대한 호출은 그래프 엣지가 아닙니다. 매크로와 std:: 사용처에는 text_pattern_search를 사용하세요.

다음 단계

빠른 시작으로 저장소를 연결한 다음, 호환성 페이지에서 지원 매트릭스를 확인하세요. 트리의 일부가 순수 C라면 C 가이드도 읽어 보세요.

가장 적합한 경우

  • > 게임 엔진, 트레이딩 시스템, 브라우저처럼 헤더 하나만 바꿔도 트리의 절반이 다시 빌드되는 대규모 C++ 코드베이스.
  • > 실행되는 메서드가 호출 위치와 다른 곳에 정의된, 가상 메서드를 가진 클래스 계층.
  • > 시그니처를 바꾸기 전에 호출자와 오버라이드를 파악해야 하는 에이전트 지원 리팩터링.

에이전트 워크플로

  • > 베이스 클래스를 바꾸기 전에 가상 메서드의 모든 오버라이드를 찾습니다.
  • > `net::Socket::send` 같은 네임스페이스 함수나 클래스 메서드의 호출자를 코드베이스 전체에서 나열합니다.
  • > 클래스가 `new`로 생성되는 곳과 그다음에 건드리는 멤버를 추적합니다.

엔진 세부 정보

  • > `void Socket::send()` 같은 클래스 외부 정의는 소유 클래스와 네임스페이스에 귀속되며, 가상 멤버도 기록됩니다.
  • > 리시버 타입 추론은 매개변수, 지역 변수, 필드, 범위 기반 `for`, `auto`를 따라가며 `unique_ptr`, `shared_ptr`, `optional` 안까지 들여다봅니다.
  • > 베이스 클래스 절은 상속으로 이어지고, `new` 표현식은 인스턴스화로 계산되며, 약 273개의 표준 라이브러리 이름은 관계에서 걸러집니다.

유용한 MCP 진입점

  • find_symbol

    정의와 호출자가 필요할 때 `OrderBook::match` 같은 한정 이름으로 쓰세요.

  • dependency_search

    시그니처를 바꾸기 전에 베이스 클래스나 가상 메서드에 써서 오버라이드와 호출자를 찾으세요.

  • get_task_context

    “시장 데이터 메시지가 전략 엔진에 어떻게 도달하는지 설명해 줘” 같은 프롬프트에 쓰세요.