Skip to main content
QUICK REVIEW

[논문 리뷰] Source Forager: A Search Engine for Similar Source Code

Vineeth Kashyap, David Bingham Brown|arXiv (Cornell University)|2017. 06. 08.
Software Engineering Research참고 문헌 14인용 수 7
한 줄 요약

Source Forager는 제안된 C/C++ 함수 간의 의미적·구문적 유사성을 분석하기 위해 제어 흐름, 데이터 의존성, AST 구조 등 여러 코드 특성 클래스를 통합된 벡터 기반 유사도 모델을 사용하여 검색하는 코드 검색 엔진입니다. 소수의 관련 결과가 있는 대규모 데이터베이스에서도 높은 정확도로 관련 코드를 순위 매기며, 텍스트 기반 검색을 능가하여 코드 완성 및 디버깅 작업에서 개발자 생산성을 향상시킵니다.

ABSTRACT

Developers spend a significant amount of time searching for code: e.g., to understand how to complete, correct, or adapt their own code for a new context. Unfortunately, the state of the art in code search has not evolved much beyond text search over tokenized source. Code has much richer structure and semantics than normal text, and this property can be exploited to specialize the code-search process for better querying, searching, and ranking of code-search results. We present a new code-search engine named Source Forager. Given a query in the form of a C/C++ function, Source Forager searches a pre-populated code database for similar C/C++ functions. Source Forager preprocesses the database to extract a variety of simple code features that capture different aspects of code. A search returns the $k$ functions in the database that are most similar to the query, based on the various extracted code features. We tested the usefulness of Source Forager using a variety of code-search queries from two domains. Our experiments show that the ranked results returned by Source Forager are accurate, and that query-relevant functions can be reliably retrieved even when searching through a large code database that contains very few query-relevant functions. We believe that Source Forager is a first step towards much-needed tools that provide a better code-search experience.

연구 동기 및 목표

  • 텍스트 기반 코드 검색의 한계를 해결하기 위해, 문법과 의미를 忽시함으로써 관련 코드를 놓치는 문제를 해결하기 위해.
  • 질의 및 코퍼스 요소의 코드 의미를 일관된 특성 관찰 프레임워크를 통해 통합적으로 명세화하기 위해.
  • 기본 검색 메커니즘을 재설계하지 않고도 새로운 특성 클래스를 추가할 수 있도록 확장성을 제공하기 위해.
  • 사전 지식 없이도 다양한 질의 도메인에 최적화된 특성 클래스 가중치를 자동으로 선택하거나 학습시키기 위해.
  • 프로그램 복구 및 합성 작업을 지원하는 확장 가능하고 정확하며 개발자 友好的인 코드 검색 경험을 제공하기 위해.

제안 방법

  • C/C++ 코드 코퍼스를 사전 처리하여 제어 흐름, 데이터 의존성, 주석, AST 패턴 등의 여러 특성 클래스를 벡터화된 특성 관찰로 추출합니다.
  • 여러 특성 클래스를 통합하여 질의와 코퍼스 함수 간의 총합 유사도를 계산하는 벡터 기반 유사도 모델을 사용합니다.
  • 사전 도메인 지식 없이도 주어진 질의에 가장 관련성이 높은 특성 클래스를 식별하기 위해 동적 특성 가중치 선택 메커니즘(dyn-select)을 활용합니다.
  • 특정 도메인에 최적화된 특성 클래스 가중치를 사전에 계산하기 위해 레이블이 붙은 학습 데이터를 기반으로 지도 학습(SVM)을 적용합니다.
  • 데이터베이스에서 가장 유사한 k개의 함수를 검색하기 위해 유사도 기반 이웃 검색(k-NN)을 적용합니다.
  • 질의가 코드 조각인 하이브리드 질의 메커니즘을 사용하며, 질의와 코퍼스 요소 모두에서 공통된 특성 추출 기법을 적용하여 유사도를 계산합니다.

실험 결과

연구 질문

  • RQ1통합된 특성 기반 접근 방식이 기존 텍스트 기반 방법을 초월해 코드 검색 정확도를 향상시킬 수 있는가?
  • RQ2사전 도메인 지식 없이도 동적 특성 가중치 선택(dyn-select) 메커니즘이 관련 특성 클래스를 효과적으로 식별할 수 있는가?
  • RQ3여러 특성 클래스가 개별 특성보다 함께 사용될 경우 검색 성능 향상에 얼마나 기여하는가?
  • RQ4SVM 기반의 가중치 학습 기법이 다양한 코드 도메인에 일반화되는 정도는 어떠한가?
  • RQ5비교적 많은 수의 혼동 요소 함수가 존재할 경우, Source Forager의 검색 정확도는 어떻게 유지되는가?

주요 결과

  • Source Forager는 svm-weights 설정을 사용하여 libc-qs 질의 세트에서 평균 평균 정밀도(MAP) 점수 0.96을 기록하여 높은 검색 정확도를 확보했습니다.
  • dyn-select 설정은 동일한 libc-qs 세트에서 MAP 0.95를 기록하여, 레이블이 붙은 학습 데이터가 필요 없이도 뛰어난 성능을 보였습니다.
  • 혼동 요소 함수 수가 100에서 204,800으로 증가하더라도 MAP 점수는 0.70 이상을 유지하여 대규모 코드베이스에서의 강건성을 입증했습니다.
  • 제어 흐름, 데이터 의존성, 주석 등의 여러 특성 클래스의 조합은 개별 특성 클래스보다 유의미하게 뛰어난 성능을 보였으며, 'cross-weights' 설정이 가장 높은 전체 MAP 점수를 기록했습니다.
  • 'equal-all' 설정은 모든 특성 클래스에 동일한 가중치를 할당했음에도 불구하고 MAP 0.84를 기록하여, 단일 특성 또는 텍스트 기반 방법보다도 다중 특성 검색의 우수성을 입증했습니다.
  • 연구 결과에 따르면 'Type–Operation Coupling'과 'Control-Flow Graph'와 같은 특성 클래스는 유사도 순위 매기기에 크게 기여하는 반면, 'Comments'와 같은 특성 클래스는 영향도는 낮지만 전체 결과 향상에 기여함을 확인했습니다.

더 나은 연구,지금 바로 시작하세요

논문 읽기부터 검토까지, 연구 시간을 획기적으로 줄여보세요.

카드 등록 없음 · 무료 플랜 제공

이 리뷰는 AI가 만들고, 인간 에디터가 검토했습니다.