KR20190015285A - Cpu 이용 및 코드 리팩토링을 위한 쿼리 최적화기 - Google Patents

Cpu 이용 및 코드 리팩토링을 위한 쿼리 최적화기 Download PDF

Info

Publication number
KR20190015285A
KR20190015285A KR1020187035332A KR20187035332A KR20190015285A KR 20190015285 A KR20190015285 A KR 20190015285A KR 1020187035332 A KR1020187035332 A KR 1020187035332A KR 20187035332 A KR20187035332 A KR 20187035332A KR 20190015285 A KR20190015285 A KR 20190015285A
Authority
KR
South Korea
Prior art keywords
query
queries
program code
functionally equivalent
code
Prior art date
Application number
KR1020187035332A
Other languages
English (en)
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 KR20190015285A publication Critical patent/KR20190015285A/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/72Code refactoring
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2453Query optimisation
    • G06F16/24534Query rewriting; Transformation

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computational Linguistics (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Management, Administration, Business Operations System, And Electronic Commerce (AREA)

Abstract

프로그램 코드 내의 쿼리의 효율을 증가시키기 위한 방법, 시스템, 장치, 및 컴퓨터 프로그램 제품이 제공된다. 프로그램 코드에서 복수의 쿼리가 검출된다. 프로그램 코드에서 쿼리의 평가에 필요한 지연 연산(laziness)이 연장된다. 쿼리는 복수의 쿼리 컴포넌트로 분해된다. 복수의 쿼리에 대하여 보다 효율적으로 평가하는 복수의 쿼리에 대한 기능적으로 균등한 쿼리 세트를 생성하기 위해 복수의 규칙을 포함하는 규칙 세트가 쿼리 컴포넌트에 적용된다.

Description

CPU 이용 및 코드 리팩토링을 위한 쿼리 최적화기
소프트웨어 개발자가 소프트웨어를 개발하는 데 사용할 수 있는 다양한 타입의 소프트웨어 개발 애플리케이션이 존재한다. 통합 개발 환경(IDE)은 하나의 패키지에 여러 개발 도구를 포함하는 타입의 소프트웨어 개발 애플리케이션이다. IDE는 소스 코드 에디터("코드 에디터"), 빌드 자동화 도구, 및 디버거(debugger)와 같은 도구를 포함할 수 있다. IDE는, 캐나다 오타와 소재의 Eclipse Foundation에 의해 개발된 Eclipse™, 캐나다 밴쿠버 소재의 ActiveState에 의해 개발된 ActiveState Komodo™, 체코 공화국의 JetBrains에 의해 개발된 IntelliJ IDEA, 미국 캘리포니아 레드우드 소재의 Oracle Corporation에 의해 개발된 Oracle JDeveloper™, Oracle Corporation에 의해 개발된 NetBeans, 미국 캘리포니아 샌프란시스코 소재의 Codenvy에 의해 개발된 Codenvy™, 미국 캘리포니아 쿠퍼티노 소재의 Apple Corporation에 의해 개발된 Xcode®, 및 미국 워싱턴 레드몬드 소재의 Microsoft Corporation에 의해 개발된 Microsoft® Visual studio®를 예로서 포함한다.
많은 현대의 프로그래밍 언어들은 기본적으로 데이터에 대한 쿼리를 지원한다. 예를 들어, Microsoft Corporation에 의해 개발된 Microsoft .NET Framework는 LINQ(Language Integrated Query) 형태의 쿼리를 지원하지만, 미국 캘리포니아 레드우드 소재의 Oracle Corporation에 의해 개발된 Java®는 Streams(스트림) 형태의 쿼리를 지원한다. 쿼리를 기본적으로 프로그래밍 언어로 지원하면, 개발자들을 위한 쿼리의 실제 구현을 통합된 쿼리 기능이 처리하기 때문에, 개발자들은 자신의 프로그램 코드의 논리 부분에 집중할 수 있게 된다. 이를 통해 개발자는 자신의 코딩 속도를 높일 수 있게 된다.
그러나, 비효율적인 쿼리의 결과를 알지 못하거나 또는 잘 이해하지 못하면, 비효율적인 프로그램 코드가 개발되는 결과가 초래될 수 있다. 또한, 소프트웨어 개발을 위한 현재의 모범 실무로 인해, 개발자는 보다 양호한 가독성을 위해 코드 내에서 보다 큰 메소드/절차를 보다 작은 메소드/절차로 분할하는 경향이 있으며, 이는 프로그램 코드 내의 쿼리에서 비효율성을 초래할 수도 있다.
본 개요는 후속하여 발명을 실시하기 위한 구체적인 내용 부분에서 설명되는 개념들 중 선택된 것들을 단순화된 형태로 소개하고자 제공되는 것이다. 본 개요는 청구항의 청구대상의 핵심적인 특징이나 필수적인 특징들을 밝히고자 함이 아니며, 청구항의 청구대상의 범위를 제한하는데 이용이 되고자 함도 아니다.
프로그램 코드 내의 쿼리의 효율을 증가시키기 위한 방법, 시스템, 장치, 및 컴퓨터 프로그램 제품이 제공된다. 예를 들어, 프로그램 코드가 코드 에디터에 입력될 때 또는 컴파일 시간 동안, 프로그램 코드에서 복수의 쿼리가 검출된다. 프로그램 코드에서 쿼리의 평가에 필요한 지연 연산(laziness)이 연장된다. 또한, 검출된 쿼리에 대하여 보다 효율적으로 평가하는 기능적으로 균등한 쿼리 세트를 생성하기 위해 검출된 쿼리에 복수의 규칙을 포함하는 규칙 세트가 적용된다.
규칙 세트에 포함되는 규칙들은, 사용자에 의해 수동으로 생성하는 것 또는 머신 러닝(machine learning), 코드 사례들의 빅 데이터 분석 등과 같은 알고리즘에 의해 자동으로 생성되는 것을 포함하여, 임의의 방식으로 생성될 수 있다. 이러한 규칙들의 세트는 개발자의 일상적인 작업에서 발생하는 가장 일반적인 오류를 현저하게 개선할 수 있다.
단일의 기능적으로 균등한 쿼리 세트가 생성되어 하나 이상의 기존의 쿼리들을 대신하여 프로그램 코드에 입력될 수 있거나, 또는 기능적으로 균등한 복수의 후보 쿼리 세트가 생성되고, 그 중에서 하나의 쿼리 세트가 프로그램 코드에 입력되도록 선택될 수 있다. 사용자가 프로그램 코드에 입력될 기능적으로 균등한 후보 쿼리 세트를 선택할 수 있거나, 또는 기능적으로 균등한 후보 쿼리 세트가 자동으로 선택될 수 있다. 기능적으로 균등한 후보 쿼리 세트의 선택은, 해당 선택이 개발 동안(예컨대, 코드 입력 동안 또는 컴파일 시간에) 이루어지는지, 또는 실행 시간(runtime) 동안 이루어지는지의 여부에 의해 영향을 받을 수 있다. 실행 시간 동안, 기능적으로 균등한 후보 쿼리 세트는 실행 시간 팩터(예컨대, 네트워크 가용성, 이용 가능한 처리 능력 등과 같은 실행 조건)에 (적어도 부분적으로) 기초하여 프로그램 코드에의 입력을 위해 복수의 후보 중에서 선택될 수 있다.
본 발명의 추가적인 특징 및 장점과, 본 발명의 다양한 실시형태의 구조 및 동작을 아래에서 첨부 도면을 참조하여 상세하게 설명한다. 본 발명은 본 명세서에서 설명되는 구체적인 실시형태들에 한정되는 것이 아니라는 점에 유의한다. 이러한 실시형태들은 본 명세서에서는 단지 예시를 위해서만 제시된다. 당업자에게는 본 명세서에 포함된 교시에 기초하여 부가적인 실시형태들이 자명할 것이다.
본 명세서에 포함되어 명세서의 일부를 형성하는 첨부 도면은 본원의 실시형태들을 예시하며, 또한 발명의 상세한 설명과 함께, 실시형태들의 원리를 설명하고 당업자가 실시형태들을 구성해서 사용할 수 있게 하는 역할을 한다.
도 1은, 예시적인 실시형태에 따른, 프로그램 코드에서 쿼리 실행의 효율을 향상시키도록 구성된 쿼리 최적화기를 포함하는 컴퓨팅 장치의 블럭도를 도시한다.
도 2는, 예시적인 실시형태에 따른, 프로그램 코드에서 쿼리 실행의 효율을 향상시키도록 구성된 쿼리 최적화기를 갖는 개발 애플리케이션을 포함하는 컴퓨팅 장치의 블럭도를 도시한다.
도 3은, 예시적인 실시형태에 따른, 프로그램 코드에서 쿼리 실행의 효율을 향상시키기 위한 프로세스를 제공하는 흐름도를 도시한다.
도 4는, 예시적인 실시형태에 따른, 쿼리 최적화기의 블럭도를 도시한다.
도 5는, 예시적인 실시형태에 따른, 코드 에디터에서 제안된 대체 쿼리 세트를 생성 및 제시하기 위한 프로세스를 제공하는 흐름도를 도시한다.
도 6은, 예시적인 실시형태에 따른, 제안된 대체 쿼리 세트를 갖는 프로그램 코드를 디스플레이하는 코드 에디터 윈도우를 포함하는 컴퓨팅 장치의 블럭도를 도시한다.
도 7은, 예시적인 실시형태에 따른, 컴파일 시간에 대체 쿼리 세트를 생성 및 구현하기 위한 프로세스를 제공하는 흐름도를 도시한다.
도 8은, 예시적인 실시형태에 따른, 프로그램 코드에서 쿼리 실행의 지연 연산을 연장시키기 위한 프로세스를 제공하는 흐름도를 도시한다.
도 9는, 예시적인 실시형태에 따른, 지연 연산 연장기(laziness extender)의 블럭도를 도시한다.
도 10은, 예시적인 실시형태에 따른, 프로그램 코드에 대한 대체 쿼리 세트를 결정하기 위해 규칙 세트를 적용하기 위한 프로세스를 제공하는 흐름도를 도시한다.
도 11은, 예시적인 실시형태에 따른, 균등한 쿼리 세트 생성기의 블럭도를 도시한다.
도 12는, 예시적인 실시형태에 따른, 복수의 기능적으로 균등한 후보 쿼리 세트를 생성하고 그 중에서 선택하기 위한 프로세스를 제공하는 흐름도를 도시한다.
도 13은 실시형태들을 구현하는 데 사용될 수 있는 예시적인 컴퓨팅 장치의 블럭도를 도시한다.
본 발명의 특징 및 장점은, 유사한 참조 문자가 명세서 전반에서 상응하는 요소를 나타내는 도면과 함께 취해지는, 아래에 제시되는 발명을 실시하기 위한 구체적인 내용으로부터 보다 분명해질 것이다. 도면에서, 유사한 참조 번호는 일반적으로 동일한, 기능적으로 유사한, 및/또는 구조적으로 유사한 요소를 가리킨다. 요소가 처음 나타나는 도면은 상응하는 참조 번호의 제일 왼쪽의 숫자(들)로 표시된다.
I. 서론
본 명세서 및 첨부 도면은 본 발명의 특징을 포함하는 하나 이상의 실시형태를 개시한다. 본 발명의 범위는 개시된 실시형태들에 한정되지 않는다. 개시된 실시형태들은 단지 본 발명을 예시하는 것이며, 개시된 실시형태들의 수정 버전도 본 발명에 포함된다. 본 발명의 실시형태들은 첨부된 청구범위에 의해 규정된다.
명세서에서 "일 실시형태", "실시형태", "예시적인 실시형태" 등의 언급은, 설명된 실시형태가 특정한 특징, 구조, 또는 특성을 포함할 수 있지만, 모든 실시형태가 그러한 특정한 특징, 구조, 또는 특성을 반드시 포함하는 것은 아닐 수도 있음을 의미한다. 또한, 그러한 문구는 반드시 동일한 실시형태를 의미하는 것도 아니다. 또한, 특정한 특징, 구조, 또는 특성을 실시형태와 관련하여 설명하는 경우, 명시적으로 설명되든지 아니든지 간에 그러한 특징, 구조, 또는 특성을 다른 실시형태들과 관련하여 실행하는 것은 당업자의 지식 범위 내에 있는 것이다.
본 논의에 있어서, 달리 언급되지 않는 한, 본 개시내용의 실시형태의 특징 또는 특징들의 조건 또는 관계 특성을 수식하는 "실질적으로" 및 "약"과 같은 수식어는, 해당 조건 또는 특성이 그것이 의도되는 용례의 실시형태의 동작에 대하여 허용 가능한 용인 범위 내로 규정됨을 의미하는 것으로 이해된다.
다수의 예시적인 실시형태가 다음과 같이 설명된다. 본 명세서에 제공되는 임의의 섹션/하위 섹션의 표제는 한정하려는 것이 아니라는 점에 유의한다. 이 문헌의 전반에 걸쳐서 실시형태들이 설명되며, 임의의 타입의 실시형태가 임의의 섹션/하위 섹션에 포함될 수 있다. 또한, 임의의 섹션/하위 섹션에서 설명되는 실시형태들은 동일한 섹션/하위 섹션에서 및/또는 다른 섹션/하위 섹션에서 설명되는 임의의 다른 실시형태들과 임의의 방식으로 조합될 수 있다.
II. 프로그램 코드에서 쿼리를 최적화하기 위한 예시적인 실시형태
많은 현대의 프로그래밍 언어들은 기본적으로 쿼리를 지원한다. 예를 들어, Microsoft Corporation에 의해 개발된 Microsoft .NET Framework는 LINQ(Language Integrated Query) 형태의 쿼리를 지원하지만, 미국 캘리포니아 레드우드 소재의 Oracle Corporation에 의해 개발된 Java®는 Streams(스트림) 형태의 쿼리를 지원한다. 쿼리를 기본적으로 프로그래밍 언어로 지원하면, 개발자들은 그들의 쿼리의 실제 구현을 처리함으로써 그 프로그램 코드의 논리 부분에 집중할 수 있게 된다. 이를 통해 개발자는 자신의 코딩 속도를 높일 수 있게 된다. 그러나, 비효율적인 쿼리의 결과를 알지 못하거나 또는 잘 이해하지 못하면, 정상적으로 기능하지 못하는 프로그램 코드가 개발되는 결과가 초래될 수 있다. 예를 들어, 이러한 프로그램 코드는, 최종까지 사용되지 않는 데이터를 검색하거나, 잉여 데이터량을 검색하거나, 및/또는 필요한 것보다 더 빈번하게 또는 조기에 데이터를 검색하는 쿼리들을 포함할 수 있다. 쿼리들은 동일한 논리적 결과를 산출하지만 성능에의 영향이 매우 상이한 여러가지 방식으로 기입될 수 있다.
또한, 소프트웨어를 개발하기 위한 현재의 모범 사례 때문에, 개발자는 보다 양호한 가독성을 위해 코드 내에서 보다 큰 메소드/절차를 보다 작은 메소드/절차로 분할하는 경향이 있다. 현재 이용 가능한 코드 최적화기는 이렇게 개발된 코드를 최적화함에 있어서 어려움을 겪을 수 있다.
실시형태들에 따르면, 프로그램 코드는 비효율적으로 구현되는 쿼리들에 대하여 자동으로 분석되고, 해당 쿼리들은 보다 효율적이지만 논리적으로는 균등한 쿼리들의 세트로 대체된다. 이러한 실시형태들은 컴파일 시간 동안(예컨대, CPU 최적화 동안) 영향을 미치도록 및/또는 IDE 도구 및/또는 IDE 애드-인(add-in)에서 리팩토링 제안으로서 구현되도록 구현될 수 있다. 예를 들어, 실시형태에 있어서, 코드 에디터는 보다 효율적인 쿼리 세트를 결정하고, 보다 효율적인 쿼리 세트를 개발자의 코드에서 구현되도록 개발자에게 제안하도록 구성된다. 실시형태들은 판독 가능한 코드가 개발자에 의해 개발될 수 있게 하고, 해당 코드를 보다 효율적인 코드로 자동으로 변환한다.
실시형태에 있어서, 쿼리 최적화기는, (a) 프로그램 코드에서 쿼리(예컨대, LINQ, Streams 등)를 식별하고, (b) 쿼리의 결과를 검사해서 그 사용(usage)/콘텍스트(context)를 결정하고, (c) 쿼리를 기본 단위(atomic unit)로 분해하고, (d) (a), (b), 및 (c)를 종합해서 쿼리 최적화가 구현될 수 있는 위치를 결정하도록 구성될 수 있다. 예를 들어, 명시적으로 규정된 규칙 및/또는 자동으로 생성된 규칙일 수 있는 규칙 세트에 대하여 패턴 매칭이 수행될 수 있다. 예를 들어, 규칙들은 머신 러닝, 코드 사례들의 빅 데이터 분석 등과 같은 알고리즘에 의해 자동으로 생성될 수 있다. 이러한 규칙들의 세트는 개발자의 일상적인 작업에서 발생하는 가장 일반적인 오류를 현저하게 개선할 수 있다.
따라서, 실시형태들은, (1) 쿼리 성능을 향상시키는 코드 변경을 분석 및 추천하는 도구 및 프로세스, (2) 쿼리를 보다 최적화된 균등한 쿼리로 자동으로 변경하는 도구 및 프로세스, (3) 쿼리의 자동적인 성능 향상을 위해 컴파일러에 대한 사전처리 코드 분석 도구 및 프로세스, (4) 데이터베이스의 쿼리에 관한 코드 리팩토링을 분석 및 추천하는 자동 도구 및 프로세스(.NET 및 다른 언어의 등가물에서의 "엔티티 프레임워크(entity framework)"와 유사), 및 런타임 동안 균등한 쿼리들을 샘플링하고 시나리오에 대한 최선의 쿼리를 자동으로 선택 및 대체하는 머신 러닝을 구현하는 코드 최적화 도구 및 프로세스 중 하나 이상을 제공한다.
본 명세서에서 사용되는, 쿼리는 데이터에 대한 쿼리(또는 요청)이며, 데이터 쿼리라고 할 수도 있다. 쿼리는 데이터베이스, 애플리케이션, API(application programming interface) 등을 포함하는 임의의 데이터 소스에 제공될 수 있다. 데이터베이스에 대한 쿼리를 "데이터베이스 쿼리(database query)"라고 할 수도 있다.
실시형태들은 다양한 방식으로 구현될 수 있다. 예를 들면, 도 1은, 예시적인 실시형태에 따른, 프로그램 코드에서 쿼리 실행의 효율을 향상시키도록 구성된 쿼리 최적화기(104)를 포함하는 컴퓨팅 장치(102)의 블럭도를 도시한다. 도 1에 도시된 바와 같이, 쿼리 최적화기(104)는 개발자(프로그램 코드를 기입/입력/수정하는 사람)에 의해 입력된 프로그램 코드(106)를 수신한다. 프로그램 코드(106)는 복수의 쿼리(110)를 포함한다. 쿼리(110)는 하나 이상의 개별 쿼리 연산자 및/또는 하나 이상의 쿼리 표현식(쿼리 연산자들의 문자열/시리즈)을 포함할 수 있는 다수의 쿼리를 포함한다. 쿼리 최적화기(104)는 쿼리(110)를 분석하고 그에 대한 대체 쿼리 세트를 생성하도록 구성되며, 그에 따라 대체 쿼리(112)를 포함하는 리팩토링된 프로그램 코드(108)가 출력된다. 리팩토링된 프로그램 코드(108)는 논리적으로는 원래의 프로그램 코드(106)와 균등(동일한 기능(들)을 수행)하지만 대체 쿼리(112)로 재기입되는 프로그램 코드이다. 대체 쿼리(112)는, 예를 들어 프로그램 코드에 의해 사용되지 않는 데이터를 검색하는 것을 회피하는 것, 잉여 데이터 검색을 요청하는 것을 회피하는 것, 잉여 동작을 수행하는 것을 회피하는 것, 및/또는 데이터를 덜 빈번하게 및/또는 나중에(지연 연산의 증가) 검색하는 것에 의해, 원래의 쿼리(110)보다 더 효율적으로 수행하도록 구성된다.
쿼리 최적화기(104)는 독립적으로 구현될 수 있거나, 또는 코드 에디터, 코드 컴파일러, 코드 디버거 등과 같이, 프로그램 코드를 입력 또는 처리하기 위해 개발자에 의해 사용될 수 있는 임의의 시스템 또는 도구에 포함될 수 있다. 예를 들면, 도 2는, 예시적인 실시형태에 따른, 쿼리 최적화기(104)를 포함하는 개발 애플리케이션(200)을 포함하는 컴퓨팅 장치(102)의 블럭도를 도시한다. 개발 애플리케이션(200)은 통합 개발 환경(IDE)의 실시예이다. 도 2에 도시된 바와 같이, 컴퓨팅 장치(102)는 개발 애플리케이션(200), 스토리지(210), 및 통신 인터페이스(208)를 포함한다. 스토리지(210)는 프로그램 코드(106 및 108)와 규칙 세트(216)를 저장한다. 개발 애플리케이션(200)은 소스 코드 에디터(202), 컴파일러(204), 및 디버거 도구(206)를 포함한다. 소스 코드 에디터(202)는 사용자 인터페이스(212)를 포함한다. 점선 화살표로 지시된 바와 같이, 쿼리 최적화기(104)는 소스 코드 에디터(202), 컴파일러(204), 및/또는 디버거 도구(206)의 어느 하나 이상에서 구현되거나, 또는 그것에 의해 호출될 수 있다. 개발 애플리케이션(200)은 예시의 목적으로 예시적인 실시형태로서 도시되며 개발 애플리케이션(200)의 모든 특징이 모든 실시형태에서 제시될 필요는 없다는 점에 유의한다. 또한, 도 2에 도시되지 않은 부가적인 특징들이 일부 실시형태들에서 제시될 수 있다. 도 2에 도시된 개발 애플리케이션(200)의 특징들이 다음과 같이 설명된다.
도 2에 도시된 바와 같이, 개발 애플리케이션(200)은 하나 이상의 컴퓨팅 장치(102)에서 구현될 수 있다. 예를 들면, 소스 코드 에디터(202), 컴파일러(204), 및 디버거 도구(206)가 동일한 컴퓨팅 장치 내에 포함될 수 있거나, 또는 소스 코드 에디터(202), 컴파일러(204), 및 디버거 도구(206)의 하나 이상이 소스 코드 에디터(202), 컴파일러(204), 및 디버거 도구(206)의 나머지의 컴퓨팅 장치와는 별도의 하나 이상의 컴퓨팅 장치에서 구현될 수 있다.
컴퓨팅 장치(102)는, 모바일 컴퓨터 또는 모바일 컴퓨팅 장치(예컨대, Microsoft® Surface® 장치, PDA(personal digital assistant), 랩탑 컴퓨터, 노트북 컴퓨터, Apple iPad™와 같은 태블릿 컴퓨터, 넷북 등), 휴대폰, 웨어러블 컴퓨팅 장치, 또는 그 밖의 타입의 모바일 장치, 또는 데스크탑 컴퓨터 또는 PC(퍼스널 컴퓨터)와 같은 고정식 컴퓨팅 장치를 포함하는, 하나 이상의 임의의 타입의 고정식 또는 모바일 컴퓨팅 장치(들)일 수 있다.
코드 에디터(202)는 본 명세서의 다른 어딘가에서 언급된, 또는 그렇지 않으면 공지된 프로그램 코드를 편집하도록 구성된 임의의 독점적인 또는 종래의 코드 에디터(예컨대, Eclipse™, ActiveState Komodo™, IntelliJ IDEA, Oracle JDeveloper™, NetBeans, Codenvy™, Xcode®, Microsoft® Visual studio® 등의 코드 에디터)일 수 있다.
개발자는 애플리케이션에 대한 소스 코드 생성시에 프로그램 코드를 입력 및 수정하기 위해 소스 코드 에디터(202)와 상호작용할 수 있다. 예를 들면, 개발자는, 예컨대 타이핑, 보이스 입력, 제안된 코드 블럭들의 선택 등에 의해, 프로그램 코드 텍스트를 추가, 수정, 또는 삭제하기 위해 소스 코드 에디터(202)의 사용자 인터페이스(212)와 상호작용할 수 있다. 따라서, 사용자 인터페이스(212)는 하나 이상의 텍스트 입력 상자/윈도우(예컨대, 도 6의 코드 에디터 윈도우(604)), 보이스/음성 인식, 하나 이상의 그래픽 사용자 인터페이스 요소(예컨대, 버튼, 체크 박스, 라디오 버튼, 풀 다운 메뉴 등), 및/또는 개발자가 상호작용할 수 있는 그 밖의 사용자 인터페이스 요소를 포함할 수 있다. 완료시에, 또는 다른 시기에, 사용자는 "세이브(save)" 버튼 또는 다른 사용자 인터페이스 요소와 상호작용함으로써 프로그램 코드를 세이브할 수 있다.
예를 들면, 도 2에 도시된 바와 같이, 개발자는 소스 코드 에디터(202)의 사용자 인터페이스(212)와 상호작용해서 프로그램 코드(106)를 생성할 수 있다. 프로그램 코드(106)는 인간-판독 가능한 컴퓨터 프로그래밍 언어를 사용해서 기입된 컴퓨터 명령어들(가능하게는 코멘트와 함께)의 집합인 소스 코드이다. 적절한 인간-판독 가능한 컴퓨터 프로그래밍 언어는 C#, C++, Java 등을 예로서 포함한다. 프로그램 코드(106)는 하나 이상의 파일로 또는 다른 형태로 수신될 수 있다. 예를 들면, 프로그램 코드(106)는 하나 이상의 ".c" 파일(C 프로그래밍 언어가 사용될 경우), 하나 이상의 ".cpp" 파일(C++ 프로그래밍 언어가 사용될 경우) 등으로서 수신될 수 있다. 프로그램 코드(106)를 리팩토링하기 위해 쿼리 최적화기(104)가 소스 코드 에디터(202)에 의해 사용되는 경우, 리팩토링된 프로그램 코드(108)는 소스 코드 에디터(202)에 의해 생성 및 세이브될 수 있다. 실시형태들에 있어서, 소스 코드 에디터(202)는 규칙 세트(216)의 규칙들을 프로그램 코드(106)의 쿼리 컴포넌트("쿼리 연산자(query operators)"라고도 함)에 적용해서 리팩토링된 프로그램 코드(108)에서 보다 효율적인 쿼리 세트를 생성할 수 있다.
도 2에 도시된 바와 같이, 프로그램 코드(106 및/또는 108)는 스토리지(210)에 저장될 수 있다. 스토리지(210)는, 자기 디스크(예컨대, 하드 디스크 드라이브 내의), 광 디스크(예컨대, 광 디스크 드라이브 내의), 자기 테이프(예컨대, 테이프 드라이브 내의), RAM 디바이스, ROM 디바이스 등과 같은 메모리 디바이스를 포함하는, 데이터를 저장하기 위한 임의의 타입의 물리적 스토리지 하드웨어/회로, 및/또는 임의의 다른 적절한 타입의 물리적 스토리지 하드웨어/회로를 하나 이상 포함할 수 있다.
컴파일러(204)는, 커맨드 라인, 그래픽 사용자 인터페이스 등에 의하는 바와 같이, 임의의 방식으로 호출될 수 있다. 컴파일러(204)가 전체 컴파일(full compile)을 수행하도록 호출되는 경우에 "-풀(-full)" 스위치, 또는 다른 스위치가 사용될 수 있다. 컴파일러(204)는 프로그램 코드(106)(또는 프로그램 코드(108))를 수신 및 컴파일해서 기계 코드(222)를 생성하도록 구성된다. 특히, 컴파일러(204)는 프로그램 코드(106 및/또는 108)를, 통상적으로 이진 형태를 갖는, 기계 코드 또는 목적 코드라고도 하는 다른 컴퓨터 언어 형태의 기계 코드(222)로 변환하도록 구성된다. 경우에 따라, 컴파일러(204)는 다수의 단계를 포함할 수 있고, 먼저 프로그램 코드(106)를 나중에 기계 코드(222)로 변환되는 중간 형태(예컨대, 중간 언어)로 변환할 수 있다.
컴파일러(204)는 기계 코드(222)의 생성시에 프로그램 코드(106 및/또는 108)에 대한 하나 이상의 타입의 최적화를 수행하도록 구성될 수 있다. 최적화된 빌드는, 결국 최적화되지 않고 생성된 기계 코드에 대하여 의미상으로는 균등한 기계 코드로 되지만, 최적화된 기계 코드의 실행 중에 보다 적은 리소스가 사용되는 방식(예컨대, 보다 적은 메모리, 보다 적은 절차 호출 등)으로 구성된다. 수행될 수 있는 최적화는, 루프 최적화, 데이터-흐름 최적화, SSA-기반 최적화, 코드-생성기 최적화, 기능 언어 최적화, 절차간 최적화, 및/또는 당업자에게 공지되어 있는 추가적인 타입의 최적화를 예로서 포함한다. 다수의 특정한 타입의 최적화가 존재한다. 예를 들어, 호출자 함수에 의해 호출된 피호출자 함수가 호출자 함수의 본문에 복사되는 "인라이닝(inlining)"이 수행될 수 있다. 특정 최적화의 다른 실시예에 있어서는, 소스 코드 내에서 여러 차례 연산되는 양에 대하여 코드의 단일 인스턴스가 사용되는 "공통 부분식 제거(common subexpression elimination)"가 수행될 수 있다. 쿼리 최적화기(104)가 컴파일러(204)에 의해 사용되어 프로그램 코드(106)를 리팩토링할 경우, 리팩토링된 프로그램 코드(108)가 생성되어 컴파일러(204)에 의해 기계 코드(222)를 생성하는 데 사용될 수 있다.
기계 코드(222)는 파일(예컨대, 목적 파일 또는 ".obj" 파일)에 포함될 수 있거나, 또는 실행 가능한 프로그램 또는 애플리케이션을 형성하도록 다른 형태로 생성/저장될 수 있다. 기계 코드(222)는 스토리지(210)에 선택적으로 저장될 수 있다.
프로그램 코드(106 및/또는 108)가 개발의 디버그 단계를 위해 컴파일러(204)에 의해 컴파일되면, 디버거 도구(206)가 기계 코드(222)를 수신할 수 있다. 디버거 도구(206)는 기계 코드(222)에 의해 표현된 애플리케이션에 대하여 디버거(또는 "디버그(debug)", "디버깅(debugging)") 세션을 실행하도록 구성된다. 디버거 세션에서, 개발자는, 프로그램 코드(106 및/또는 108)에 입력된(또한 디버그의 목적으로 컴파일러(204)에 의해 기계 코드(222)에 전달된) 임의의 디버그 코드/스테이트먼트의 영향에 접근하는 것을 포함하여, 기계 코드(222)의 실행에 의해 생성된 변수, 배열, 속성, 및/또는 출력의 값(예컨대, 레지스터의 내용, GUI 등)을 보면서, 기계 코드(222)의 코드 실행을 확인하는 것이 가능해질 수 있다. 이렇게 해서, 개발자는 디버거 세션의 결과에 기초하여 소스 코드 에디터(202)를 사용해서 프로그램 코드(106 및/또는 108)를 편집하는 것으로, 프로그램 코드(106 및/또는 108)를 테스트 또는 문제해결("디버그")할 수 있다. 수정된 버전의 프로그램 코드(106 및/또는 108)는 컴파일러(204)에 의해 컴파일될 수 있으며 추가적인 디버깅을 위해 디버거 도구(206)에 의해 수신될 수 있다. 디버그 도중에, 디버거 도구(206)는 프로그램 코드(106)에서 쿼리를 제안 및/또는 재기입해서 프로그램 코드(108)를 생성할 수 있다. 디버거 도구(206)는 기계 코드(222)를 실행하는 물리적 및/또는 가상의 하나 이상의 프로세서(예컨대, 중앙 처리 장치(CPU))를 포함할 수 있다.
디버거 도구(206)에 의한 디버깅이 완료되고 프로그램 코드(106 및/또는 108)가 그 최종 버전으로 되면, 컴파일러(204)는 프로그램 코드(106 및/또는 108)를 컴파일해서 개발의 릴리스 단계를 위한 기계 코드(222)를 생성할 수 있다. 릴리스 버전의 기계 코드(222)는 사용자에 의해 사용되도록 릴리스될 수 있다.
통신 인터페이스(208)는 프로그램 코드(106 및/또는 108)를 원격 엔티티에 전송하고, 실시형태들에 따라 프로그램 코드를 개선하기 위한 규칙을 수신하고, 및/또는 독점적인 또는 종래의 임의의 적절한 통신 프로토콜에 따라 다른 데이터를 통신하도록 구성된다. 통신 인터페이스 및 통신 프로토콜의 추가적인 실시예는 다음 섹션에서 설명된다.
쿼리 최적화기(104)는 그 기능을 수행하도록 다양하게 구성될 수 있다. 예를 들면, 도 3은, 예시적인 실시형태에 따른, 프로그램 코드에서 쿼리 실행의 효율을 향상시키기 위한 프로세스를 제공하는 흐름도(300)를 도시한다. 쿼리 최적화기(104)는 실시형태에 있어서는 흐름도(300)에 따라 동작할 수 있다. 흐름도(300)는 도 1 및 도 4를 참조하여 다음과 같이 설명된다. 도 4는, 예시적인 실시형태에 따른, 쿼리 최적화기(104)의 블럭도를 도시한다. 도 4에 도시된 바와 같이, 쿼리 최적화기(104)는 흐름도(300)를 참조하여 다음과 같이 설명되는 쿼리 검출기(402), 지연 연산 연장기(404), 및 균등한 쿼리 세트 생성기(406)를 포함한다.
흐름도(300)는 단계(302)에서 시작한다. 단계(302)에서는, 프로그램 코드에서 복수의 쿼리가 검출된다. 도 1에 도시된 바와 같이, 쿼리 최적화기(104)는 쿼리(110)를 포함하는 프로그램 코드(106)를 수신한다. 도 4의 쿼리 검출기(402)는 프로그램 코드(106)를 파싱해서 쿼리를 검출하도록 구성된다. 쿼리 검출기(402)는 임의의 방식으로, 예를 들어 프로그램 코드(106) 내의 코드 용어를 기지의 쿼리 연산자/컴포넌트의 소정의 목록과 비교하는 등에 의해 쿼리를 검출할 수 있다. 예를 들면, LINQ 쿼리를 탐색하는 경우, 쿼리 검출기(402)는 Select, Where, Sum, Min, Max, Average, Aggregate, Join, GroupJoin, OrderBy, GroupBy, Union, Contains, Count, ToList, ToDictionary 등과 같은 기지의 LINQ 연산자에 대하여 프로그램 코드(106)를 파싱할 수 있다. 각각의 발견된 쿼리 연산자(예컨대, 텍스트 매칭에 의해 발견됨)는 쿼리 검출기(402)에 의해 프로그램 코드(106)에 대한 쿼리로서 표시된다.
하나의 예시적인 실시예에 있어서, 쿼리 검출기(402)는 쿼리에 대하여 하기의 프로그램 코드를 파싱할 수 있다:
public void Main()
var 1stOfPrimes = ReturnListOfPrimes(1000);
var 1stOrdered = 1stOfPrimes.OrderBy(x => x).ToList();
var 1stOrderedDesc = 1stOrdered.OrderByDescending(x => x).ToList();
Console.WriteLine("Biggest prime in range is: {0}", 1stOrderedDesc.First());
이 실시예에 있어서, 쿼리 검출기(402)는 코드의 3번째 라인에서 Orderby(x => x) 및 ToList()의 LINQ 쿼리, 및 코드의 4번째 라인에서 OrderByDescending(x => x) 및 ToList()의 LINQ 쿼리를 검출할 수 있다.
단계(302)(및 흐름도(300)의 나머지 부분)는 임의의 적절한 코드 개발 도구 또는 애플리케이션에서 쿼리 최적화기(104)에 의해 구현될 수 있다는 점에 유의한다. 예를 들어, 도 5는, 예시적인 실시형태에 따른, 코드 에디터에서 제안된 대체 쿼리 세트를 생성 및 제시하기 위한 프로세스를 제공하는 흐름도(500)를 도시한다. 실시형태에 있어서, 도 3의 흐름도(300)는 도 5의 흐름도(500)를 구현할 수 있다. 예를 들면, 흐름도(300)의 단계(302)는 흐름도(500)의 단계(502)를 구현할 수 있으며, 단계(504)는 흐름도(300)에 대한 부가적인 단계일 수 있다. 흐름도(500)는 다음과 같이 설명된다.
단계(502)에서는, 코드 에디터에서, 프로그램 코드에서 쿼리가 검출된다. 실시형태에 있어서, 쿼리 검출기(402)는, 개발자가 프로그램 코드를 입력 및 편집하는 코드 에디터(202)(도 2 참조)와 같은 코드 에디터에서 프로그램 코드(106)에서의 쿼리를 검출하도록 구성될 수 있다. 쿼리 검출기(402)는, 개발자가 코드를 입력하면, 개발자에 의한 요청(예컨대, "쿼리 검출" 버튼을 클릭하는 것에 의함)에 응답하여, 주기적으로, 및/또는 임의의 다른 원하는 시간 또는 기준으로, 개발자가 코드를 세이브할 때마다 프로그램 코드(106)에서 쿼리 용어 검색을 수행할 수 있다.
예를 들면, 도 6은, 예시적인 실시형태에 따른, 프로그램 코드(106)를 디스플레이하는 코드 에디터 윈도우(604)를 포함하는 컴퓨팅 장치(102)의 블럭도를 도시한다. 디스플레이(602)는, LCD(액정 디스플레이), CRT(음극선관) 디스플레이, LED(발광 다이오드) 디스플레이, 플라스마 디스플레이 등을 포함하는 임의의 적절한 타입의 디스플레이 장치 또는 스크린일 수 있다. 코드 에디터 윈도우(604)는, 코드 에디터(202)에 의해 디스플레이(602)에, 코드 에디터 윈도우(604)에 디스플레이된 프로그램 코드(106)와의 상호작용을 위한 그래픽 사용자 인터페이스(GUI)로서 디스플레이되는 윈도우(테두리 있는 또는 테두리 없는)이다. 코드 라인(606, 608, 및 610)은, 당업자에게 공지되어 있는 바와 같이, 각각 임의의 적절한 프로그래밍 언어로 이루어진 하나 이상의 코드 라인이다. 실시형태에 있어서, 쿼리 검출기(402)는 단계(502)에 따른 쿼리에 대하여, 코드 라인(606, 608, 및 610)을 포함하는 프로그램 코드(106)를 파싱한다.
단계(504)에서는, 복수의 쿼리를 기능적으로 균등한 쿼리 세트로 대체하기 위해 프로그램 코드를 자동으로 리팩토링하는 옵션이 코드 에디터에 제시된다. 실시형태에 있어서, 쿼리 최적화기(104)가 쿼리를 검출하고 프로그램 코드(106)에서 검출된 쿼리를 대체하기 위한 보다 효율적인 쿼리를 결정한 후에(본 명세서의 다른 어딘가에서 추가로 설명됨), 코드 에디터(202)는 결정된 보다 효율적인 쿼리를 수용 또는 거절하는 옵션을 개발자에게 제시할 수 있다. 예를 들면, 도 6에 도시된 바와 같이, 제안된 대체 쿼리 세트(612)는 개발자에 의한 수용 또는 거절을 위해 코드 에디터 윈도우(604)에 디스플레이될 수 있다. 제안된 대체 쿼리 세트(612)는 프로그램 코드(106)에서 검출된 쿼리 세트보다 더 효율적으로 되는 쿼리 최적화기(104)에 의해 결정된 제안된 쿼리 세트이다. 제안된 대체 쿼리 세트(612)를 개발자가 (예컨대, 버튼을 클릭하는 것에 의해) 수용하면, 코드 에디터(202)는 프로그램 코드(106)에서 검출된 쿼리 세트를 제안된 대체 쿼리 세트(612)로 대체해서 리팩토링된 프로그램 코드(108)를 생성하여 코드 에디터 윈도우(604)에 디스플레이할 수 있다. 제안된 대체 쿼리 세트(612)를 개발자가 거절하면, 프로그램 코드(106)에 대해서는 어떠한 변경도 이루어지지 않으며, 더 이상 제안이 디스플레이되지 않는다. 다른 실시형태에 있어서는, 제안된 대체 쿼리 세트(612)가 (개발자 수용을 요청하기 않고) 프로그램 코드(106)에서 자동으로 구현될 수 있다.
다른 실시형태에 있어서, 전술한 바와 같이, 쿼리 검출기(402)는 컴파일 동안 프로그램 코드(106)에서 쿼리를 검출하도록 구성될 수 있다. 예를 들면, 도 7은, 예시적인 실시형태에 따른, 컴파일 시간에 대체 쿼리 세트를 생성 및 구현하기 위한 프로세스를 제공하는 흐름도(700)를 도시한다. 실시형태에 있어서, 도 3의 흐름도(300)는 도 7의 흐름도(700)를 구현할 수 있다. 예를 들면, 흐름도(300)의 단계(302)는 흐름도(700)의 단계(702)를 구현할 수 있으며, 단계(704)는 흐름도(300)에 대한 부가적인 단계일 수 있다. 흐름도(700)는 다음과 같이 설명된다.
단계(702)에서는, 컴파일 동안 프로그램 코드에서 쿼리가 검출된다. 실시형태에 있어서, 쿼리 검출기(402)는, 프로그램 코드(106)가 컴파일될 때, 컴파일러(204)(도 2 참조)와 같은 컴파일러에서 (예컨대, 텍스트 매칭 등에 의해) 프로그램 코드(106)에서 쿼리를 검출하도록 구성될 수 있다.
단계(704)에서는, 복수의 쿼리가 기능적으로 균등한 쿼리 세트로 대체되는 프로그램 코드의 버전에 기초하여 컴파일러에서 컴파일된 코드가 생성된다. 실시형태에 있어서, 아래에서 더 상세하게 설명되는 바와 같이, 쿼리 최적화기(104)는 쿼리 검출기(402)에 의해 프로그램 코드(106)에서 검출된 쿼리에 대하여 보다 효율적인 대체 쿼리 세트를 생성하고, 프로그램 코드(106)의 복제에서 검출된 쿼리를 대체 쿼리 세트로 대체하여 리팩토링된 프로그램 코드(108)를 생성하고, 리팩토링된 프로그램 코드(108)를 컴파일함으로써 프로그램 코드(106)의 컴파일된 버전을 생성하도록 구성된다. 이렇게 해서, 코드 에디터(202)에서 프로그램 코드(106)의 후속 편집시에 개발자가 변경된 쿼리를 보지 못하도록, 프로그램 코드(106)를 변경하지 않고 보다 효율적으로 동작하는 쿼리 세트를 포함하는 컴파일된 기계 코드가 생성된다. 그러나, 다른 실시형태에 있어서는, (개발자 수용을 요청하지 않고) 컴파일 시간에 프로그램 코드(106)에서 대체 쿼리 세트가 자동으로 구현될 수 있다.
도 3의 흐름도(300)를 다시 참조하면, 단계(304)에서, 프로그램 코드에서 쿼리의 평가에 필요한 지연 연산이 연장된다. 실시형태에 있어서, 지연 연산 연장기(404)는 (프로그램 코드가 실행될 때) 쿼리 검출기(402)에 의해 프로그램 코드(106)에서 검출된 쿼리를 분석하고, 쿼리의 평가의 지연 연산을 연장하도록 구성된다. "지연 평가(lazy evaluation)"는 그 값이 필요해질 때까지 표현식의 평가를 늦추는 평가 기법을 의미한다. 지연 연산 연장기(404)는 쿼리를 수신하고 가능한 한 늦출 수 있는 만큼 그 연산자의 실행을 연기하도록 구성된다. 따라서, 지연 연산 연장기(404)는 프로그램 코드(106)를 분석해서 평가를 지연시킬 수 있는 쿼리를 결정하고, 해당 쿼리를 지연된 방식으로 수행하는 균등한 하나 이상의 쿼리 스테이트먼트를 결정한다.
예를 들어, 도 8은, 예시적인 실시형태에 따른, 프로그램 코드에서 쿼리 실행의 지연 연산을 연장시키기 위한 프로세스를 제공하는 흐름도(800)를 도시한다. 실시형태에 있어서, 지연 연산 연장기(404)는 흐름도(800)에 따라 동작한다. 흐름도(800)는 도 9를 참조하여 다음과 같이 설명된다. 도 9는, 예시적인 실시형태에 따른, 지연 연산 연장기(404)의 블럭도를 도시한다. 도 9에 도시된 바와 같이, 지연 연산 연장기(404)는 연장 가능한 쿼리 검출기(902) 및 쿼리 표현식 어셈블러(904)를 포함한다.
흐름도(800)는 단계(802)에서 시작한다. 단계(802)에서는, 평가-연장 가능한 하나 이상의 쿼리가 검출된다. 실시형태에 있어서, 지연 연산 연장기(404)의 연장 가능한 쿼리 검출기(902)는 프로그램 코드(106)를 분석해서 지연시킬 수 있는 쿼리를 결정하는데, 그 이유는 그 출력값이 프로그램 코드(106) 내의 현재의 장소에서는 필요 없고, 대신에 나중에 사용되기 때문이다. 이러한 실시형태에 있어서, 연장 가능한 쿼리 검출기(902)는, 특정 쿼리에 대하여, 프로그램 코드(106)에서 쿼리를 파싱해서, 쿼리의 값이 필요해지는 위치, 예를 들면 해당 값이 사용자에게 직접적으로 출력되는 위치 또는 사용자에의 출력을 생성하기 위해 표현식이 해당 값을 사용하는 위치에 있는 또는 그에 가까운 장소(예컨대, 표현식, 코드 라인 등)를 찾도록 구성된다.
실시형태에 있어서, 연장 가능한 쿼리 검출기(902)는 프로그램 코드에서 뿐만 아니라 비-쿼리 프로그램 코드 동작에서 쿼리 검출기(402)에 의해 검출된 쿼리를 포함하는 검출된 쿼리(906)의 각 쿼리에 대하여 Operation Tree(동작 트리)와 같은 데이터 구조를 구축하는 것으로 시작한다. 연장 가능한 쿼리 검출기(902)는 동일한 Operation Tree 아래에 다수의 관련 쿼리를 함께 나열한다. 이러한 Operation Tree는 그래프로 표현될 수 있으며, 여기서 각 노드(node)는 데이터 소스로부터 실제 데이터를 페치(예컨대, 데이터에 대한 동작을 수행)하지 않는 쿼리의 매칭 쿼리 연산자를 나타내고, Operation Tree의 각 리프(leaf)는 데이터 소스로부터 실제 데이터를 페치하는 쿼리의 쿼리 연산자를 나타낸다. 연장 가능한 쿼리 검출기(902)는 프로그램 코드 내의 각 변수/쿼리 연산자/메소드/코드 스테이트먼트를 따르고 데이터를 Operation Tree에 재귀적으로 추가함으로써 Operation Tree를 구축한다. 따라서, 연장 가능한 쿼리 검출기(902)는 쿼리들을 수신해서 관련 트리로 변환한다.
예를 들면, 일 실시예에 있어서, 연장 가능한 쿼리 검출기(902)는 하기의 프로그램 코드를 분석해서 그 평가를 지연시킬 수 있는 하나 이상의 LINQ 쿼리를 결정할 수 있다:
var 1stOfPrimes = ReturnListOfPrimes(1000);
var 1stOrdered = 1stOfPrimes.OrderBy(x => x).ToList();
Console.WriteLine("Smallest prime in range is: {0}", 1stOrdered.First());
이 예시적인 프로그램 코드는 OrderBy, ToList, 및 First의 검출된 LINQ 쿼리를 포함한다. 연장 가능한 쿼리 검출기(902)는 하기의 Operation Tree를 지정한다:
1stOfPrimes - ReturnListOfPrimes - OrderBy - ToList - First
여기서, 1stOfPrimes는 Operation Tree의 최상위 레벨 요소이고, First는 Operation Tree의 최하위 레벨 요소이다. 이 실시예에 있어서, 연장 가능한 쿼리 검출기(902)는 OrderBy 및 ToList를 연장 가능한 것(지연된 실행)으로 나타내는데, 그 이유는 1stOrdered의 값은 즉시 필요한 것이 아니고(후속 코드 라인에 대한 입력임), First는 리프여서 연장 가능한 것으로 나타나 있지 않기 때문이다.
다른 실시예에 있어서, 연장 가능한 쿼리 검출기(902)는 하기의 프로그램 코드를 분석해서 그 평가를 지연시킬 수 있는 하나 이상의 LINQ 쿼리를 결정할 수 있다:
var 1stOfPrimes = ReturnListOfPrimes(1000);
var 1stOrdered = 1stOfPrimes.OrderBy(x => x).ToList();
var LastOrdered = 1stOfPrimes.OrderByDescending(x => x).ToList();
Console.WriteLine("Smallest prime in range is: {0}", 1stOrdered.First());
Console.WriteLine("Biggest prime in range is: {0}", LastOrdered.First());
이 예시적인 프로그램 코드는 OrderBy, ToList, OrderByDescending, ToList, First, 및 First의 검출된 LINQ 쿼리를 포함한다. 연장 가능한 쿼리 검출기(902)는 하기의 제1 및 제2 브랜치를 갖는 Operation Tree를 지정한다:
1stOfPrimes - ReturnListOfPrimes - OrderBy - ToList - First
1stOfPrimes - ReturnListOfPrimes - OrderByDescending - ToList - First
이 Operation Tree에서, 공통의 1stOfPrimes 요소는 최상위 레벨 요소이고, OrderBy 노드와 OrderByDescending 노드는 1stOfPrimes 요소에 연결된 공통의 ReturnListOfPrimes 노드로부터 분기된다. 이 실시예에 있어서, 연장 가능한 쿼리 검출기(902)는 제1 브랜치에서 OrderBy 및 ToList를, 그리고 제2 브랜치에서 OrderByDescending 및 ToList를 연장 가능한 것(지연된 실행)으로 나타내는데, 그 이유는 1stOrdered의 값 및 LastOrdered의 값은 즉시 필요한 것이 아니고(후속 코드 라인에 대한 입력임), 제1 브랜치에서의 First 및 제2 브랜치에서의 First는 모두 리프여서 연장 가능한 것으로 나타나 있지 않기 때문이다.
또 다른 실시예에 있어서, 연장 가능한 쿼리 검출기(902)는 하기의 예시적인 프로그램 코드를 분석해서 그 평가를 지연시킬 수 있는 하나 이상의 LINQ 쿼리를 결정할 수 있다: 이 예시적인 프로그램 코드는 2 내지 1000 범위에서 마지막 소수를 찾도록 지정된다:
public List<int> ReturnListOfPrimes(int range)
{
return Enumerable.Range(2, range).Where(IsPrime).ToList();
}
public Dictionary<int, double.ReturnDictionaryOfPower(List<int> 1stOflnts, int pow)
{
return 1stOfInts.ToDictionary(x => x, x => Math.Pow(x, pow));
}
public void MainMethod()
{
var 1stOfPrimes = ReturnListOfPrimes(1000);
var power = ReturnDictionaryOfPower(1stOfPrimes, 2);
var lastItem = power.Last();
Console.WriteLine("Last prime : {0}, {1}", lastItem,Key, lastltem.Value);
}
이 실시예에 있어서, 제3 메소드("MainMethod")는 이전의 두 메소드("ReturnListOfPrimes" 및 "ReturnDictionaryOfPower")를 참조한다. 제1 메소드는 Range, Where, 및 ToList의 쿼리 컴포넌트를 포함한다. 제2 메소드는 ToDictionary 쿼리 컴포넌트를 포함한다. 제3 메소드는 Last 쿼리 컴포넌트를 포함한다. 쿼리 검출기(402)는 3가지 메소드에서 이들 쿼리를 검출한다(도 3의 단계(302) 참조). 도 9에 도시된 바와 같이, 연장 가능한 쿼리 검출기(902)는 프로그램 코드에서 쿼리 검출기(402)에 의해 검출되는 쿼리를 포함하는 검출된 쿼리(906)를 수신한다. 실시형태에 있어서, 연장 가능한 쿼리 검출기(902)는 (예컨대, 간략화를 위해 여기서는 도시되지 않은 Operation Tree를 생성함으로써) 검출된 쿼리(906) 및 프로그램 코드(106)를 분석해서 검출된 쿼리가 프로그램 코드(106)에서 지연되어 평가될 수 있는지의 여부를 결정한다.
특히, 제3 메소드는 4개의 코드 라인을 포함한다. 제3 메소드가 실행되는 경우, 제1 라인은 제1 값에 대하여 제1 메소드에 액세스하고, 제2 라인은 제2 값(제1 값에 기초함)에 대하여 제2 메소드에 액세스하고, 제3 라인은 제2 값과 관련된 쿼리(Last)를 수행해서 제3 값을 생성하고, 제4 라인은 제3 값에 기초하여 출력을 생성한다. 따라서, 연장 가능한 쿼리 검출기(902)는, 즉시 필요하지 않지만(예컨대, 사용자에게 또는 데이터베이스에 출력되지 않음) 대신에 후속 코드 라인에 입력으로서 사용되는 값을 제1 및 제2 라인이 생성하는 것으로 결정하고, 그에 따라 제1 및 제2 라인에서 쿼리의 평가가 지연될 수 있다. 도 9에 도시된 바와 같이, 연장 가능한 쿼리 검출기(902)는, 연장 가능한 쿼리 검출기(902)에 의해 연장 가능한 것으로 결정된 쿼리를 나타내는 연장 가능한 쿼리(908)를 출력한다.
도 8에서의 흐름도(800)를 다시 참조하면, 단계(804)에서는, 하나 이상의 평가-연장 가능한 쿼리를 포함하는 단일의 쿼리 표현식이 형성된다. 실시형태에 있어서, 쿼리 표현식 어셈블러(904)는 연장 가능한 쿼리(908)를 수신하고, (단계(802)에서) 평가-연장 가능한 것으로 결정된 쿼리를 포함하는 단일의 쿼리 표현식을 생성한다. 도 9에 도시된 바와 같이, 쿼리 표현식 어셈블러(904)는 프로그램 코드에 대하여 연장 가능한 쿼리 검출기(902)에 의해 결정된 평가-연장 가능한 쿼리를 결합하는 단일의 쿼리 표현식을 포함하는 수정된 쿼리(910)를 생성한다. 특정 프로그램 코드에 대하여, 쿼리 표현식 어셈블러(904)는 평가-연장 가능한 쿼리를 결합하는 하나 이상의 상기와 같은 쿼리 표현식을 생성할 수 있다. 개별 쿼리들을 단일의 쿼리 표현식에 결합하기 위해 쿼리 표현식 어셈블러(904)에 의해 수행되는 기술은 당업자에게는 공지되어 있으며 특정 쿼리 언어에 의존할 것이다. 일 실시예에 있어서, 표현식에서의 변수는 다른 어딘가에서 사용된 표현식으로 대체되어 변수를 결정할 수 있다.
예를 들면, 상기의 예시적인 프로그램 코드와 관련하여, 쿼리 표현식 어셈블러(904)는 제1 및 제2 메소드의 LINQ 쿼리 및 제3 메소드의 처음 3개의 라인을 포함하는 "var lastItem"에 대한 하기의 단일의 쿼리 표현식을 생성할 수 있다:
Public void MainMethod()
{
var lastltem = Enumerable.Range(2, 1000).Where(IsPrime).ToList().ToDictionary(x => x, x => Math.Pow(x, pow)).Last();
Console.WriteLine("Last prime : {0}, {1}", lastltem.Key, lastltem.Value);
}
상기에 도시된 바와 같이, "var lastItem" 표현식은 3가지 메소드 모두의 Range, Where, ToList, ToDictionary, 및 Last 쿼리 컴포넌트를 포함하는 종합 쿼리 컴포넌트 세트이고, 상기에 추가 도시된 원래의 프로그램 코드에 대하여 기능적으로 균등하다. 이렇게 해서, Range, Where, ToList, ToDictionary, 및 Last 쿼리 컴포넌트는, "lastItem" 출력이 제시되기 직전에만 평가되는 "MainMethod"가 실행될 경우에 지연 평가된다.
실시형태에 있어서, 쿼리 표현식 어셈블러(904)는 쿼리에 대하여 연장 가능한 쿼리 검출기(902)에 의해 생성된 Operation Tree를 수신하는 것에 의해 동작할 수 있고, Operation Tree 데이터 구조에서는 리프가 아닐 경우 쿼리 실행이 명시적으로 "불능(disabled)"으로 되게 하는 쿼리 연산자를 지시/표시한다는 점에 유의한다. 즉, 쿼리 표현식 어셈블러(904)는, 쿼리 실행이 리프에 대해서만 일어나서 쿼리의 지연 연산을 가장 늦은 시점까지 연장시키는 방식으로 Operation Tree를 표시할 수 있다.
도 3에서의 흐름도(300)를 다시 참조하면, 단계(306)에서는, 복수의 쿼리에 대하여 보다 효율적으로 평가하는 복수의 쿼리에 대한 기능적으로 균등한 쿼리 세트를 생성하기 위해 복수의 규칙을 포함하는 규칙 세트가 쿼리 컴포넌트에 적용된다. 실시형태에 있어서, 균등한 쿼리 세트 생성기(406)(도 4 참조)는 검출된 쿼리(도 1의 쿼리(110))를 분석하고, 검출된 쿼리에 기능적으로 균등하되, 검출된 쿼리의 원래의 구성보다 더 효율적으로 실행하는 대안적인 쿼리 세트(도 1의 대체 쿼리(112))를 생성하도록 구성된다. 예를 들면, 균등한 쿼리 세트 생성기(406)는 대체 쿼리(112)를 생성해서, 프로그램 코드에 의해 사용되지 않는 데이터를 검색하는 것을 회피하고, 잉여 데이터 검색을 행하는 것을 회피하고, 출력에 영향을 미치지 않는 데이터에 대한 동작을 수행하는 것을 회피하는 등이 가능하다. 이러한 효율을 높이기 위해, 균등한 쿼리 세트 생성기(406)는 쿼리 컴포넌트를 제거, 쿼리 컴포넌트를 추가, 및/또는 쿼리 컴포넌트를 수정할 수 있다.
균등한 쿼리 세트 생성기(406)는 그 기능을 다양한 방식으로 수행할 수 있다. 예를 들면, 도 10은, 예시적인 실시형태에 따른, 프로그램 코드에 대한 대체 쿼리 세트를 결정하기 위해 규칙 세트를 적용하기 위한 프로세스를 제공하는 흐름도(1000)를 도시한다. 균등한 쿼리 세트 생성기(406)는 실시형태에 있어서 흐름도(1000)에 따라 동작할 수 있다. 흐름도(1000)는 도 11을 참조하여 다음과 같이 설명된다. 도 11은, 예시적인 실시형태에 따른, 균등한 쿼리 세트 생성기(406)의 블럭도를 도시한다. 도 11에 도시된 바와 같이, 균등한 쿼리 세트 생성기(406)는 콘텍스트 결정기(1104) 및 규칙 선택기(1106)를 포함하고, 규칙 세트(216)를 포함하는 스토리지(210)와 통신 가능하게 연결된다.
흐름도(1000)는 단계(1002)에서 시작한다. 단계(1002)에서, 다수의 쿼리 컴포넌트들 사이의 공통의 논리적 콘텍스트가 결정된다. 도 11에 도시된 바와 같이, 콘텍스트 결정기(1104)는 쿼리 검출기(402)에 의해 검출되며 지연 연산 연장기(404)에 의해 지연 평가하도록 재기입되는 쿼리인 수정된 쿼리(910)를 수신한다. 콘텍스트 결정기(1104)는 공통의 논리적 콘텍스트에 대한 수정된 쿼리(910)를 분석한다. 예를 들어, 콘텍스트 결정기(1104)는 단일의 쿼리 표현식일 수 있는 수정된 쿼리(910)를 쿼리 컴포넌트들의 세트로 분해하고, 해당 쿼리 컴포넌트들을 서로 비교할 수 있다. 유사한 또는 관련된 타입의 쿼리 컴포넌트들이 검출되면(예컨대, OrderBy 및 OrderByDescending 등), 쿼리 컴포넌트들 사이의 공통의 논리적 콘텍스트가 확립된다. 도 11에 도시된 바와 같이, 콘텍스트 결정기(1104)는 콘텍스트상 연관되는 수정된 쿼리(910)의 쿼리 컴포넌트들의 그룹을 포함하는 콘텍스트상 연관된 쿼리(1114)를 출력한다.
단계(1004)에서는, 공통의 논리적 콘텍스트에 대응하는 규칙 세트의 규칙이 다수의 쿼리 컴포넌트에 적용된다. 도 11에 도시된 바와 같이, 규칙 선택기(1106)는 콘텍스트상 연관된 쿼리(1114)를 수신한다. 규칙 선택기(1106)는 제1 규칙(1108), 제2 규칙(1110) 등과 같은 규칙 세트(216)의 규칙들의 적용 가능성에 대하여 콘텍스트상 연관된 쿼리(1114)를 분석한다. 규칙 세트(216)의 각 규칙은 상응하는 공통의 콘텍스트의 쿼리 컴포넌트에 적용되도록, 또한 콘텍스트상 연관된 쿼리의 쿼리 컴포넌트를 추가, 수정, 및/또는 삭제하는 등에 의해 쿼리 컴포넌트를 보다 양호한 효율로 재기입하도록 구성된다. 임의의 수의 다양한 규칙이 규칙 세트(216)에 포함될 수 있다. 규칙 세트(216)에 포함될 수 있는 규칙의 7가지 실시예가 예시의 목적으로 다음과 같이 설명된다. 각 규칙은 예시적인 규칙 명칭, 개요, 및 규칙의 기능/역학의 설명으로 아래에서 설명된다:
(A) 규칙 명칭: OrderBy Minimizer(OrderBy 최소화기)
개요: 불필요한 OrderBy 동작을 배제하는 데 사용됨.
규칙 역학: OrderBy 최소화기는 프로그램 코드에서 발견된 OrderBy 연산자 목록을 확인하고, 프로그램 코드에서 그 결과가 사용되지 않는 임의의 OrderBy 연산자를 찾는다(여기서, "사용된"은 OrderBy 연산자에 의해 수행되는 순서가 후속 표현식 또는 메소드에 의존되지 않음, 즉 그에 의해 출력 또는 요구되지 않음을 의미한다). 이렇게 발견된 OrderBy 연산자에 대하여, OrderBy 최소화기는 해당 OrderBy 연산자를 프로그램 코드로부터 잉여로서 삭제하고, 코드 라인 스테이트먼트의 삭제에 의해 영향을 받은 프로그램 코드의 임의의 다른 라인들을 재기입(예컨대, 변수 명칭을 대체하는 등)한다.
(B) 규칙 명칭: ToCurrent collection(수집)
개요: 하기의 "ToCurrent" 타입의 연산자― 'ToList", 'ToDictionary' 등 ―를 연속으로 복수 회 수행하는 컴파일된 쿼리의 경우에 사용됨. 이들 ToCurrent 연산자 각각은 비용이 들며, 그 시퀀스에 있어서, 시퀀스의 마지막 연산자를 제외하고는 잉여이다.
규칙 역학: 하기의 패턴이 검출된다 - 종합 쿼리 컴포넌트 세트에서 상기 연산자들 중 2개 이상(예컨대, 흐름도(800)의 단계(804)에서 생성된 다수의 쿼리 컴포넌트를 포함하는 단일의 쿼리 표현식). ToCurrent 타입 연산자들은 모두 (논리를 변경하지 않고) 하나를 제외하고는 종합 쿼리 컴포넌트 세트로부터 폐기된다.
(C) 규칙 명칭: DataRetrival Minimizer(DataRetrival 최소화기) - 타입 1
개요: 쿼리 연산자에 의해 요청된 다량의 데이터가 궁극적으로 사용되지 않을 때 사용되고, 그에 따라 데이터 검색이 안전하게 감소되거나 또는 전혀 수행되지 않을 수 있음.
규칙 역학: 하기의 패턴이 검출된다 - 쿼리 연산자가 데이터를 검색하고, 검색된 데이터가 분류되고, 분류된 데이터의 최초 또는 최종 요소만이 사용된다. 이 쿼리를, 데이터로부터 제각기 최소값 요소 또는 최대값 요소 검색만을 수행하는 쿼리로 대체한다.
(D) 규칙 명칭: DataRetrival Minimizer - 타입 2
개요: 쿼리 연산자에 의해 요청된 다량의 데이터가 궁극적으로 사용되지 않을 때 사용되고, 그에 따라 데이터 검색이 안전하게 감소되거나 또는 전혀 수행되지 않을 수 있음.
규칙 역학: 하기의 패턴이 검출된다 - 쿼리 연산자가 데이터를 검색하고, 해당 데이터의 최초 또는 최종 요소만이 사용된다. 이 쿼리를, 데이터로부터 임의의 랜덤 데이터 요소만을 검색하는 쿼리로 대체한다.
(E) 규칙 명칭: DataRetrival Minimizer - 타입 3
개요: 단일의 매우 큰 데이터 엔티티가 검색되지만 해당 데이터의 일부만이 궁극적으로 사용되는 경우에 사용됨.
규칙 역학: 하기의 패턴이 검출된다 - 큰 데이터세트(예컨대, XML 데이터, JSON 데이터, 전체 파일 등)일 가능성이 있는 데이터가 요청되지만, 검색된 데이터의 서브세트만이 사용된다. 이 쿼리를, 데이터의 서브세트만을 검색하는 쿼리로 대체한다.
"DataRetrival Minimizer - 타입 3" 규칙의 적용 가능성의 실시예들은 다음을 포함한다:
(1) 파일의 검색을 요청하지만, 궁극적으로는 (파일의 내용을 사용하기보다는) 파일의 메타데이터만을 사용해서 파일의 크기를 결정한다. 이 규칙은 쿼리 연산자를 사용해서 전체 파일을 검색하는 것을 회피하고, 대신 쿼리 연산자를 사용해서 파일 메타데이터(전체 파일보다 사이즈가 작은 몇몇 팩터일 수 있음)를 검색하는 데 사용될 수 있다.
(2) 단일의 데이터베이스 라인 또는 엔티티를 요청하고, 궁극적으로는 해당 라인/엔티티의 단일의 칼럼만을 사용한다. 전체 DB 라인/엔티티는 매우 클 수 있다. 이 규칙은 쿼리 연산자를, 원하는 칼럼만을 검색하는 다른 쿼리 연산자로 대체하는 데 사용될 수 있다.
(F) 규칙 명칭: Enumeration Iteration Minimizer(열거 반복 최소화기)
개요: 쿼리가 단일의 값을 이용하고 있어서, 메모리에 전체 데이터 구조를 구축할 필요가 없을 경우에 사용됨.
규칙 역학: 하기의 패턴이 검출된다 - "ToCurrent" 타입 연산자 다음에 단일의 값만이 사용된다. 최초의 것을 최종의 것으로 전환한다.
(G) 규칙 명칭: Reversing Enumeration When Using Last() Operator (Last() 연산자를 사용할 경우의 열거 역전)
개요: 최종 항목만이 필요해서, 시작부터 끝까지의 열거가 비효율적일 경우에 사용됨. 역순으로 열거함으로써 성능을 향상시킨다.
규칙 역학: 하기의 패턴이 검출된다 - "ToCurrent" 타입 연산자 다음에 최종 값만이 사용된다. 열거를 그 "역전(reverse)" 매칭 연산자로 대체하거나 및/또는 열거 범위 값들을 역전시키고, 연산자 "Last"를 연산자 "First"로 대체한다.
추가적인 예시로서, 설명을 용이하게 하기 위해 아래에서 반복되는, 위에서 생성된 단일의 쿼리 표현식에 대하여 예시적인 규칙이 적용된다:
var lastltem = Enumerable.Range(2, 1000).Where(IsPrime).ToList().ToDictionary(x => x, x => Math.Pow(x, pow)).Last();
위에서 설명한 바와 같이, 이 기능적으로 균등한 종합 쿼리 컴포넌트 세트를 생성하기 위해 지연 평가가 연장되었다(흐름도(300)의 단계(304); 지연 연산 연장기(404)). 또한, 이 단일의 쿼리 표현식의 효율은 규칙 세트(216)의 규칙들을 적용함으로써 더 향상될 수 있다(흐름도(300)의 단계(306); 균등한 쿼리 세트 생성기(406)).
예를 들면, ToCurrent Collection Minimizer(ToCurrent 수집 최소화기) 규칙(상기 규칙 (B))이 적용될 수 있다. 그러한 경우, 콘텍스트 결정기(1104)는 공통의 논리적 콘텍스트를 확립하는 상기 쿼리 스테이트먼트에서 ToList 및 ToDictionary 연산자를 검출한다. 규칙 선택기(1106)는, 규칙 세트(216)에서 이 공통의 논리적 콘텍스트와 연관되는 ToCurrent 수집 최소화기 규칙을 적용한다. ToCurrent 수집 최소화기 규칙은 쿼리 스테이트먼트로부터 최종 연산자를 제외하고는 모든 ToCurrent 연산자를 제거해서, 하기의 보다 효율적이지만 기능적으로는 균등한 쿼리 표현식을 생성한다:
var lastItem = Enumerable.Range(2, 1000).Where(IsPrime).ToDictionary(x => x, x => Math.Pow(x, pow)).Last();
또한, Last()/First() 연산자를 ToCurrent 스테이트먼트(이 경우에는 ToDictionary)보다 앞에 놓이도록 재배치하는 Enumeration Iteration Minimizer(열거 반복 최소화기) 규칙(상기 규칙 (F))이 사용될 수 있다. 이렇게 해서, 최초 항목이 발견될 때까지 쿼리 스테이트먼트가 반복되므로, 모든 데이터 구조가 채워지지 않는다. 대신에, ToDictionary 연산자는 단일의 엔티티에 대하여 동작할 것이다. 따라서, 콘텍스트 결정기(1104)는 상기 쿼리 스테이트먼트에서 Last 연산자로 이어지는 ToDictionary 연산자를 결정해서 공통의 논리적 콘텍스트를 확립한다. 규칙 선택기(1106)는 이 공통의 논리적 콘텍스트와 연관되는 Enumerable 반복 규칙을 적용한다. Enumerable 반복 규칙은 Last 연산자를 ToDictionary 연산자 앞에 재배치해서, 하기의 보다 효율적이지만 기능적으로는 균등한 쿼리 표현식을 생성한다:
var lastItem = Enumerable.Range(2, 1000).Where(IsPrime).Last().ToDictionary(x => x, x => Math.Pow(x, pow))
또한, 최종 항목을 탐색하는 순서를 역전시키는 Reversing Enumeration When Using Last() Operator (Last() 연산자를 사용할 경우의 열거 역전)(상기 규칙 (G))가 사용될 수 있다. 이는, 최종 항목을 찾을 때 역순으로 진행하는 것이 훨씬 더 효율적이기 때문이다. 따라서, 이 규칙은 숫자를 역순으로 열거하고 최종 요소가 아닌 최초 요소를 취한다. 따라서, 콘텍스트 결정기(1104)는 상기 쿼리 스테이트먼트에서 ToDictionary 연산자에 선행하는 Last 연산자를 결정해서 공통의 논리적 콘텍스트를 확립한다. 규칙 선택기(1106)는 이 공통의 논리적 콘텍스트와 연관되는 Enumerable 규칙의 Optimizing(최적화)을 적용한다. Enumerable 규칙의 Optimizing은 Last 연산자를 First 연산자로 대체해서, 하기의 보다 효율적이지만 기능적으로는 균등한 쿼리 표현식을 생성한다:
var lastItem = Enumerable.Range(1000, 2).Where(IsPrime).First().ToDictionary(x => x, x => Math.Pow(x, pow))
이 최종 쿼리는 1100에서 시작하는 정수에 대하여 하향으로 반복되어서, 그 안에서 첫 번째 소수를 찾고, 더 위에 도시된 원래의 3가지 메소드 버전보다 훨씬 더 효율적으로(예컨대, 데이터 저장을 위해 더 적은 메모리를 사용하고, CPU를 더 잘 사용함) 이를 수행한다.
실시형태에 있어서, 균등한 쿼리 세트 생성기(406)는 단일의 기능적으로 균등한 쿼리 세트를 결정하기 위해 더 이상 규칙이 적용될 수 없을 때까지 규칙 세트(216)의 규칙들을 순차적으로 적용할 수 있다는 점에 유의한다. 다른 실시형태에 있어서, 기능적으로 균등한 쿼리 세트들의 다수의 상이한 세트가 균등한 쿼리 세트 생성기(406)에 의해 결정될 수 있으며, 각각의 결정된 세트는 프로그램 코드(106)에서 검출된 쿼리를 대체하기 위해 적용 가능한 것이다. 이러한 실시형태에 있어서, 규칙 선택기(1106)는 개발자가 기능적으로 균등한 쿼리 세트들 중 하나를 수동으로 선택해서 프로그램 코드(106)에 적용하여 리팩토링된 프로그램 코드(108)를 생성하는 것을 가능하게 할 수 있다. 대안으로서, 규칙 선택기(1106)는 선택을 자동으로 행할 수 있다.
예를 들면, 도 12는, 예시적인 실시형태에 따른, 복수의 기능적으로 균등한 후보 쿼리 세트를 생성하고 그 중에서 선택하기 위한 프로세스를 제공하는 흐름도(1200)를 도시한다. 실시형태에 있어서, 규칙 선택기(1106)는 흐름도(1200)를 수행할 수 있다. 흐름도(1200)는 다음과 같이 설명된다.
단계(1202)에서, 규칙 세트의 규칙들의 복수의 조합의 쿼리 컴포넌트에의 적용이 평가되어, 복수의 기능적으로 균등한 후보 쿼리 세트를 생성한다. 실시형태에 있어서, 규칙 선택기(1106)는 서로 다른 조합 및/또는 순서의 규칙들을 프로그램 코드에 적용해서 기능적으로 균등한 상이한 쿼리 세트들을 생성할 수 있다. 예를 들어, 특정 프로그램 코드는 OrderBy, GroupBy, 및 ThenBy 쿼리 컴포넌트를 쿼리 표현식에 포함할 수 있다. 규칙 선택기(1106)는 OrderBy 및 GroupBy를 제1 쿼리 연산자로 대체하는 제1 규칙을 쿼리 표현식에 적용해서 기능적으로 균등한 제1 쿼리 세트를 생성하고 나서, GroupBy 및 ThenBy를 제2 쿼리 연산자로 대체하는 제2 규칙을 쿼리 표현식에 적용해서 기능적으로 균등한 제2 쿼리 세트를 생성할 수 있다. 이렇게 해서, 동일한 쿼리 표현식에 대하여, 각각 그 자신의 효율 특성을 가질 수 있는 2개의 기능적으로 균등한 쿼리 세트가 생성된다. 쿼리 표현식에서의 특정 쿼리 연산자 및 규칙 세트(216)에서 이용 가능한 규칙에 따라, 동일한 쿼리 표현식에 대하여 임의의 수의 기능적으로 균등한 쿼리 세트가 생성될 수 있다.
단계(1204)에서는, 복수의 기능적으로 균등한 후보 쿼리 세트 중에서 최대 효율 이득을 갖는 기능적으로 균등한 후보 쿼리 세트가, 생성된 기능적으로 균등한 쿼리 세트로 되도록 선택된다. 상기 실시예에 있어서, 규칙 선택기(1106)는 개발자가 기능적으로 균등한 제1 및 제2 쿼리 세트 중 어느 것을 프로그램 코드에 리팩토링할지를 선택할 수 있게 하거나, 또는 제1 및 제2 쿼리 컴포넌트 중 어느 것을 프로그램 코드에 리팩토링할지를 자동으로 선택할 수 있다. 예를 들어, 규칙 선택기(1106)는 기능적으로 균등한 가용 쿼리 세트들 중 최대 효율을 갖는 세트를 선택할 수 있다. 이 최대 효율은 다양한 방식으로 결정될 수 있다.
예를 들면, 규칙 세트(216) 내의 각 규칙은 규칙에 대한 상대 효율을 나타내는 상응하는 효율 값(예컨대, 0~1의 수)을 가질 수 있다. 규칙 선택기(1106)는 기능적으로 균등한 쿼리 세트의 전체 효율 값을 결정하기 위해 기능적으로 균등한 특정 쿼리 세트에 사용된 각 규칙에 대한 효율 값들을 조합하고 나서, 기능적으로 균등한 모든 쿼리 세트에 대한 전체 효율 값들과 비교해서 최대 효율을 갖는 것을 결정할 수 있다. 다른 실시형태들에 있어서, 규칙 선택기(1106)는 최대 효율을 다른 방식들로 결정할 수 있다.
실시형태에 있어서, 흐름도(1200)는 컴파일 시간에 또는 실행 시간에 수행될 수 있다는 점에 유의한다. 예를 들면, 실행 시간에, 실행 가능한 버전의 프로그램 코드(106) 또는 리팩토링된 프로그램 코드(108)(예컨대, 기계 코드(222))가 실행 엔진(예컨대, 운영 체제 등에서)에 의해 실행될 수 있다. 실행 시간 실시형태에 따르면, 기능적으로 균등한 최선의 후보 쿼리 세트가 실제 시스템 상태를 고려하는 방식으로 결정될 수 있다. 이는, 하나 이상의 기능적으로 균등한 후보 쿼리 세트에 의해 제공되는 효율 이득이 적어도 부분적으로 실행 시간에 실행 조건에 의존할 수 있기 때문이다. 예를 들면, 실행 시간에, 실행 가능한 버전의 프로그램 코드가 실행될 수 있고, 특정 쿼리가 실행될 경우에는, 프로그램 코드에 의해 규칙 선택기(1106)에 대한 호출이 이루어져서(예를 들면, 실행 엔진에 의해 구현될 수 있음), 기능적으로 균등한 어느 후보 쿼리 세트를 실행 시간 조건(예컨대, 네트워크 조건, 가용 처리 대역폭, 가용 처리 능력 등)에 기초하여 구현할지를 선택할 수 있다.
예를 들어, 통상 실행 시간 조건(예컨대, 완전한 네트워크 가용성 등)에 있어서는, 기능적으로 균등한 후보 쿼리 세트 A가 기능적으로 균등한 쿼리 세트 B보다 더 효율적일 수 있다. 그러나, 특정한 실행 시간 동안, 느린 인터넷 접속 등과 같이, 원치 않는 무엇인가가 기능적으로 균등한 쿼리 세트 A의 쿼리 컴포넌트의 성능을 방해할 수 있다. 결국, 그러한 실행 시간 조건(예컨대, 네트워크 응답이 나쁨)에 있어서는, 기능적으로 균등한 쿼리 세트 B가 (쿼리 세트 A보다는) 효율이 더 좋을 수 있으며, 그에 따라 해당 특정한 실행 시간 동안 실행되는 규칙 선택기(1106)에 의해 선택될 수 있다. 따라서, 실시형태들에 있어서, 규칙 선택기(1106)는 실행 시간에 기능적으로 균등한 후보 쿼리 세트의 선택이 가능하도록 구성될 수 있다.
규칙 세트(216)에는, 수동 또는 자동을 포함하여, 임의의 방식으로 규칙들이 추가될 수 있다는 점에 유의한다. 예를 들어, 개발자는, 특정한 효율 문제를 개발자가 알게 된 또는 알고 있는 쿼리로 해결하려는 요망을 포함하여, 개발자의 경험에 기초하여 규칙을 규칙 세트(216)에 추가할 수 있다. 다른 실시형태에 있어서, 자동 메커니즘은 머신 러닝을 포함하는 자동 메커니즘을 포함하여, 새로운 규칙을 생성할 수 있다. 머신 러닝은 실행 시간 동안 상대 효율에 대하여 균등한 쿼리들을 샘플링하고, 그에 기초하여 해당 상황에 대하여 가장 효율적인 쿼리를 자동으로 선택하기 위해 사용될 수 있다. 규칙에 의해 제공되는 각각의 쿼리 최적화에 대하여, 쿼리 최적화기(104)는 쿼리 최적화에 의한 영향의 상세한 분석을 유지할 수 있다.
III. 예시적인 모바일 및 고정식 장치 실시형태
컴퓨팅 장치(102), 쿼리 최적화기(104), 컴파일러(204), 개발 애플리케이션(200), 소스 코드 에디터(202), 컴파일러(204), 디버거 도구(206), 쿼리 검출기(402), 지연 연산 연장기(404), 균등한 쿼리 세트 생성기(406), 연장 가능한 쿼리 검출기(902), 쿼리 표현식 어셈블러(904), 콘텐츠 결정기(1104), 규칙 선택기(1106), 흐름도(300), 흐름도(500), 흐름도(700), 흐름도(800), 흐름도(1000), 및 흐름도(1200)는 하드웨어로, 또는 소프트웨어 및/또는 펌웨어와 결합된 하드웨어로 구현될 수 있다. 예를 들어, 쿼리 최적화기(104), 컴파일러(204), 개발 애플리케이션(200), 소스 코드 에디터(202), 컴파일러(204), 디버거 도구(206), 쿼리 검출기(402), 지연 연산 연장기(404), 균등한 쿼리 세트 생성기(406), 연장 가능한 쿼리 검출기(902), 쿼리 표현식 어셈블러(904), 콘텐츠 결정기(1104), 규칙 선택기(1106), 흐름도(300), 흐름도(500), 흐름도(700), 흐름도(800), 흐름도(1000), 및/또는 흐름도(1200)는 하나 이상의 프로세서에서 실행되도록 구성된 컴퓨터 프로그램 코드/명령어로서 구현되고, 컴퓨터 판독 가능한 저장 매체에 저장될 수 있다. 대안으로서, 컴퓨팅 장치(102), 쿼리 최적화기(104), 컴파일러(204), 개발 애플리케이션(200), 소스 코드 에디터(202), 컴파일러(204), 디버거 도구(206), 쿼리 검출기(402), 지연 연산 연장기(404), 균등한 쿼리 세트 생성기(406), 연장 가능한 쿼리 검출기(902), 쿼리 표현식 어셈블러(904), 콘텐츠 결정기(1104), 규칙 선택기(1106), 흐름도(300), 흐름도(500), 흐름도(700), 흐름도(800), 흐름도(1000), 및/또는 흐름도(1200)는 하드웨어 논리/전기 회로로 구현될 수 있다.
예를 들면, 실시형태에 있어서, 쿼리 최적화기(104), 컴파일러(204), 개발 애플리케이션(200), 소스 코드 에디터(202), 컴파일러(204), 디버거 도구(206), 쿼리 검출기(402), 지연 연산 연장기(404), 균등한 쿼리 세트 생성기(406), 연장 가능한 쿼리 검출기(902), 쿼리 표현식 어셈블러(904), 콘텐츠 결정기(1104), 규칙 선택기(1106), 흐름도(300), 흐름도(500), 흐름도(700), 흐름도(800), 흐름도(1000), 및/또는 흐름도(1200)의 하나 이상은, 임의의 조합으로, 함께 SoC로 구현될 수 있다. SoC는 프로세서(예컨대, 중앙 처리 장치(CPU), 마이크로컨트롤러, 마이크로프로세서, 디지털 신호 처리기(DSP) 등), 메모리, 하나 이상의 통신 인터페이스, 및/또는 추가적인 회로를 하나 이상 포함하는 집적 회로 칩을 포함할 수 있으며, 수신된 프로그램 코드를 선택적으로 실행하거나 및/또는 기능을 수행하기 위한 내장된 펌웨어를 포함할 수 있다.
도 13은 실시형태들이 구현될 수 있는 컴퓨팅 장치(1300)의 예시적인 구현예를 묘사한다. 예를 들어, 컴퓨팅 장치(102) 및/또는 클라이언트 컴퓨팅 장치(104)는, 컴퓨팅 장치(1300)의 하나 이상의 특징 및/또는 대안적인 특징을 포함하여, 고정식 또는 모바일 컴퓨터 실시형태에서 컴퓨팅 장치(1300)와 유사한 하나 이상의 컴퓨팅 장치로 구현될 수 있다. 본 명세서에 제공되는 컴퓨팅 장치(1300)의 설명은 예시를 위해 제공되는 것이지, 제한하려는 것이 아니다. 실시형태들은, 당업자에게 알려져 있는 바와 같이, 추가적인 타입의 컴퓨터 시스템으로 구현될 수 있다.
도 13에 도시된 바와 같이, 컴퓨팅 장치(1300)는 프로세서 회로(1302)로 인용되는 하나 이상의 프로세서, 시스템 메모리(1304), 및 시스템 메모리(1304)를 포함하는 다양한 시스템 컴포넌트를 프로세서 회로(1302)에 연결하는 버스(1306)를 포함한다. 프로세서 회로(1302)는 중앙 처리 장치(CPU), 마이크로컨트롤러, 마이크로프로세서, 및/또는 다른 물리적 하드웨어 프로세서 회로로서 하나 이상의 물리적 하드웨어 전기 회로 장치 요소 및/또는 집적 회로 장치(반도체 재료 칩 또는 다이)로 구현되는 전기 및/또는 광학 회로이다. 프로세서 회로(1302)는 운영 체제(1330), 애플리케이션 프로그램(1332), 다른 프로그램(1334) 등의 프로그램 코드와 같이, 컴퓨터 판독 가능한 매체에 저장되는 프로그램 코드를 실행할 수 있다. 버스(1306)는, 메모리 버스 또는 메모리 컨트롤러, 주변 버스, 가속 그래픽 포트, 및 임의의 다양한 버스 아키텍처를 사용하는 프로세서 또는 로컬 버스를 포함하여, 하나 이상의, 임의의 몇 가지 타입의 버스 구조를 나타낸다. 시스템 메모리(1304)는 리드 온리 메모리(ROM)(1308) 및 랜덤 액세스 메모리(RAM)(1310)를 포함한다. 기본 입력/출력 시스템(1312)(BIOS)은 ROM(1308)에 저장된다.
또한, 컴퓨팅 장치(1300)는 하기의 드라이브들, 즉 하드 디스크에 대하여 판독 및 기입하기 위한 하드 디스크 드라이브(1314), 제거 가능한 자기 디스크(1318)에 대하여 판독 및 기입하기 위한 자기 디스크 드라이브(1316), 및 CD ROM, DVD ROM, 또는 그 밖의 광학 매체와 같은 제거 가능한 광 디스크(1322)에 대하여 판독 및 기입하기 위한 광 디스크 드라이브(1320)를 하나 이상 구비한다. 하드 디스크 드라이브(1314), 자기 디스크 드라이브(1316), 및 광 디스크 드라이브(1320)는 제각기 하드 디스크 드라이브 인터페이스(1324), 자기 디스크 드라이브 인터페이스(1326), 및 광학 드라이브 인터페이스(1328)에 의해 버스(1306)에 접속된다. 드라이브들 및 그들의 연관된 컴퓨터-판독 가능한 매체는 컴퓨터-판독 가능한 명령어, 데이터 구조, 프로그램 모듈 및 그 밖의 컴퓨터용 데이터의 비휘발성 스토리지를 제공한다. 하드 디스크, 제거 가능한 자기 디스크 및 제거 가능한 광 디스크를 설명했지만, 플래시 메모리 카드, 디지털 비디오 디스크, RAM, ROM, 및 그 밖의 하드웨어 저장 매체와 같이, 다른 타입의 하드웨어-기반의 컴퓨터-판독 가능한 저장 매체를 사용해서 데이터를 저장할 수 있다.
다수의 프로그램 모듈이 하드 디스크, 자기 디스크, 광 디스크, ROM, 또는 RAM에 저장될 수 있다. 이들 프로그램은 운영 체제(1330), 하나 이상의 애플리케이션 프로그램(1332), 다른 프로그램(1334), 및 프로그램 데이터(1336)를 포함한다. 애플리케이션 프로그램(1332) 또는 다른 프로그램(1334)은, 예를 들어, 쿼리 최적화기(104), 컴파일러(204), 개발 애플리케이션(200), 소스 코드 에디터(202), 컴파일러(204), 디버거 도구(206), 쿼리 검출기(402), 지연 연산 연장기(404), 균등한 쿼리 세트 생성기(406), 연장 가능한 쿼리 검출기(902), 쿼리 표현식 어셈블러(904), 콘텐츠 결정기(1104), 규칙 선택기(1106), 흐름도(300), 흐름도(500), 흐름도(700), 흐름도(800), 흐름도(1000), 및/또는 흐름도(1200)(흐름도(300, 500, 700, 800, 1000, 1200)의 임의의 적절한 단계를 포함)를 구현하기 위한 컴퓨터 프로그램 논리(예컨대, 컴퓨터 프로그램 코드 또는 명령어), 및/또는 본 명세서에서 설명된 추가적인 실시형태들을 포함할 수 있다.
사용자는 명령 또는 정보를 키보드(1338) 및 포인팅 디바이스(1340)와 같은 입력 장치를 통해 컴퓨팅 장치(1300)에 입력할 수 있다. 그 밖의 입력 장치(도시되지 않음)는, 마이크로폰, 조이스틱, 게임 패드, 위성 안테나, 스캐너, 터치 스크린 및/또는 터치 패드, 음력 입력을 수신하는 음성 인식 시스템, 제스처 입력을 수신하는 제스처 인식 시스템 등을 포함할 수 있다. 이들 및 다른 입력 장치는, 흔히 버스(1306)에 연결되는 직렬 포트 인터페이스(1342)를 통해 프로세서 회로(1302)에 접속되지만, 병렬 포트, 게임 포트, 또는 범용 직렬 버스(USB)와 같은 다른 인터페이스에 의해 접속될 수 있다.
또한, 디스플레이 스크린(1344)이 비디오 어댑터(1346)와 같은 인터페이스를 통해 버스(1306)에 접속된다. 디스플레이 스크린(1344)은 컴퓨팅 장치(1300)의 외부 기기이거나, 또는 컴퓨팅 장치에 포함될 수 있다. 디스플레이 스크린(1344)은 정보를 디스플레이할 뿐만 아니라, 사용자 명령 및/또는 다른 정보를 수신(예컨대, 터치, 손가락 제스처, 가상 키보드 등에 의함)하기 위한 사용자 인터페이스일 수 있다. 컴퓨팅 장치(1300)는, 디스플레이 스크린(1344) 외에도, 스피커 및 프린터와 같은 다른 주변 출력 장치(도시되지 않음)를 포함할 수 있다.
컴퓨팅 장치(1300)는 어댑터 또는 네트워크 인터페이스(1350), 모뎀(1352), 또는 네트워크를 통해 통신을 확립하는 다른 수단을 통해 네트워크(1348)(예컨대, 인터넷)에 접속된다. 내부 또는 외부 기기일 수 있는 모뎀(1352)은 도 13에 도시된 바와 같이, 직렬 포트 인터페이스(1342)를 통해 버스(1306)에 접속될 수 있거나, 또는 병렬 인터페이스를 포함하여, 다른 인터페이스 타입을 사용해서 버스(1306)에 접속될 수 있다.
본원에서 사용된 용어 "컴퓨터 프로그램 매체(computer program medium)", "컴퓨터-판독 가능한 매체(computer-readable medium)", 및 "컴퓨터-판독 가능한 저장 매체(computer-readable storage medium)"는, 하드 디스크 드라이브(1314)와 연관된 하드 디스크, 제거 가능한 자기 디스크(1318), 제거 가능한 광 디스크(1322), 그 밖에 RAM, ROM, 플래시 메모리 카드, 디지털 비디오 디스크, 집 디스크, MEMs, 나노테크놀로지-기반의 저장 장치와 같은 물리적 하드웨어 매체, 및 추가적인 타입의 물리적/유형의 하드웨어 저장 매체(도 13의 메모리(1320)를 포함)와 같은 물리적 하드웨어 매체를 지칭하는 데 사용된다. 이러한 컴퓨터-판독 가능한 저장 매체는 통신 매체와는 구별되며 중복되지 않는다(통신 매체를 포함하지 않음). 통신 매체는 컴퓨터-판독 가능한 명령어, 데이터 구조, 프로그램 모듈 또는 그 밖의 데이터를 반송파와 같은 변조 데이터 신호로 구체화한다. 용어 "변조 데이터 신호(modulated data signal)"는 신호 내의 정보를 인코딩하는 바와 같은 방식으로 설정 또는 변경되는 하나 이상의 특성을 갖는 신호를 의미한다. 제한이 아닌, 예시로서, 통신 매체는 음향, RF, 적외선 및 그 밖의 무선 매체와 같은 무선 매체 뿐만 아니라 유선 매체를 포함한다. 또한, 컴퓨터-판독 가능한 저장 매체와 관련되는 실시형태들과는 별도이며 중복되지 않는 실시형태들은 상기와 같은 통신 매체와 관련된다.
위에서 주지한 바와 같이, 컴퓨터 프로그램 및 모듈(애플리케이션 프로그램(1332) 및 다른 프로그램(1334)를 포함)은 하드 디스크, 자기 디스크, 광 디스크, ROM, RAM, 또는 그 밖의 하드웨어 저장 매체에 저장될 수 있다. 또한, 이러한 컴퓨터 프로그램은 네트워크 인터페이스(1350), 직렬 포트 인터페이스(1342), 또는 임의의 다른 인터페이스 타입을 통해 수신될 수도 있다. 이러한 컴퓨터 프로그램은, 애플리케이션에 의한 실행 또는 로딩시에, 컴퓨팅 장치(1300)가 본 명세서에서 논의된 실시형태들의 특징을 구현할 수 있게 한다. 따라서, 상기와 같은 컴퓨터 프로그램은 컴퓨팅 장치(1300)의 컨트롤러를 나타낸다.
또한, 실시형태들은 임의의 컴퓨터-판독 가능한 매체에 저장되는 컴퓨터 코드 또는 명령어를 포함하는 컴퓨터 프로그램 제품과 관련된다. 이러한 컴퓨터 프로그램 제품은 하드 디스크 드라이브, 광 디스크 드라이브, 메모리 장치 패키지, 휴대용 메모리 스틱, 메모리 카드, 및 그 밖의 타입의 물리적 스토리지 하드웨어를 포함한다.
IV. 예시적인 실시형태
실시형태에 있어서, 방법은, 프로그램 코드에서 복수의 쿼리를 검출하는 단계; 프로그램 코드에서 쿼리의 평가에 필요한 지연 연산을 연장하는 단계; 및 검출된 쿼리에 대하여 보다 효율적으로 평가하는 기능적으로 균등한 쿼리 세트를 생성하기 위해 검출된 쿼리에 복수의 규칙을 포함하는 규칙 세트를 적용하는 단계를 포함한다.
실시형태에 있어서, 검출하는 단계는, 코드 에디터에서, 프로그램 코드에서 쿼리를 검출하는 단계를 포함하고; 방법은, 복수의 쿼리를 기능적으로 균등한 쿼리 세트로 대체하기 위해 프로그램 코드를 자동으로 리팩토링하는 옵션을 코드 에디터에 제시하는 단계를 더 포함한다.
실시형태에 있어서, 검출하는 단계는, 컴파일 동안 프로그램 코드에서 쿼리를 검출하는 단계를 포함하고; 방법은, 복수의 쿼리가 기능적으로 균등한 쿼리 세트로 대체되는 프로그램 코드의 버전에 기초하여 컴파일러에서 컴파일된 코드를 생성하는 단계를 더 포함한다.
실시형태에 있어서, 프로그램 코드에서 쿼리의 평가에 필요한 지연 연산을 연장하는 단계는, 평가-연장 가능한 쿼리를 하나 이상 검출하는 단계; 및 하나 이상의 평가-연장 가능한 쿼리를 포함하는 단일의 쿼리 표현식을 형성하는 단계를 포함한다.
실시형태에 있어서, 규칙 세트를 적용하는 단계는, 다수의 쿼리 컴포넌트들 사이에서 공통의 논리적 콘텍스트를 결정하는 단계; 및 공통의 논리적 콘텍스트에 대응하는 규칙 세트의 규칙을 다수의 쿼리 컴포넌트에 적용하는 단계를 포함한다.
실시형태에 있어서, 생성된 기능적으로 균등한 쿼리 세트는 복수의 쿼리의 쿼리 결과보다 메모리 공간을 덜 소비하는 쿼리 결과를 생성하는 것, 복수의 쿼리보다 실행 시간이 덜 걸리는 것, 복수의 쿼리보다 네트워크 대역폭을 덜 소비하는 것, 또는 복수의 쿼리보다 처리 능력을 덜 소비하는 것 중 적어도 하나에 의해 복수의 쿼리에 대하여 보다 효율적으로 평가한다.
실시형태에 있어서, 규칙 세트를 적용하는 단계는, 규칙 세트의 규칙들의 복수의 조합의 쿼리 컴포넌트에의 적용을 평가해서 복수의 기능적으로 균등한 후보 쿼리 세트를 생성하는 단계; 및 복수의 기능적으로 균등한 후보 쿼리 세트 중에서 최대 효율 이득을 갖는 기능적으로 균등한 후보 쿼리 세트를, 생성된 기능적으로 균등한 쿼리 세트로 되도록 선택하는 단계를 포함한다.
실시형태에 있어서, 규칙 세트를 적용하는 단계는, 실행 시간 동안, 규칙 세트의 규칙들의 복수의 조합의 쿼리 컴포넌트에의 적용을 평가해서 복수의 기능적으로 균등한 후보 쿼리 세트를 생성하는 단계; 및 실행 시간 동안, 복수의 기능적으로 균등한 후보 쿼리 세트 중에서 최대 효율 이득을 갖는 기능적으로 균등한 후보 쿼리 세트를, 생성된 기능적으로 균등한 쿼리 세트로 되도록 선택하는 단계를 포함한다.
실시형태에 있어서, 하나 이상의 기능적으로 균등한 후보 쿼리 세트에 의해 제공되는 효율 이득은 적어도 부분적으로 실행 시간에 실행 조건에 의존한다.
실시형태에 있어서, 방법은, 머신 러닝을 사용해서 규칙 세트에 추가할 적어도 하나의 규칙을 생성하는 단계를 더 포함한다.
다른 실시형태에 있어서, 컴퓨팅 장치는, 적어도 하나의 프로세서 회로; 및 적어도 하나의 프로세서 회로에 의해 실행되도록 구성되는 프로그램 코드를 저장하는 적어도 하나의 메모리를 포함하고, 프로그램 코드는, 프로그램 코드에서 복수의 쿼리를 검출하는 동작; 프로그램 코드에서 쿼리의 평가에 필요한 지연 연산을 연장하는 동작; 및 검출된 쿼리에 대하여 보다 효율적으로 평가하는 기능적으로 균등한 쿼리 세트를 생성하기 위해 검출된 쿼리에 복수의 규칙을 포함하는 규칙 세트를 적용하는 동작을 수행하도록 구성된다.
실시형태에 있어서, 검출하는 동작은, 코드 에디터에서, 프로그램 코드에서 쿼리를 검출하는 동작을 포함하고; 방법은, 복수의 쿼리를 기능적으로 균등한 쿼리 세트로 대체하기 위해 프로그램 코드를 자동으로 리팩토링하는 옵션을 코드 에디터에 제시하는 동작을 더 포함한다.
실시형태에 있어서, 검출하는 동작은, 컴파일 동안 프로그램 코드에서 쿼리를 검출하는 동작을 포함하고; 방법은, 복수의 쿼리가 기능적으로 균등한 쿼리 세트로 대체되는 프로그램 코드의 버전에 기초하여 컴파일러에서 컴파일된 코드를 생성하는 동작을 더 포함한다.
실시형태에 있어서, 프로그램 코드에서 쿼리의 평가에 필요한 지연 연산을 연장하는 동작은, 평가-연장 가능한 쿼리를 하나 이상 검출하는 동작; 및 하나 이상의 평가-연장 가능한 쿼리를 포함하는 단일의 쿼리 표현식을 형성하는 동작을 포함한다.
실시형태에 있어서, 규칙 세트를 적용하는 동작은, 다수의 쿼리 컴포넌트들 사이에서 공통의 논리적 콘텍스트를 결정하는 동작; 및 공통의 논리적 콘텍스트에 대응하는 규칙 세트의 규칙을 다수의 쿼리 컴포넌트에 적용하는 동작을 포함한다.
실시형태에 있어서, 규칙 세트를 적용하는 동작은, 규칙 세트의 규칙들의 복수의 조합의 쿼리 컴포넌트에의 적용을 평가해서 복수의 기능적으로 균등한 후보 쿼리 세트를 생성하는 동작; 및 복수의 기능적으로 균등한 후보 쿼리 세트 중에서 최대 효율 이득을 갖는 기능적으로 균등한 후보 쿼리 세트를, 생성된 기능적으로 균등한 쿼리 세트로 되도록 선택하는 동작을 포함한다.
실시형태에 있어서, 규칙 세트를 적용하는 동작은, 실행 시간 동안, 규칙 세트의 규칙들의 복수의 조합의 쿼리 컴포넌트에의 적용을 평가해서 복수의 기능적으로 균등한 후보 쿼리 세트를 생성하는 동작; 및 실행 시간 동안, 복수의 기능적으로 균등한 후보 쿼리 세트 중에서 최대 효율 이득을 갖는 기능적으로 균등한 후보 쿼리 세트를, 생성된 기능적으로 균등한 쿼리 세트로 되도록 선택하는 동작 포함한다.
실시형태에 있어서, 하나 이상의 기능적으로 균등한 후보 쿼리 세트에 의해 제공되는 효율 이득은 적어도 부분적으로 실행 시간에 실행 조건에 의존한다.
실시형태에 있어서, 동작은, 머신 러닝을 사용해서 규칙 세트에 추가할 적어도 하나의 규칙을 생성하는 동작을 더 포함한다.
다른 실시형태에 있어서, 컴퓨팅 장치는, 적어도 하나의 프로세서 회로; 및 적어도 하나의 프로세서 회로에 의해 실행되도록 구성되는 프로그램 코드를 저장하는 적어도 하나의 메모리를 포함하고, 프로그램 코드는, 프로그램 코드에서 복수의 쿼리를 검출하도록 구성된 쿼리 검출기; 프로그램 코드에서 쿼리의 평가에 필요한 지연 연산을 연장하도록 구성된 지연 연산 연장기; 및 검출된 쿼리에 대하여 보다 효율적으로 평가하는 기능적으로 균등한 쿼리 세트를 생성하기 위해 검출된 쿼리에 복수의 규칙을 포함하는 규칙 세트를 적용하도록 구성되는 균등한 쿼리 세트 생성기를 포함한다.
V. 결론
본 발명의 다양한 실시형태를 위에서 설명했지만, 이는 제한이 아닌 예시로서만 제시된 것임을 이해해야 한다. 당업자라면, 첨부된 청구범위에서 규정되는 바와 같은 본 발명의 정신 및 범위로부터 일탈함이 없이, 형태 및 상세에 있어서 다양한 변경이 이루어질 수 있음을 이해할 것이다. 따라서, 본 발명의 폭 및 범위는 전술한 예시적인 실시형태들 중 어느 하나에 의해 한정되지 않아야 하며, 하기의 청구범위 및 그 등가물에 따라서만 규정되어야 한다.

Claims (15)

  1. 적어도 하나의 프로세서를 포함하는 컴퓨팅 장치에서의 방법으로서,
    프로그램 코드에서 복수의 쿼리를 검출하는 단계;
    상기 프로그램 코드에서 상기 쿼리들의 평가에 필요한 지연 연산(laziness)을 연장하는 단계; 및
    상기 검출된 쿼리들에 대하여 보다 효율적으로 평가하는 기능적으로 균등한 쿼리 세트를 생성하기 위해 상기 검출된 쿼리들에 복수의 규칙을 포함하는 규칙 세트를 적용하는 단계를 포함하는
    방법.
  2. 제1항에 있어서,
    상기 검출하는 단계는, 코드 에디터에서, 상기 프로그램 코드에서 상기 쿼리들을 검출하는 단계를 포함하고,
    상기 방법은, 상기 복수의 쿼리를 상기 기능적으로 균등한 쿼리 세트로 대체하기 위해 상기 프로그램 코드를 자동으로 리팩토링하는 옵션을 상기 코드 에디터에 제시하는 단계를 더 포함하는
    방법.
  3. 제1항에 있어서,
    상기 검출하는 단계는, 컴파일 동안 상기 프로그램 코드에서 상기 쿼리들을 검출하는 단계를 포함하고;
    상기 방법은, 상기 복수의 쿼리가 상기 기능적으로 균등한 쿼리 세트로 대체되는 상기 프로그램 코드의 버전에 기초하여 컴파일러에서 컴파일된 코드를 생성하는 단계를 더 포함하는
    방법.
  4. 제1항에 있어서,
    상기 프로그램 코드에서 상기 쿼리들의 평가에 필요한 지연 연산을 연장하는 단계는,
    상기 쿼리들 중 평가-연장 가능한 하나 이상의 쿼리를 검출하는 단계; 및
    상기 하나 이상의 평가-연장 가능한 쿼리를 포함하는 단일의 쿼리 표현식을 형성하는 단계를 포함하는
    방법.
  5. 제1항에 있어서,
    상기 규칙세트를 적용하는 단계는,
    다수의 쿼리 컴포넌트들 사이에서 공통의 논리적 콘텍스트를 결정하는 단계; 및
    상기 공통의 논리적 콘텍스트에 대응하는 상기 규칙 세트의 규칙을 상기 다수의 쿼리 컴포넌트에 적용하는 단계를 포함하는
    방법.
  6. 제1항에 있어서,
    생성된 기능적으로 균등한 쿼리 세트는 상기 복수의 쿼리의 쿼리 결과들보다 메모리 공간을 덜 소비하는 쿼리 결과들을 생성하는 것, 상기 복수의 쿼리보다 실행 시간이 덜 걸리는 것, 상기 복수의 쿼리보다 네트워크 대역폭을 덜 소비하는 것, 또는 상기 복수의 쿼리보다 처리 능력을 덜 소비하는 것 중 적어도 하나에 의해 상기 복수의 쿼리에 대하여 보다 효율적으로 평가하는
    방법.
  7. 제1항에 있어서,
    상기 규칙세트를 적용하는 단계는,
    상기 규칙 세트의 규칙들의 복수의 조합의 쿼리 컴포넌트들에의 적용을 평가해서 복수의 기능적으로 균등한 후보 쿼리 세트를 생성하는 단계; 및
    상기 복수의 기능적으로 균등한 후보 쿼리 세트 중에서 최대 효율 이득을 갖는 기능적으로 균등한 후보 쿼리 세트를, 생성된 기능적으로 균등한 쿼리 세트로 되도록 선택하는 단계를 포함하는
    방법.
  8. 제1항에 있어서,
    상기 규칙세트를 적용하는 단계는,
    실행 시간 동안, 상기 규칙 세트의 규칙들의 복수의 조합의 쿼리 컴포넌트들에의 적용을 평가해서 복수의 기능적으로 균등한 후보 쿼리 세트를 생성하는 단계; 및
    실행 시간 동안, 상기 복수의 기능적으로 균등한 후보 쿼리 세트 중에서 최대 효율 이득을 갖는 기능적으로 균등한 후보 쿼리 세트를, 생성된 기능적으로 균등한 쿼리 세트로 되도록 선택하는 단계를 포함하는
    방법.
  9. 제8항에 있어서,
    하나 이상의 상기 기능적으로 균등한 후보 쿼리 세트에 의해 제공되는 상기 효율 이득은 적어도 부분적으로 실행 시간에서의 실행 조건에 의존하는
    방법.
  10. 제1항에 있어서,
    머신 러닝을 사용해서 상기 규칙 세트에 추가할 적어도 하나의 규칙을 생성하는 단계를 더 포함하는
    방법.
  11. 컴퓨팅 장치로서,
    적어도 하나의 프로세서 회로; 및
    상기 적어도 하나의 프로세서 회로에 의해 실행되도록 구성되는 프로그램 코드를 저장하는 적어도 하나의 메모리를 포함하고,
    상기 프로그램 코드는,
    프로그램 코드에서 복수의 쿼리를 검출하는 동작;
    상기 프로그램 코드에서 상기 쿼리들의 평가에 필요한 지연 연산을 연장하는 동작; 및
    상기 검출된 쿼리들에 대하여 보다 효율적으로 평가하는 기능적으로 균등한 쿼리 세트를 생성하기 위해 상기 검출된 쿼리들에 복수의 규칙을 포함하는 규칙 세트를 적용하는 동작
    을 포함하는 동작들을 수행하도록 구성되는
    컴퓨팅 장치.
  12. 제11항에 있어서,
    상기 검출하는 동작은, 코드 에디터에서, 상기 프로그램 코드에서 상기 쿼리들을 검출하는 동작을 포함하고;
    상기 동작들은, 상기 복수의 쿼리를 상기 기능적으로 균등한 쿼리 세트로 대체하기 위해 상기 프로그램 코드를 자동으로 리팩토링하는 옵션을 상기 코드 에디터에 제시하는 동작을 더 포함하는
    컴퓨팅 장치.
  13. 제11항에 있어서,
    상기 검출하는 동작은, 컴파일 동안 상기 프로그램 코드에서 상기 쿼리들을 검출하는 동작을 포함하고;
    상기 동작들은, 상기 복수의 쿼리가 상기 기능적으로 균등한 쿼리 세트로 대체되는 상기 프로그램 코드의 버전에 기초하여 컴파일러에서 컴파일된 코드를 생성하는 동작을 더 포함하는
    컴퓨팅 장치.
  14. 제11항에 있어서,
    상기 프로그램 코드에서 상기 쿼리들의 평가에 필요한 지연 연산을 연장하는 동작은,
    상기 쿼리들 중 평가-연장 가능한 하나 이상의 쿼리를 검출하는 동작; 및
    상기 하나 이상의 평가-연장 가능한 쿼리를 포함하는 단일의 쿼리 표현식을 형성하는 동작을 포함하는
    컴퓨팅 장치.
  15. 컴퓨터 프로그램 로직이 기록된 컴퓨터-판독 가능한 매체를 포함하는 컴퓨터 프로그램 제품으로서,
    프로세서가 제1항 내지 제10항 중 어느 한 항을 수행할 수 있게 하는 컴퓨터 프로그램 로직 수단을 포함하는
    컴퓨터 프로그램 제품.
KR1020187035332A 2016-06-06 2017-05-31 Cpu 이용 및 코드 리팩토링을 위한 쿼리 최적화기 KR20190015285A (ko)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US15/174,688 2016-06-06
US15/174,688 US10558458B2 (en) 2016-06-06 2016-06-06 Query optimizer for CPU utilization and code refactoring
PCT/US2017/035085 WO2017213917A1 (en) 2016-06-06 2017-05-31 Query optimizer for cpu utilization and code refactoring

Publications (1)

Publication Number Publication Date
KR20190015285A true KR20190015285A (ko) 2019-02-13

Family

ID=59054257

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020187035332A KR20190015285A (ko) 2016-06-06 2017-05-31 Cpu 이용 및 코드 리팩토링을 위한 쿼리 최적화기

Country Status (17)

Country Link
US (1) US10558458B2 (ko)
EP (1) EP3465425A1 (ko)
JP (1) JP6911059B2 (ko)
KR (1) KR20190015285A (ko)
CN (1) CN109313547B (ko)
AU (1) AU2017277831B2 (ko)
BR (1) BR112018074025A2 (ko)
CA (1) CA3023326A1 (ko)
CL (1) CL2018003468A1 (ko)
CO (1) CO2018013186A2 (ko)
IL (1) IL263264A (ko)
MX (1) MX2018015045A (ko)
PH (1) PH12018550197A1 (ko)
RU (1) RU2018142897A (ko)
SG (1) SG11201809886VA (ko)
WO (1) WO2017213917A1 (ko)
ZA (1) ZA201807412B (ko)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2021086680A1 (en) * 2019-10-30 2021-05-06 Ocient Holdings LLC Enforcement of sets of query rules for access to data supplied by a plurality of data providers
KR20220040446A (ko) * 2020-05-12 2022-03-30 쿠팡 주식회사 데이터베이스 쿼리 레이턴시를 감소시키기 위한 시스템 및 방법

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10210240B2 (en) * 2017-06-30 2019-02-19 Capital One Services, Llc Systems and methods for code parsing and lineage detection
US10705809B2 (en) * 2017-09-08 2020-07-07 Devfactory Innovations Fz-Llc Pruning engine
US10691433B2 (en) 2018-08-31 2020-06-23 Databricks Inc. Split front end for flexible back end cluster processing
US20200409927A1 (en) * 2019-06-27 2020-12-31 Yrc Worldwide Inc. Cross-database platform synchronization of data and code
US20220414101A1 (en) * 2021-06-24 2022-12-29 Microsoft Technology Licensing, Llc Shifting left database degradation detection

Family Cites Families (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
IL152987A0 (en) * 2000-05-26 2003-06-24 Computer Ass Think Inc System and method for automatically generating database queries
JP3956131B2 (ja) 2002-12-26 2007-08-08 インターナショナル・ビジネス・マシーンズ・コーポレーション プログラム変換装置、プログラム変換方法及びプログラム
US7805411B2 (en) 2003-09-06 2010-09-28 Oracle International Corporation Auto-tuning SQL statements
US20080065590A1 (en) 2006-09-07 2008-03-13 Microsoft Corporation Lightweight query processing over in-memory data structures
US20090144229A1 (en) 2007-11-30 2009-06-04 Microsoft Corporation Static query optimization for linq
US8713048B2 (en) 2008-06-24 2014-04-29 Microsoft Corporation Query processing with specialized query operators
CN101763428A (zh) * 2010-01-04 2010-06-30 山东浪潮齐鲁软件产业股份有限公司 一种SOA对web服务的注册存储管理应用系统
US8332388B2 (en) * 2010-06-18 2012-12-11 Microsoft Corporation Transformation rule profiling for a query optimizer
US9177017B2 (en) 2010-09-27 2015-11-03 Microsoft Technology Licensing, Llc Query constraint encoding with type-based state machine
US20120078878A1 (en) * 2010-09-28 2012-03-29 Microsoft Corporation Optimized lazy query operators
US8914782B2 (en) 2010-11-10 2014-12-16 Microsoft Corporation Optimization of declarative queries
US8997070B2 (en) * 2011-12-15 2015-03-31 Sap Se Extension mechanism for scripting language compiler
US20140082014A1 (en) 2012-03-02 2014-03-20 Logics Research Centre Sia Abstract, structured data store querying technology
CN102982103A (zh) * 2012-11-06 2013-03-20 东南大学 一种olap海量多维数据维存储方法
CN103970870A (zh) * 2014-05-12 2014-08-06 华为技术有限公司 数据库查询方法和服务器
US11461319B2 (en) * 2014-10-06 2022-10-04 Business Objects Software, Ltd. Dynamic database query efficiency improvement

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2021086680A1 (en) * 2019-10-30 2021-05-06 Ocient Holdings LLC Enforcement of sets of query rules for access to data supplied by a plurality of data providers
US11106679B2 (en) 2019-10-30 2021-08-31 Ocient Holdings LLC Enforcement of sets of query rules for access to data supplied by a plurality of data providers
US11734283B2 (en) 2019-10-30 2023-08-22 Ocient Holdings LLC Enforcement of a set of query rules for access to data supplied by at least one data provider
US11874841B2 (en) 2019-10-30 2024-01-16 Ocient Holdings LLC Enforcement of query rules for access to data in a database system
KR20220040446A (ko) * 2020-05-12 2022-03-30 쿠팡 주식회사 데이터베이스 쿼리 레이턴시를 감소시키기 위한 시스템 및 방법
US11681701B2 (en) 2020-05-12 2023-06-20 Coupang Corp. Systems and methods for reducing database query latency

Also Published As

Publication number Publication date
JP2019523942A (ja) 2019-08-29
ZA201807412B (en) 2020-01-29
EP3465425A1 (en) 2019-04-10
CN109313547B (zh) 2022-04-15
BR112018074025A2 (pt) 2019-02-26
IL263264A (en) 2018-12-31
CL2018003468A1 (es) 2019-03-15
US10558458B2 (en) 2020-02-11
WO2017213917A1 (en) 2017-12-14
JP6911059B2 (ja) 2021-07-28
CO2018013186A2 (es) 2018-12-14
MX2018015045A (es) 2019-03-06
PH12018550197A1 (en) 2019-09-16
CA3023326A1 (en) 2017-12-14
RU2018142897A (ru) 2020-06-05
SG11201809886VA (en) 2018-12-28
AU2017277831A1 (en) 2018-11-22
AU2017277831B2 (en) 2021-09-09
US20170351512A1 (en) 2017-12-07
CN109313547A (zh) 2019-02-05

Similar Documents

Publication Publication Date Title
AU2017277831B2 (en) Query optimizer for CPU utilization and code refactoring
US10409574B2 (en) Incremental whole program compilation of code
US10261889B2 (en) Techniques for edit-and-continue and enhanced optimized debugging on optimized code
US7865870B2 (en) Automatic content completion of valid values for method argument variables
US9081586B2 (en) Systems and methods for customizing optimization/transformation/ processing strategies
US8364696B2 (en) Efficient incremental parsing of context sensitive programming languages
US9311077B2 (en) Identification of code changes using language syntax and changeset data
WO2021169227A1 (zh) 一种代码处理方法、装置、设备及介质
WO2018161509A1 (zh) 条件编译预处理方法、终端及存储介质
Nguyen et al. Arist: An effective api argument recommendation approach
JP6651974B2 (ja) 情報処理装置、コンパイル方法及びコンパイラプログラム
CN111796832B (zh) 热补丁文件生成方法、装置、设备及存储介质
CN110727428B (zh) 一种转换业务逻辑层代码的方法、装置和电子设备
US7318221B2 (en) Windows™ F-language interpreter
US10949209B2 (en) Techniques for scheduling instructions in compiling source code
JP7469999B2 (ja) 検索装置、検索方法、および検索プログラム
US20230418574A1 (en) Using a semantic tree of a compiler to execute a semantic code query against source code
US11144288B1 (en) System and method for compiling rules set into bytecode using switch and class hierarchies

Legal Events

Date Code Title Description
WITB Written withdrawal of application