KR102141272B1 - 코드 추천 기법 - Google Patents

코드 추천 기법 Download PDF

Info

Publication number
KR102141272B1
KR102141272B1 KR1020167036837A KR20167036837A KR102141272B1 KR 102141272 B1 KR102141272 B1 KR 102141272B1 KR 1020167036837 A KR1020167036837 A KR 1020167036837A KR 20167036837 A KR20167036837 A KR 20167036837A KR 102141272 B1 KR102141272 B1 KR 102141272B1
Authority
KR
South Korea
Prior art keywords
code
snippet
code snippet
snippets
representative
Prior art date
Application number
KR1020167036837A
Other languages
English (en)
Other versions
KR20170023022A (ko
Inventor
잉농 당
쳉린 종
키안 우
한 인
니코 슈왈츠
동메이 장
Original Assignee
마이크로소프트 테크놀로지 라이센싱, 엘엘씨
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 마이크로소프트 테크놀로지 라이센싱, 엘엘씨 filed Critical 마이크로소프트 테크놀로지 라이센싱, 엘엘씨
Publication of KR20170023022A publication Critical patent/KR20170023022A/ko
Application granted granted Critical
Publication of KR102141272B1 publication Critical patent/KR102141272B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/36Software reuse
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/33Intelligent editors
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/20Software design
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

방법은 일반적으로 코드 추천에 관한 것이다. 상기 방법에서, 코드 스니펫들(2201, 2202, … 220n)은 인보크 중심 코드 슬라이싱 프로세스를 이용하여 추출된 후 메소드 사용법에 따라 그룹지어질 수 있다. 각각의 메소드 사용법에 대해, 대표 코드 스니펫이 선택되고 메타 데이터(2301, 2302, … 230n)와 관련되어 지식 베이스(210)에 저장될 수 있다. 프로그래밍 컨텍스트를 얻고 이를 이용하여 추천할 하나 이상의 코드 스니펫을 검색하도록 지식 베이스(210)에 질의할 수 있다. 추천된 코드 스니펫들의 랭킹이 정해져 유용성 및 사용자 편의성을 개선할 수 있으며, 메타 데이터(2301, 2302, … 230n)를 사용하여 가변점 및 가능하다면 그 밖의 다른 보조 정보를 제공하여 동작 효율성 및 사용자 경험을 개선할 수 있다.

Description

코드 추천 기법{CODE RECOMMENDATION}
코드 재사용은 소프트웨어 개발의 효율성을 향상시킬 수 있다. 예를 들어, 각각의 작업을 완수하기 위해 다양한 프로그래밍 컨텍스트에서 많은 애플리케이션 프로그래밍 인터페이스 메소드들(API methods)이 인보크되어(invoke) 사용될 수 있다. 알려진 것처럼, 제삼자 API 라이브러리는 수백 개 혹은 수천 개의 API 메소드 또는 함수들을 포함할 수 있다. 또한, 소프트웨어 개발 프로젝트에서, 소프트웨어 엔지니어들은 보통 추후의 인보크를 위해 내부 API로서 많은 메소드를 설계하고 구현한다. 결과적으로, 프로젝트-특정 API 메소드들의 개수 역시 엄청날 수 있다.
실제로는, 유감스럽게도, API 메소드들과 그 사용법(usage)에 대한 지식이 보통은 잘 문서화되지 않는다. API 메소드들을 사용할 때, 그 API 메소드들을 배우기에는 부적절하거나 부족한 자원이나 지식으로 인한 장애가 있다. 소프트웨어 엔지니어는 자신의 작업을 완수하는 데 도움될 수 있는 생성 API 메소드(들)이 있다는 것을 알고 있다. 그러나, 엔지니어는 정확한 API 메소드를 또는 그것을 사용하는 방법을 종종 기억하지 못할 수 있다. 코드 추천 및 코드 완성을 위한 종래의 해결 방안은 보통 정확도, 유용성(utility) 및/또는 사용자 편의성(user friendliness)이 충분하지 못한다.
현재는, 특정 프로그래밍 작업에 대한 API 메소드들의 적절한 서브셋을 결정하는 것이 어렵다. 따라서, 사용자들에게, 특히 API에 대해 상대적으로 적은 지식을 갖고 있는 사용자들에게 다른 프로그래밍 컨텍스트들에서 API 메소드들을 효과적이고 효율적으로 인보크하여 사용하는 것이 과제가 된다. 사실, 특정 프로그래밍 컨텍스트를 고려하지 않고는, 일부 추천된 코드들이 현재 작업에 적합하지 않아서 전혀 의미가 없게 된다. 게다가, 대규모 코드 베이스에 수만 개의 메소드들이 있고, 단일 API 메소드가 여러 사용법을 갖고 있을 수 있다. 따라서, 이런 API 메소드들과 그 사용법의 높은 커버리지를 제공하는 것이 중요하다. 한편, 기본적으로 유사하거나 동일한 사용법을 갖는 코드 스니펫(snippet)의 제공을 피하기 위해 코드 추천은 간명해야 한다(succinct). 또한, 추천된 코드 스니펫을 현재 프로그래밍 컨텍스트에 맞춰 조정하는 방법을 결정하기 위해 사용자가 추가로 공을 들여야 하는 경우, 특히, 코드 추천을 빨리 검색, 선택 및/또는 편집하는 효과적이고 효율적인 방법을 지원하지 않는 종래의 사용자 인터페이스로는 사용자 경험이 저하될 것이다.
본원에 설명된 대상의 일 양태는 다양한 메소드들의 사용법을 저장하는 지식 베이스(knowledge base)의 구축에 관한 것이다. 일 실시예에서, 코드 스니펫에 포함된 메소드 인보크 세트에서 제시될 수 있는 메소드 사용법에 따라서 코드 스니펫들이 그룹지어진다. 메소드 사용법들의 높은 커버리지를 얻기 위해서, 그룹지어질 하나 이상의 코드 스니펫이 인보크 중심 방식(invocation-centered manner)으로 추출될 수 있다. 임의의 결과적인 그룹에서, 대표 코드 스니펫이 선택된다. 그 대표되는 코드 스니펫은 적어도 그 대표 코드 스니펫에서 가변점(variation point)(들)을 나타내는 메타 데이터에 관련되어 지식 베이스에 저장된다. 이와 같은 방식으로, 지식 베이스가 확장 가능하며 메타 데이터는 추천 시에 유용한 정보를 제공할 수 있다.
본원에 설명된 대상의 다른 양태는 코드 추천에 관한 것이다. 일 실시예에서, 메소드 인보크에 기초하여 현재 프로그래밍 컨텍스트가 얻어진다. 프로그래밍 컨텍스트에 기초하여 지식 베이스에서 하나 이상의 후보 코드 스니펫이 검색되어 사용자에게 추천된다. 일 실시예에서, 검색된 코드 스니펫은 하나 이상의 기준에 따라 랭킹이 정해질 수 있다. 일 실시예에서, 관련된 메타 데이터에 기초하여 추천된 코드 스니펫의 하나 이상의 가변점을 강조하는 것이 가능하여, 사용자가 그 코드 스니펫을 특정 프로그래밍 컨텍스트에 맞도록 효과적이고 효율적으로 조정할 수 있다. 결과적으로, 코드 추천의 품질, 사용성(usability) 및/또는 사용자 편의성이 개선된다.
본 개요는 상세한 설명에서 추가로 후술되는 개념들 중 선택된 것을 단순화된 형태로 소개하기 위해 제공된다. 본 개요는 특허 청구된 대상의 중요 특징 또는 필수적 특징을 식별하도록 의도된 것이 아니며, 특허 청구된 대상의 범위를 한정하는 데에 사용되도록 의도된 것도 아니다.
도 1은 본원에 설명된 대상의 실시예들이 구현될 수 있는 컴퓨팅 환경의 블록도를 도시한다.
도 2는 본원에 설명된 대상의 일 실시예에 따른 코드 추천 시스템의 블록도를 도시한다.
도 3은 본원에 설명된 대상의 일 실시예에 따른 지식 베이스 구축 순서도를 도시한다.
도 4는 본원에 설명된 대상의 일 실시예에 따른 코드 스니펫에서 식별된 가변점의 일례를 도시한다.
도 5는 본원에 설명된 대상의 일 실시예에 따른 코드 세그먼트로부터 코드 스니펫을 추출하는 순서도를 도시한다.
도 6은 본원에 설명된 대상의 일 실시예에 따른 인보크 중심 슬라이싱(invocation-centered slicing)에 의한 코드 스니펫 추출의 일례를 도시한다.
도 7은 본원에 설명된 대상의 일 실시예에 따른 추출된 코드 스니펫에 있는 코드 클론들의 일례를 도시한다.
도 8은 본원에 설명된 대상의 실시예들에 따른 코드 추천 방법의 순서도를 도시한다.
도 9는 본원에 설명된 대상의 실시예들에 따른 지식 베이스 구축 시스템의 블록도를 도시한다.
도 10은 본원에 설명된 대상의 실시예들에 따른 코드 추천 시스템의 블록도를 도시한다.
이제부터 본원에 설명된 대상이 여러 예시적인 실시예와 관련해서 논의될 것이다. 이들 실시예는 대상의 범위에 대한 한정을 제안하려는 것이 아니라, 당업자가 보다 잘 이해하여 본원에 설명된 대상을 구현할 수 있게 하는 목적으로만 논의된 것임을 이해해야 한다.
본원에서 사용된 바와 같이, "포함한다"라는 용어 및 그 변형들은, "포함하지만 그것에 제한되지는 않는다"는 것을 의미하는 개방된 용어로서 해석되어야 한다. "또는"이라는 용어는, 문맥상 다르게 명시하지 않는 한, "및/또는"으로 해석되어야 한다. "에 기초하는"이라는 용어는 "에 적어도 부분적으로 기초하는"으로 해석되어야 한다. "일 실시예" 및 "하나의 실시예"라는 용어는 "적어도 하나의 실시예"로 해석되어야 한다. "다른 실시예"라는 용어는 "적어도 하나의 다른 실시예"로 해석되어야 한다. 다른 정의들이, 명시적으로 그리고 암시적으로, 아래에서 포함될 수 있다.
도 1은 설명된 대상의 하나 이상의 실시예가 구현될 수 있는 컴퓨팅 환경(100)의 일례를 도시하고 있다. 다양한 실시예들이 다양한 범용 또는 특수 목적 컴퓨팅 환경에서 구현될 수 있기 때문에, 컴퓨팅 환경(100)은 본원에 설명된 대상의 용도 또는 기능의 범위에 대해 어떠한 한정도 제안하려는 것이 아니다.
도 1을 참조하면, 컴퓨팅 환경(100)은 적어도 하나의 처리 유닛(또는 프로세서, 110) 및 메모리(120)를 포함한다. 처리 유닛(110)은 컴퓨터 실행가능 명령어를 실행하고 실제 또는 가상 프로세서일 수 있다. 멀티-프로세싱 시스템에서, 다수의 처리 유닛이 컴퓨터 실행가능 명령어를 실행하여 처리 능력을 증가시킬 수 있다. 메모리(120)는 휘발성 메모리(예를 들어, 레지스터, 캐시, RAM), 비휘발성 메모리(예를 들어, ROM, EEPROM, 플래시 메모리), 또는 이 둘의 일부 조합일 수 있다. 메모리(120)는 지식 베이스 및/또는 코드 추천을 구축하는 소프트웨어(170)의 적어도 일부분을 저장한다.
컴퓨팅 환경(100)은 추가 구성요소 또는 특징부를 가질 수 있다. 도 1에 도시된 예시에서, 컴퓨팅 환경(100)은 저장부(130), 하나 이상의 입력 장치(140), 하나 이상의 출력 장치(150), 및 하나 이상의 통신 연결(160)을 포함한다. 버스, 제어기, 또는 네트워크와 같은 상호 연결 메커니즘(도시되지 않음)이 컴퓨팅 환경(100)의 구성요소를 상호 연결한다. 일반적으로, 운영 체제 소프트웨어(도시되지 않음)가 컴퓨팅 환경(100)에서 실행되는 다른 소프트웨어에 대한 운영 환경을 제공하고 컴퓨팅 환경(100)의 구성요소의 활동들을 조정한다.
저장부(130)는 이동식 또는 비이동식일 수 있고, 컴퓨터 판독가능 저장 매체, 예컨대, 플래시 드라이브, 자기 디스크, 자기 테이프 또는 카세트, CD-ROM, CD-RW, DVD, 또는 정보를 저장하도록 사용될 수 있고 컴퓨팅 환경(100) 내에서 액세스될 수 있는 그 밖의 다른 매체를 포함할 수 있다. 저장부(130)는 소프트웨어(170)에 대한 명령어의 적어도 일부분을 저장한다.
입력 장치(들)(140)는 여러 다른 입력 장치 중 하나 이상일 수 있다. 예를 들어, 입력 장치(들)(140)는 마우스, 키보드, 트랙볼 등과 같은 사용자 장치를 포함할 수 있다. 입력 장치(들)(140)는 하나 이상의 자연 사용자 인터페이스(natural user interface) 기법, 예컨대, 말 인식(speech recognition), 터치 및 스타일러스 인식, 입력 장치(들)(140)와 접촉 및 입력 장치(들)(140)에 인접한 제스처 인식, 에어 제스처 인식, 머리 및 시선 추적, 음성 및 말 인식(voice and speech recognition), 사용자 뇌 활동 감지, 및 기계 지능을 구현할 수 있다. 또 다른 예를 들면, 입력 장치(들)(140)는 스캐닝 장치, 네트워크 어댑터, CD/DVD 판독기, 또는 컴퓨팅 환경(100)으로 입력을 제공하는 또 다른 장치를 포함할 수 있다. 출력 장치(들)(150)는 디스플레이, 프린터, 스피커, CD/DVD 기록기, 네트워크 어댑터, 또는 컴퓨팅 환경(100)으로부터의 출력을 제공하는 또 다른 장치일 수 있다. 입력 장치(들)(140)와 출력 장치(들)(150)가 터치 스크린 또는 가상 현실 시스템과 같은 단일 시스템 또는 장치에 포함될 수 있다.
통신 연결(들)(160)에 의해 통신 매체를 통한 또 다른 컴퓨팅 개체로의 통신이 가능해진다. 게다가, 컴퓨팅 환경(100)의 구성요소들의 기능이 단일 컴퓨팅 기기로 또는 통신 연결을 통해 통신할 수 있는 복수의 컴퓨팅 기기로 구현될 수 있다. 따라서 컴퓨팅 환경(100)은 하나 이상의 원격 컴퓨팅 장치, 예컨대, 핸드헬드 컴퓨팅 장치, 개인용 컴퓨터, 서버, 라우터, 네트워크 PC, 피어 장치 또는 또 다른 공통 네트워크 노드로의 논리적 연결을 이용하는 네트워크 연결된 환경에서 동작할 수 있다. 통신 매체는 데이터 또는 컴퓨터 실행가능 명령어 또는 요청과 같은 정보를 변조된 데이터 신호의 형태로 전달한다. 변조된 데이터 신호는 신호에 정보를 인코딩하도록 특성 중 하나 이상이 설정 또는 변경된 신호이다. 비제한적인 예를 들면, 통신 매체는 전기, 광학, RF, 적외선, 음향, 또는 그 밖의 다른 반송파에 의해 구현되는 유선 또는 무선 기법을 포함한다.
본 대상의 실시예들이 저장 매체 또는 통신 매체일 수 있는 컴퓨터 판독가능 매체의 일반적인 맥락으로 설명될 수 있다. 컴퓨터 판독가능 저장 매체는 컴퓨팅 환경 내에서 액세스될 수 있는 임의의 이용 가능한 저장 매체이지만, 컴퓨터 판독가능 저장 매체라는 용어는 전파되는 신호 그 자체를 지칭하지 않는다. 비제한적인 예를 들면, 컴퓨팅 환경(100)에서, 컴퓨터 판독가능 저장 매체는 메모리(120), 저장부(130), 및 이들의 조합을 포함한다.
본 대상의 실시예들이 컴퓨터 실행가능 명령어, 예컨대, 타겟인 실제 또는 가상 프로세서 상에서 컴퓨팅 환경에서 실행되는, 프로그램 모듈에 포함되는 컴퓨터 실행가능 명령어의 일반적인 맥락으로 설명될 수 있다. 일반적으로, 프로그램 모듈은 특정 작업을 수행하거나 특정 추상화 데이터 유형을 구현하는 루틴, 프로그램, 라이브러리, 객체, 클래스, 구성요소, 데이터 구조 등을 포함한다. 프로그램 모듈의 기능은 다양한 실시예에서 필요에 따라 프로그램 모듈들 간에 조합되거나 분할될 수 있다. 프로그램 모듈을 위한 컴퓨터 실행가능 명령어가 로컬 또는 분산 컴퓨팅 환경 내에서 실행될 수 있다. 분산 컴퓨팅 환경에서, 프로그램 모듈은 로컬 컴퓨터 저장 매체와 원격 컴퓨터 저장 매체 모두에 위치할 수 있다.
도 2는 본원에 설명된 대상의 실시예들에 따른 코드 추천 시스템(200)의 블록도를 도시한다. 도시된 바와 같이, 시스템(200)은 지식 베이스(210)를 포함한다. 특히, 지식 베이스(210)는 프로그래밍 시에 인보크될 수 있는 하나 이상의 메소드의 사용법에 관한 지식을 저장한다. 예를 들어, 일 실시예에서, 지식 베이스(210)는 하나 이상의 API 메소드의 사용법을 특징짓는 API 사용법 베이스로서 구현된다. 다음의 설명에서, API 메소드를 참조하여 몇몇 실시예가 논의될 것이다. 그러나, 이는 본원에 설명된 대상에 대한 어떠한 한정도 제안하지 않고 단지 예시를 위한 것에 불과함을 이해해야 한다. 본원에 설명된 대상의 실시예들은 프로그래밍 시에 인보크되거나 호출될(called) 수 있는 다양한 종류의 메소드에 적용될 수 있다.
지식 베이스(210)는 복수의 코드 스니펫(2201, 2202, … 220n, 집합적으로 "코드 스니펫(220)"으로 지칭됨)을 포함한다. 각각의 코드 스니펫(220)은 하나 이상의 명령문(statement)를 포함하고 특정 메소드 사용법을 나타낸다. 코드 스니펫은 임의의 적절한 방식으로 얻을 수 있다. 예를 들어, 일 실시예에서, 하나 이상의 코드 스니펫(220)이 하나 이상의 코드 베이스 및/또는 인터넷으로부터 직접 수집될 수 있다. 대안적으로 또는 추가적으로, 기존의 코드 세그먼트에서 코드 스니펫(220)이 생성될 수 있다. 일 실시예에서, 스니펫 추출(extraction), 그루핑(grouping) 및 선택을 포함하는 프로세스에 의해 하나 이상의 코드 스니펫(220)이 생성된다. 코드 스니펫(200) 및 그 생성의 예시들이 다음에서 논의될 것이다.
도 2에 도시된 바와 같이, 일 실시예에서, 코드 스니펫(2201, 2202, … 220n)은 각각 메타 데이터(2301, 2302, … 230n, 집합적으로 "메타 데이터(230)"로 지칭됨)를 갖고 있다. 메타 데이터(230)는 코드 추천에서 유용할 수 있는 관련된 코드 스니펫(220)의 정보를 나타낸다. 예를 들어, 일 실시예에서, 메타 데이터(230)는 관련된 코드 스니펫(220)의 하나 이상의 가변점을 나타낸다. 본원에서 사용된 바와 같이, "가변점"이라는 용어는, 프로그래밍 작업마다 달라질 가능성이 크고 사용자가 수동으로 및/또는 임의의 적절한 자동-코딩 기술을 이용하여 편집되거나 지정되어야 하는 코드 스니펫의 포인트를 지칭한다. 이에 관한 예시적인 실시예가 나중에 논의될 것이다. 그 밖의 다른 임의의 관련 정보가 메타 데이터(230)에 포함될 수 있다. 예를 들어, 일 실시예에서, 메타 데이터(230)는 관련된 코드 스니펫(220)을 얻을 소스에 대한 정보를 포함할 수 있다.
코드 스니펫(220)과 그에 관련된 메타 데이터(230)가 도 2에 도시된 바와 같이 반드시 함께 저장될 필요는 없음을 이해해야 한다. 그보다는, 일 실시예에서, 메타 데이터(230)의 전부 또는 일부가, 예를 들어, 테이블이나 그 밖의 다른 임의의 적절한 데이터 구조에 저장될 수 있다. 테이블의 각각의 항목이, 예를 들어, 코드 스니펫(220)의 식별자에 의해, 코드 스니펫(220)에 관련되어 있을 수 있다.
또한, 시스템(200)은 개발 환경(240)을 포함하고 있다. 개발 환경(240)은 컴퓨터 프로그램 코드를 편집, 저장, 디버깅, 구축 및/또는 실행하는 데 사용될 수 있다. 일 실시예에서, 개발 환경(240)은 통합 개발 환경(integrated development environment, IDE)이다. 특히, 개발 환경(240)은 사용자가 코드를 입력 및/또는 편집할 수 있는 코드 편집기(250)를 포함한다. 일 실시예에서, 개발 환경(240)은 추천 영역(260)을 더 포함할 수 있다. 동작 시에, 예를 들어, 사용자가 코드 편집기(250)에서 코드를 타이핑하는 동안 프로그래밍 컨텍스트를 얻을 수 있다. 프로그래밍 컨텍스트 및 가능한 그 밖의 다른 관련 정보를 사용하여 지식 베이스(210)에 질의를 할 수 있다. 그에 대한 응답으로, 지식 베이스(210)는 프로그래밍 컨텍스트에 관련이 있을 것으로 예상되는 하나 이상의 코드 스니펫(220)을 검색하여 반환할 것이다. 랭킹과 같은 일부 프로세싱에 따라, 지식 베이스(210)에서 제공하는 코드 스니펫(220)의 일부 또는 전부가 코드 추천으로서 추천 영역(260)에 제시될 수 있다. 추천 영역(260)에 제시된 추천들을 검색, 선택 및/또는 편집함으로써, 사용자가 추천된 코드 스니펫(들)(220)을 가지고 자신의 코드를 완성할 수 있다.
지식 베이스(210) 및 개발 환경(240)은 쌍방향 연결(270)을 통해 서로 통신할 수 있다. 일 실시예에서, 지식 베이스(210) 및 개발 환경(240)이 하나의 물리적인 기계에 같이 배치되어 있다. 이 때, 연결(270)은, 예를 들어, 애플리케이션 간 또는 프로세스 간 통신 연결일 수 있다. 다른 실시예에서, 지식 베이스(210) 및 개발 환경(240)이 별개의 기계들에 분산되어 있다. 이런 실시예에서, 연결(270)은, 예를 들어, 근거리 통신망("LAN"), 광역 통신망("WAN") 또는 인터넷과 같은 컴퓨터 네트워크, 통신 네트워크, 근거리 자기장(near field) 통신 연결, 또는 이들의 임의의 조합일 수 있다. 개발 환경(240)이 로컬 지식 베이스와 원격 지식 베이스 모두를 이용할 수 있음을 이해해야 한다. 이때, 연결(270)은 로컬 및 원격 통신을 가능하게 한다.
코드 편집기(250)와 추천 영역(260)이 도 2에서 별개의 영역으로 도시되어 있더라도, 이는 단지 본원에 설명된 대상에 대한 어떠한 한정도 제안하지 않고 예시를 위한 것임에 불과하다는 점을 이해해야 한다. 대안적으로, 코드 및 추천은 단일 영역 또는 창, 팝업창 또는 프레임, 또는 드롭다운 메뉴에 디스플레이될 수 있다. 예를 들어, 일 실시예에서, 추천 영역(260)이 코드 편집기(250)의 커서의 위치 근처에 디스플레이되는 이동식 창(floating window)으로 구현될 수 있다.
이제 지식 베이스(210)의 구축이 설명될 것이다. 도 3은 지식 베이스(210)를 구축하는 방법(300)의 순서도를 도시한다. 방법(300)은 임의의 적절한 타이밍에 실행될 수 있음을 이해해야 한다. 예를 들어, 일 실시예에서, 지식 베이스(210)가 사전에 구축될 수 있다. 추가적으로 또는 대안적으로, 지식 베이스(210)가 질의를 처리하기 위해 이미 배치된 후에 방법(300)이 실행될 수 있어서, 지식 베이스(210)가 동적으로 업데이트될 수 있다. 또한, 단지 예시의 목적으로서, 방법(300)이 API 메소드들과 관련하여 논의될 것이다.
일반적으로, 방법(300)에서, 다수의 코드 스니펫들을 그룹지음으로써 지식 베이스가 구축된다. 이를 위해서, 방법(300)은 그룹지어질 코드 스니펫들이 노이즈 제거를 위해 필터링되어 그루핑의 정확도를 향상시키는 단계(305)에서 시작된다. 그루핑의 기준에 따라서, 다양하게 다른 방식으로 필터링될 수 있다. 필터링의 예시가 아래에서 설명될 것이다. 코드 스니펫의 필터링이 반드시 실행되어야 하는 것은 아님을 이해해야 한다. 일 실시예에서, 코드 스니펫이 필터링 없이 바로 그룹지어질 수 있다.
단계(310)에서, 다수의 코드 스니펫들이 그룹지어져 하나 이상의 그룹들을 얻는다. 그룹지어질 코드 스니펫 각각은 하나 이상의 API 메소드의 인보크와 관련된 명령문을 포함한다. 그룹지어질 코드 스니펫은 임의의 적절한 방식으로 얻어질 수 있다. 예를 들어, 일 실시예에서, 하나 이상의 코드 스니펫이 기존의 코드 세그먼트에서 추출될 수 있다. 이에 관한 예시적인 실시예가 나중에 논의될 것이다. 대안적으로, 그룹지어질 코드 스니펫이 코드 베이스로부터 또는 임의의 적절한 소스로부터 수집될 수 있다.
단계(310)에서, 코드 스니펫의 메소드 사용법에 따라 그루핑이 실행된다. 즉, 동일하거나 유사한 메소드 사용법을 나타내는 코드 스니펫들이 함께 그룹지어질 것이다. 이런 식으로, 각각의 결과적인 그룹은 동일하거나 유사한 메소드 사용법에 관련된 코드 스니펫들을 포함하게 된다.
본원에서 사용된 바와 같이, 메소드 사용법이란 주어진 컨텍스트에서 이 메소드가 동작하는 방법을 반영하는 메소드(들)의 이용 패턴을 지칭한다. 메소드 사용법은 임의의 적절한 방식으로 표현될 수 있다. 예를 들어, 메소드 사용법은 파라미터 또는 변수 세트, 메소드 인보크 세트, 메소드 인보크 순서, 데이터 의존도, 제어 흐름, 및/또는 그 밖의 다른 임의의 적절한 양태들로 특징지어질 수 있다. 따라서, 이들 양태 중 하나 이상을 사용하여 코드 스니펫을 그룹지을 수 있다.
특히, 일 실시예에서, 오직 코드 스니펫에 포함된 메소드 인보크 세트만에 의해서 코드 스니펫이 그룹지어질 수 있다. 코드 스니펫의 메소드 인보크 세트가 대부분의 경우에 코드 스니펫의 의미(semantics)를 특징지을 수 있기 때문에, 이것이 가능하다. 동일한 메소드 인보크 세트를 갖는 두 개의 코드 스니펫들에서, 인보크 순서, 데이터 의존도 및/또는 제어 흐름의 분산(variance)이 의미상으로(semantically) 중요하지 않을 수 있다고 실험에서 보여준다. 이와 같은 실시예에서, 동일하거나 유사한 메소드 인보크 세트를 포함하는 코드 스니펫들은 단일 그룹에 배정된다. 이러한 접근 방법은 매우 효율적이며 파라미터를 조정할 필요도 없어서, 실제 효율성 면에서 유익하다.
전술한 바와 같이, 일 실시예에서, 단계(310)에서의 코드 스니펫의 그루핑 전에, 단계(305)에서 코드 스니펫을 필터링하여 노이즈를 제거하는 것이 가능하다. 예를 들어, 메소드 인보크 세트에 기초하여 코드 스니펫들이 그룹지어질 때, 단계(305)에서, 코드 스니펫에서 하나 이상의 사소한(trivial) 메소드 인보크가 제거될 수 있다. 본원에서 사용된 바와 같이, "사소한 메소드 인보크"라는 용어는 단지 보조 함수만을 제공하고 코드 스니펫의 의미에 관련이 적은 메소드 인보크를 지칭한다. 예를 들어, ToString 함수 또는 로깅 함수와 같은 API 메소드들의 인보크가 사소한 메소드 인보크로 여겨질 수 있다. 일 실시예에서, 하나 이상의 사소한 메소드 인보크가 미리 정의되어 저장될 수 있다. 특히, 개별 코드 베이스에 대해 사소한 메소드 인보크가 커스터마이징될 수 있다. 동작 시에, 코드 스니펫에, 만약에 있다면, 사소한 메소드 인보크를 제거하기 위해 사전 정의된 사소한 메소드 인보크가 그룹화될 코드 스니펫들에서 확인할 수 있다. 이런 식으로 노이즈를 필터링함으로써, 코드 스니펫이 좀 더 정확하게 그룹지어질 수 있다.
다음으로 방법(300)은 단계(310)의 결과인 그룹들 각각에 대해 하나 이상의 대표 코드 스니펫을 선택하는 단계(320)로 진행한다. 대표 코드 스니펫은 차후의 질의를 위한 코드 스니펫(220)으로서 지식 베이스(210)에 저장될 수 있다. 일 실시예에서, 그룹의 대표 코드 스니펫이, 예를 들어, 랜덤으로 그 그룹에서 직접 선택될 수 있다. 대안적으로 또는 추가적으로, 신뢰되거나 인증된 소스로부터 얻어진 코드 스니펫이 대표 코드 스니펫으로 선택될 수 있다.
대표 스니펫 선택의 정확도를 더욱 향상시키기 위해서, 일 실시예에서, 코드 스니펫들의 형태에 기초하여 그 그룹에 있는 코드 스니펫들을 추가로 그룹지음으로써 그룹의 대표 코드 스니펫이 선택될 수 있다. 본원에서 사용된 바와 같이, 코드 스니펫의 "형태"라는 용어는 코드 스니펫의 식별자들을 토큰화함으로써 얻어지는 명령문들의 시퀀스를 지칭한다. 보다 구체적으로, 코드 스니펫의 형태는, 토큰화되지 않은 키워드와 메소드 인보크를 유지하면서, 타입 이름 및 변수 이름과 같은 식별자가 동일한 토큰으로 대체되는 이전된(transferred) 토큰 시퀀스로 여겨질 수 있다. 전술한 바와 같이, 일 실시예에서, 메소드 인보크의 순서를 고려하지 않고, 코드 스니펫들에 포함된 메소드 인보크 세트에 기초하여 코드 스니펫들이 그룹지어진다. 코드 스니펫들의 형태에 따라 대표 코드 스니펫을 선택함으로써, 메소드 인보크의 순서가 고려된다. 이와 같이, 선택된 대표 코드 스니펫은 메소드 사용법을 좀 더 정확하게 반영할 수 있다.
이런 실시예에서, 단계(310)의 결과인 임의의 그룹에 대해서, 코드 스니펫의 형태에 기초하여 그 그룹을 추가로 나눔으로써 하나 이상의 서브그룹을 얻을 수 있다. 다음으로 서브그룹들의 크기에 적어도 부분적으로 기초하여 서브그룹이 선택될 수 있다. 본원에서 사용된 바와 같이, 서브그룹의 "크기"라는 용어는 그 서브그룹에 포함된 코드 스니펫의 개수, 또는 전체로서 그 서브그룹들과 비교해서 또는 다른 서브그룹들과 비교해서 그 서브그룹에 포함된 코드 스니펫의 퍼센트 또는 할당량을 지칭한다. 일 실시예에서, 가장 큰 크기의 서브그룹이 선택된다.
추가적으로 또는 대안적으로, 서브그룹의 코드 스니펫의 코딩 스타일에 대한 사용자 설정 또는 선호도 역시 고려될 수 있다. 예를 들어, 일 실시예에서, 가장 큰 크기의 서브그룹이 둘 이상이 있는 경우, 사용자 선호도에 따라서 이들 서브그룹 중 하나가 선택될 수 있다. 이런 실시예에서, 사용자가 코딩 스타일에 대한 자신의 선호도를 사전에 표현할 수 있다. 예를 들어, 사용자가 좋은 코딩 스타일로 try-catch-finally 명령문의 사용을 정의할 수 있다. 이런 선호도에 따라서, try-catch-finally 명령문을 사용하는 코드 스니펫들을 포함하는 서브그룹이 선택될 수 있다. 코드 스니펫의 작성자, 소스, 생성 시각 및/또는 그 밖의 다른 임의의 적절한 정보가 서브그룹 선택 시에 고려될 수 있다.
다음으로 결정된 서브그룹 내의 코드 스니펫이 대표 코드 스니펫으로 선택된다. 일 실시예에서, 결정된 서브그룹에서 대표 코드 스니펫이 랜덤으로 선택될 수 있다. 선택적으로, 선택된 서브그룹에서의 각각의 코드 스니펫의 코딩 스타일, 소스, 작성자, 생성 시각 및/또는 그 밖의 다른 임의의 적절한 정보가 고려될 수 있다.
계속해서 도 3과 관련해서, 단계(330)에서, 단계(320)에서 선택된 대로의 각각의 대표 코드 스니펫에 대해 메타 데이터가 생성된다. 메타 데이터는 대표 코드 스니펫에 관한 임의의 적절한 정보 또는 지식을 나타낼 수 있다. 구체적으로, 일 실시예에서, 메타 데이터는 대표 코드 스니펫의 하나 이상의 가변점을 나타낸다. 전술한 바와 같이, 가변점은 특정 프로그래밍 작업에 따라 달라질 가능성이 있어서 사용자에 의해 수동으로 또는 자동-코딩 기술로 편집되거나 지정되어야 하는 코드 스니펫에서의 포인트이다. 메타 데이터로 이런 가변점들을 나타냄으로써, 관련된 코드 스니펫이 사용자에게 추천될 때, 가변점들이 강조될 수 있다. 이와 같이, 사용자는 특정 프로그래밍 작업 및 컨텍스트에 따라서 가변점의 특정값들을 편집하거나 설정함으로써 코드 스니펫을 쉽게 재사용할 수 있다. 이는 코드 효율성과 사용자 경험을 향상시킨다. 예시적인 실시예들이 아래에서 상세히 설명될 것이다.
단계(330)에서, 대표 코드 스니펫의 가변점들을 다양한 방식으로 결정할 수 있다. 전술한 바와 같이, 일 실시예에서, 단계(310)에서 얻어진 그룹들 각각은 대표 코드 스니펫의 선택을 위해 스니펫 형태에 기초하여 서브그룹들로 추가로 나뉠 수 있다. 결과적으로, 하나의 서브그룹 내의 코드 스니펫들은 동일한 형태를 갖고 있다. 이런 실시예에서, 동일한 서브그룹 내의 대표 코드 스니펫과 하나 이상의 추가 코드 스니펫 간의 차이(들)를 식별함으로써 대표 코드 스니펫의 가변점을 결정할 수 있다. 예를 들어, 동일한 서브그룹의 선택된 대표 코드 스니펫과 그 밖의 다른 코드 스니펫들 간의 상이한 식별자 및/또는 리터럴들(literals)이 가변점으로 정의될 수 있다. 도 4는 가변점들을 식별하는 일례를 도시한다.
도 4에 도시된 예시에서, 코드 스니펫(400)은 그룹의 대표 코드 스니펫이며, 코드 스니펫(410)은 대표 코드 스니펫(400)과 동일한 서브그룹에서 온다. 코드 스니펫들(400 및 410)이 동일한 형태를 갖고 있으며 단지 7 번째 줄의 식별자에서만 서로 다른 것을 볼 수 있다. 따라서, 7 번째 줄에서 식별된 포인트(420 및 430)가 가변점으로서 결정되고 메타 데이터에 저장된다.
메타 데이터는 그 밖의 다른 임의의 관련 정보를 포함할 수 있음을 이해해야 한다. 예를 들어, 일 실시예에서, 메타 데이터는 선택된 대표 코드 스니펫을 얻을 소스의 정보(예를 들어, 식별자 및/또는 전체 경로 이름)를 포함한다. 코드 추천에서, 사용자가 그 소스의 코드의 품질을 알고 있거나 또는 코드 스니펫의 사용법의 더 큰 컨텍스트를 볼 수 있는 경우, 이런 지식은 사용자가 코드 스니펫의 재사용 여부를 더 잘 결정할 수 있게 돕는다.
단계들(310 내지 330)을 통해서, API 메소드 사용법을 나타내는 각각의 그룹에 대해, 대표 코드 스니펫 및 관련된 메타 데이터가 얻어진다. 다음으로, 단계(340)에서, 대표 코드 스니펫들이 그 각각의 메타 데이터와 연관되어 지식 베이스(210)에 저장된다. 좀 더 구체적으로는, 각각의 대표 코드 스니펫이 지식 베이스(210)에 코드 스니펫(220)으로서 저장되고, 관련된 메타 데이터가 메타 데이터(230)로서 저장된다.
본원에 설명된 바와 같은 대상의 실시예들에 따라서, 각각의 메타 데이터(230)에 포함된 코드 스니펫들(220)에 관한 지식이 코드 추천에서 사용되어 유용한 힌트 또는 가이드라인을 제공하여, 사용자가 자신의 현재 프로그래밍 작업을 완수하기 위해 추천된 코드 스니펫을 수정하는 방법을 쉽게 결정할 수 있음을 이해할 것이다. 추가적으로, 본원에 설명된 대상의 실시예들이 대규모 코드 베이스에 적용될 수 있고 또한 많이 확장될 수 있다. 예를 들어, 동시에 그룹지어질 코드 스니펫들을 생성 및 수집하는 것이 가능하다. 대안적으로 또는 추가적으로, 일 실시예에서, 그루핑은, 예를 들어, 해싱(hashing) 기법으로 가속화될 수 있다. 따라서, 대규모 API 사용법 베이스를 효율적으로 구축할 수 있다.
앞서 논의된 바와 같이, 지식 베이스(210)를 구축하기 위해 방법(300)으로 처리될 코드 스니펫들을 다양한 방식으로 얻을 수 있다. 예를 들어, 일 실시예에서, 하나 이상의 코드 스니펫이 코드 세그먼트에서 추출될 수 있다. 스니펫이 추출될 코드 세그먼트는, 예를 들어, 기존의 코드 베이스 및/또는 인터넷과 같은 다양한 소스로부터 얻을 수 있다. 타겟 API 메소드가 주어지면, 코드 스니펫이 많은 다양한 방법으로 추출될 수 있다. 예를 들어, 타겟 메소드가 인보크되는 함수 본체가 코드 스니펫으로서 추출될 수 있다. 다른 예를 들면, 타겟 메소드를 포함하는 사전 정의된 줄 개수의 코드 프래그먼트를 추출하는 것이 가능하다. 특히, 코드 스니펫을 효율적이고 효과적으로 추출하기 위해서, 일 실시예에서 코드 슬라이싱 기술을 사용할 수 있다.
도 5는 코드 슬라이싱에 기초하여 코드 세그먼트로부터 코드 스니펫을 추출하는 방법(500)의 순서도를 도시한다. 보다 구체적으로, 방법(500)에서, 주어진 메소드 인보크와 관련된 명령문의 데이터 의존도에 기초하여 코드 세그먼트로부터 코드 스니펫이 추출된다. 즉, 본 실시예에서, 인보크-중심 코드 슬라이싱에 의해 코드 스니펫이 추출된다.
도시된 바와 같이, 방법(500)은 코드 세그먼트에서 재사용된 변수들의 이름이 변경되는(renamed) 단계(510)에서 시작된다. 알려진 것처럼, 실제로, 다른 작업들을 수행하기 위해 편의상 메소드 내에서 변수가 재사용될 수 있다. 예를 들어, 단일 코드 세그먼트 내에서, 많은 소프트웨어 엔지니어들이 메소드 몸체 또는 제어 루프와 같은 상이한 코드 세그먼트들에서 변수를 표현하기 위해 "i" 또는 "j"를 반복해서 사용할 가능성이 있다. 이런 경우에, 두 개의 독립 코드 프래그먼트들이 동일한 변수 이름을 포함하면, 데이터 의존도를 갖는 것으로 잘못 식별되어 데이터 의존도에 기초하여 코드 스니펫을 추출할 때 분리되지 못한다. 결과적으로, 변수의 재사용으로 코드 슬라이싱 프로세스의 정확도가 감소된다. 코드 슬라이싱 전에 단계(510)에서 코드 세그먼트 내에서 이런 재사용된 변수들의 이름을 변경함으로써, 이 문제가 해결될 수 있다. 사전-처리 단계로서, 재사용된 변수들의 이름 변경이 선택적이며 일부 실시예에서는 생략될 수 있음을 이해해야 한다.
다음으로, 코드 세그먼트에서 어떤 메소드 인보크가 타겟으로 선택되고 타겟 메소드 인보크와의 명령문의 데이터 의존도가 결정될 수 있다. 특히, 단계(520)에서, 선택된 타겟 메소드 인보크에 관련된 하나 이상의 변수가 식별된다. 일 실시예에서, 타겟 메소드 인보크와 직접적으로 관련된 변수들이 식별될 수 있다. 이런 변수는 타겟 메소드 인보크에 의해 정의, 사용 또는 반환되는 변수들을 포함하며, 다만 이에 국한되지 않는다. 다음으로, 식별된 변수들을 정의, 사용, 및/또는 반환하는 하나 이상의 명령문이 단계(530)에서 결정될 수 있다.
일 실시예에서, 다음으로 방법(500)은 타겟 메소드 인보크에 대한 제어 흐름에 관련된 하나 이상의 명령문을 식별하기 위한 단계(540)로 진행된다. 예를 들어, 코드 브랜치 나 루프에 타겟 인보크가 위치하는 경우, 제어 흐름 명령문 "IF…THEN…ELSE" 또는 "WHILE"이 단계(540)에서 식별될 수 있다. 제어 흐름 명령문으로, 추출된 코드 스니펫이 메소드 사용법을 좀 더 정확하게 반영할 수 있다. 일 실시예에서, 단계(540)에서 식별된 제어 흐름 명령문이 코드 스니펫에 직접 포함될 수 있다. 다른 실시예에서, 식별된 제어 흐름이 임의의 적절한 방식으로 메타 데이터에 표시될 수 있다. 그러나, 제어 흐름을 식별하지 않고도 코드 스니펫이 추출될 수 있음을 이해해야 한다. 즉, 단계(540)는 생략될 수 있으며 오직 데이터 의존도만으로도 코드 스니펫 추출이 잘 된다.
일 실시예로, 단계(550)에서, 타겟 메소드 인보크와의 간접적인 데이터 의존도를 계속해서 식별할지 여부가 결정된다. 만일 그렇다면(브랜치 "예"), 방법(500)은 단계(520, 530 및 가능하면 540)를 반복한다. 1회차 처리 시에, 단계(520)에서, 타겟 메소드 인보크와 직접적으로 관련된 변수(들)가 식별된다. 따라서, 단계(530)에서 결정된 임의의 명령문은 타겟 메소드 인보크와 직접적인 데이터 의존도를 갖는다. 다음 회차에서, 단계(520)에서 식별된 변수들과 단계(530)에서 결정된 명령문들은 이전 회차에서 결정된 명령문들과 관련이 있으므로 타겟 메소드 인보크와 간접적인 데이터 의존도를 갖는다.
단계들(520 내지 540)을 한 번 이상 반복함으로써, 타겟 메소드 인보크에 대해 하나 이상의 더 높은 단계(level)의 사용법을 얻을 수 있다. 이와 같이, 추출된 사용법은 보다 완벽하고 정확하게 된다. 그러나, 더 높은 단계의 사용법이 반드시 필요한 것은 아님을 이해해야 한다. 일 실시예에서, 첫 번째 단계의 사용법을 추출하기 위해 단계들(520, 530 및 가능하면 540)이 단 한 번만 실행될 수 있다.
단계(550)에서 더 이상의 간접적인 데이터 의존도가 추출되지 않는다고 결정되면(브랜치 "아니오"), 방법(500)은 코드 스니펫을 추출하기 위해 단계(560)로 진행된다. 특히, 단계(530)에서 결정된 명령문들은 단계(560)에서 코드 스니펫의 일부로서 추출된다. 나아가, 제어 흐름 명령문들이 단계(540)에서 결정되는 실시예들에서, 제어 흐름 명령문들 역시 단계(560)에서 코드 스니펫으로 추출된다.
도 6은 방법(500)으로 코드 스니펫을 추출하는 일례를 도시한다. 코드 세그먼트(600)에서, 6 번째 줄의 StreamReader.ReadLine API 메소드 인보크가 타겟 메소드 인보크라고 가정하자. 이 API 메소드는 File.OpenText 메소드를 2 번째 줄에서 인보크하여 구축되고 11 번째 줄에서 닫히는 입력 파라미터 sr을 갖고 있다. 타겟 API 메소드 인보크는 5 번째 줄에서 시작되고 8 번째 줄에서 처리되는 출력 파라미터 줄을 갖고 있다. 또한, 도시된 예시에서, StreamReader.ReadLine API 메소드가 6 번째에서 10 번째까지의 WHILE 루프에 인보크되었음을 볼 수 있다. 따라서, 6, 7, 및 10 번째 줄의 제어 흐름 명령문들 역시 API 사용법의 일부분이 된다. 6 번째 줄의 StreamReader.ReadLine 메소드 인보크와 데이터 의존도를 갖는 모든 명령문들 및 그에 관련된 제어 흐름 명령문들이 코드 세그먼트(600)에서 추출되어 도 6에 밑줄이 그어진 코드 스니펫을 형성하게 된다.
도 6에 도시된 예시에서, 단지 첫 번째 단계의 사용법만이 추출되고 이용된다는 점을 이해할 것이다. 다른 실시예에서, 앞서 논의한 바와 같이, 하나 이상의 추가 단계의 메소드 사용법을 추출하는 것이 가능하다. 예를 들어, File.OpenText 메소드 인보크를 분석하여 StreamReader.ReadLine에 대해서는 간접적인 의존도인 그 직접적인 의존도를 결정할 수 있다. 이와 같이, 두 번째 단계의 사용법이 추출될 수 있다.
도 5를 참조하면, 일 실시예에서, 추출된 코드 스니펫은 코드 클론을 제거하기 위해 선택적인 단계(570)에서 추가로 처리될 수 있다. 본원에서 사용된 바와 같이, "코드 클론"이라는 용어는 정규화 및 토큰화 후에 구문론적으로(syntactically) 동일한 둘 이상의 코드 프래그먼트를 지칭한다. 도 7은 타겟 메소드 인보크로서 new SqlCommand 메소드의 인보크를 사용하여 추출된 코드 스니펫(700)의 일례를 도시한다. 4 번째에서 5 번째 줄의 코드 프래그먼트(720)와 6 번째에서 7 번째 줄의 코드 프래그먼트(730)가 2 번째에서 3 번째 줄의 코드 프래그먼트(710)와 클론임을 볼 수 있다. 이런 클론 코드들은 new SqlCommand 타겟 메소드의 사용법 면에서 추가 지식을 제공하지 못하므로 단계(570)에서 제거되거나 필터링될 수 있다.
이를 위해, 일 실시예에서, 클론 코드를 탐지하고 제거하는 효율적인 기법이 사용된다. 추출된 코드 스니펫이 주어지면, 그 스니펫에 포함된 코드들이 먼저 정규화 및 토큰화된다. 즉, 모든 변수 이름 및 리터럴들이 동일한 토큰으로 대체된다. 예를 들어, 도 7을 참조하면, 프래그먼트들(710 및 720)에서, 변수 및 리터럴 "@StsCode," "SqlDbType.Int," "0," "resultCode," "@ErrMsg," "SqlDbType.VarChar," "1," 및 "errorText"가 동일한 토큰으로, 예를 들어, "X"로 모두 대체될 수 있다. 그 다음으로 중복되는 부분 문자열(sub-string)에 대해 코드 스니펫을 확인할 수 있다. 현재 알려져 있든지 또는 미래에 개발되든지에 상관 없이, 임의의 부분 문자열 탐지 알고리즘이 본원에 적용될 수 있다. 일 실시예에서, 코드 스니펫에서 탐지된 클론 코드 프래그먼트에서, 그 중 하나만 유지되고 나머지들은 제거된다.
방법(500)에 의해, 인보크 중심 방식으로 코드 세그먼트들을 슬라이싱함으로써 코드 스니펫이 추출된다. 복수의 코드 세그먼트들에 코드 스니펫 추출 프로세스(500)를 적용함으로써, 더 적은 사용 빈도를 갖는 API 메소드들을 무시하지 않고도, 코드 베이스의 다수의 API 메소드들에 대한 사용법을 얻을 수 있다. 사실, 다른 타겟 메소드 인보크를 선택함으로써, 단일 코드 세그먼트에서 하나 이상의 코드 스니펫을 추출하는 것이 가능하다. 이런 방식으로, 추출된 코드 스니펫들은 코드 베이스에서 API 메소드 인보크들의 상당 부분은 물론 그들의 사용법까지도 포함할 수 있다. 나아가, 스니펫 추출에서, 코드 베이스의 각각의 메소드 몸체의 코드가 독립적으로 처리될 수 있고 동시에 실행될 수도 있다. 또한, 사전 처리(단계(510)에서 재사용된 변수 이름 변경) 및 후처리(단계(570)에서 코드 클론 제거)와 제어 흐름 명령문들의 통합을 통해서, 추출된 코드 스니펫들이 좀 더 정확하고 완전하게 될 수 있다. 도 3과 관련하여 앞서 논의된 바와 같이, 방법(500)으로 추출된 코드 스니펫들은 방법(300)에 의해 그룹지어져 지식 베이스(210)를 구축하는 데 사용될 수 있다.
이제부터 코드 지식 베이스에 기초하는 코드 추천이 논의될 것이다. 코드 추천 방법(800)의 순서도를 도시하는 도 8을 참조한다.
방법(800)은 고려 대상인 코드 세그먼트의 프로그래밍 컨텍스트가 결정되는 단계(810)에서 시작된다. 예를 들어, 코드 세그먼트는 도 2에 도시된 개발 환경(240)에서 코드 편집기(250)에 입력 및 편집 중인 것일 수 있다. 일 실시예에서, 코드의 메소드 인보크와의 데이터 의존도에 적어도 부분적으로 기초하여 프로그래밍 컨텍스트를 얻도록 인보크 중심 기법이 이용된다. 예를 들어, 사용자가 입력한 마지막 문자에 가까운 마지막 메소드 인보크 명령문이 통상 사용자의 의도를 가장 잘 반영한다는 사실을 고려하면, 프로그래밍 컨텍스트를 자동으로 추출하기 위해 코드 편집기(250)로 입력된 마지막 메소드("m"으로 표시됨)의 인보크를 이용할 수 있다.
다음으로 코드 세그먼트에서 인보크되고 메소드 인보크에 데이터 의존도를 갖는 메소드 시퀀스 q = <I 0 , I 1 , ···, I n- 1 >가 결정된다. 시퀀스 q, I i (i = 0, ···, n-l)는 개발 중인 함수의 몸체의 시작에서부터 i 번째 인보크된 메소드이다. I i 를 인보크하는 명령문들은 m을 인보크하는 명령문과 데이터 의존도를 갖는다. 각각의 I i 는 앞서 논의한 바와 같이 메소드(500)의 단계들(520 및 530)과 유사한 방식으로 식별될 수 있다. 특히, 도 5와 관련해서 논의된 바와 같은 인보크 중심 코드 슬라이싱 기법과 유사하게, 시퀀브 q의 메소드 I i 는 메소드 인보크 m과 직접적인 또는 간접적인 데이터 의존도를 가질 수 있다. 이와 같이, 인보크된 메소드 시퀀스 q가 사용자의 의도를 반영하며 프로그래밍 컨텍스트로서 사용될 수 있다.
방법(800)은, 단계(810)에서 결정된 프로그래밍 컨텍스트에 적어도 부분적으로 기초하여 지식 베이스(210)에서 하나 이상의 후보 코드 스니펫이 검색되는 단계(820)로 진행된다. 일 실시예에서, 예를 들어, 인보크된 메소드 시퀀스 q의 형태로 프로그래밍 컨텍스트가 주어지면, 단계(820)에서 q에 대략적으로 관련 있는 후보 코드 스니펫들의 컬렉션(C로 표시됨)이 지식 베이스에서 결정될 수 있다. 예를 들어, C의 각각의 후보 코드 스니펫이 프로그래밍 컨텍스트 q의 적어도 하나의 메소드를 인보크하도록 컬렉션 C가 결정될 수 있다.
다음은, 단계(820)에서 검색된 후보 코드 스니펫들의 적어도 일부가 코드 추천으로서, 예를 들어, 추천 영역(260)에서 사용자에게 제시될 수 있다. 일 실시예에서, 단계(820)에서 검색된 모든 추천 코드 스니펫들이 사용자에게 추천될 수 있다. 추천의 정확도와 사용자 편의성을 더욱 개선하기 위해서, 일 실시예에서, 검색된 후보 코드 스니펫들이 일련의 사전 정의된 기준 또는 규칙에 따라서 단계(830)에서 필터링되거나 랭킹이 정해질 수 있다. 그 다음에 하나 이상의 최상위 랭킹 코드 스니펫이 사용자에게 추천된다. 예를 들어, 일 실시예에서, 랭킹이 두 단계로 실행될 수 있다.
이와 같은 실시예에서, 후보 코드 스니펫들의 랭킹을 정하는 사전 정의된 기준은 후보 코드 스니펫과 프로그래밍 컨텍스트 간의 관련성(relevance), 후보 코드 스니펫들의 사용법의 인기도, 후보 코드 스니펫들의 간결성(conciseness), 및 코드 추천의 다양성 또는 간명성(succinctness) 중 하나 이상을 포함할 수 있지만, 이에 국한되는 것은 아니다. 이 기준들은 본원에 설명된 대상의 범위에 대한 제한을 제안하지 않고 단지 예시를 위한 것임을 이해해야 한다. 임의의 대안적인 또는 추가적인 적절한 요인, 기준, 또는 규칙들을 이용하여 단계(830)에서 후보 코드 스니펫들을 필터링하거나 랭킹을 정할 수 있다. 예를 들어, 후보 코드 스니펫들에 관련된 소스, 작성자, 및/또는 사용자 선호도가 고려될 수 있다. 관련성은 코드 스니펫이 프로그래밍 컨텍스트에 일치하는 정도를 나타낸다. 사용법의 인기도는 코드 스니펫이 (현재 사용자 또는 데이터 세트의 사용자 커뮤니티 중 어느 하나 또는 양쪽 모두에 의해) 이전에 얼마나 많이 또는 얼마나 자주 선택되고 사용되었는지를 나타낸다. 간결성은 코드 스니펫의 가독성 또는 명료성의 정도에 관련된다. 다양성 또는 간명성은, 추천된 코드 스니펫에서, 예상된 메소드 사용법을 가능한 한 많이 포함하는 것이 바람직함을 의미한다. 즉, 다른 코드 스니펫들이 다른 메소드 사용법들을 나타내는 간명한 추천 목록이 바람직하다.
이러한 기준은 단독으로 또는 임의의 조합으로 사용될 수 있다. 예를 들어, 일 실시예에서, 단계(820)에서 검색된 후보 코드 스니펫들이 적어도 하나의 기준(예를 들어, 관련성, 사용법의 인기도 및 간결성 중 적어도 어느 하나 또는 이들의 조합)에 따라서 먼저 랭킹 결정 및/또는 필터링된 후에 두 번째 기준(예를 들어, 다양성 또는 간명성 중 적어도 하나 또는 양쪽 모두)에 따라서 다시 랭킹 결정 및/또는 필터링될 수 있다.
좀 더 구체적으로, 일 실시예에서, 단계(830)의 첫 번째 단계의 랭킹이 관련성 및 사용법의 인기도에 따라 실행된다. 컬렉션 C의 각각의 후보 코드 스니펫 s에 대해서, 다음과 같이 정의되는 점수("score 1 "로 표시됨)가 계산된다.
Figure 112016128924793-pct00001
여기서, α는 0에서 1 사이의 파라미터이며, Relevance( q,s )s와 단계(810)에서 결정된 프로그래밍 컨텍스트 q 간의 관련성을 나타내며, Support(s)는 코드 스니펫 s의 사용법의 인기도를 나타낸다.
일 실시예에서, Relevance( q,s )는 다음과 같이 정의될 수 있다.
Figure 112016128924793-pct00002
여기서, MatchScore(q,s)sq의 일치 정도를 나타내며, Penalty( q,s )MatchScore(q,s)에 대한 벌점 함수(penalty function)를 나타낸다.
앞서 논의한 바와 같이, 사용자가 입력한 마지막 문자에 가까운 마지막 메소드 인보크 명령문이 통상 사용자의 의도를 가장 잘 반영한다고 가정할 수 있다. 따라서, 일 실시예에서, 사용자가 입력한 마지막 문자에 상대적으로 더 가까운, 일치된 메소드에게 더 많은 가중치가 주어지도록 MatchScore(q,s)가 정의될 수 있다. 예를 들어, MatchScore(q,s)는 다음과 같이 정의될 수 있다.
Figure 112016128924793-pct00003
여기서, isMatch i 는 프로그래밍 컨텍스트 q에서 i 번째 인보크된 메소드가 s에서 보일 때 1로 설정되고 그 외에는 0으로 설정되는 값을 나타내며, γ는 그 값이 사전에 정의될 수 있는 파라미터를 나타내며, ratio는 일치된 메소드들의 개수 나누기 s의 메소드 개수를 나타낸다. ratio가 1이면, 코드 스니펫 s가 어떤 새로운 메소드도 제공하지 않음을 의미하므로, 추천할 의미가 없다. 이런 경우에, MatchScore가 0으로 설정될 것이다.
일 실시예에서, 식(2)의 Penalty( q,s )가, 일례로 다음과 같이 정의될 수 있는 sq 사이의 관련성의 감소 함수일 수 있다.
Figure 112016128924793-pct00004
여기서, μ는 그 값이 사전에 정의될 수 있는 파라미터를 나타낸다. 코드 스니펫 s가 프로그래밍 컨텍스트 q에 좀 더 관련이 있을 때 ratio의 값이 증가할 것이며 따라서 Pe(q,s)의 값이 감소할 것임을 이해할 것이다. 전술한 바와 같이, 일 실시예에서, 코드 스니펫이 프로그래밍 컨텍스트 q의 적어도 하나의 메소드를 포함하고 있다면 후보로서 선택될 수 있다. 그 결과, 하나 이상의 후보 코드 스니펫 s는 현재 프로그래밍 컨텍스트 q와 불일치하거나 무관한 메소드들의 인보크를 포함할 수 있다. Pen( q,s )를 사용함으로써, 후보 코드 스니펫들의 랭킹을 정할 때 후보 코드 스니펫에 포함된 이런 불일치하거나 무관한 메소드들의 영향이 고려될 수 있다.
일 실시예에서, 코드 스니펫 s의 인기도를 나타내는 식(1)의 Support(s)는 코드 스니펫 s와 동일한 메소드 인보크 세트를 갖고 있는 지식 베이스(210)의 코드 스니펫들의 개수의 정규값으로서 정의될 수 있다. 예를 들어, 일 실시예에서, Support(s)는 다음과 같이 정의될 수 있다.
Figure 112016128924793-pct00005
여기서, Frequency(s)s와 동일한 메소드 인보크 세트를 갖고 있는 지식 베이스(210)의 코드 스니펫들의 개수를 나타내고, 이는, 예를 들어, 지식 베이스(210)가 구축될 때 결정될 수 있으며, Max_Frequency는 지식 베이스의 모든 코드 스니펫들 s에 대한 최대 Frequency(s)를 나타낸다. Support(s)Fre(s)의 정규값임을 이해할 것이다.
식(1) 내지 식(5)에서 전술한 기준들은 본원에 설명된 대상에 대해 어떠한 제한도 제안하지 않고 단지 예시를 위한 것임을 이해해야 한다. 일례로, Rel(q,s)Support(s)는 독립적으로 사용될 수 있으며, 또는 기준들의 임의의 조합이 적합할 수도 있다. 다른 예로서, 간결성을 고려하여 score 1 을 정의할 수 있다. 예를 들어, 간결성은 코드 스니펫의 길이에 의해 측정될 수 있다.
첫 번째 단계의 관련성, 사용법의 인기도, 및/또는 간결성에 따라 후보 코드 스니펫들의 랭킹을 정함으로써, 최고점들을 갖는 최상위 k*m 후보 코드 스니펫들이 두 번째 단계 랭킹을 위해 선택될 수 있고, 여기서 k는 추천 목록의 원하는 크기를 나타내며 m은 상수이다. 예를 들어, 일 실시예에서, m의 값이 2.5로 설정될 수 있다. 다음으로, 첫 번째 단계 랭킹에서 얻어진 최상위 k*m 스니펫 후보들(컬렉션 C'로 표시됨)이 두 번째 단계에서 그 랭킹이 다시 결정되어 오직 최상위 k 후보 스니펫들만이 추천으로서 출력된다. 최상위 k 랭킹 코드 스니펫들이 최대한 서로 다르게 하기 위해 다양성 및/또는 간명성에 따라서 랭킹의 재결정이 실행된다.
다양성 랭킹을 포함하는 일 실시예에서, 식 (1)에 정의된 바와 같은 최고치의 score 1 을 갖는 C'의 코드 스니펫이 먼저 유지된다. C'에 남아 있는 각각의 스니펫 s가 두 코드 스니펫들 간의 비유사성(dissimilarity) 정도를 측정하는 점수(score 2 로 표시됨)를 사용하여 랭킹이 재결정된다. 일 실시예에서, score 2 score 1 과, 코드 스니펫 s와 컬렉션 C로 이미 선택된 코드 스니펫들 간의 최소화된 비유사성의 가중 평균으로 정의될 수 있다. 예를 들어, 일 실시예에서, score 2 는 다음과 같이 표현될 수 있다.
Figure 112016128924793-pct00006
여기서, 베타는 가중치를 조절하는 데 사용되는 0에서 1 사이의 파라미터를 나타내며, Dismilarity(s,s')ss' 사이의 비유사성을 나타내고, s'는 컬렉션 C'로 이미 선택된 코드 스니펫들을 나타내며, Min()은 최소값을 반환하는 함수를 나타낸다. 이와 같이, s와 이미 추천된 스니펫들의 유사성이 감소할수록 코드 스니펫 sscore 2 가 증가할 것이다.
최고값의 score 2 를 갖는 코드 스니펫이 C'에서 랭킹 2위에 배치된다. 다음으로, 나머지 스니펫들의 랭킹이 다시 결정되고 최고값의 score 2 를 갖는 스니펫이 3위 추천으로 선택된다. 이런 프로세스를 반복적으로 되풀이함으로써, 추천될 최상위 k 코드 스니펫들이 결정되고 순서대로 사용자에게 제시된다. 일 실시예에서, 낮은 랭킹을 갖는 후보 코드 스니펫들을 걸러내거나 제거할 수 있다. 대안적으로, 후보 코드 스니펫들을 남겨둘 수 있으며, 이는 나중에 논의될 것이다.
일부 실시예에서 단계(830)가 생략될 수 있음을 이해해야 한다. 예를 들어, 일 실시예에서, 단계(820)에서 검색되는 모든 후보 코드 스니펫들을 필터링이나 랭킹 결정 없이 사용자에게 추천하는 것이 가능하다.
계속해서 도 8을 참조하면, 단계(840)에서, 예를 들어, 코드 추천으로서 추천 영역(260)에서 하나 이상의 후보 코드 스니펫들이 사용자들에게 제시될 수 있다. 예로서, 추천된 코드 스니펫들은, 예를 들어, 단계(830)의 랭킹에 따라서, 추천 영역(260)에 목록으로 디스플레이될 수 있다. 추천된 코드 스니펫들이 임의의 적절한 방식으로 제시될 수 있다. 일례로서, 일 실시예에서, 각각의 코드 스니펫이, 예를 들어, 코드 스니펫의 처음 몇 줄을 포함하는 요약으로 표현될 수 있다. 다른 예로서, 썸네일을 사용하여 추천된 코드 스니펫을 제시할 수 있다. 사용자가 선택을 하면, 선택된 코드 스니펫이 확장될 수 있다.
일 실시예에서, 임계 기간 또는 사용자의 요청에 따라, 추천된 코드 스니펫들의 제시된 목록이 확장되어 추가 코드 스니펫들을 포함할 수 있다. 예를 들어, 검색된 코드 스니펫들이 필터링되거나 랭킹이 정해지는 실시예들에서, 확장된 목록이 처음에 걸러지거나 또는 처음 제시된 코드 스니펫들의 목록보다 낮은 랭킹의 코드 스니펫들을 디스플레이할 수 있다.
단계(840)에서 하나 이상의 후보 코드 스니펫을 사용자에게 추천함으로써, 타겟 API 메소드가 올바른 및/또는 효과적인 방식으로 이용되었는지 여부를 사용자가 확인할 수 있다. 또한, 앞서 논의된 바와 같이, 사용자가 입력한 마지막 메소드가 타겟 메소드로서 선택될 수 있다. 한편, 추천된 코드 스니펫의 적어도 일부는 타겟 메소드에 뒤이은 하나 이상의 명령문을 포함할 수 있고, 따라서 사용자가 하려고 하는 것의 예측으로서 사용될 수 있다. 이와 같이, 사용자는 자신의 작업이나 코드 완성 욕구에 일치하는 하나 이상의 추천된 코드 스니펫들을 선택 및 재사용할 수 있다.
코드 추천 방법(800)은 다른 방식들로 트리거될 수 있음을 이해해야 한다. 일 실시예에서, 코드 추천의 검색 및/또는 디스플레이가 자동으로 가능하게 될 수 있다. 예를 들어, 사용자가 코드 편집기(250)에 문자를 입력할 때 특정 키워드나 문자가 탐지되면, 관련된 코드 스니펫들을 검색 및 추천하도록 방법(800)이 활성화될 수 있다. 대안적으로 또는 추가적으로, 사용자가 코드 추천을 사용 가능 또는 사용 불가능하게 할 수 있다. 예를 들어, 일 실시예에서, 사용자는 임의의 적절한 상호 작용 방식으로 추천된 코드 스니펫들의 검색 및/또는 디스플레이를 활성화 및 비활성화시킬 수 있다.
특히, 전술한 바와 같이, 지식 베이스(210)에 저장된 코드 스니펫들(220)이 관련된 메타 데이터(230)를 갖고 있을 수 있다. 따라서, 일 실시예에서, 메타 데이터가 단계(820)에서 관련된 코드 스니펫과 함께 검색될 수 있다. 코드 스니펫이 사용자에게 추천될 때, 일부 관련 있는 정보 또는 보조 정보가 메타 데이터에 기초하여 디스플레이될 수 있다. 예를 들어, 제시된 하나 이상의 코드 스니펫에 대해서, 관련된 메타 데이터로 표현된 바와 같은 소스 파일 및/또는 그 밖의 다른 적절한 정보가 디스플레이될 수 있다. 대안적으로 또는 추가적으로, 일 실시예에서, 하나 이상의 추천된 코드 스니펫에서 가변점(들)이 강조될 수 있다. 전술한 바와 같이, 가변점은 사용자가 수동으로 설정하거나 편집할 수 있고, 및/또는 자동-코딩 기술로 수정될 수 있다. 도 4에 도시된 포인트들(420 및 430)과 같은 가변점을 강조함으로써, 사용자 현재 프로그래밍 작업을 완수하기 위해 추천된 코드 스니펫을 조정하는 방법을 효과적이고 효율적으로 결정할 수 있다. 이와 같은 방식으로, 코딩 효율성과 사용자 경험이 개선될 수 있다.
도 9는 지식 베이스(210)를 구축하는 시스템(900)의 블록도를 도시한다. 도시된 바와 같이, 시스템(900)은 코드 스니펫에 포함된 메소드 인보크에 기초하여 하나 이상의 코드 스니펫 그룹을 얻도록 구성된 스니펫 그루핑 유닛(910)과, 그룹들 각각의 대표 코드 스니펫을 선택하도록 구성된 스니펫 선택 유닛(920)을 포함할 수 있다. 시스템(900)은 또한, 주어진 임의의 대표 코드 스니펫에 대해, 적어도 그 대표 코드 스니펫의 가변점을 나타내는 메타 데이터를 생성하도록 구성된 메타 데이터 생성 유닛(930)을 포함한다. 시스템(900)은 지식 베이스의 메타 데이터와 관련하여 대표 코드 스니펫을 저장하도록 구성된 저장 관리 유닛(940)을 더 포함한다.
일 실시예에서, 하나 이상의 사전 정의된 사소한 메소드 인보크가 그루핑 전에 코드 스니펫에서 제거될 수 있다. 일 실시예에서, 스니펫 선택 유닛(920)은 그룹 내의 코드 스니펫들의 형태에 기초하여 그룹을 서브그룹들로 나누고, 적어도 부분적으로는 서브그룹들의 크기에 기초하여 서브그룹들 중 하나를 선택하고, 선택된 서브그룹에서 대표 코드 스니펫을 선택하도록 구성된다. 이런 실시예에서, 메타 데이터 생성 유닛(930)은 결정된 서브그룹의 대표 코드 스니펫과 추가 코드 스니펫 간의 차이를 결정하고 결정된 차이에 기초하여 가변점을 식별함으로써 메타 데이터를 생성하도록 구성된다.
일 실시예에서, 시스템(900)은 코드 세그먼트의 메소드 인보크에 기초하여 코드 세그먼트로부터 코드 스니펫을 추출하도록 구성된 스니펫 추출 유닛(950)을 포함할 수 있다. 예를 들어, 일 실시예에서, 스니펫 추출 유닛(950)은 앞서 논의한 바와 같은 방법(500)을 실행하여 코드 베이스의 코드 세그먼트에서 하나 이상의 코드 스니펫을 추출하도록 구성된다.
도 10은 본원에 설명된 대상의 실시예들에 따른 코드 추천 시스템(1000)의 블록도를 도시한다. 도시된 바와 같이, 시스템(1000)은 코드 세그먼트의 메소드 인보크와의 데이터 의존도에 적어도 부분적으로 기초하여 코드 세그먼트에 대한 프로그래밍 컨텍스트를 얻도록 구성된 컨텍스트 결정 유닛(1010), 얻어진 프로그래밍 컨텍스트에 적어도 부분적으로 기초하여 지식 베이스로부터 후보 코드 스니펫들을 검색하도록 구성된 스니펫 검색 유닛(1020), 및 검색된 후보 코드 스니펫들의 적어도 일부를 코드 추천으로서 제시하도록 구성된 추천 유닛(1030)을 포함한다.
일 실시예에서, 컨텍스트 결정 유닛(1010)은 메소드 인보크와 데이터 의존도를 갖는 코드 세그먼트에서 인보크된 메소드 시퀀스를 결정함으로써 프로그래밍 컨텍스트를 얻도록 구성된다.
일 실시예에서, 시스템(1000)은 사전 정의된 기준에 따라, 검색된 후보 코드 스니펫들의 랭킹을 정하도록 구성된 랭킹 유닛(1025)을 더 포함할 수 있다. 따라서, 추천 유닛(1030)은 랭킹이 정해진 후보 코드 스니펫들을 제시하도록 구성될 수 있다. 예를 들어, 일 실시예에서, 사전 정의된 기준은 후보 코드 스니펫들과 프로그래밍 컨텍스트의 관련성, 후보 코드 스니펫들의 사용법의 인기도, 후보 코드 스니펫들의 간결성, 및 코드 추천 다양성 중 적어도 어느 하나를 포함한다. 이런 실시예에서, 랭킹 유닛(125)은 검색된 후보 코드 스니펫들의 랭킹을 관련성, 사용법의 인기도, 및 간결성 중 적어도 어느 하나에 따라서 정하고, 사전 정의된 개수의 랭킹이 재결정된 후보 코드 스니펫들이 서로 다르도록, 랭킹이 정해진 후보 코드 스니펫들의 랭킹을 다양성에 따라서 다시 정하도록 구성될 수 있다.
대안적으로 또는 추가적으로, 일 실시예에서, 추천 유닛(1030)은 제시된 코드 스니펫들 중 적어도 하나에서 가변점을 강조하도록 구성되며, 여기서 가변점은 제시된 적어도 하나의 코드 스니펫과 관련된 메타 데이터에 의해 표시된다.
시스템들(900 및 1000)은 별개의 기계에 원격으로 위치하거나, 하나의 물리적인 기계에 같이 배치될 수 있음을 이해해야 한다. 즉, 지식 베이스의 구축 및 사용이 다른 개체들에 의해서 또는 단일 개체에 의해서 구현될 수 있다. 또한, 방법들(300 및 500)이 단일 개체에 의해서 또는 다른 개체들에 의해서 실행될 수 있음을 이해해야 한다. 즉, 코드 스니펫 추출 및 지식 베이스 구축의 기능들이 통합되어 구현되거나 또는 별개로 구현될 수 있다.
컴퓨터 저장 매체에 저장된 컴퓨터 실행가능 명령어에 더하여, 또는 이를 대신하여, 본원에 설명된 대상의 적어도 일부 또는 전부가, 적어도 부분적으로는, 하나 이상의 하드웨어 로직 컴포넌트에 의해서 실행될 수 있다. 비제한적인 예를 들면, 사용될 수 있는 하드웨어 로직 컴포넌트의 예시적인 유형으로 필드 프로그램가능 게이트 어레이(Field-programmable Gate Array, FPGA), 주문형 집적 회로(Program-Specific Integrated Circuit, ASIC), 주문형 표준 제품(Program-Specific Standard Product, ASSP), 시스템 온 칩 시스템(System-On-a-Chip system, SOC), 복합 프로그램가능 논리 소자(Complex Programmable Logic Device, CPLD) 등을 포함한다.
본 대상이 구조적인 특징부 및/또는 방법의 동작들에 특정된 언어로 기재되었지만, 첨부된 특허청구범위에 정의된 대상이 전술한 특정 특징부 또는 동작에 반드시 한정되는 것은 아님을 이해해야 한다. 오히려, 전술한 특정 특징부 및 동작은 청구항을 구현하는 예시 형태로서 개시된 것이다.

Claims (20)

  1. 컴퓨터에 의해 적어도 부분적으로 구현되는 방법으로서,
    개발 환경에서, 코드 스니펫들의 그룹(a group of code snippets)을 상기 코드 스니펫들에 포함된 메소드 인보크(method invocations)에 기초하여 얻는 단계와,
    상기 그룹에 대한 대표 코드 스니펫을 선택하는 단계와,
    상기 대표 코드 스니펫에 대한 메타 데이터를 생성하는 단계- 상기 메타 데이터는 적어도 상기 대표 코드 스니펫에서의 가변점을 표시함 -와,
    상기 메타 데이터와 연계하여 상기 대표 코드 스니펫을 지식 베이스에 저장하는 단계를 포함하는
    방법.
  2. 제 1 항에 있어서,
    상기 그룹 내의 코드 스니펫은 코드 세그먼트 내의 메소드 인보크에 기초하여 상기 코드 세그먼트로부터 상기 코드 스니펫을 추출함으로써 얻어지는
    방법.
  3. 제 2 항에 있어서,
    상기 코드 스니펫의 추출은,
    상기 코드 세그먼트 내의 상기 메소드 인보크에 관련된 적어도 하나의 변수를 식별하는 것과,
    상기 적어도 하나의 변수에 기초하여, 상기 코드 세그먼트 내의 상기 메소드 인보크와의 데이터 의존성을 갖는 적어도 하나의 명령문(statement)을 결정하는 것과,
    상기 코드 스니펫의 일부로서 상기 코드 세그먼트로부터 상기 적어도 하나의 명령문을 추출하는 것을 포함하는
    방법.
  4. 제 3 항에 있어서,
    상기 적어도 하나의 명령문은 상기 메소드 인보크와의 간접적인 데이터 의존성을 갖는 명령문을 포함하는
    방법.
  5. 제 2 항에 있어서,
    상기 추출 전에 상기 코드 세그먼트에서 재사용되는 변수의 이름을 다시 정하는(renaming) 단계를 더 포함하는
    방법.
  6. 제 2 항에 있어서,
    상기 코드 스니펫의 추출은 상기 메소드 인보크의 제어 흐름과 연관된 적어도 하나의 명령문을 추출하는 것을 포함하는
    방법.
  7. 제 2 항에 있어서,
    상기 추출된 코드 스니펫에서 서로 구문론적으로 동일한 코드 프래그먼트들을 검출하는 단계와,
    상기 검출된 코드 프래그먼트들에 기초하여 상기 추출된 코드 스니펫에서 코드 클론을 제거하는 단계를 더 포함하는
    방법.
  8. 제 1 항에 있어서,
    상기 대표 코드 스니펫을 선택하는 단계는,
    상기 그룹 내의 상기 코드 스니펫들의 형태에 기초하여 상기 그룹을 서브그룹들로 나누는 단계- 상기 코드 스니펫의 형태는 상기 코드 스니펫에서 식별자를 토큰화하여 얻어지는 명령문들의 시퀀스임 -와,
    상기 서브그룹들의 크기에 적어도 부분적으로 기초하여 상기 서브그룹들 중 하나를 결정하는 단계와,
    상기 결정된 서브그룹에서 상기 대표 코드 스니펫을 선택하는 단계를 포함하는
    방법.
  9. 제 8 항에 있어서,
    상기 대표 코드 스니펫에 대한 상기 메타 데이터를 생성하는 단계는,
    상기 결정된 서브그룹에서 상기 대표 코드 스니펫과 추가 코드 스니펫 간의 차이를 식별하는 단계와,
    상기 식별된 차이에 기초하여 상기 가변점을 결정하는 단계를 포함하는
    방법.
  10. 제 1 항에 있어서,
    상기 그룹을 얻는 단계 이전에 상기 코드 스니펫들로부터 사전 정의된 사소한 메소드 인보크를 제거하는 단계를 더 포함하는
    방법.
  11. 제 1 항에 있어서,
    상기 코드 스니펫들의 그룹은 애플리케이션 프로그래밍 인터페이스(API) 메소드의 사용과 연관되어 있는
    방법.
  12. 시스템으로서,
    단계들을 수행하도록 구성된 프로세서를 포함하되,
    상기 단계들은
    개발 환경에서, 코드 스니펫들의 그룹을 상기 코드 스니펫들에 포함된 메소드 인보크에 기초하여 얻는 단계와,
    상기 그룹에 대한 대표 코드 스니펫을 선택하는 단계와,
    상기 대표 코드 스니펫에 대한 메타 데이터를 생성하는 단계- 상기 메타 데이터는 적어도 상기 대표 코드 스니펫에서의 가변점을 표시함 -와,
    상기 메타 데이터와 연계하여 상기 대표 코드 스니펫을 지식 베이스에 저장하는 단계를 포함하는
    시스템.
  13. 제 12 항에 있어서,
    상기 그룹 내의 코드 스니펫이 코드 세그먼트 내의 메소드 인보크에 기초하여 상기 코드 세그먼트로부터 상기 코드 스니펫을 추출함으로써 얻어지는
    시스템.
  14. 제 13 항에 있어서,
    상기 코드 스니펫의 추출은,
    상기 코드 세그먼트 내의 상기 메소드 인보크에 관련된 적어도 하나의 변수를 식별하는 것과,
    상기 적어도 하나의 변수에 기초하여, 상기 코드 세그먼트 내의 상기 메소드 인보크와의 데이터 의존성을 갖는 적어도 하나의 명령문을 결정하는 것과,
    상기 코드 스니펫의 일부로서 상기 코드 세그먼트로부터 상기 적어도 하나의 명령문을 추출하는 것을 포함하는
    시스템.
  15. 제 14 항에 있어서,
    상기 적어도 하나의 명령문은 상기 메소드 인보크와의 간접적인 데이터 의존성을 갖는 명령문을 포함하는
    시스템.
  16. 제 13 항에 있어서,
    상기 코드 스니펫의 추출은 상기 메소드 인보크의 제어 흐름에 연관된 적어도 하나의 명령문을 추출하는 것을 포함하는
    시스템.
  17. 제 13 항에 있어서,
    상기 추출된 코드 스니펫에서 서로 구문론적으로 동일한 코드 프래그먼트들을 검출하는 단계와,
    상기 검출된 코드 프래그먼트들에 기초하여 상기 추출된 코드 스니펫에서 코드 클론을 제거하는 단계를 더 포함하는
    시스템.
  18. 제 12 항에 있어서,
    상기 대표 코드 스니펫을 선택하는 단계는,
    상기 그룹 내의 상기 코드 스니펫들의 형태에 기초하여 상기 그룹을 서브그룹들로 나누는 단계- 상기 코드 스니펫의 형태는 상기 코드 스니펫에서 식별자를 토큰화하여 얻어지는 명령문들의 시퀀스임 -와,
    상기 서브그룹들의 크기에 적어도 부분적으로 기초하여 상기 서브그룹들 중 하나를 결정하는 단계와,
    상기 결정된 서브그룹에서 상기 대표 코드 스니펫을 선택하는 단계를 포함하는
    시스템.
  19. 제 18 항에 있어서,
    상기 대표 코드 스니펫에 대한 상기 메타 데이터를 생성하는 단계는,
    상기 결정된 서브그룹에서 상기 대표 코드 스니펫과 추가 코드 스니펫 간의 차이를 식별하는 단계와,
    상기 식별된 차이에 기초하여 상기 가변점을 결정하는 단계를 포함하는
    시스템.
  20. 제 12 항에 있어서,
    상기 코드 스니펫들의 그룹은 애플리케이션 프로그래밍 인터페이스(API) 메소드의 사용과 연관되어 있는
    시스템.
KR1020167036837A 2014-06-30 2014-06-30 코드 추천 기법 KR102141272B1 (ko)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/CN2014/081228 WO2016000158A1 (en) 2014-06-30 2014-06-30 Code recommendation

Publications (2)

Publication Number Publication Date
KR20170023022A KR20170023022A (ko) 2017-03-02
KR102141272B1 true KR102141272B1 (ko) 2020-08-04

Family

ID=54930535

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020167036837A KR102141272B1 (ko) 2014-06-30 2014-06-30 코드 추천 기법

Country Status (5)

Country Link
US (1) US9519464B2 (ko)
EP (1) EP3161618A4 (ko)
KR (1) KR102141272B1 (ko)
CN (1) CN106462399B (ko)
WO (1) WO2016000158A1 (ko)

Families Citing this family (61)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9715545B2 (en) 2014-06-12 2017-07-25 International Business Machines Corporation Continuous collection of web API ecosystem data
US9588738B2 (en) * 2015-02-16 2017-03-07 International Business Machines Corporation Supporting software application developers to iteratively refine requirements for web application programming interfaces
US9471285B1 (en) * 2015-07-09 2016-10-18 Synopsys, Inc. Identifying software components in a software codebase
US10740408B2 (en) 2016-01-11 2020-08-11 Accenture Global Solutions Limited Method and system for generating an architecture document for describing a system framework
KR101780233B1 (ko) * 2016-04-26 2017-09-21 고려대학교 산학협력단 소프트웨어의 코드 클론 탐지 장치 및 방법
GB2551525A (en) * 2016-06-20 2017-12-27 Austin Consultants Ltd A system for automated code calculation and an automated code calculation method
US10437565B2 (en) 2016-08-31 2019-10-08 International Business Machines Corporation Dynamic code suggestion
US10592304B2 (en) * 2016-11-10 2020-03-17 International Business Machines Corporation Suggesting application programming interfaces based on feature and context analysis
US9977656B1 (en) * 2017-03-13 2018-05-22 Wipro Limited Systems and methods for providing software components for developing software applications
US10564939B2 (en) * 2017-06-05 2020-02-18 Devfactory Fz-Llc Method and system for arbitrary-granularity execution clone detection
CN107479879B (zh) * 2017-07-28 2021-09-14 扬州大学 一种面向软件功能维护的api及其使用推荐方法
CN107463683B (zh) * 2017-08-09 2018-07-24 深圳壹账通智能科技有限公司 代码元素的命名方法及终端设备
US10684849B2 (en) * 2017-09-08 2020-06-16 Devfactory Innovations Fz-Llc Automating generation of library suggestion engine models
US10474455B2 (en) * 2017-09-08 2019-11-12 Devfactory Fz-Llc Automating identification of code snippets for library suggestion models
US10732966B2 (en) * 2017-09-08 2020-08-04 Devfactory Innovations Fz-Llc Library model addition
US10705809B2 (en) * 2017-09-08 2020-07-07 Devfactory Innovations Fz-Llc Pruning engine
US10705943B2 (en) * 2017-09-08 2020-07-07 Devfactory Innovations Fz-Llc Automating identification of test cases for library suggestion models
US10810099B2 (en) * 2017-09-11 2020-10-20 Internatinal Business Machines Corporation Cognitive in-memory API logging
CN109814855A (zh) * 2017-11-21 2019-05-28 南京大学 一种基于对象分类和自适应子图匹配的api推荐方法
CN109918058B (zh) * 2017-12-13 2022-08-12 富士通株式会社 信息处理装置和方法以及在编程环境中推荐代码的方法
CN108446115A (zh) * 2018-03-12 2018-08-24 中国银行股份有限公司 一种代码复用的方法及装置
CN108388425B (zh) * 2018-03-20 2021-02-19 北京大学 一种基于lstm自动补全代码的方法
US10990358B2 (en) 2018-03-29 2021-04-27 Microsoft Technology Licensing, Llc. Code completion for overloaded methods
CN108717423B (zh) * 2018-04-24 2020-07-07 南京航空航天大学 一种基于深度语义挖掘的代码段推荐方法
US11645576B2 (en) 2018-04-29 2023-05-09 Microsoft Technology Licensing, Llc. Code completion for languages with hierarchical structures
CN110502226B (zh) * 2018-05-16 2023-06-09 富士通株式会社 在编程环境中推荐代码的方法和装置
CN110569030B (zh) * 2018-06-06 2023-04-07 富士通株式会社 代码推荐方法及装置
CN108717470B (zh) * 2018-06-14 2020-10-23 南京航空航天大学 一种具有高准确度的代码片段推荐方法
US10545733B2 (en) * 2018-06-25 2020-01-28 Hcl Technologies Ltd. Code reusability
US10579370B2 (en) * 2018-08-03 2020-03-03 EMC IP Company LLC Method to disintegrate a monolith service to microservices
KR102304692B1 (ko) 2018-09-21 2021-09-24 주식회사 럭스로보 소스 코드 및 모듈 추천 시스템 및 모듈 어셈블리
KR102137667B1 (ko) * 2018-09-21 2020-07-24 주식회사 럭스로보 소스 코드 및 모듈 추천 시스템 및 모듈 어셈블리
US20210342124A1 (en) * 2018-09-28 2021-11-04 Element Ai Inc. Context-based recommendations for robotic process automation design
US10534585B1 (en) * 2018-10-29 2020-01-14 Sap Se Integrated development environment with deep insights and recommendations
KR102187293B1 (ko) * 2018-11-05 2020-12-04 서강대학교 산학협력단 Gas 절감이 가능한 스마트 컨트랙트 분석 장치 및 방법
CN109634594B (zh) * 2018-11-05 2020-08-21 南京航空航天大学 一种考虑代码语句顺序信息的代码片段推荐方法
US11275565B2 (en) 2018-11-21 2022-03-15 Kony, Inc. System and method for connecting end-users to business systems
CN109683946B (zh) * 2018-12-13 2021-12-03 南开大学 一种基于代码克隆技术的用户评论推荐方法
CN109683907A (zh) * 2018-12-29 2019-04-26 深圳乐信软件技术有限公司 代码补全方法、装置、设备及存储介质
US10922101B2 (en) 2019-06-26 2021-02-16 International Business Machines Corporation User interface widget recommendation
US10972572B2 (en) * 2019-07-12 2021-04-06 Zycada Networks Programmable delivery network
US11194553B2 (en) * 2019-09-17 2021-12-07 International Business Machines Corporation Identifying and recommending code snippets to be reused by software developer
CN110806861B (zh) * 2019-10-10 2021-10-08 南京航空航天大学 一种结合用户反馈信息的api推荐方法及终端
US11113034B2 (en) * 2019-10-30 2021-09-07 EMC IP Holding Company LLC Smart programming assistant
US11048621B2 (en) * 2019-11-07 2021-06-29 International Business Machines Corporation Ensuring source code integrity in a computing environment
US11157246B2 (en) 2020-01-06 2021-10-26 International Business Machines Corporation Code recommender for resolving a new issue received by an issue tracking system
US20210368241A1 (en) * 2020-03-31 2021-11-25 Kosmas George Ballis System and method for curating internet multimedia content for television broadcast
CN111831259A (zh) * 2020-04-15 2020-10-27 中国人民解放军军事科学院战争研究院 一种引导式的智能处理定制方法
FI20205459A1 (en) 2020-05-05 2021-11-06 Qentinel Oy FORECASTING CODE EDITOR
CN111596897B (zh) * 2020-05-07 2023-04-28 北京百度网讯科技有限公司 代码复用的处理方法、装置及电子设备
US11321054B2 (en) * 2020-06-26 2022-05-03 Xoriant Corporation System and method for automated software engineering
CN113900635B (zh) * 2020-07-06 2024-08-20 阿里巴巴集团控股有限公司 一种代码推荐方法及装置
US11720346B2 (en) * 2020-10-02 2023-08-08 International Business Machines Corporation Semantic code retrieval using graph matching
CN112328743A (zh) * 2020-11-03 2021-02-05 北京嘀嘀无限科技发展有限公司 代码搜索方法、装置、可读存储介质和电子设备
CN112416431B (zh) * 2020-11-23 2023-02-14 南京航空航天大学 一种基于编码序列表示的源代码片段成对比较方法
US11875136B2 (en) 2021-04-01 2024-01-16 Microsoft Technology Licensing, Llc Edit automation using a temporal edit pattern
US11836469B2 (en) 2021-06-03 2023-12-05 International Business Machines Corporation Dynamic code snippet promotion
CN114385150B (zh) * 2021-09-18 2022-09-02 北京能科瑞元数字技术有限公司 基于智能引擎的低代码开发方法
US12085910B2 (en) * 2021-09-24 2024-09-10 Rockwell Automation Technologies, Inc. Model asset library and recommendation engine for industrial automation environments
US12056488B2 (en) * 2022-06-01 2024-08-06 At&T Intellectual Property I, L.P. Quantifying software code reuse
CN117369787B (zh) * 2023-12-08 2024-06-07 泰德网聚(北京)科技股份有限公司 一种自动进行低代码开发的系统

Family Cites Families (20)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6965990B2 (en) * 2001-10-23 2005-11-15 International Business Machines Corporation Method and apparatus for providing programming assistance
US7526753B2 (en) * 2003-06-18 2009-04-28 Microsoft Corporation System and method for creating, managing and using code segments
US7373634B2 (en) * 2003-12-09 2008-05-13 International Business Machines Corporation User configurable language independent code assist method, system, article of manufacture, and computer program product
US20060242631A1 (en) * 2005-04-22 2006-10-26 Andersen Jakob R Process and system for sharing program fragments
CN1855052A (zh) * 2005-04-25 2006-11-01 罗迪平 一种从树型结构数据和一组代码片断结构体生成目标源代码的方法
US8572560B2 (en) * 2006-01-10 2013-10-29 International Business Machines Corporation Collaborative software development systems and methods providing automated programming assistance
US8578334B2 (en) * 2006-12-04 2013-11-05 Microsoft Corporation Dynamic language-based integrated development environment
US8245186B2 (en) * 2008-04-03 2012-08-14 Microsoft Corporation Techniques for offering and applying code modifications
US20090292527A1 (en) * 2008-05-22 2009-11-26 Travelocity.Com Lp Methods, Apparatuses and Computer Program Products for Receiving and Utilizing Multidimensional Data Via A Phrase
US8271939B1 (en) * 2008-11-14 2012-09-18 Adobe Systems Incorporated Methods and systems for data introspection
US20110271258A1 (en) * 2010-04-30 2011-11-03 Microsoft Corporation Software Development Tool
CN102402429B (zh) * 2010-09-10 2015-04-15 金蝶软件(中国)有限公司 获取、反编译图形用户界面属性信息的方法及装置
US9619211B2 (en) * 2010-12-30 2017-04-11 International Business Machines Corporation Code suggestion in a software development tool
US8612936B2 (en) * 2011-06-02 2013-12-17 Sonatype, Inc. System and method for recommending software artifacts
US9383973B2 (en) * 2011-06-29 2016-07-05 Microsoft Technology Licensing, Llc Code suggestions
US9495134B2 (en) * 2011-09-16 2016-11-15 Adobe Systems Incorporated Methods and apparatus for code segment handling
CN103488468B (zh) * 2012-06-13 2017-10-10 腾讯科技(北京)有限公司 门户网站页面的编写方法及系统
US20140013299A1 (en) * 2012-07-06 2014-01-09 Microsoft Corporation Generalization and/or specialization of code fragments
US9244658B2 (en) * 2013-06-04 2016-01-26 Microsoft Technology Licensing, Llc Multi-step auto-completion model for software development environments
DK3011442T3 (da) * 2013-06-18 2021-01-04 Ciambella Ltd Fremgangsmåde og anordning til generering af et brugerdefineret softwareudviklingskit (sdk)

Also Published As

Publication number Publication date
EP3161618A4 (en) 2017-06-28
CN106462399A (zh) 2017-02-22
WO2016000158A1 (en) 2016-01-07
KR20170023022A (ko) 2017-03-02
EP3161618A1 (en) 2017-05-03
CN106462399B (zh) 2019-10-18
US9519464B2 (en) 2016-12-13
US20150378692A1 (en) 2015-12-31

Similar Documents

Publication Publication Date Title
KR102141272B1 (ko) 코드 추천 기법
US10599643B2 (en) Template-driven structured query generation
US20210263962A1 (en) Utilizing natural language processing and multiple object detection models to automatically select objects in images
TWI524193B (zh) 用於搜尋結果之語義目錄的電腦可讀取媒體及電腦實現方法
Corley et al. Exploring the use of deep learning for feature location
JP2015506515A (ja) タグをドキュメントに自動的に追加するための方法、装置およびコンピュータ記憶媒体
KR20210151017A (ko) 검색 모델의 훈련 방법, 목표 대상의 검색 방법 및 그 장치
JP4750832B2 (ja) 情報検索方法およびそのシステム
Hung et al. QUBLE: towards blending interactive visual subgraph search queries on large networks
CN104484392A (zh) 数据库查询语句生成方法及装置
JP6690828B2 (ja) キーワードに基づくテキスト検索の方法及び装置
KR100899930B1 (ko) 연관 데이터 클래스 생성 방법 및 시스템
KR101793578B1 (ko) 효율적으로 질의를 처리하는 방법 및 장치
AU2016277656B2 (en) Context-based retrieval and recommendation in the document cloud
JP5486667B2 (ja) クエリ結果を多様化するための方法および装置
JP6163143B2 (ja) 情報提供装置、情報提供方法、および情報提供プログラム
Vasilyeva et al. Debeaq-debugging empty-answer queries on large data graphs
CN105630837A (zh) 一种媒体记录搜索方法和装置
Zhang et al. ICTIR Subtopic Mining System at NTCIR-9 INTENT Task.
JP2018060379A (ja) 検索手段選択プログラム、検索手段選択方法及び検索手段選択装置
Simões et al. When speed has a price: Fast information extraction using approximate algorithms
JP2008269106A (ja) スキーマ抽出方法、情報処理装置、コンピュータプログラム及び記録媒体
JP2013125429A (ja) 分析対象決定装置
Fördős et al. Comprehensible presentation of clone detection results
JP6855401B2 (ja) 生成装置、生成方法、及び生成プログラム

Legal Events

Date Code Title Description
E701 Decision to grant or registration of patent right
GRNT Written decision to grant