KR101764941B1 - 점진적 변화를 이용한 효율적 불변 구문 표현 - Google Patents

점진적 변화를 이용한 효율적 불변 구문 표현 Download PDF

Info

Publication number
KR101764941B1
KR101764941B1 KR1020127018073A KR20127018073A KR101764941B1 KR 101764941 B1 KR101764941 B1 KR 101764941B1 KR 1020127018073 A KR1020127018073 A KR 1020127018073A KR 20127018073 A KR20127018073 A KR 20127018073A KR 101764941 B1 KR101764941 B1 KR 101764941B1
Authority
KR
South Korea
Prior art keywords
tree
node
public
private
consumer
Prior art date
Application number
KR1020127018073A
Other languages
English (en)
Other versions
KR20120115304A (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 KR20120115304A publication Critical patent/KR20120115304A/ko
Application granted granted Critical
Publication of KR101764941B1 publication Critical patent/KR101764941B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/10File systems; File servers
    • G06F16/13File access structures, e.g. distributed indices
    • 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
    • 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/22Indexing; Data structures therefor; Storage structures
    • 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/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • 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/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • G06F16/2246Trees, e.g. B+trees
    • 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/23Updating
    • G06F16/2379Updates performed during online database operations; commit processing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/30Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
    • G06F16/31Indexing; Data structures therefor; Storage structures
    • G06F16/316Indexing structures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F17/00Digital computing or data processing equipment or methods, specially adapted for specific functions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/20Natural language analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4434Reducing the memory space required by the program code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/48Incremental compilation

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Databases & Information Systems (AREA)
  • Software Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Artificial Intelligence (AREA)
  • Quality & Reliability (AREA)
  • Mathematical Physics (AREA)
  • Health & Medical Sciences (AREA)
  • Computer Hardware Design (AREA)
  • Audiology, Speech & Language Pathology (AREA)
  • Computational Linguistics (AREA)
  • General Health & Medical Sciences (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

트리 내에서 상향 및 하향 참조 둘 모두를 허용하는 적어도 한 개의 트리 구조 및 불변이고(읽기만 가능) 자신의 일부가 다른 데이터 구조들에서 재사용될 수 있게 하는 트리 구조를 구비한 데이터 구조를 생성함으로써 점진적 변화 상황의 부모 포인터들을 이용한 효율적인 불변 구문 표현이 가능하다. 기술된 데이터 구조는 툴들이 특정 서브 트리들을 검색하고 타깃으로 삼게 할 수 있다. 타깃화된 서브 트리를 나타내는 트리의 단편이 사용 시 생성된다. 트리의 나머지는 생성되지 않는다. 판독 전용 트리는 상대적 정보를 보유하면서 그것이 재 어셈블링되어 공유될 수 있게 한다.

Description

점진적 변화를 이용한 효율적 불변 구문 표현{EFFICIENT IMMUTABLE SYNTAX REPRESENTATION WITH INCREMENTAL CHANGE}
컴퓨터 과학분야에서 트리(tree)는 링크된 노드들의 계층적 데이터 구조이다. 트리는 트리 안의 각각의 노드가 0 개 이상의 자식 노드들과 최대한 한 개의 부모 노드를 가지는 비순환적 연결 그래프이다. 노드는 값, 상태를 포함할 수 있고, 아니면 (다른 트리와 같은) 별도의 데이터 구조를 나타낼 수 있다. 관례적으로, 자식 노드는 트리 안에서 자신의 부모 "밑"에 있으며, 이것은 컴퓨터 과학분야의 트리들이 자연 상태의 트리들과는 달리 위가 아닌 아래로 성장한다는 것을 말한다. 자식을 가진 노드는 자식의 부모 노드, 그 조상 또는 그 우위 노드(superior node)라고 불린다.
트리는 컴퓨터 내에서 메모리 안의 노드들 및 그 트리 내 에지(edge)들을 나타내는 레퍼런스(reference)들로 표현된다. 각각의 부모 노드는 자신의 자식 노드(들)에 대한 레퍼런스를 가지지만, 모든 자식 노드가 자신의 부모 노드에 대한 레퍼런스를 가지는 것은 아니다. 자식이 없는 노드는 리프(leaf) 노드 또는 터미널 노드라고 불린다. 노드의 높이는 그 노드에서 리프까지의 아래로 가장 긴 경로의 길이이다. 루트(root)의 높이는 트리의 높이이다. 노드의 깊이는 자신의 루트까지의 경로(즉, 자신의 루트 경로)의 길이이다. 트리 내에서 최상위 노드가 루트 노드라 불린다. 루트 노드는 부모를 포함하지 않는다. 트리 상에서의 동작들은 보통 루트 노드에서 시작된다. 노드들 간 포인터들이나 링크들을 따라서 루트 노드로부터 트리 내 어떤 노드에 도달할 수 있다. 트리 내 특정 노드에 도달될 때, 동작이 보통 수행된다. 내부 노드는 자식 노드들을 가진 트리의 임의의 노드이다. 따라서, 리프 노드는 자식 노드들을 가지지 않기 때문에 내부 노드가 아니다.
트리 내 각각의 노드는 그 노드로부터 내려가는 서브 트리의 루트 노드라 할 수 있다. "서브 트리(subtree)"라는 용어는 트리 내 어떤 노드 및 트리 안에서 그 노드의 모든 후손들로 이루어지는 트리를 의미한다. 루트 노드에 대응하는 서브 트리가 전체 트리이며, 어떤 다른 노드에 대응하는 서브 트리는 상응한(proper) 서브 트리라 불린다. 트리들은 많은 다양한 방식으로 표현될 수 있다. 일부 일반적인 표현들은 자식 노드(들), 그 부모, 또는 자식 노드(들) 및 부모 노드 양자에 대한 포인터(들)을 가진 힙(heap)(힙 데이터 구조와 혼동해서는 안됨) 상에 할당된 레코드로서, 또는 어레이(가령, 바이너리 힙(binary heap)) 내 노드들의 위치에 의해 결정되는 노드들 사이의 관계를 이용하는 어레이 내의 아이템으로서 노드를 표현한다.
트리는 일련의 부모 노드들 및 부모들의 자식 노드(들) 사이의 연결이나 포인터들을 따라감으로써 탐색될 수 있다. 전위 탐색(pre-order traversal)은 부모 노드의 자식 노드(들)에 도달하기 전에 그 부모 노드에 도달한다. 후위 탐색은 부모 노드가 탐색되기 전에 부모 노드의 자식 노드들이 탐색되는 것이다.
파스 트리(parse tree)나 구문 트리(syntax tree)는 통상적으로 어떤 공식적 문법에 따라 스트링의 구문 구조를 나타내는 질서 정연한 루트를 가진 트리이다. 파스 트리 내에서, 내부 노드들은 문법의 비 터미널들(non-terminals)로 표시되며, 리프 노드들은 문법의 터미널들로 표시된다. 그러한 트리들을 생성하는 프로그램의 한 타입을 파서(parser)라 부른다. 파스 트리들(parse trees)이나 구문 트리들은 흔히, 컴퓨터 프로그래밍 언어의 처리 중에 생성된다.
변경 불가한 트리는 여러 스레드들 상의 여러 클라이언트들이 다른 스레드들에 의해 동시에 유발되는 변화들을 관찰할 위험 없이 동일한 트리를 사용하게 할 수 있다. 또한, 트리의 일부를 사용 및 재사용할 수 있다는 것은 프로세싱을 보다 효율적이도록 하며, 이는 트리의 작은 부분들만이 변화될 때 전체 트리가 반복해서 생성될 필요가 없기 때문이다. 트리의 노드들이 그 바로 아래나 바로 위에 있는 한 개 이상의 노드들만을 가리키는 트리인 단방향 트리 안에서 트리의 일부분이 재 사용될 수 있다. 즉, 오직 한 방향으로만 포인터들을 가지는 트리에서 루트는 그 바로 아래의 노드들을 가리킬 수 있고, 그 노드들 각각은 그 바로 아래의 노드나 노드들(이들은 또 그 아래의 노드들을 가리키는 것으로 이어짐)을 가리킬 수 있지만, 트리 안의 어떤 노드도 자신의 부모 노드와 자신의 자식 노드(들) 둘 모두를 가리키지 못한다. 그러나, 보통의 경우, 양 방향으로 포인터들(양방향 포인터들)을 가지는 트리들이 단방향 포인터들을 가지는 트리들보다 훨씬 더 유용하다. 양방향 포인터들을 가진 전통적 트리들은 재사용이 불가능하며, 재사용불가 트리들은 프로세싱 자원들의 기준에서 보다 값이 나가므로 통상적으로 덜 효율적이다.
소비자가 효율성이나 데이터 무결성을 희생하지 않으면서 여러 소비자들에 의해 사용되는 새로운 버전의 트리를 생성하게 할 수 있도록, 제1불변 사설(immutable private) 트리 및 제2공개(public) 트리를 포함하는 데이터 구조가 생성된다. 공개 트리가 사설 트리 액세스를 제어한다. 사설 및 공개 트리들의 조합은 데이터 구조 내 상향 및 하향 둘 모두의 레퍼런스(reference)들이 존재할 수 있게 하며, 불변(읽기만 가능하거나 변경 불가한) 및 변경 가능 특성들이 동일한 데이터 구조 안에 공존할 수 있게 한다. 데이터 구조의 일부가 다른 트리 데이터 구조 안에서 재사용될 수 있다. 사설 트리는 재 어셈블링되고 재사용될 수 있게 하는 상대적 정보를 보유한다. 공개 트리는 소비자 특유 정보를 보유하며, 툴(tool)들이 사설 트리 내 특정 서브 트리들을 검색 및 타깃화할 수 있게 한다. 공개 트리의 구성(루트 노드 제외)은 공개 트리 안의 어떤 트리가 요청될 때까지 연기될 수 있다. 공개 트리는 사설 트리 내 어떤 노드를 액세스하라는 소비자 요청에 따라 즉시 구성될 수 있다.
상술한 데이터 구조는 파스 트리들, 구문 트리들, 의미(semantic) 트리들 및 바운드(bound) 트리들과 같은 컴파일러 생성 트리들을, 양방향 포인터들, 소비자 특유의 상대적 위치가 표현될 수 있게 하며, 둘 다 불변이면서 여전히 트리들의 효율적 생성 및 진화를 고려하여 전체 트리를 재생성하지 않으면서 데이터 구조의 판독 전용 트리의 새 버전들을 생성할 수 있게 하는 방식으로 제공하는데 사용될 수 있다.
이 요약은 이하의 상세한 설명에 자세히 기술되는 개념들의 선택을 간략한 형식으로 소개하기 위해 주어진다. 이 요약은 청구된 주제의 주요 특징이나 필수적 특징을 확인하도록 의도되거나 청구된 주제의 범위를 한정하는 데 사용되도록 의도된 것이 아니다.
도면들에서,
도 1a는 종래 기술 분야에 알려진 바와 같은 트리 데이터 구조 예의 블록도이다.
도 1b는 종래 기술 분야에 알려진 바와 같은 트리 데이터 구조의 또 다른 예에 대한 블록도이다.
도 1c는 종래 기술 분야에 알려진 바와 같은 트리 데이터 구조의 또 다른 예에 대한 블록도이다.
도 1d는 여기 개시된 발명의 양태들에 따른 점진적 변화를 이용한 효율적 불변 구문 표현을 위한 시스템(100)의 예를 예시한다.
도 1e는 여기 개시된 발명의 양태들에 따른 데이터 구조의 블록도이다.
도 2a는 여기 개시된 발명의 양태들에 따른 점진적 변화를 이용한 효율적 불변 구문 표현 방법 예의 흐름도이다.
도 2b는 여기 개시된 발명의 양태들에 따른 루트 노드 예의 블록도이다.
도 2c는 여기 개시된 발명의 양태들에 따른 비루트 노드 예의 블록도이다.
도 2d는 여기 개시된 발명의 양태들에 따른 비루트 노드의 또 다른 예에 대한 블록도이다.
도 3은 본 발명의 양태들이 구현될 수 있는 컴퓨팅 환경의 예를 예시한 블록도이다.
도 4는 여기 개시된 본 발명의 양태들에 따른 통합 개발 환경의 예에 대한 블록도이다.
개요
컴퓨터 언어 파스 트리들(문법 요소들로 분해된 입력 소스 코드를 기술하는 언어 파서의 출력), 구문 트리들, 의미 트리들 및 바운드 트리들(파생 멤버들 등과 같은 바인딩 정보를 포함하는 트리)과 같은 트리들이 컴파일러, 디버거, 소스 코드 에디터, 클래스 디자이너, 아키텍처 조사자, 메트릭, 룰 체커 및 소스 코드 리팩토링 툴들 등과 같은 코드 분석자들을 포함하는 많은 다양한 타입의 소비자들에게 유용하다. 여러 소비자들이 데이터 무결성을 유지하면서 동시에 동일한 트리를 액세스하게 하기 위해, 그 트리는 불변(읽기만 가능) 구조로서 표현될 수 있다.
소비자는 직간접적으로 트리를 수정할 수 있기를 바랄 수도 있다(가령, 간접 트리 수정은 트리가 생성되게 하는 파일 안의 텍스트를 수정함으로써 트리를 간접 수정함). 그러나, 소비자는 공유되는 판독 전용(read-only) 트리를 직접적으로 수정할 수 없기 때문에, 다른 소비자들이 원래의 트리를 가지고 계속 작업할 수 있게 하면서 소비자의 수정된 트리 버전을 표현하기 위한 새로운 판독 전용 트리가 구성되어야 한다. 이상적으로, 새로운 트리를 구성할 때 기존 트리의 적어도 일부가 재사용될 수 있을 것이다. 트리 데이터 구조들의 소비자들은 보통 그 구조를 위 아래로 탐색하는 기능을 가지고 싶어하므로, 상향 및 햐향의 양쪽 레퍼런스들이 도움이 되지만 상향 및 하향 레퍼런스들을 가진 트리들의 단편들은 다른 트리들에서 재사용될 수 없다.
왜 그렇게 되는지를 이해하기 위해, 도 1a가 문장(statement) "Return(리턴) 3.14 * r ^ 2"를 표현하기 위해 생성될지도 모르는 트리(10)인 파스 트리를 예시한다. 트리(10)는 아래로(부모 노드로부터 자식 노드로) 가리키는 단방향 포인터들을 가진다. 이제 도 1b를 참조할 때, 소비자가 문장 "Return Math.PI * r ^ 2"("3.14"를 나타낸 노드를 "Math.PI"로 바꿈)를 반영하기 위해 트리(10)를 수정하고 싶어한다고 가정할 것이다. 도 1b의 트리(12)는 새로운 문장 "Return Math.PI * r ^ 2"를 반영한다. 도 1a 및 1b에 도시된 바와 같이, 트리(10)는 트리(12)로부터 분리된다. 이것은 트리(12)가 트리(10)이 사용하는 것과 실질적으로 동일한 양의 메모리를 사용한다는 것을 의미하는데, 이는 트리(10)와 아무 노드도 공유하지 않는 별개의 트리(트리(12))가 구성되었기 때문이다. 수천 개의 노드들을 포함하는 대형 트리들에 있어서, 그러한 프로세스는 효율성이 부족하다(자원이 값비싸다).
수정된 문장 "Return Math.PI * r ^ 2"을 나타내는 트리를 생성하는 프로세스를 보다 효율적이게 하기 위해, 트리(10)의 불변 부분들이 그 두 트리들에 의해 공유될 수 있다. 트리(10), 및 트리(10)와 일부 노드들을 공유하는 제2트리 사이에 명백히 공유될 수 없는 노드들이 "Math"를 나타내는 노드(16), "PI"를 나타내는 노드(18) 및 "."를 나타내는 노드(20)이다. 트리(10) 안에서 노드(16) 및 노드(18)에 대응하는 노드들이 존재하지 않고, 트리(12) 안에서 "."를 나타내는 노드(20)에 대응하는 노드가 트리(10)에서 "3.14"를 나타내는 노드(22)이기 때문이다. 명백히 말하면 노드(20)는 노드(22)와 동일하지 않다.
트리(10) 안에서 재사용될 수 없는 다른 노드들 역시 존재한다. 트리(12) 안에서 "*"를 나타내는 노드(24)는 트리(10) 안에서 "*"를 나타내는 노드(26)와 동일하지 않은데, 이는 노드(26)가 "3.14"를 나타내는 가장 왼쪽의 노드(22)가 포함된 두 개의 자식 노드들을 가지는 반면 "*"을 나타내는 트리(12)의 노드(24)는 "."를 나타내는 가장 왼쪽의 자식 노드(20)를 가지기 때문이다. 마찬가지로, 트리(12) 안의 노드(28)가 "Stmt"를 나타내고 트리(10) 안의 노드(30) 역시 "Stmt"를 나타낸다고 하더라도, 노드(28)과 노드(30)은 동일하지 않은데, 이는 노드(28)의 가장 오른편 자식이 트리(10) 내 노드(26)와 동일하지 않은 노드인 노드(24)이기 때문이다. 마찬가지로 트리(12)의 노드(32)는 트리(10)의 노드(34)와 동일한 노드가 아니다.
그러나, 도 1a의 트리(10)와 도 1b의 트리(12)인 두 개의 트리들 안에서 불연속 라인들로 나타내지고 참조 부호 9로 표시되는 노드들인 나머지 노드들은 공유될 수 있다. 그 노드들은 구조적으로 동일하기 때문에 재사용될 수 있다. 그 트리들 안의 포인터들이 단방향성(이 예에서는 부모 노드에서 자식 노드를 가리킴)인 한, 단속(interrupted) 라인들로 나타낸 모든 노드들은 공유될 수 있다. 도 1c는 트리들 사이에 공유될 수 있는 정보 중 일부가 새 트리인 트리(14)의 노드들을 트리(10) 안의 불변 노드들로 가리킴으로써 공유된다.
트리들의 공유 부분들은 트리 내에서 자식에서 부모를 가리키는 포인터들이 추가될 때까지 데이터 무결성을 유지한다는 것을 예상할 수 있을 것이다. 예를 들어, 도 1c의 트리(10)의 노드(36)에 대한 관찰은 노드(36)에 대한 두 개의 가능한 부모 노드들인 트리(14)의 노드(24) 및 트리(10)의 노드(26)가 존재한다는 것을 드러낸다. 그에 따라, 트리(10) 및 트리(14)의 여러 가능한 후차 탐색이 가능하다. 트리(10) 및 트리(14)의 여러 가능한 후차 탐색들이 가능하므로, 예컨대 "노드(36)의 부모 노드가 무엇인가?"라는 질문에 대해 두 개의 가능한 답변이 존재하기 때문에 데이터 무결성이 상실된다.
여기 개시된 발명에 따르면, 데이터 구조는 소비자나 소비자들이 직접 액세스할 수 없는 사설 트리 및 소비자나 소비자들이 직접 액세스할 수 있는 공개 트리를 포함한다. 공개 트리는 사설 트리에 대한 간접 액세스를 제공한다. 사설 트리는 부모 노드에서 자식 노드를 가리키는 단방향 포인터들을 가지며 재사용될 수 있다. 공개 트리는 재사용이 불가능한 양방향 참조 트리이거나, 재사용 가능한 단방향 포인팅 트리일 수 있다. 공개 트리 안의 트리 요소는 소비자가 액세스할 수 없는 사설 트리 안의 대응하거나 등가의 트리 요소를 가리킬 수도 있다. 즉, 공개 트리 안의 어떤 노드가 공개 트리 내 자신의 부모 노드를 가리킬 수 있고, 등가의 사설 트리 노드를 가리킬 수도 있다. 공개 트리 내 상기 노드는 또한 공개 트리 내 자신의 자식 노드들에 대한 포인터들을 가질 수도 있다. 공개 트리 내 자식 노드들에 대한 포인터들은 소비자에 의해 요청될 때 게으르게(lazily) (즉시(on-demand)) 결정될 수 있다. 공개 트리 내 상기 노드가 공개 트리 내 자신의 자식 노드들에 대한 포인터들을 가지지 않으면, 각각의 요청에 대해 공개 자식 노드들이 생성되며 계속 유지되거나 재사용되지 않는다. 그러므로 데이터 구조는 소비자나 소비자들에게 있어 양방향 레퍼런스를 가지는 것으로 보여지면서 감춰진 사설 트리로 인해 데이터 무결성을 계속 유지한다.
상술한 특징들은 데이터 구조의 효율적인 점진적 업데이트를 가능하게 한다. 어떤 소비자가 오직 한 개의 노드를 통해 원래 트리와 다른 버전의 트리를 생성하고 싶어한다고 가정할 수 있다. 그 소비자는 수정된 문장(statement)을 나타내는 새로운 공개 트리 및 이전 사설 트리와 노드들을 공유할 수 있는 새로운 액세스 불가 사설 트리를 포함하는 데이터 구조를 생성할 수 있다. 새로운 공개 트리를 위해 생성된 루트는 차별화된 노드를 가진 트리를 나타내며, 원래 트리에 존재하는 노드들에 대한 최대한의 공유를 통해 원래 트리의 루트와 공존할 수 있다.
새로운 트리는 요청 시 생성될 수 있으므로, 새로운 트리의 자식 노드들은 소비자가 원래 트리에 의해 나타내어진 문장을 액세스하거나 변경하라는 요청을 행할 경우에만 생성될 것이다. 그 결과, 기술된 데이터 구조는 불변 데이터 구조에 양방향 포인터들을 제공하여, 업데이트 이전 및 이후의 트리들이 공존할 수 있게 하고 서로 다른 버전의 사설 트리들 사이의 공유를 허용하는 효율적인 비파괴적 업데이트를 가능하게 한다.
점진적 변화를 이용한 효율적 불변 구문 표현
도 1d는 여기 개시된 발명의 양태들에 따른 점진적 변화를 이용한 효율적 불변 구문 표현을 위한 시스템(100)의 예를 예시한다. 시스템(100) 전체나 부분들이 도 3과 관련하여 이하에 기술될 컴퓨터들과 같은 한 개 이상의 컴퓨터들 상에 존재할 수 있다. 시스템(100) 전체나 부분들이 도 4와 관련하여 이하에 기술될 컴퓨터들과 같은 한 개 이상의 소프트웨어 개발 컴퓨터들(가령, 컴퓨터(102)) 상에 존재할 수 있다. 시스템(100) 또는 그 부분들은 도 4와 관련하여 이하에 기술되고 예시되는 것들과 같은 통합 개발 환경(가령, IDE(integrated development environment)(104))의 일부를 포함할 수 있다. 다른 대안으로서, 시스템(100)이나 그 부분들은 자립형 시스템이나 플러그 인 또는 애드 인(add-in)으로서 제공될 수 있다.
시스템(100)은 프로세서(프로세서(142) 같은 것), 메모리(144), 및 점진적 변화(106)를 통한 효율적 불변 구문 표현을 위한 모듈 중 한 개 이상을 포함할 수 있다. 이 기술분야들에서 잘 알려진 다른 구성요소들도 포함될 수 있으나 여기에 도시되지는 않는다. 점진적 변화를 통한 효율적 불변 구문 표현을 위한 모듈(106)이 메모리(144) 안에 로드되어, 프로세서(142)와 같은 한 개 이상의 프로세서들이 점진적 변화를 통한 효율적 불변 구문 표현을 위한 모듈(106)에서 비롯된 액션들을 수행하게 할 수 있다는 것을 예상할 수 있을 것이다. 여기 개시된 본 발명의 양태에 따른 점진적 변화를 통한 효율적 불변 구문 표현을 위한 모듈(106)은 파스 트리(108)와 같은 판독 전용 트리를 수신하거나 생성하며, 이하에 보다 완전히 기술될 한 개 이상의 데이터 구조들(110)을 포함하는 출력을 생성할 수 있다.
점진적 변화를 통한 효율적 불변 구문 표현을 위한 모듈(106)은 배경 컴파일러, 병렬 컴파일러 또는 점진적 컴파일러와 같은 컴파일러, 배경 파서, 병렬 파서 또는 점진적 파서와 같은 파서나 플러그 인, 전치 프로세서, 또는 IDE, 파서, 컴파일러 또는 전치 프로세서로의 애드 인이나 확장 중 한 개 이상을 포함할 수 있다. 점진적 변화를 통한 효율적 불변 구문 표현을 위한 모듈(106)은 텍스트 또는 비텍스트 정보를 분해할 수 있으며, 그로부터 정보의 블록들을 나타내는 트리를 구축할 수 있다. 점진적 변화를 통한 효율적 불변 구문 표현을 위한 모듈(106)은 인터랙티브(interactive) 디자인 타임 소스 코드 에디터에 달려 있거나, 그 안에 병합되거나, 그와 관련될 수 있으며, C# (CSharp), 비주얼 베이직(Visual Basic), C, C++, 자바(Java), 루비(Ruby), 펄(Perl), 파이톤(Python), 포트란(Fortran), 코볼(Cobol) 및 기타를 포함하는 어떤 프로그래밍 언어(들)을 파싱할 수 있다.
동작 시, 점진적 변화를 통한 효율적 불변 구문 표현을 위한 모듈(106)은 파스 트리, 구문 트리, 의미 트리, 바운드 트리 등과 같은 컴파일러 생성 트리들을 포함하나 그들에 국한하는 것은 아닌 한 개 이상의 트리들을 생성하거나 수신할 수 있으며, 그로부터 이하에서 보다 완전히 기술될 데이터 구조를 생성할 수 있다. 이제 도 1e를 참조하면, 판독 전용 제1트리(가령, 사설 트리), 예컨대 문장 "Return math.PI * r ^ 2"을 나타내는 트리(40)가 주어질 때, 점진적 변화를 통한 효율적 불변 구문 표현을 위한 모듈(106)은 소비자로부터 그 제1트리를 감추거나, 제1트리를 소비자가 액세스 불가 또는 이용불가하게 한다. 점진적 변화를 통한 효율적 불변 구문 표현을 위한 모듈(106)은 트리(40) 내 어떤 노드를 액세스하거나 수정하라는 요청을 포함하는 입력을 수신함에 따라 사설 트리를 감출 수 있고, 혹은 다른 대안으로서 소비자로부터 요청이 수신되기 전에 트리들이 소비자들에게 이용불가능한 상태에 놓여지게 될 수 있다. 트리(40)의 이용불가성이 도 1e에서 트리(40) 주위에 보여진 박스(42)로 나타내어진다. 여기 개시된 본 발명의 어떤 양태들에 따르면, 트리(43)와 같이 제1트리에 대한 액세스를 제어하는 제2의 판독 전용 트리(가령, 판독 전용 공개 트리)를 생성함으로써 판독 전용 제1트리에 대한 소비자의 간접 액세스가 허용된다. 제2트리인 트리(43)는 그러나 소비자에 의해 직접 수정될 수는 없으며, 제2트리는 한 개 이상의 새로운 트리들의 생성 중에 사용될 수 있다. 새로운 트리(들)는 제2트리를 생성하는데 사용되는 정보의 수정사항에 해당하는 정보를 나타낸다.
제2트리인 트리(43)를 생성하기 위해, 제1트리인 트리(40)의 루트 노드(46)를 래핑하는(wrap) 루트 노드인 루트 노드(44)가 생성된다. 제2트리의 루트 노드는 제1트리의 루트 노드 주변의 프록시나 파사드(facade)로서 작용한다. 제2트리 안의 노드들을 생성함으로써 제1트리 안의 노드들에 대한 어떤 정보가 획득될 수 있으며, 생성된 제2트리의 노드들은 제1트리 안의 대응하는 노드들을 감싼다. 제1트리의 특정 노드에 대한 정보를 얻기 위해, 제2트리 내 대응하는 노드들이 생성되며, 그 노드들은 특정하게 요청된 노드로의 경로를 따라 제1트리의 대응 노드들을 감싼다. 제2트리는 제1트리로부터 정보를 얻고 제1트리로부터 나온 그 정보를 소비자에게 돌려준다. 제2트리 안의 노드들을 생성하는 것 외에, 제2트리 안에서 자식으로부터 부모로의 포인터들이 생성된다.
예를 들어, 트리(40) 내 노드(48)의 콘텐츠가 요망된다고 가정할 수 있다. 도 1e를 다시 참조하면, 루트 노드(46)를 감싸는 루트 노드(44)가 생성된다. 루트 노드(44)는 루트 노드(46)를 가리킨다. 루트 노드(46)의 자식 노드인 노드(52)를 찾기 위해 루트 노드(46)의 자식 포인터가 액세스된다. 노드(52)를 가리키는 노드(54)가 트리(43) 내에서 생성된다. 노드(54) 안의 필드는 노드(52)에 대한 포인터, 즉 포인터(56)를 포함한다. 노드(54)의 부모 노드인 루트 노드(44)로의 포인터(가령, 포인터(50)) 또한 생성된다. 원하는 노드로의 경로를 따라 판독 전용 제1트리 내 모든 노드들에 대해 이 프로세스가 이어진다.
통상적으로, 트리에 대한 연산이 수행될 때, 트리의 작은 부분만이 탐색된다. 예를 들어 소비자가 트리(40) 안의 특정 노드를 찾고 있다고 가정할 수 있다. 그 소비자는 트리, 예컨대 트리(40) 안의 특정 위치에 있는 노드를 찾고 있다고 가정할 수 있다. 그 위치에 있는 노드는 "Math"라는 콘텐츠를 가진 노드(48)라고 가정할 수 있다. 이 예에서, "Math"라는 콘텐츠를 가진 노드들로의 경로 상에 있는 노드들, 즉 노드(62), 노드(64) 및 노드(66)를 위한 노드들이 생성된다. 노드(62)에 대응하는 노드(68)가 트리(43) 안에서 생성된다. 노드(64)에 대응하는 노드(70)가 트리(43) 안에서 생성된다. 노드(66)에 대응하는 노드(72)가 트리(43) 안에서 생성된다. 제1트리 안의 어떤 다른 노드에 상응하는 노드들은 생성되지 않는다.
여기 개시된 본 발명의 다른 양태들에 따르면, 제1트리 안의 다른 경로들에 대해서는 제2트리 내에 아무 노드들도 생성되지 않는다. 여기 개시된 본 발명의 양태들에 따르면, 제2트리 안에 노드들을 생성함으로써 판독 전용 트리의 가능한 어떤 부분이 액세스될 수 있지만, 노드들은 원하는 노드로의 경로 상에 있는 경우에만 생성되므로, 데이터 무결성을 희생하지 않으면서 여러 소비자들에 의해 공유될 수 있는 판독 전용 트리를 유지하면서 트리 연산의 효율성을 제공할 수 있다. 다른 대안으로서, 최초에 두 개의 서로 다른 트리들이 생성되고 초기에 전체 프로세싱 비용이 평가된다. 여기 개시된 본 발명의 양태들에 따르면, 소비자가 제2트리의 사용을 마칠 때 가비지 컬렉션(garbage collection)이나 하우스키핑(housekeeping) 프로세스들에 의해 메모리로부터 제2트리가 제거될 수 있다. 남은 어떤 제1 또는 제2트리 노드들에 의해서도 더 이상 참조되지 않는 제1트리의 서브 트리들 역시 메모리로부터 제거될 수 있다.
마찬가지로, 판독 전용 트리 안의 노드를 조사하는 대신, 소비자가 그 판독 전용 트리 내 어떤 노드를 수정하고자 할 때, 새로운 트리가 생성된다. 상기 판독 전용 트리 안에서 소비자가 변경하고 싶어하는 노드에 해당하는 노드의 콘텐츠가 새로운 트리 안의 대응 노드에 의해 가리켜지지 않는다는 것을 제외하고, 상술한 프로세스가 판독 전용 공개 트리 상에서 수행된다. 또한, 새로운 트리의 노드의 콘텐츠는 새로운 값으로 세팅된다. 즉, 새로운 트리 내 콘텐츠 필드가 판독 전용 공개 트리 안의 대응 노드 안의 대응 필드의 값과 다른 값으로 세팅될 수 있다. 예를 들어, 소비자가 트리(43) 안의 노드(58)의 콘텐츠를 "Math"에서 "PI"로 바꾸고 싶어하는 경우, 노드(58)로의 포인터는 생성되지 않을 것이고, 노드(58)에 상응하는 새로운 트리의 노드 콘텐츠들은 "PI"로 세팅될 것이다. 일반적으로 알려져 있다시피, 필요할 때 추가 노드들이 새로운 트리에 추가될 수 있다.
새로운 트리가 단일 소비자에 의해 사용되기 때문에, 새로운 트리 내 각각의 노드는 특정 파일이나 문서 내 그 노드의 절대 위치와 같은 소비자 특유 정보를 추적하는데 사용될 수 있다. 예를 들어, 텍스트를 포함하는 문서가 주어질 때, 그 문서 안의 각각의 워드는 그 버전의 문서와 관련된 텍스트 버퍼 안의 특정 위치에 존재할 수 있다. "Math"라는 워드는 예컨대, 문서에 대한 텍스트 버퍼 내 위치(20)에 있을 수 있다. 트리(43) 안의 노드(58)에 대응하는 새로운 트리 안의 노드는 절대 위치(20)를 포함할 수 있는데, 이는 새로운 트리가 다른 소비자에 의해 재사용될 수 없기 때문이다. 판독 전용 공개 트리, 가령 트리(43) 안의 노드들과 달리, 각각의 소비자를 위한 텍스트 버퍼가 다른 위치에서 시작할 가능성이 있기 때문에, 판독 전용 공개 트리 내 노드들은 노드의 폭과 같은 상대적 위치 정보나 노드 안의 문자들의 개수를 포함한다. 새로운 트리는 특정 노드로의 경로 상에 있는 노드들의 폭을 합하고, 그 합을 텍스트 버퍼의 시작 위치에 더하여 문서 내 노드의 절대 위치를 판단할 수 있다.
도 2a는 여기 개시된 발명의 양태들에 따른 점진적 변화를 이용한 효율적 불변 구문 표현을 위한 방법(200)의 예를 예시한다. 여기 개시된 발명의 어떤 양태들에 따르면, 202에서 판독 전용 사설 트리가 획득, 생성, 또는 수신된다. 사설 트리는 공개 트리를 위한 새 루트를 생성함으로써 소비자가 액세스할 수 없게 될 수 있으며, 공개 트리의 새 루트는 사설 트리의 루트 노드를 감싸고 사설 트리에 대한 액세스를 제어한다. 이제 도 2b를 참조하면, 새 루트 노드, 예컨대 루트 노드(276)는 사설 트리(270)의 루트 노드에 대한 포인터, 및 도 2b에서 자식 필드(272, 274 등)에 대한 포인터를 통해 예시된 바와 같이, 자식 노드로의 한 개 이상의 포인터들에 대한 필드들 중 한 개 이상을 포함할 수 있다. 204에서, 소비자로부터 트리 안의 노드를 액세스하거나 수정하라는 요청이 수신된다. 그에 응하여, 소비자에게 사설 트리로의 액세스를 제어하는 공개 트리를 나타내는 루트 노드로의 액세스가 주어진다.
206에서 그러한 요청을 수신함에 따라, 원하는 노드로의 사설 트리 내 경로를 탐색하기 위해 사설 트리 안의 포인터들을 따라감으로써 공개 트리 안에 추가 노드들이 생성될 수 있다. 사설 트리 안의 다음 노드에 도달될 때마다, 공개 트리 안에서 대응 노드가 생성된다. 208에서 공개 트리 안에서 포인터들이 생성된다. 예를 들어 생성된 노드로부터 생성된 노드의 부모 노드를 가리키는 포인터가 생성된다. 비루트 노드의 구조의 예가 도 2c에 예시된다. 제2트리 안의 노드(290)는 사설 트리의 대응 노드에 대한 포인터의 필드(278), 콘텐츠 저장을 위한 한 개 이상의 필드들인 필드들(280, 282 등), 공개 트리(284) 내 노드(290)로부터 그 부모 노드로의 포인터 및 공개 트리 내 노드(290)의 자식 노드들에 대한 한 개 이상의 포인터들의 필드들(286, 288 등)을 포함할 수 있다. 사설 트리 안의 원하는 노드에 도달될 때까지, 사설 트리 안의 경로 상에 있는 각 노드에 대한 노드들이 공개 트리 안에 생성된다.
소비자 요청이 액세스 요청이었으면, 소비자가 공개 트리의 사용을 마칠 때, 210에서 그가 사용한 공간이 가비지 콜렉션에 의해 재생될 수 있다. 소비자는 공개 트리의 변경을 요청할 수 있다. 그러한 요청은 212에서, 새로운 공개 트리가 생성되게 하고 새로운 소비자 액세스 불가 사설 트리가 생성되게 한다. 그 새로운 액세스 불가 트리는 이전의 사설 트리와 노드들을 공유할 수 있다. 즉, 소비자 요청이 기존 트리의 수정을 포함하는 새로운 트리를 생성하라는 것이었으면, 그 새로운 트리는 원래의 사설 트리의 서브 트리들을 재사용할 수 있다. 소비자가 그러한 트리를 생성하면, 새로 생성된 트리는 공유될 수 없다. 소비자는 이전 서브 트리들과 새 단편들의 조합으로부터 새 트리들을 능동적으로 구성하고, 새 트리 안의 대응 노드의 콘텐츠를 새 값으로 세팅한다. 판독 전용 공개 트리 안에 대응 노드들이 없는 새 트리에 추가되는 서브 트리들에 대해, 필요 시 새 트리로 추가 노드들이 더해질 수 있다. 이 경우, 판독 전용 트리의 대응 노드에 대한 포인터의 필드(278)가 공(null)으로 세팅된다. 다른 대안으로서, 제2의 비 루트 노드 타입이 도 2d의 노드(292)로 예시된 바와 같이, 판독 전용 트리 필드(278)의 대응 노드에 대한 포인터의 필드를 가질 수 있다. 소비자가 새 트리를 수정하고 싶어하면, 새 트리의 루트 노드를 가리키는 판독 전용 루트 노드를 포함하는 또 다른 트리가 생성될 수 있다. 다른 대안으로서, 예컨대 소비자가 새 트리 안의 어떤 노드를 액세스하거나 수정하라고 요청하면, 새 트리 전체의 판독 전용 사본, 버전 또는 스냅샷이 구성될 수 있다. 판독 전용 트리의 루트 노드는 제3트리의 루트 노드를 가리키는 제4수정가능 트리를 생성함으로써 감싸지고, 그런 방식이 계속될 수 있다.
적절한 컴퓨팅 환경의 예
여기에 개시된 방법의 다양한 양태들의 배경을 제공하기 위해, 도 3 및 이하의 논의는 다양한 실시예들이 구현될 수 있는 적절한 컴퓨팅 환경(510)의 간략한 일반적 내용을 제공하기 위한 것이다. 여기에 개시된 발명은 한 개 이상의 컴퓨터나 다른 컴퓨팅 장치들에 의해 실행될 수 있는 프로그램 모듈들과 같은 컴퓨터 실행 가능 명령어들에 대한 일반적 맥락 안에 있지만, 당업자는 여기 개시된 발명의 일부가 다른 프로그램 모듈과의 결합 및/또는 하드웨어 및 소프트웨어의 조합을 통해 구현될 수도 있다는 것을 알 것이다. 일반적으로 프로그램 모듈은 특정 작업을 수행하거나 특정 데이터 타입을 구현하는 루틴, 프로그램, 오브젝트, 물리적 인공물, 데이터 구조 등을 포함한다. 통상적으로, 프로그램 모듈들의 기능은 다양한 실시예들에서 원하는 바대로 결합되거나 분산될 수 있다. 컴퓨팅 환경(510)은 다만 적절한 운영 환경의 예일 뿐이며 여기에 개시된 발명의 용도나 기능의 범위를 한정하도록 의도된 것이 아니다.
도 3을 참조할 때, 컴퓨터(512)의 형태로 된 소프트웨어 개발용 컴퓨터 장치가 기술된다. 컴퓨터(512)는 프로세싱 유닛(514), 시스템 메모리(516), 및 시스템 버스(518)를 포함할 수 있다. 프로세싱 유닛(514)은 다양한 이용가능 프로세서들 중 어느 하나일 수 있다. 듀얼 마이크로프로세서들 및 다른 멀티프로세서 구조들 역시 프로세싱 유닛(514)으로서 사용될 수 있다. 시스템 메모리(516)는 휘발성 메모리(520) 및 비휘발성 메모리(522)를 포함할 수 있다. 비휘발성 메모리(522)는 ROM(read only memory), PROM(programmable ROM), EPROM(electrically programmable ROM), 또는 플래시 메모리를 포함할 수 있다. 휘발성 메모리(520)는 외부 캐시 메모리로서 작용할 수 있는 RAM(random access memory)를 포함할 수 있다. 시스템 버스(518)는 시스템 메모리(516)를 포함하는 시스템의 물리적 인공물들을 프로세싱 유닛(514)에 연결한다. 시스템 버스(518)는 메모리 버스, 메모리 제어기, 주변 버스, 외부 버스, 또는 로컬 버스를 포함하는 여러 타입들 중 어느 하나일 수 있고, 이용가능한 어떤 다양한 버스 구조를 사용할 수 있다.
컴퓨터(512)는 통상적으로 휘발성 및 비휘발성 매체, 착탈가능 및 착탈불가능 매체와 같은 다양한 컴퓨터 판독가능 매체를 포함한다. 컴퓨터 저장 매체는 RAM, ROM, EEPROM, 플래시 메모리 또는 다른 메모리 기술, CD-ROM, DVD(digital versatile disks) 또는 다른 광학 디스크 저장, 마그네틱 카세트, 마그네틱 테이프, 마그네틱 디스크 저장부 또는 다른 마그네틱 저장기, 또는 원하는 정보를 저장하는데 사용될 수 있고 컴퓨터(512)에 의해 액세스될 수 있는 어떤 다른 매체를 포함하나, 그에 국한되지 않는다.
도 3이 사용자들과 컴퓨터 자원들 사이의 매개자로서 동작할 수 있는 소프트웨어를 나타낸다는 것을 알 수 있을 것이다. 그 소프트웨어는 디스크 저장부(524) 상에 저장될 수 있고 컴퓨터 시스템(512)의 자원들을 제어하고 할당하는 운영체계(528)를 포함할 수 있다. 디스크 저장부(524)는 인터페이스(526)와 같은 착탈불가능 메모리 인터페이스를 통해 시스템 버스(518)에 연결되는 하드 디스크 드라이브일 수 있다. 시스템 애플리케이션들(530)은 시스템 메모리(516)나 디스크 저장부(524)에 저장되는 프로그램 모듈들(532) 및 프로그램 데이터(534)를 통하여 운영체계(528)에 의한 자원들의 관리를 활용할 수 있다. 컴퓨터들이 다양한 운영체계들이나 운영체계들의 조합을 사용하여 구현될 수 있다는 것을 예상할 수 있을 것이다.
사용자는 입력 기기(들)(536)을 통하여 컴퓨터(512) 안으로 명령들이나 정보를 입력할 수 있다. 입력 기기들(536)은 비한정적인 것으로서 마우스, 트랙볼, 스타일러스, 터치 패드, 키보드, 마이크로폰 등과 같은 포인팅 장치를 포함한다. 이러한 것 및 다른 입력 기기들이 인터페이스 포트(들)(538)을 거치고 시스템 버스(518)를 통하여 프로세싱 유닛(514)에 연결된다. 인터페이스 포트(들)(538)은 직렬 포트, 병렬 포트, USB(universal serial bus) 등을 나타낼 수 있다. 출력 기기(들)(540)은 입력 기기들과 같은 유형의 포트들을 이용할 수 있다. 특정 어댑터들을 필요로 하는 모니터, 스피커 및 프린터 같은 일부 출력 기기들(540)이 존재한다는 것을 예시하기 위해 출력 어댑터(542)가 제공된다. 출력 어댑터들(542)은 비한정적인 것으로서, 출력 기기(540) 및 시스템 버스(518) 사이의 연결을 제공하는 비디오 및 사운드 카드들을 포함한다. 다른 기기들 및/또는 시스템들이나 원격 컴퓨터(들)(544)과 같은 기기들은 입력과 출력 기능 둘 모두를 제공할 수 있다.
컴퓨터(512)는 원격 컴퓨터(들)(544)과 같은 한 개 이상의 원격 컴퓨터로의 로직 연결을 이용하여, 네트워킹 환경 안에서 동작할 수 있다. 원격 컴퓨터(544)는 퍼스널 컴퓨터, 서버, 라우터, 네트워크 PC, 피어 장치 또는 다른 전형적 네트워크 노드일 수 있으며, 도 4에는 메모리 저장 장치(546) 만이 예시되었지만 통상적으로 컴퓨터(512)와 관련해 위에서 기술된 구성요소들 중 다수나 전부를 포함한다. 원격 컴퓨터(들)(544)은 통신 접속부(550)를 통해 논리적으로 연결될 수 있다. 네트워크 인터페이스(548)는 LAN(local area network) 및 WAN(wide area network)과 같은 통신 네트워크를 포괄하나 다른 네트워크들 또한 포함할 수 있다. 통신 접속부(들)(550)은 네트워크 인터페이스(548)를 버스(518)에 연결시키기 위해 사용되는 하드웨어/소프트웨어를 말한다. 접속부(550)는 컴퓨터(512) 내부나 외부에 있을 수 있으며, 모뎀(전화, 케이블, DSL 및 무선) 및 ISDN 어댑터들, 이더넷 카드들 등과 같은 내외부 기술들을 포함할 수 있다.
도시된 네트워크 접속은 단지 예일 뿐이며 컴퓨터들 사이에 통신 링크를 설정하는 다른 수단 역시 사용될 수 있다는 것을 알 수 있을 것이다. 당업자는 컴퓨터(512)나 다른 클라이언트 기기가 컴퓨터 네트워크의 일부로서 알맞게 사용될 수 있다는 것을 예상할 수 있을 것이다. 이와 관련하여, 여기 개시된 발명은 임의 개의 메모리나 저장 유닛들, 및 임의 개의 저장 유닛들이나 볼륨들에 걸쳐 발생하는 임의 개의 애플리케이션들과 프로세스들을 가진 어떤 컴퓨터 시스템과 관련될 수 있다. 여기 개시된 발명의 양태들은 원격이나 로컬 저장부를 가지고 네트워크 환경 안에서 사용되는 서버 컴퓨터들 및 클라이언트 컴퓨터들을 가진 환경에 적용될 수 있다. 여기 개시된 발명의 양태들은 또한 프로그래밍 언어 기능, 해석 및 실행 기능들을 가진 단독형 컴퓨팅 장치에도 적용될 수 있다.
도 4는 통합 개발 환경(IDE)(600) 및 공통 언어 런타임 환경(Common Language Runtime Environment)(602)를 예시한다. IDE(600)는 사용자(가령, 개발자, 프로그래머, 디자이너, 코더 등)가 컴퓨터 시스템 내 프로그램, 프로그램들의 집합, 웹 사이트, 웹 애플리케이션, 및 웹 서비스들을 설계, 코딩, 컴파일링, 테스팅, 실행, 편집, 디버깅 또는 구축하게 할 수 있다. 소프트웨어 프로그램들은 한 개 이상의 소스 코드 언어들(비주얼 베이직, 비주얼 J#, C++. C#, J#, 자바 스크립트, APL, 코볼(COBOL), 파스칼(Pascal), 에이펠(Eiffel), 하스켈(Haskell), ML, 오베론(Oberon), 펄(Perl), 파이톤(Python), 스킴(Scheme), 스몰토크(Smalltalk) 등)로 생성되는 소스 코드(성분 610)를 포함할 수 있다. IDE(600)는 네이티브 코드 개발 환경을 제공하거나, 가상 머신 상에서 실행되는 관리 코드 개발을 지원하거나, 그러한 것들의 조합을 지원할 수 있다. IDE(600)는 .NET 프레임워크를 이용하는 관리 코드 개발 환경을 제공할 수 있다. 애플리케이션이 실행될 때, 언어 고유의 소스 컴파일러(620)를 이용하여 소스 코드 성분(610) 및 네이티브 코드 성분(611)으로부터 매개 언어 성분(650)이 생성될 수 있으며 매개 언어 성분(660)(가령, JIT(just-in-time) 컴파일러)을 사용하여 매개 언어 성분(650)으로부터 네이티브 코드 성분(611)(가령, 장치 실행 명령어들)이 생성된다. 즉, IL 애플리케이션이 실행될 때, 그것은 실행되는 플랫폼을 위한 알맞은 기계어로 실행되면서 컴파일링됨으로써, 여러 플랫폼들에 걸쳐 코드를 이동 가능하게 할 수 있다. 다른 대안으로서, 다른 실시예들에서는 프로그램들이 의도된 플랫폼에 알맞은 네이티브 코드 기계어(미도시)로 컴파일링될 수 있다.
사용자는 IDE(600) 내 사용자 인터페이스(64) 및 소스 코드 에디터(651)를 통해 특정 소스 언어와 연관된 알려진 소프트웨어 프로그래밍 기법들 및 특정 언어 및 구문상의 규칙들에 따라 소스 코드 성분을 생성 및/또는 편집할 수 있다. 그런 다음, 소스 코드 성분(610)이 소스 컴파일러(620)를 통해 컴파일링될 수 있고, 그에 따라 어셈블리(630)와 같은 프로그램의 매개 언어 표현이 생성될 수 있다. 어셈블리(630)는 매개 언어 성분(650) 및 메타데이터(642)를 포함할 수 있다. 애플리케이션 디자인은 배치 전에 실증될 수 있다.
여기 기술된 다양한 기법들은 하드웨어나 소프트웨어, 또는 적절하다면 그 둘의 조합과 관련하여 구현될 수 있다. 그에 따라, 여기에 기술된 방법 및 장치, 또는 그들의 소정 양태들이나 일부는 플로피 디스크, CD-ROM, 하드 드라이브, 또는 어떤 다른 장치 판독가능 저장 매체와 같은 유형의 매체에 수록되는 프로그램 코드(즉, 명령어들)의 형태를 취할 수 있으며, 프로그램 코드가 컴퓨터와 같은 기계로 로드되어 그 기계에 의해 실행될 때, 그 기계는 여기 개시된 발명의 양태들을 실시하는 장치가 된다. 프로그램 가능한 컴퓨터들 상에서 프로그램 코드가 실행되는 경우, 컴퓨팅 장치는 일반적으로 프로세서, 프로세서에 의해 판독가능한 저장 매체(휘발성 및 비휘발성 메모리 및/또는 저장 요소들을 포함), 적어도 한 개의 입력 기기, 및 적어도 한 개의 출력 기기를 포함할 것이다. 예컨대 데이터 프로세싱 API의 사용을 통한 도메인 고유의 프로그래밍 모델 양태들의 생성 및/또는 구현을 활용할 수 있는 한 개 이상의 프로그램은 컴퓨터 시스템과 통신하기 위해 고급 절차 또는 객체 지향 프로그래밍 언어로 구현될 수 있다. 그러나, 프로그램(들)은 원할 경우 어셈블리어나 기계어로 구현될 수 있다. 어느 경우든, 그 언어는 컴파일 혹은 해석 언어이며, 하드웨어 구현과 결합될 수 있다.
여기 개시된 발명 대상은 도면과 관련하여 기술되었지만, 동일한 기능을 다른 방법으로 수행하기 위해 변경이 이뤄질 수 있다는 것을 알아야 한다.

Claims (20)

  1. 프로세서, 및
    상기 프로세서로 하여금 적어도 한 소비자가 액세스할 수 있는 데이터 구조를 생성하게 하도록 구성된 모듈을 포함하는 메모리를 포함하고,
    상기 데이터 구조는 소스 코드의 적어도 한 문장(statement)을 나타내는 트리를 나타내며, 상기 데이터 구조는
    상기 적어도 한 소비자가 직접 수정할 수는 없는 공유된 판독 전용(read-only) 트리를 나타내는 재사용 가능한 제1트리- 상기 판독 전용 트리는 상기 제1트리의 노드가 부모 노드에 대한 포인터를 포함하지 않도록 단방향 포인터를 갖는 노드를 포함하고, 상기 판독 전용 트리 내의 노드는 상기 소스 코드의 적어도 한 문장의 각각의 상이한 요소에 대응함 -, 및
    상기 제1트리에 대한 상기 적어도 한 소비자의 액세스를 제어하는 루트 노드를 적어도 포함하는, 상기 적어도 한 소비자가 액세스할 수 있는 제2트리- 상기 제2트리의 루트 노드는 상기 제1트리의 루트 노드에 대한 포인터를 포함하고, 상기 제2트리는 다른 소비자로 하여금 상기 제1트리에 대해 작업하는 것을 허용하면서도 상기 적어도 한 소비자에 의해 수정된 상기 제1트리의 상기 적어도 한 소비자의 수정된 버전을 나타내도록 구성되고, 상기 제2트리는 상기 제1트리의 루트 노드를 래핑(wrap)하는 루트 노드를 포함함 - 를 포함하는
    시스템.
  2. 제1항에 있어서,
    상기 제2트리는 상기 제1트리 내 요청된 노드로의 경로 상에 있는 상기 제1트리 내 각 노드에 대해 상기 제2트리 내에 노드를 생성함으로써 요구에 따라(on demand) 구성되고, 상기 생성된 노드는 상기 요청된 노드로의 상기 경로 상에 있는 상기 제1트리 내 다음 노드에 대응하며, 상기 생성된 노드는 상기 제1트리의 대응 노드에 대한 포인터, 및 상기 제2트리 내 상기 생성된 노드의 부모 노드에 대한 포인터를 포함하는
    시스템.
  3. 제1항에 있어서,
    상기 제1트리는 상대적 정보를 보유하는 사설 트리(a private tree)이며, 상기 제2트리는 소비자 특유의 정보를 보유하는 공개 트리(a public tree)인
    시스템.
  4. 제1항에 있어서,
    상기 제2트리는 상기 적어도 한 소비자가 상기 제2트리의 사용을 마쳤을 때 메모리로부터 제거되는
    시스템.
  5. 제1항에 있어서,
    상기 트리는 파스(parse) 트리, 구문(syntax) 트리, 의미(semantic) 트리 또는 바운드(bound) 트리를 포함하는 컴파일러 생성(compiler-generated) 트리인
    시스템.
  6. 제3항에 있어서,
    상기 적어도 한 소비자로부터 수정된 트리에 대한 요청을 수신함에 응답하여, 새로운 공개 트리가 생성되고, 새로운 사설 트리가 생성되며, 상기 새로운 사설 트리는 상기 제1트리의 적어도 한 개의 서브 트리(subtree)를 재사용하는
    시스템.
  7. 제2항에 있어서,
    상기 제2트리에 추가 노드가 추가되고, 상기 추가 노드는 상기 제1트리 내에 대응 노드가 없으며, 상기 추가 노드는 상기 제1트리 내의 노드에 대한 포인터를 포함하지 않는
    시스템.
  8. 소프트웨어 개발 컴퓨터의 IDE에서 소비자가 액세스할 수 있는 데이터 구조를 생성하는 단계를 포함하며,
    상기 데이터 구조는
    소스 코드의 적어도 한 문장을 나타내는 판독 전용 사설 트리- 상기 사설 트리는 상기 사설 트리의 부모 노드로부터 상기 사설 트리의 자식 노드로의 포인터를 포함하는 적어도 하나의 단방향 포인터를 포함하는 적어도 하나의 노드를 포함하고, 상기 적어도 하나의 노드는 상기 소스 코드의 적어도 한 문장의 적어도 하나의 각각의 요소에 대응함 -, 및
    소비자 액세스 가능 공개 트리- 상기 공개 트리는 상기 사설 트리에 대한 액세스를 제어하고, 상기 공개 트리는 적어도 하나의 루트 노드를 포함하고, 상기 공개 트리의 루트 노드는 상기 사설 트리의 루트 노드에 대한 포인터를 포함함 -를 나타내고,
    상기 데이터 구조를 생성하는 단계는 상기 소비자 액세스 가능 공개 트리 내의 노드가 요청될 때까지 상기 소비자 액세스 가능 공개 트리의 자식 노드의 생성을 연기하는 단계를 포함하는
    방법.
  9. 제8항에 있어서,
    상기 사설 트리의 수정된 버전을 나타내는 트리에 대한 요청을 수신함에 응답하여, 새로운 공개 트리 및 새로운 사설 트리를 생성하는 단계를 더 포함하고, 상기 새로운 사설 트리는 적어도 한 개의 노드에서 제1사설 트리와 다른 트리를 나타내고, 상기 새로운 사설 트리는 적어도 한 개의 노드에서 제1공개 트리와 다른 트리를 나타내는
    방법.
  10. 제9항에 있어서,
    상기 제1사설 트리의 적어도 한 개의 서브 트리를 재사용하는 단계
    를 더 포함하는 방법.
  11. 제8항에 있어서,
    상기 소비자가 상기 공개 트리의 사용을 마쳤을 때 상기 공개 트리를 가비지 콜렉팅(garbage collecting)하는 단계
    를 더 포함하는 방법.
  12. 제8항에 있어서,
    상기 공개 트리의 노드는 상기 공개 트리의 상기 노드로부터 상기 공개 트리 내의 상기 노드의 자식 노드로의 포인터와 상기 공개 트리의 상기 노드로부터 상기 공개 트리 내의 상기 노드의 부모 노드로의 포인터를 포함하는 양방향 포인터를 포함하고, 상기 공개 트리의 상기 노드는 상기 공개 트리 내의 상기 노드로부터 상기 사설 트리 내의 대응 노드로의 포인터를 포함하며, 상기 공개 트리의 노드는 상기 사설 트리 내의 노드에 액세스하라는 소비자로부터의 요청에 응답하여 요구에 따라 생성되는
    방법.
  13. 제12항에 있어서,
    상기 사설 트리 및 상기 공개 트리는 구문(syntax) 트리, 의미(semantic) 트리, 파스(parse) 트리 또는 바운드(bound) 트리를 포함하는
    방법.
  14. 컴퓨터 실행 가능 명령어를 포함하는 컴퓨터 판독가능 저장 장치로서,
    상기 컴퓨터 실행 가능 명령어는 실행 시 적어도 한 개의 프로세서로 하여금
    소스 코드의 적어도 한 문장을 나타내는 트리를 나타내는 데이터 구조를 생성하게 하고 - 상기 데이터 구조는
    소비자가 직접 액세스할 수 없는 공유된 판독 전용 사설 트리, 및
    상기 소비자가 액세스할 수 있는 재사용 불가능 공개 트리를 포함하고,
    상기 사설 트리는 상기 사설 트리 내의 부모 노드가 상기 부모 노드의 자식 노드에 대한 포인터를 포함하되 상기 부모 노드가 상기 사설 트리 내의 상기 부모 노드의 부모 노드에 대한 포인터는 포함하지 않도록 하는 단방향 포인터를 갖고, 상기 부모 노드와 상기 부모 노드의 자식 노드는 상기 소스 코드의 적어도 한 문장의 상이한 요소에 대응하며,
    상기 공개 트리는 상기 공개 트리 내의 부모 노드가 상기 부모 노드의 자식 노드에 대한 포인터를 포함하고 상기 부모 노드가 상기 공개 트리 내의 상기 부모 노드의 부모 노드에 대한 포인터를 포함하도록 하는 양방향 포인터를 갖고, 상기 공개 트리는 상기 사설 트리에 대한 상기 소비자의 액세스를 제어하고, 상기 사설 트리는 상대적 정보를 보유하고, 상기 공개 트리는 소비자 특유의 정보를 보유함 -,
    상기 소비자로부터 상기 재사용 불가능 공개 트리 내의 노드에 액세스하라는 요청을 수신함에 응답하여, 상기 재사용 불가능 공개 트리의 판독 전용의 재사용가능 버전을 포함하는 제3사설 트리를 생성하게 하고- 상기 제3사설 트리는 상기 제3사설 트리 내의 부모 노드로부터 상기 제3 사설 트리 내의 상기 부모 노드의 자식 노드에 대한 단방향 포인터를 가짐 -,
    상기 제3사설 트리에 대한 상기 소비자의 액세스를 제어하는 제4공개 트리를 생성하는- 상기 제4공개 트리는 상기 소비자가 액세스할 수 있는 재사용 불가능 트리를 포함하고, 상기 제4공개 트리는 상기 제4공개 트리 내의 부모 노드로부터 상기 제4공개 트리 내의 상기 부모 노드의 자식 노드에 대한 포인터와 상기 제4공개 트리 내의 자식 노드로부터 상기 제4공개 트리 내의 상기 자식 노드의 부모 노드에 대한 포인터를 포함하는 양방향 포인터를 갖고, 상기 제4공개 트리는 상기 제4공개 트리 내의 노드로부터 상기 제3사설 트리 내의 대응 노드로의 포인터를 가짐-
    컴퓨터 판독가능 저장 장치.
  15. 제14항에 있어서,
    실행 시 상기 적어도 한 개의 프로세서로 하여금 상기 데이터 구조를 생성하게 하는 컴퓨터 실행 가능 명령어를 더 포함하되, 상기 재사용 불가능 공개 트리는 상기 공유된 판독 전용 사설 트리 내의 노드에 대한 상기 소비자의 액세스 요청에 응답하여 요구에 따라 생성되는
    컴퓨터 판독가능 저장 장치.
  16. 제15항에 있어서,
    실행 시 상기 적어도 한 개의 프로세서로 하여금 상기 공유된 판독 전용 사설 트리 내의 상기 요청된 노드로의 경로 상에 있는 각각의 노드에 대해 상기 재사용 불가능 공개 트리 내에 노드를 생성함으로써 요구에 따라 상기 재사용 불가능 공개 트리를 생성하게 하는 컴퓨터 실행 가능 명령어를 더 포함하되, 상기 생성된 노드는 상기 요청된 노드로의 상기 경로 상에 있는 상기 공유된 판독 전용 사설 트리 내의 다음 노드에 대응하며, 상기 재사용 불가능 공개 트리 내의 상기 생성된 노드는 상기 공유된 판독 전용 사설 트리의 대응 노드에 대한 포인터를 포함하는
    컴퓨터 판독가능 저장 장치.
  17. 제15항에 있어서,
    실행 시 상기 적어도 한 개의 프로세서로 하여금
    상기 소비자가 상기 데이터 구조의 상기 재사용 불가능 공개 트리의 사용을 마쳤을 때 상기 데이터 구조의 상기 재사용 불가능 공개 트리를 제거하게 하는 컴퓨터 실행 가능 명령어를 더 포함하는
    컴퓨터 판독가능 저장 장치.
  18. 제1항에 있어서,
    상기 제2트리는 상기 제1트리의 대응 노드를 래핑하는 복수의 노드를 포함하는
    시스템.
  19. 제8항에 있어서,
    상기 공개 트리는 상기 사설 트리의 대응 노드를 래핑하는 복수의 노드를 포함하는
    방법.
  20. 제15항에 있어서,
    상기 데이터 구조의 생성은 상기 재사용 불가능 공개 트리 내의 노드가 요청될 때까지 상기 재사용 불가능 공개 트리의 자식 노드의 생성을 연기하는 것을 포함하는
    컴퓨터 판독가능 저장 장치.
KR1020127018073A 2010-01-07 2010-12-31 점진적 변화를 이용한 효율적 불변 구문 표현 KR101764941B1 (ko)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US12/683,445 US10564944B2 (en) 2010-01-07 2010-01-07 Efficient immutable syntax representation with incremental change
US12/683,445 2010-01-07
PCT/US2010/062653 WO2011084876A2 (en) 2010-01-07 2010-12-31 Efficient immutable syntax representation with incremental change

Publications (2)

Publication Number Publication Date
KR20120115304A KR20120115304A (ko) 2012-10-17
KR101764941B1 true KR101764941B1 (ko) 2017-08-03

Family

ID=44225340

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020127018073A KR101764941B1 (ko) 2010-01-07 2010-12-31 점진적 변화를 이용한 효율적 불변 구문 표현

Country Status (8)

Country Link
US (2) US10564944B2 (ko)
EP (1) EP2521978B1 (ko)
JP (1) JP5734311B2 (ko)
KR (1) KR101764941B1 (ko)
CN (1) CN102696026B (ko)
CA (1) CA2786588A1 (ko)
HK (1) HK1174708A1 (ko)
WO (1) WO2011084876A2 (ko)

Families Citing this family (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9191397B2 (en) * 2008-06-27 2015-11-17 Microsoft Technology Licensing, Llc Extension model for improved parsing and describing protocols
JP5568776B2 (ja) * 2010-11-05 2014-08-13 株式会社日立製作所 計算機のモニタリングシステム及びモニタリング方法
US8825817B1 (en) * 2012-03-19 2014-09-02 Amazon Technologies, Inc. Using a template to update a stack of resources
US9710243B2 (en) * 2013-11-07 2017-07-18 Eagle Legacy Modernization, LLC Parser that uses a reflection technique to build a program semantic tree
US9921769B2 (en) 2014-06-19 2018-03-20 Cohesity, Inc. Making more active use of a secondary storage system
US10614131B2 (en) * 2016-10-26 2020-04-07 Lookingglass Cyber Solutions, Inc. Methods and apparatus of an immutable threat intelligence system
CA3042293A1 (en) * 2016-11-17 2018-05-24 Goldman Sachs & Co. LLC System and method for coupled detection of syntax and semantics for natural language understanding and generation
DK3644196T3 (da) * 2018-10-26 2022-08-01 Tata Consultancy Services Ltd Systemer og fremgangsmåde til lagring af data i et integreret array og en struktur baseret på en linked-liste
US10901706B1 (en) * 2019-08-14 2021-01-26 Business Objects Software Ltd. Partially immutable model
US11392356B1 (en) * 2021-02-26 2022-07-19 Oracle International Corporation Online machine learning based compilation
US12111957B2 (en) 2021-06-08 2024-10-08 Microsoft Technology Licensing, Llc Software provenance validation
WO2024162500A1 (ko) * 2023-02-02 2024-08-08 엘지전자 주식회사 무선 통신 시스템에서 시맨틱 오류를 검출하기 위한 장치 및 방법

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20050010592A1 (en) * 2003-07-08 2005-01-13 John Guthrie Method and system for taking a data snapshot
US20080109908A1 (en) 2006-11-02 2008-05-08 Microsoft Corporation Reverse Name Mappings In Restricted Namespace Environments
US20100174524A1 (en) 2004-07-02 2010-07-08 Philipp Koehn Empirical Methods for Splitting Compound Words with Application to Machine Translation

Family Cites Families (33)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5204958A (en) * 1991-06-27 1993-04-20 Digital Equipment Corporation System and method for efficiently indexing and storing a large database with high data insertion frequency
JP3526595B2 (ja) * 1993-10-29 2004-05-17 富士通株式会社 情報管理機構
US5761511A (en) 1994-01-28 1998-06-02 Sun Microsystems, Inc. Method and apparatus for a type-safe framework for dynamically extensible objects
US5671416A (en) 1995-02-24 1997-09-23 Elson; David Apparatus and a method for searching and modifying source code of a computer program
CA2171570C (en) 1995-03-29 1999-09-21 Swee Boon Lim Compiler with generic front end and dynamically loadable back ends
US5939877A (en) * 1997-05-27 1999-08-17 Hewlett-Packard Company Graphical system and method for automatically scaling waveforms in a signal measurement system
JP4128641B2 (ja) 1997-10-13 2008-07-30 株式会社東芝 データ退避方法
US6378126B2 (en) * 1998-09-29 2002-04-23 International Business Machines Corporation Compilation of embedded language statements in a source code program
US6321338B1 (en) * 1998-11-09 2001-11-20 Sri International Network surveillance
JP3390357B2 (ja) 1999-02-12 2003-03-24 日本電気株式会社 木構造データ編集システムにおける木構造差分出力方法及び装置
US20020027909A1 (en) * 2000-06-30 2002-03-07 Mariner Networks, Inc. Multientity queue pointer chain technique
US7035802B1 (en) * 2000-07-31 2006-04-25 Matsushita Electric Industrial Co., Ltd. Recognition system using lexical trees
DE10104831A1 (de) * 2001-02-01 2002-08-08 Sap Ag Datenstruktur für Informationssysteme
US7222132B2 (en) * 2001-03-20 2007-05-22 Swsoft Holdings, Ltd. Common template file system tree for virtual environments and virtual servers
US7203701B1 (en) * 2002-02-20 2007-04-10 Trilogy Development Group, Inc. System and method for an interface to provide visualization and navigation of a directed graph
US6694323B2 (en) * 2002-04-25 2004-02-17 Sybase, Inc. System and methodology for providing compact B-Tree
US6857001B2 (en) 2002-06-07 2005-02-15 Network Appliance, Inc. Multiple concurrent active file systems
US7188340B2 (en) * 2002-06-28 2007-03-06 Microsoft Corporation Hybrid tree for mixed user interface elements and sequential data
US7072904B2 (en) * 2002-12-02 2006-07-04 Microsoft Corporation Deletion and compaction using versioned nodes
US8060619B1 (en) * 2003-11-07 2011-11-15 Symantec Operating Corporation Direct connections to a plurality of storage object replicas in a computer network
US20060277221A1 (en) * 2005-06-01 2006-12-07 Green Hills Software, Inc. Transactional file system with client partitioning
US20070009713A1 (en) * 2005-07-05 2007-01-11 Hoeschele Allen H Scored applique for instrument panels
US7762076B2 (en) * 2005-10-20 2010-07-27 United Technologies Corporation Attachment of a ceramic combustor can
US7535475B2 (en) * 2005-11-01 2009-05-19 Adobe Systems Incorporated Virtual view tree
US7921367B2 (en) * 2005-12-20 2011-04-05 Oracle International Corp. Application generator for data transformation applications
US7660804B2 (en) * 2006-08-16 2010-02-09 Microsoft Corporation Joint optimization of wrapper generation and template detection
US7802179B2 (en) 2006-12-21 2010-09-21 Microsoft Corporation Synchronizing data between different editor views
US8072467B2 (en) * 2007-01-31 2011-12-06 Microsoft Corporation Request-driven on-demand processing
US9037613B2 (en) * 2007-05-23 2015-05-19 Oracle International Corporation Self-learning data lenses for conversion of information from a source form to a target form
US9043367B2 (en) * 2007-05-23 2015-05-26 Oracle International Corporation Self-learning data lenses for conversion of information from a first form to a second form
US9063979B2 (en) * 2007-11-01 2015-06-23 Ebay, Inc. Analyzing event streams of user sessions
US20090199090A1 (en) * 2007-11-23 2009-08-06 Timothy Poston Method and system for digital file flow management
US20090254594A1 (en) * 2008-04-02 2009-10-08 Microsoft Corporation Techniques to enhance database performance

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20050010592A1 (en) * 2003-07-08 2005-01-13 John Guthrie Method and system for taking a data snapshot
US20100174524A1 (en) 2004-07-02 2010-07-08 Philipp Koehn Empirical Methods for Splitting Compound Words with Application to Machine Translation
US20080109908A1 (en) 2006-11-02 2008-05-08 Microsoft Corporation Reverse Name Mappings In Restricted Namespace Environments

Also Published As

Publication number Publication date
HK1174708A1 (zh) 2013-06-14
KR20120115304A (ko) 2012-10-17
CN102696026B (zh) 2016-01-20
EP2521978B1 (en) 2020-06-24
WO2011084876A2 (en) 2011-07-14
CN102696026A (zh) 2012-09-26
US10564944B2 (en) 2020-02-18
US20200183667A1 (en) 2020-06-11
JP2013516701A (ja) 2013-05-13
US11372630B2 (en) 2022-06-28
EP2521978A4 (en) 2014-04-02
CA2786588A1 (en) 2011-07-14
EP2521978A2 (en) 2012-11-14
WO2011084876A3 (en) 2011-11-17
US20110167088A1 (en) 2011-07-07
JP5734311B2 (ja) 2015-06-17

Similar Documents

Publication Publication Date Title
KR101764941B1 (ko) 점진적 변화를 이용한 효율적 불변 구문 표현
US9182980B2 (en) Expansion and reduction of source code for code refactoring
US9696974B2 (en) Graph-based model for type systems
CN108139891B (zh) 用于生成建议以纠正未定义标记错误的方法和系统
US20130152061A1 (en) Full fidelity parse tree for programming language processing
EP2521967A2 (en) Creating inferred symbols from code usage
Yallop Staged generic programming
Plaisted Source-to-source translation and software engineering
Söderberg et al. Incremental evaluation of reference attribute grammars using dynamic dependency tracking
Vollmer et al. Compiling tree transforms to operate on packed representations
US10642714B2 (en) Mapping dynamic analysis data to source code
Sakka et al. Sound, fine-grained traversal fusion for heterogeneous trees
Levental et al. nelli: a lightweight frontend for MLIR
Kalleberg et al. Fusing a transformation language with an open compiler
CN113641361A (zh) 一种基于Clang的代码隐藏方法及装置
Ketkar et al. A Lightweight Polyglot Code Transformation Language
Scheidgen et al. Model-based mining of source code repositories
Overbey Immutable source-mapped abstract syntax tree: a design pattern for refactoring engine APIs
Cazzola et al. DEXTER and Neverlang: a union towards dynamicity
JP2022119668A (ja) コード変更方法及びコード変更プログラム
Laddad et al. Fluid quotes: metaprogramming across abstraction boundaries with dependent types
Shaikhha et al. A Compiler-Compiler for DSL Embedding
Saraiva et al. Efficient Embedding of Strategic Attribute Grammars via Memoization
Sakka et al. Sound, Fine-Grained Traversal Fusion for Heterogeneous Trees-Extended Version
Boukham et al. A Multi-target, Multi-paradigm DSL Compiler for Algorithmic Graph Processing

Legal Events

Date Code Title Description
N231 Notification of change of applicant
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right