KR101764941B1 - 점진적 변화를 이용한 효율적 불변 구문 표현 - Google Patents
점진적 변화를 이용한 효율적 불변 구문 표현 Download PDFInfo
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/427—Parsing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/13—File access structures, e.g. distributed indices
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2228—Indexing structures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2228—Indexing structures
- G06F16/2246—Trees, e.g. B+trees
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
- G06F16/2379—Updates performed during online database operations; commit processing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/30—Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
- G06F16/31—Indexing; Data structures therefor; Storage structures
- G06F16/316—Indexing structures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F17/00—Digital computing or data processing equipment or methods, specially adapted for specific functions
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/20—Natural language analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
- G06F8/4434—Reducing the memory space required by the program code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/48—Incremental 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
컴퓨터 과학분야에서 트리(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는 여기 개시된 본 발명의 양태들에 따른 통합 개발 환경의 예에 대한 블록도이다.
도 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)
- 프로세서, 및
상기 프로세서로 하여금 적어도 한 소비자가 액세스할 수 있는 데이터 구조를 생성하게 하도록 구성된 모듈을 포함하는 메모리를 포함하고,
상기 데이터 구조는 소스 코드의 적어도 한 문장(statement)을 나타내는 트리를 나타내며, 상기 데이터 구조는
상기 적어도 한 소비자가 직접 수정할 수는 없는 공유된 판독 전용(read-only) 트리를 나타내는 재사용 가능한 제1트리- 상기 판독 전용 트리는 상기 제1트리의 노드가 부모 노드에 대한 포인터를 포함하지 않도록 단방향 포인터를 갖는 노드를 포함하고, 상기 판독 전용 트리 내의 노드는 상기 소스 코드의 적어도 한 문장의 각각의 상이한 요소에 대응함 -, 및
상기 제1트리에 대한 상기 적어도 한 소비자의 액세스를 제어하는 루트 노드를 적어도 포함하는, 상기 적어도 한 소비자가 액세스할 수 있는 제2트리- 상기 제2트리의 루트 노드는 상기 제1트리의 루트 노드에 대한 포인터를 포함하고, 상기 제2트리는 다른 소비자로 하여금 상기 제1트리에 대해 작업하는 것을 허용하면서도 상기 적어도 한 소비자에 의해 수정된 상기 제1트리의 상기 적어도 한 소비자의 수정된 버전을 나타내도록 구성되고, 상기 제2트리는 상기 제1트리의 루트 노드를 래핑(wrap)하는 루트 노드를 포함함 - 를 포함하는
시스템.
- 제1항에 있어서,
상기 제2트리는 상기 제1트리 내 요청된 노드로의 경로 상에 있는 상기 제1트리 내 각 노드에 대해 상기 제2트리 내에 노드를 생성함으로써 요구에 따라(on demand) 구성되고, 상기 생성된 노드는 상기 요청된 노드로의 상기 경로 상에 있는 상기 제1트리 내 다음 노드에 대응하며, 상기 생성된 노드는 상기 제1트리의 대응 노드에 대한 포인터, 및 상기 제2트리 내 상기 생성된 노드의 부모 노드에 대한 포인터를 포함하는
시스템.
- 제1항에 있어서,
상기 제1트리는 상대적 정보를 보유하는 사설 트리(a private tree)이며, 상기 제2트리는 소비자 특유의 정보를 보유하는 공개 트리(a public tree)인
시스템.
- 제1항에 있어서,
상기 제2트리는 상기 적어도 한 소비자가 상기 제2트리의 사용을 마쳤을 때 메모리로부터 제거되는
시스템.
- 제1항에 있어서,
상기 트리는 파스(parse) 트리, 구문(syntax) 트리, 의미(semantic) 트리 또는 바운드(bound) 트리를 포함하는 컴파일러 생성(compiler-generated) 트리인
시스템.
- 제3항에 있어서,
상기 적어도 한 소비자로부터 수정된 트리에 대한 요청을 수신함에 응답하여, 새로운 공개 트리가 생성되고, 새로운 사설 트리가 생성되며, 상기 새로운 사설 트리는 상기 제1트리의 적어도 한 개의 서브 트리(subtree)를 재사용하는
시스템.
- 제2항에 있어서,
상기 제2트리에 추가 노드가 추가되고, 상기 추가 노드는 상기 제1트리 내에 대응 노드가 없으며, 상기 추가 노드는 상기 제1트리 내의 노드에 대한 포인터를 포함하지 않는
시스템.
- 소프트웨어 개발 컴퓨터의 IDE에서 소비자가 액세스할 수 있는 데이터 구조를 생성하는 단계를 포함하며,
상기 데이터 구조는
소스 코드의 적어도 한 문장을 나타내는 판독 전용 사설 트리- 상기 사설 트리는 상기 사설 트리의 부모 노드로부터 상기 사설 트리의 자식 노드로의 포인터를 포함하는 적어도 하나의 단방향 포인터를 포함하는 적어도 하나의 노드를 포함하고, 상기 적어도 하나의 노드는 상기 소스 코드의 적어도 한 문장의 적어도 하나의 각각의 요소에 대응함 -, 및
소비자 액세스 가능 공개 트리- 상기 공개 트리는 상기 사설 트리에 대한 액세스를 제어하고, 상기 공개 트리는 적어도 하나의 루트 노드를 포함하고, 상기 공개 트리의 루트 노드는 상기 사설 트리의 루트 노드에 대한 포인터를 포함함 -를 나타내고,
상기 데이터 구조를 생성하는 단계는 상기 소비자 액세스 가능 공개 트리 내의 노드가 요청될 때까지 상기 소비자 액세스 가능 공개 트리의 자식 노드의 생성을 연기하는 단계를 포함하는
방법.
- 제8항에 있어서,
상기 사설 트리의 수정된 버전을 나타내는 트리에 대한 요청을 수신함에 응답하여, 새로운 공개 트리 및 새로운 사설 트리를 생성하는 단계를 더 포함하고, 상기 새로운 사설 트리는 적어도 한 개의 노드에서 제1사설 트리와 다른 트리를 나타내고, 상기 새로운 사설 트리는 적어도 한 개의 노드에서 제1공개 트리와 다른 트리를 나타내는
방법.
- 제9항에 있어서,
상기 제1사설 트리의 적어도 한 개의 서브 트리를 재사용하는 단계
를 더 포함하는 방법.
- 제8항에 있어서,
상기 소비자가 상기 공개 트리의 사용을 마쳤을 때 상기 공개 트리를 가비지 콜렉팅(garbage collecting)하는 단계
를 더 포함하는 방법.
- 제8항에 있어서,
상기 공개 트리의 노드는 상기 공개 트리의 상기 노드로부터 상기 공개 트리 내의 상기 노드의 자식 노드로의 포인터와 상기 공개 트리의 상기 노드로부터 상기 공개 트리 내의 상기 노드의 부모 노드로의 포인터를 포함하는 양방향 포인터를 포함하고, 상기 공개 트리의 상기 노드는 상기 공개 트리 내의 상기 노드로부터 상기 사설 트리 내의 대응 노드로의 포인터를 포함하며, 상기 공개 트리의 노드는 상기 사설 트리 내의 노드에 액세스하라는 소비자로부터의 요청에 응답하여 요구에 따라 생성되는
방법.
- 제12항에 있어서,
상기 사설 트리 및 상기 공개 트리는 구문(syntax) 트리, 의미(semantic) 트리, 파스(parse) 트리 또는 바운드(bound) 트리를 포함하는
방법.
- 컴퓨터 실행 가능 명령어를 포함하는 컴퓨터 판독가능 저장 장치로서,
상기 컴퓨터 실행 가능 명령어는 실행 시 적어도 한 개의 프로세서로 하여금
소스 코드의 적어도 한 문장을 나타내는 트리를 나타내는 데이터 구조를 생성하게 하고 - 상기 데이터 구조는
소비자가 직접 액세스할 수 없는 공유된 판독 전용 사설 트리, 및
상기 소비자가 액세스할 수 있는 재사용 불가능 공개 트리를 포함하고,
상기 사설 트리는 상기 사설 트리 내의 부모 노드가 상기 부모 노드의 자식 노드에 대한 포인터를 포함하되 상기 부모 노드가 상기 사설 트리 내의 상기 부모 노드의 부모 노드에 대한 포인터는 포함하지 않도록 하는 단방향 포인터를 갖고, 상기 부모 노드와 상기 부모 노드의 자식 노드는 상기 소스 코드의 적어도 한 문장의 상이한 요소에 대응하며,
상기 공개 트리는 상기 공개 트리 내의 부모 노드가 상기 부모 노드의 자식 노드에 대한 포인터를 포함하고 상기 부모 노드가 상기 공개 트리 내의 상기 부모 노드의 부모 노드에 대한 포인터를 포함하도록 하는 양방향 포인터를 갖고, 상기 공개 트리는 상기 사설 트리에 대한 상기 소비자의 액세스를 제어하고, 상기 사설 트리는 상대적 정보를 보유하고, 상기 공개 트리는 소비자 특유의 정보를 보유함 -,
상기 소비자로부터 상기 재사용 불가능 공개 트리 내의 노드에 액세스하라는 요청을 수신함에 응답하여, 상기 재사용 불가능 공개 트리의 판독 전용의 재사용가능 버전을 포함하는 제3사설 트리를 생성하게 하고- 상기 제3사설 트리는 상기 제3사설 트리 내의 부모 노드로부터 상기 제3 사설 트리 내의 상기 부모 노드의 자식 노드에 대한 단방향 포인터를 가짐 -,
상기 제3사설 트리에 대한 상기 소비자의 액세스를 제어하는 제4공개 트리를 생성하는- 상기 제4공개 트리는 상기 소비자가 액세스할 수 있는 재사용 불가능 트리를 포함하고, 상기 제4공개 트리는 상기 제4공개 트리 내의 부모 노드로부터 상기 제4공개 트리 내의 상기 부모 노드의 자식 노드에 대한 포인터와 상기 제4공개 트리 내의 자식 노드로부터 상기 제4공개 트리 내의 상기 자식 노드의 부모 노드에 대한 포인터를 포함하는 양방향 포인터를 갖고, 상기 제4공개 트리는 상기 제4공개 트리 내의 노드로부터 상기 제3사설 트리 내의 대응 노드로의 포인터를 가짐-
컴퓨터 판독가능 저장 장치.
- 제14항에 있어서,
실행 시 상기 적어도 한 개의 프로세서로 하여금 상기 데이터 구조를 생성하게 하는 컴퓨터 실행 가능 명령어를 더 포함하되, 상기 재사용 불가능 공개 트리는 상기 공유된 판독 전용 사설 트리 내의 노드에 대한 상기 소비자의 액세스 요청에 응답하여 요구에 따라 생성되는
컴퓨터 판독가능 저장 장치.
- 제15항에 있어서,
실행 시 상기 적어도 한 개의 프로세서로 하여금 상기 공유된 판독 전용 사설 트리 내의 상기 요청된 노드로의 경로 상에 있는 각각의 노드에 대해 상기 재사용 불가능 공개 트리 내에 노드를 생성함으로써 요구에 따라 상기 재사용 불가능 공개 트리를 생성하게 하는 컴퓨터 실행 가능 명령어를 더 포함하되, 상기 생성된 노드는 상기 요청된 노드로의 상기 경로 상에 있는 상기 공유된 판독 전용 사설 트리 내의 다음 노드에 대응하며, 상기 재사용 불가능 공개 트리 내의 상기 생성된 노드는 상기 공유된 판독 전용 사설 트리의 대응 노드에 대한 포인터를 포함하는
컴퓨터 판독가능 저장 장치.
- 제15항에 있어서,
실행 시 상기 적어도 한 개의 프로세서로 하여금
상기 소비자가 상기 데이터 구조의 상기 재사용 불가능 공개 트리의 사용을 마쳤을 때 상기 데이터 구조의 상기 재사용 불가능 공개 트리를 제거하게 하는 컴퓨터 실행 가능 명령어를 더 포함하는
컴퓨터 판독가능 저장 장치.
- 제1항에 있어서,
상기 제2트리는 상기 제1트리의 대응 노드를 래핑하는 복수의 노드를 포함하는
시스템.
- 제8항에 있어서,
상기 공개 트리는 상기 사설 트리의 대응 노드를 래핑하는 복수의 노드를 포함하는
방법.
- 제15항에 있어서,
상기 데이터 구조의 생성은 상기 재사용 불가능 공개 트리 내의 노드가 요청될 때까지 상기 재사용 불가능 공개 트리의 자식 노드의 생성을 연기하는 것을 포함하는
컴퓨터 판독가능 저장 장치.
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)
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)
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)
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 |
-
2010
- 2010-01-07 US US12/683,445 patent/US10564944B2/en active Active
- 2010-12-31 KR KR1020127018073A patent/KR101764941B1/ko active IP Right Grant
- 2010-12-31 CA CA2786588A patent/CA2786588A1/en not_active Abandoned
- 2010-12-31 WO PCT/US2010/062653 patent/WO2011084876A2/en active Application Filing
- 2010-12-31 EP EP10842771.7A patent/EP2521978B1/en active Active
- 2010-12-31 JP JP2012548049A patent/JP5734311B2/ja active Active
- 2010-12-31 CN CN201080060863.8A patent/CN102696026B/zh active Active
-
2013
- 2013-02-08 HK HK13101829.0A patent/HK1174708A1/zh unknown
-
2020
- 2020-02-17 US US16/792,706 patent/US11372630B2/en active Active
Patent Citations (3)
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 |