이하, 본 발명의 몇몇 양태의 기본 이해를 제공하기 위한 본 발명의 간략한 요약이 제공된다. 이 요약은 본 발명의 넓은 개요는 아니다. 이는 본 발명의 주요/중요 요소를 식별하거나 본 발명의 범위를 상세히 나타내려는 것은 아니다. 단지 그 목적은 이하 제시되는 보다 상세한 설명에 앞서 본 발명의 일부 개념을 간략한 형태로 제공하려는 것이다.
본 발명은 관리 객체 환경에서의 동적 프로그래밍 언어로부터 생성된 태그형 값을 처리하는 시스템 및 방법에 관한 것이다. 태그형 값은 실행 엔진이 예를 들어 포인터와 즉시 데이터값(immediate data value)을 구별할 수 있게 하는 32비트 값의 최하위 비트와 같은 데이터의 특별 인코딩 부위를 포함한다. 본 발명은 가상 머신에 의해 제공되는 바와 같은 관리 객체 환경에서 실행가능한 동적 프로그래밍언어에 대한 추상 루트형 클래스를 정의한다. 이 유형의 클래스는 클래스의 상부 아래에서 정의되는 데이터 요소에 대한 불투명, 자연 크기값(opaque, natural size value)을 나타내는 클래스 계층에서의 상부를 갖는 것으로 정의된다.
하나의 경우에서, 분기된 트리는 클래스의 상부 또는 루트 아래에서 구현되며, 여기서, 트리의 한 측에서는 시스템 객체 계층(예를 들어, 비태그 요소(non-tagged element))가 구현되고 트리의 다른 측에서는 태그값을 나타내는 실드형이 구현된다. 그 후, 태그형(예를 들어, 사용자 정의형에서 태그형으로 데이터 액세스를 방지 또는 억제하는 것)을 사용하는 동적 프로그래밍 언어의 적절한 실행을 용이하게 하기 위해 추상 루트형 클래스에 여러 규칙이 인가된다. 특히, 실행 규칙은 사용자 정의형과 관련된 값 또는 데이터가 추상 클래스의 태그 멤버로부터 계승하거나 속성을 유도하는 것을 완화시킨다. 이러한 방식으로, 태그형 값은 유형 안전 실행 환경에서 실행될 수 있다. 또한, 추상 클래스를 정의하고 클래스의 멤버에 대한 액세스를 제한함으로써, 코드 실행 성능은 상술한 바와 같은 복싱 프로토콜에 의해서와 같이 태그값을 사용하는 종래의 알고리즘보다 개선된다.
본 발명의 일 양태에 따르면, 태그형 요소와 탑(top)형 요소가 정의되며, 여기서 탑은 트리의 한 브랜치에서 태그 데이터 서브타입 및 트리의 다른 브랜치에서 비태그 멤버와 관련된 데이터 서브타입을 갖는 트리의 최상위 멤버를 정의한다. 따라서, 메타데이터 규칙은 비태그 브랜치의 멤버는 태그 서브타입으로부터 또는 탑형 요소로부터 속성을 유도 또는 계승하지 않음을 보장하도록 확장된다. 또한, 이 규칙은 태그값에 산술 적용 등의 연산 또는 다른유형의 연산을 지원하도록 확장될 수 있다. 또한, 이는 개별 클래스 또는 서브타입의 멤버의 값인지를 결정하는 연산을 테스트하는 것을 포함한다. 다른 실행 규칙은 한 유형의 데이터(예를 들어, 정수)를 태그형으로 변환 또는 그 역으로 변환하는 것을 포함한다. 태그값과 비태그값을 모두 포함하는 추상 클래스를 정의함으로써, 그리고 클래스 서브타입들 간의 계승을 분리하는 규칙을 제공함으로써, 본 발명은 동적 프로그래밍 언어를 실행하기 위한 빠르고 안전한 환경을 제공한다.
상기 및 관련 목적의 달성을 위해, 본 발명의 몇몇 양태들이 아래의 설명 및 첨부 도면과 관련하여 여기서 설명된다. 이들 양태는 본 발명이 실시될 수 있는 여러 방식을 나타내며, 이들 모두는 본 발명에 의해 커버하려는 것이다. 본 발명의 다른 이점 및 신규한 특징은 도면을 참조하는 본 발명의 상세한 설명으로부터 보다 명백해질 것이다.
<실시예>
본 발명의 관리 코드 환경에서 동적 프로그래밍 언어 실행을 용이하게 하는 시스템 및 방법에 관한 것이다. 동적 프로그래밍 언어에 관련된 하나 이상의 태그값에 대한 계승 계층을 선언하는 클래스 콤포넌트가 제공된다. 태그값의 실행 동안, 규칙 콤포넌트는 유형 안전 런타임 환경을 지원하기 위해서 사용자 정의형이 태그값에서 속성을 유도 또는 계승하는 것을 완화시킨다. 트리의 일측에는 비태그형 요소가 트리의 다른 브랜치에는 태그형 요소값을 정의하는 분기된 클래스 트리가 제공된다. 규칙 콤포넌트는 트리의 일 콤포넌트로부터의 데이터가 트리의 다른 콤포넌트로부터의 속성 계승 또는 유도를 방지할 수 있게 하는 런타임 확장을 분석한다. 런타임 확장은 캐스트 클래스 확장, 테스트 클래스 확장 및 하나의 클래스 서브타입에서 다른 것(예를 들어, 태그 요소에서 비태그 요소로 또는 그 역으로)으로 데이터형을 변환하는 변환 클래스 확장과 같은 양태를 포함한다.
이 애플리케이션에서 사용되는 바와 같이, "콤포넌트", "클래스", "계층", "시스템" 등의 용어는 하드웨어, 하드웨어와 소프트웨어의 조합, 소프트웨어 또는 실행중인 소프트웨어에 관련된 컴퓨터 관련 엔티티를 의미하려는 것이다. 예를 들어, 콤포넌트는 프로세서 상에서 실행되는 프로세스, 프로세서, 객체, 실행가능, 실행의 스레드(thread), 프로그램 및/또는 컴퓨터를 포함하지만 이에 국한되지는 않는다. 예를 들어, 서버 상에서 실행하는 애플리케이션과 서버 모두 콤포넌트일 수 있다. 하나 이상의 콤포넌트는 프로세스 및/또는 실행 스레드에 상주할 수 있으며, 콤포넌트는 둘 이상의 컴퓨터 상에서 분산되어 및/또는 하나의 컴퓨터 상에 로컬화될 수 있다.
도 1을 우선 참조하면, 시스템(100)은 본 발명의 일 양태에 따른 태그형을 나타낸다. 하나 이상의 동적 언어(110)가 가상 머신(130)에 의해 실행되는 중간 언어 명령(intermediate language instruction; 124)을 생성하는 컴파일러(120; 예를 들어, 저스트 인 타임 컴파일러)에 입력된다. 동적 언어(110)는 예를 들어, 가상 머신(130)에 의해 실행되고 컴파일러(120)에 의해 컴파일되는 Perl, Scheme, Ruby, Python 및 Smalltalk과 같은 임의 유형의 컴퓨터 언어를 실질적으로 포함한다. 이러한 머신은, 예를 들어, 가상 예외 시스템(VES), 공통 언어 런타임(CLR) 또는 자바 가상 머신을 포함할 수 있다. 본 발명의 일 양태에서, 동적 언어(110)는 컴파일되고 가상 머신(130) 상에서 실행되는 하나 이상의 태그형(140)을 선언하고 생성한다. 태그형(140)은 즉시 데이터값 등의 다른 값과 포인터값을 구별하여 동적 언어(110)에 의해 종종 사용되는 인코딩을 나타낸다.
태그형(140)은 클래스 구조의 일측 또는 루트 상에서 태그값을 가지고 다른 측 또는 루트에서 비태그 또는 사용자 정의값을 갖는 분기된 클래스 구조로 선언되며, 여기서, 이러한 유형의 클래스 구조는 도 2를 참조하여 이하 상세히 설명된다. 즉시 명령(124)과 태그형(140)을 처리하기 위해서, 가상 머신(130) 및/또는 컴파일러(120)는 일련의 확인 규칙(150)을 사용하여 사용자 정의 데이터형이 태그 데이터형으로부터 유도 또는 계승되지 않음을 보장할 수 있게 된다. 또한, 여러 스택 실행 규칙(160; 후술함)은 태그 및 비태그값을 처리하기 위해 스택 예외 핸들러에 의해 변형되고 실행된다. 새로운 클래스형 프레임워크, 확인 규칙(150) 및/또는 스택 예외 핸들링(160)을 제공함으로써, 본 발명은 가상 머신(130)의 실행 성능을 향상시킨다. 이는 클래스 프레임워크 및 규칙에 따른 태그값을 처리함으로써 또한 그에 병행하여 및/또는 "복싱된(boxed)" 변수와 같은 태그값을 처리하는 기술을 완화함으로써 달성된다. 이들 변수는 공통 언어 기반구조(CLI)를 정의하는 "ECMA 표준" 등의 표준으로 설명된다.
통상, 시스템(100)은 여러 하이 레벨 언어로 기재된 애플리케이션이 이들 환경의 고유 특성을 고려하기 위해 애플리케이션을 다시 작성할 필요없이 서로 다른 시스템 환경에서 실행될 수 있는 ECMA 표준 및 공통 언어 기반구조(CLI)에 부응한다. 동적 언어 및/또는 가상 실행 환경을 다루는 다른 표준은 본 발명에 따라 또한 적합될 수 있음이 이해되어져야 한다. ECMA 표준은 그들의 개별 섹션에서 이들의 콤포넌트를 설명함으로써 다양한 콤포넌트의 이해를 용이하게 하기 위해서 인터넷 상에서 용이하게 이용할 수 있는 여러 섹션으로 이루어져 있다. 이들 섹션은:
파티션 I: 아키텍쳐
파티션 II: 메타데이터 정의 및 의미
파티션 III: CIL 명령 집합
파티션 IV: 프로파일 및 라이브러리
파티션 V: 부록
공통 언어 기반구조(CLI)는 그것이 곧 실행되는 실행가능 코드 및 실행 환경(가상 실행 시스템 즉 VES)에 대하여 구체적으로 설명된다. 실행가능 코드는 모듈로서 VES에 제공된다. 모듈은 통상 규정된 포맷 내의 실행가능 컨텐츠를 포함하는 단일 파일이다. 통상, 공통 언어 기반구조(CLI)의 중앙에는 단일형 시스템, 즉 컴파일러 도구 및 CLI 자체에 의해 공유되는 공통 유형 시스템(CTS)이 있다. 이는 유형을 선언, 사용 및 관리할 때 CLI가 따르는 규칙을 정의하는 모델이다. CTS는 교차 언어 통합, 유형 안정 및 고성능 코드 실행을 가능하게 하는 프레임워크를 설정한다. CLI는 다음 기본 콤포넌트를 포함한다.
공통 유형 시스템.공통 유형 시스템(CTS)은 많은 프로그래밍 언어에서 발견되는 유형 및 연산을 지원하는 리치형(rich type) 시스템을 제공한다. 공통 유형 시스템은 광범위한 프로그래밍 언어의 완전한 구현을 지원하려는 것이다.
메타데이터.CLI는 메타데이터를 사용하여 공통 유형 시스템에 의해 정의되는 유형을 설명하고 참조한다. 메타데이터는 임의의 특정 프로그래밍 언어에 독립적인 방식으로 저장(유지)된다. 따라서, 메타데이터는 프로그램(컴파일러, 디버거 등)을 다루는 도구들 사이 뿐만 아니라 이들 도구와 가상 실행 시스템 사이에서 사용하기 위한 공통 교환 메커니즘을 제공한다.
공통 언어 사양.공통 언어 사양은 언어 설계자와 프레임워크(클래스 라이브러리) 설계자 간의 합의이다. 이는 CTS 유형 시스템의 부분집합과 사용 규약의 집합을 규정한다. 언어는 이들의 사용자에게 CLS의 일부인 CTS의 적어도 일부를 구현함으로써 프레임워크를 액세스하는 최대 능력을 제공한다. 유사하게, 프레임워크는 그들이 공개적으로 노출된 양태(클래스, 인터페이스, 메소드, 필드 등)이 CLS의 일부이거나 CLS 규약에 맞는 유형을 사용하면 가장 광범위하게 사용될 수 있다.
가상 실행 시스템.가상 실행 시스템(VES)은 CTS 모델을 구현하여 실행한다. VES는 CLI에 대해 기재된 프로그램을 로딩하고 실행하는 것을 맡고 있다. 이는 관리 코드 및 데이터를 실행하는데 필요한 서비스를 런타임(지연 바인딩)과 개별 생성된 모듈을 접속하도록 메타데이터를 사용하여 제공한다.
이와 함께, 이들 CLI 양태는 분산 컴포넌트 및 애플리케이션을 설계, 개발, 배치 및 실행하는 통합 프레임워크를 형성한다. 공통 유형 시스템의 적절한 서브셋은 CLI를 타겟으로 하는 각각의 프로그래밍 언어로부터 이용가능하게 된다. 언어 기반 도구는 서로 그리고 가상 실행 시스템과 메타데이터를 사용하여 통신하여 애플리케이션을 구성하는데 사용되는 유형을 정의하고 참조한다. 가상 실행 시스템은 메타데이터를 사용하여 요구되는 유형의 인스턴스를 생성하고 기반구조의 다른 부분(원격 서비스, 어셈블리 다운로딩, 보안 등)에 데이터형 정보를 제공한다.
도 2를 이제 참조하면, 도면(200)은 본 발명의 일 양태에 따른 태그형 계층을 나타낸다. 유형 안정 방식(type safe way)으로 태그 값을 지원하기 위해서, 본 발명은 불투명, 자연 크기 값을 나타내는 계승 계층에 Top(210)으로 기재된 새로운 (추상) 루트형을 제공한다. 이 새로운 루트(210) 아래에, 일측에는 기존 System.Ojbect 계층(220)이 다른 측에는 (실링된) 유형의 태그(230)가 선언된다. 유형 Top(210)은 ECMA 파티션 III에서 제공된 바와 같은 객체 참조 유형 O의 개념에 통상 대응된다. 본 발명은 O에 제1 클래스 유형을 제공하여 새로운 서브타입 태그(230)을 추가한다. 240에서, Top(210)과 태그형(230)으로서 정의된 요소에 계승을 불허하는 하나 이상의 메타데이터 확인 규칙이 제공된다. 이들 규칙은 이하 보다 상세히 설명된다. 또한, 비록 두 브랜치가 Top(210) 아래에 도시되어 있지만, 다른 브랜치가 유사하게 제공될 수 있다(예를 들어, System.Obj의 태그형 옆 또는 아래에 정의된 다중 브랜치).
ECMA 파티션 III에서 정의된 객체 참조(유형 O)는 통상 완전히 불투명한 것으로 간주된다. 통상, 본 발명이 후술한 바와 같이 태그형에 대한 산술 연산을 제공하지만 피연산자로서 객체 참조를 허용하는 산술 연산은 없다. 허용된 비교 연산은 테스트 클래스 명령을 제공하는 본 발명을 사용한 객체 참조들 간의 등식(부등식)이다. ECMA 파티션 III에서 객체 참조에 대하여 정의된 변환 연산은 없지만, 본 발명은 태그값과 비태그값 사이에 변환을 제공한다. 객체 참조는 통상 특정CIL 객체 명령(예를 들어, newobj 및 newarr)에 의해 생성된다. 예를 들어, 이들 참조는 로컬 변수로서 저장되고, 값으로 리턴되며, 어레이에 그리고 객체의 필드로서 저장되는 인수로서 또한 전달될 수 있다.
또한, 본 발명은 진정한 다중언어 런타임(true multilanguage runtime)으로서 CLR의 채용을 실질적으로 용이하게 하는 공통 런타임 언어(CLR)에 대한 명시적인 지원을 제공한다. 본 발명의 하나의 특정 양태는 연산 추가(예를 들어, 산술 연산, 확인 규칙)를 제공하여 동적 언어(예를 들어, 오픈 소스 애플리케이션)를 또한 지원한다. 본 발명은 불투명, 자연 크기, 값을 나타내는 계승 계층을 갖는 추상 루트형(예를 들어, 탑)의 이용을 통해 유형 안전 방식으로 태그 값을 지원한다. 본 발명은 힙 상에 작은(예를 들어, 워드 크기) 객체를 할당하는 오버헤드를 극복하기 위해 여러 태깅 방식을 사용할 필요와 관련된 종래의 문제점을 완화하면서도, 예를 들어, 파라미터 연산에 대한 값의 일정한 표현의 이점을 여전히 유지한다.
도 3 내지 도 4 및 도 6 내지 도 9는 본 발명에 따른 여러 방법을 설명하고 있다. 설명의 간이함을 위해서, 이 방법들은 일련의 동작으로 도시되고 설명되지만, 본 발명은 이 동작 순서에 국한되는 것이 아니라, 본 발명에 따라서 몇몇 동작들이 다른 순서로 발생하거나 및/또는 여기서 도시되고 설명된 것과 다른 동작들과 동시에 발생할 수도 있음이 이해되어져야 한다. 예를 들어, 당업자는 상태도와 같이 일련의 상호관련된 상태 또는 이벤트로서 다르게 나타낼 수 있음을 이해할 것이다. 더욱이, 도시된 모든 동작이 본 발명에 따른 방법을 구현하는데 필요한 것은 아닐 수 있다.
도 3을 이제 참조하면, 도면(300)은 본 발명의 일 양태에 따른 태그형 프로세싱을 설명한다. 310과 320으로 진행하기 전에, 이들 동작은 ECMA 파티션 III의 변형으로서 제공될 수 있음이 주목된다. 310에서, 적어도 두개의 새로운 요소 유형 ELEMENT_TYPE_TAGGED 및 ELEMENT_TYPE_TOP은 태그값을 처리하는 계층 클래스 구조의 일부로서 정의된다. 320에서, 메타데이터 확인 규칙은 사용자 정의형이 TOP 또는 TAGGED 유형 요소로부터 유도할 수 없음을 보장하도록 확장된다. 전술한 바와 같이, CLI는 공통 유형 시스템에 의해 정의된 유형을 설명하고 참조하기 위해 메타데이터를 사용한다. 메타데이터는 특정 프로그래밍 언어에 독립적인 방식으로 저장("유지")된다. 따라서, 메타데이터는 도구 및 조작 프로그램(컴파일러, 디버거 등) 사이에서 뿐만 아니라 도구 및 가상 실행 시스템 사이에서 사용하기 위한 공통 교환 메커니즘을 제공한다. 메타데이터 토큰은, 예를 들어, 통상 메타데이타 테이블 내에서 행을 규정하는 4바이트값 또는 사용자 스트링 힙으로 개시 바이트 오프셋을 나타낸다.
진행하기 전에, 이하는 ECMA 파티션 III에 대한 변경의 일부로서 제공될 수 있음이 주목된다. 330에서, 통상, .ref 식별자를 갖는 모든 명령 변화는 태그형 값을 처리하기 위해 스택 상에서 유형 TOP의 값을 로딩할 수 있다. 340에서, 본 발명의 다른 양태에서, 산술 연산은 태그값에 작용하도록 재정의될 수 있다. 이를 달성하기 위해서, 파티션 III의 섹션 1.5에서의 표는 확장될 수 있다(예를 들어, TOP 및 TAG 유형 상에 동작하도록 피연산자를 변경, 산술 연산 동안 확인 규칙을 확장). 다음 표는 태그형 값에 동작하도록 확장될 수 있는 ECMA 파티션 III으로부터의 여러 명령을 나타낸다.
이진 수치 연산
A 유형
|
B 유형
|
int32
|
int64
|
native int
|
F
|
&
|
O
|
int32
|
int32 |
x |
native int |
x |
&(add)
|
x |
int64
|
x |
int64 |
x |
x |
x |
x |
native int
|
native int |
x |
native int |
x |
&(add)
|
x |
F
|
x |
x |
x |
F |
x |
x |
&
|
&(add,sub)
|
x |
&(add,sub)
|
x |
native int(sub)
|
x |
O
|
x |
x |
x |
x |
x |
x |
단항 수치 연산
피연산자 유형
|
int32 |
int64 |
native int |
F |
& |
O |
결과 유형
|
int32 |
int64 |
native int |
F |
x |
x |
이진 비교 또는 브랜치 연산
|
int32
|
int64
|
native int
|
F
|
&
|
O
|
int32
|
√ |
x |
√ |
x |
x |
x |
int64
|
x |
√ |
x |
x |
x |
x |
native int
|
√ |
x |
√ |
x |
Beq[.s],
bne.un[.s],
ceq
|
x |
F
|
x |
x |
x |
√ |
x |
x |
&
|
x |
x |
beq[.s],
bne.un[.s],
ceq
|
x |
√ |
x |
O
|
x |
x |
x |
x |
x |
beq[.s],bne.un[.s],ceq2 |
정수 연산
|
int32
|
int64
|
native int
|
F
|
&
|
O
|
int32
|
int32 |
x |
native int |
x |
x |
x |
int64
|
x |
int64 |
x |
x |
x |
x |
native int
|
native int |
x |
native int |
x |
x |
x |
F
|
x |
x |
x |
x |
x |
x |
&
|
x |
x |
x |
x |
x |
x |
O
|
x |
x |
x |
x |
x |
x |
시프트 연산
|
시프트 요인
|
int32
|
int64
|
native int
|
F
|
&
|
O
|
시프트
대상
|
int32
|
int32 |
x |
int32 |
x |
x |
x |
int64
|
int64 |
x |
int64 |
x |
x |
x |
native int
|
native int |
x |
native int |
x |
x |
x |
F
|
x |
x |
x |
x |
x |
x |
&
|
x |
x |
x |
x |
x |
x |
O
|
x |
x |
x |
x |
x |
x |
오버플로우 산술 연산
|
int32
|
int64
|
native int
|
F
|
&
|
O
|
int32
|
int32 |
x |
native int |
x |
&add.ovf.un
|
x |
int64
|
x |
int64 |
x |
x |
x |
x |
native int
|
native int |
x |
native int |
x |
&add.ovf.un
|
x |
F
|
x |
x |
x |
x |
x |
x |
&
|
&
add.ovf.un,
sub.ovf.un
|
x |
&
add.ovf.un,
sub.ovf.un
|
x |
native int sub.ovf.un
|
x |
O
|
x |
x |
x |
x |
x |
x |
변환 연산
변환후
|
입력(평가 스택으로부터)
|
int32
|
int64
|
native int
|
F
|
&
|
O
|
int8
unsigned int8
int16
unsigned int16
|
Truncate |
Truncate |
Truncate |
Truncate to zero2 |
x |
x |
int32
unsigned int32
|
Nop |
Truncate |
Truncate |
Truncate to zero |
x |
x |
int64
|
Sign extend |
Nop |
Sign extend |
Truncate to zero |
GC 트래킹 중단
|
GC 트래킹 중단
|
unsigned int64
|
Zero extend |
Nop |
Zero extend |
Truncate to zero |
GC 트래킹 중단
|
GC 트래킹 중단
|
native int
|
Sign extend |
Truncate |
Nop |
Truncate to zero |
GC 트래킹 중단
|
GC 트래킹 중단
|
native unsigned int
|
Zero extend |
Truncate |
Nop |
Truncate to zero |
GC 트래킹 중단
|
GC 트래킹 중단
|
All float Types
|
To Float |
To Float |
To Float |
Change precision3 |
x |
x |
도 4를 참조하면, 도면(400)은 본 발명의 일 양태에 따른 태그형 명령 실행의 일 예를 나타낸다. 아래 설명된 명령은 "추가" 명령에 관련되지만, ECMA 또는 다른 표준에 관련된 임의의 명령이 태그형 처리 또는 태그형 및 비태그형 처리의 조합에 유사하게 확장 및 적용될 수 있다. 410에서, 클래스 또는 함수 요소가 선언된다. 예를 들어, 추가 명령(또는 다른 피연산자)를 갖는 리스트 펑션이 다음과 같이 작성될 수 있다:
List{
Add(Top x);
420에서, 태그형 및 비태그형이 예를 들어, 다음과 같이 선언될 수 있다:
List{
Add(Top x);
private Top[] values;
private(int, i);
430에서, 태그형 연산이 예를 들어, 다음과 같이 실행된다:
List{
Add(Top x);
private Top[] values;
private(int, i);
Add(Top x) {
values[i]=x;
i=i+1;
}
440으로 진행하면, 스택 연산은 태그형 처리 전, 그 동안, 및/또는 그 후에 실행된다. 450에서, 태그형 연산 또는 함수가 종료한다. 따라서, 이 예에서, 최종 예시 리스트 펑션은 다음과 같이 나타난다:
List{
Add(Top x);
private Top[] values;
private(int, i);
Add(Top x) {
values[i]=x;
i=i+1;
}
}
도 5는 본 발명의 일 양태에 따른 하나 이상의 실행 규칙(500)을 나타낸다. 일 양태에서, 캐스트 클래스 명령 또는 규칙은 520에서 제공될 수 있다. 이런 유형의 명령은 객체를 클래스에 캐스트하고 도 6을 참조하여 이하 상세히 설명된다. 다른 양태에서, 테스트 클래스 명령 또는 규칙은 524에서 제공될 수 있다. 이러한 유형의 명령은 객체가 클래스 또는 인터페이스의 인스턴스인지를 결정하도록 객체에 대하여 테스트를 수행하고 도 7을 참조하여 이하 상세히 설명한다. 또다른 양태에서, 정수의 객체 참조로의 변환 명령 또는 규칙으로 변환하는 것이 530에서 제공된다. 이런 유형의 명령(예를 들어, 태그 명령)은 정수값을 객체 참조로 변환하며 도 8을 참조하여 이하 상세히 설명한다. 또다른 실시예에서, 객체 참의 정수로의 변환 명령 또는 규칙이 534에서 제공될 수 있다. 이런 유형의 명령(예를 들어, 비태그 명령)은 객체 참조를 정수값으로 변환하여 이는 도 9를 참조하여 이하 상세히 설명한다. 다른 명령 또는 규칙(예를 들어, 산술 명령)이 유사하게 정의될 수 있음이 이해되어져야 한다.
도 6 내지 도 9의 설명을 하기 전에, 이에 사용되는 스택 개념이 이하 제공된다.
스택 천이도(stack transition diagram)
스택 천이 다이어그램은 명령이 실행되기 전과 후에 평가 스택의 상태를 표시한다. 다음은 통상의 스택 천이도이다.
..., value1, value 2 -> ..., 결과
상기 예는 스택이 그 위에 적어도 두개의 요소를 가져야 함을 나타내고, 정의에서 최상위 값("스택 상부" 또는 "가장 최근에 푸시된 것")은 value2라 불리고, 그 아래 값(value2 이전에 푸시된 것)은 value1이라 불린다. (이와 유사한 다이어그램에서, 스택은 페이지를 따라 오른쪽으로 진행한다). 명령은 이들 값을 스택에서 제거하고 이들을 "결과"로 기재된 다른 값으로 대체한다.
도 6은 본 발명의 일 양태에 따른 캐스트 클래스 규칙을 나타내는 도면(600)이다.
캐스트클래스 - 객체를 클래스에 캐스트
서식 |
어셈블리 서식 |
설명 |
74<T> |
castclass cast |
객체를 클래스에 캐스트 |
610에서, 스택 천이는 캐스트 클래스에 대하여 다음과 같이 정의된다:
스택 천이:
..., obj-> ..., obj2
620에서, 캐스트 클래스는 이탤릭체 부분이 ECMA 파티션 III에 대한 변화를 나타내는 것으로 다음과 같이 정의된다.
캐스트클래스 명령은 클래스에 객체(예를 들어,Top)을 캐스트하려 한다. 클래스튼 메타데이터 토큰(typeref 또는 typedef)으로서, 원하는 클래스를 가리킨다.클래스 상부의 객체가 비태그이고 T가 태그이면, invalidexception이 주어진다.스택 상부의 객체 클래스가 클래스를 구현하지 않으면(클래스가 인터페이스이면), 그리고 클래스의 서브클래스가 아니면(클래스가 정규 클래스이면),InvalidCastException이 주어진다.
아래 사항이 확인된다:
1. 어레이가 System.Array를 계승
2. Foo가 Bar에 캐스트될 수 있으면, Foo[]가 Bar[]에 캐스트될 수 있다.
3. 2의 목적을 위해, enums은 그들의 하부 유형으로서 처리된다: 따라서, E1[]은 E1과 E2가 하부 유형을 공유하면 E2[]에 캐스트할 수 있다.
obj가 널(null)이면, 캐스트클래스가 성공하고 널로 복귀한다. 이들 동작은 후술하는 isInst와는 다르다.
630에서, 캐스트 클래스에 대한 예외는 다음과 같이 설명된다:
InvalidCastException은 obj가 클래스에 캐스트될 수 없으면 주어진다.
TypeLoadException은 클래스가 발견될 수 없으면 주어진다. 이는 통상 CIL이 런타임때가 아닌 네이티브 코드에 변환될 때 탐지된다.
640에서, 캐스트 클래스에 대한 검증가능성이 설명된다.
올바른 CIL은 유효 TypeRef 또는 TypeDef 토큰임과 obj가 널, 객체 참조 또는 태그 즉시값임을 보장한다.
도 7은 본 발명의 일 양태에 따른 테스트 클래스 규칙을 나타낸다.
isinst-객체가 클래스 또는 인터페이스의 인스턴스이면 테스트
서식 |
어셈블리 서식 |
설명 |
75 <T> |
isinst class |
obj가 클래스 인스턴스, 복귀 NULL 또는 그 클래스 또는 인터페이스의 인스턴스이면 테스트 |
710에서, 스택 천이는 캐스트 클래스에 대하여 다음과 같이 정의된다:
스택 천이:
..., obj -> ..., .결과
720에서, 캐스트 클래스는 이탤릭체 부분이 ECMA 파티션 III에 대한 변경을 나타내는 것으로서 다음과 같이 정의된다:
isinst 명령은 obj(Top 유형)이 클래스의 인스턴스인지를 테스트한다. 클래스는 원하는 토큰을 가리키는 메타데이터 토큰(typeref 또는 typedef)이다.스택 상부의 객체가 비태크이고 T가 태그이면, NULL이 스택 상으로 푸시된다. 스택 상부 객체의 클래스가 클래스(클래스가 인터페이스일 경우) 또는 클래스의 서브클래스(클래스가 정기 클래스인 경우)이면, 유형 클래스에 캐스트되고, 그 결과는 캐스트클래스가 호출되었던 것처럼 스택 상에 푸시된다. 다르게는, NULL이 스택 상으로 푸시된다. obj가 NULL이면, isinst는 NULL로 복귀한다.
다음이 확인된다:
1. 어레이는 System.Array로부터 계승한다.
2. Foo가 Bar에 캐스트될 수 있으면, Foo[]는 Bar[]에 캐스트될 수 있다.
3. 2의 목적으로, enum은 그들의 하부 유형으로서 취급된다: 따라서, E1[]은 E1과 E2가 하부 유형을 공유하면 E[2]에 캐스트할 수 있다.
730에서, 테스트 클래스에 대한 예외가 다음과 같이 설명된다:
TypeLoadException은 클래스가 발견되지 않으면 주어진다. 이는 통상 CIL이 런타임에서 보다 네이티브 코드로 변환될 때 감지된다.
740에서, 테스트 클래스에 대한 검증가능성이 설명된다:
올바른 CIL은 CIL이 클래스를 나타내는 유효 typeref 또는 typedef 토큰이다는 점과 obj가 항상 null 또는 객체 참조임을 보장한다.
도 8은 본 발명의 일 양태에 따른 정수로부터 태그형으로부터 변환 규칙을 나타내는 다이어그램(800)이다.
tag[.ovf] 정수에서 객체 참조로의 변환
서식 |
어셈블리 서식 |
설명 |
OPCODE_TAG |
Tag[.ovf] |
정수 i를 태그형 참조 객체로 변환 |
810에서, 스택 천이는 태그 클래스에 대하여 다음과 같이 정의된다.
스택 천이:
..., i-> ..., obj
820에서, 태그는 다음과 같이 정의된다:
태그 명령은 비태그값 i(네이티브 정수)를 유형 탑(유형 0)의 인스턴스로 변경한다. 이는 특별 태그 비트를 i 내에 설정함으로써 달성된다.
830에서, 태그에 대한 예외가 다음과 같이 설명된다:
OverflowException은 값의 태그가 이미 설정되어 있으면 주어진다.
840에서, 태그에 대한 검증가능성이 설명된다:
올바른 CIL은 i가 유형 네이티브 int임을 보장한다.
도 9는 본 발명의 일 양태에 따라 태그형에서 정수로의 변환 규칙을 나타내는 다이어그램(900)이다.
untag[.ovf] 객체 참초의 정수로의 변환
서식 |
어셈블리 서식 |
설명 |
OPCODE_UNTAG* |
UnTag |
태그 객체 참조를 정수 i로 변환 |
* 주의: 이 opcode OPCODE_TAG 및 OPCODE_UNTAG는 이용가능한 CLI opcode의 범위로부터 할당될 수 있다 (ECMA 파티션 III, 섹션 1.2.1 참조).
910에서, 스택 천이는 비태그 클래스에 대하여 다음과 같이 정의된다.
스택 천이:
..., obj ->..., i
920에서, 비태그는 다음과 같이 정의된다.
비태그 명령은 태그 객체 참조를 네이티브 정수로 변환한다. 이는 obj 내에 있는 특정 비트를 비설정함으로써 달성된다.
930에서, 비태그에 대한 예외가 다음과 같이 설정된다:
InvalidCastException은 obj가 태그된 값이 아닌 경우 주어진다.
NullReferenceException은 obj가 null인 경우에 주어진다.
940에서, 비태그에 대한 검증가능성이 설명된다:
올바른 CIL은 obj가 객체 참조, 즉, 유형 탑임을 보장하고 태그 정수를 나타낸다.
도 10을 참조하면, 본 발명의 여러 양태를 구현하기 위한 예시적인 환경(1010)은 컴퓨터(1012)를 포함한다. 컴퓨터(1012)는 처리부(1014), 시스템 메모리(1016), 시스템 버스(1018)을 포함한다. 시스템 버스(1018)는 시스템(1016)를 포함하지만 이에 한정되지는 않는 시스템 컴포넌트를 처리부(1014)에 결합시킨다. 처리부(1014)는 여러 이용가능 프로세서들 중의 임의의 것일 수 있다. 듀얼 마이크로프로세서 및 다른 멀티프로세서 아키텍쳐가 또한 처리부(1014)로서 사용될 수있다.
시스템 버스(1018)는 메모리 버스 또는 메모리 컨트롤러, 병렬 버스 또는 외부 버스 및/또는 11 비트 버스, 산업표준 아키텍쳐(ISA), 마이크로 채널 아키텍쳐(MSA), 확장형 ISA(EISA), 지능형 구동 전자(IDE), VESA 로컬 버스(VLB), 병령 콤포넌트 상호접속(PCI), 범용 직렬 버스(USB), 개선된 그래픽 포트(AGP), 국제 개인용 컴퓨터 메모리 카드 협회 버스(PCMAIA) 및 소형 컴퓨터 시스템 인터페이스(SCSI)를 포함하지만 이에 국한되지는 않는 다양한 이용가능 버스 아키텍쳐 중의 임의의 것을 사용한 로컬 버스를 포함하는 여러 유형의 버스 구조(들) 중의 임의의 것일 수 있다.
시스템 메모리(1016)는 휘발성 메모리(1020) 및 비휘발성 메모리(1022)를 포함한다. 기본 입출력 시스템(BIOS)는 시동 동안과 같이 컴퓨터(1012) 내부의 요소들 간의 정보를 전송하기 위한 기본 루틴을 포함하여, 비휘발성 메모리(1022)에 저장된다. 예를 들어, - 한정이 아님 -, 비휘발성 메모리(1022)는 판독 전용 메모리(ROM), 프로그래머블 ROM(PROM), 전기적 프로그래머블 ROM(EPROM), 전기적 소거가능 ROM(EEPROM) 또는 플래시 메모리를 포함할 수 있다. 비휘발성 메모리(1020)는 외부 캐시 메모리로서 동작하는 랜덤 액세스 메모리(RAM)을 포함한다. 예를 들어, - 한정이 아님 -, RAM은 동기 RAM(SRAM), 동적 RAM(DRAM), 동기 DRAM(SDRAM), 더블 데이터 레이트 SDRAM(DDR SDRAM), 개선된 SDRAM(ESDRAM), 싱크링크(Synchlink) DRAM(SLDRAM), 및 다이렉트 램버스 RAM(DRRAM)과 같은 여러 형태로 이용가능하게 된다.
또한, 컴퓨터(1012)는 분리형/비분리형, 휘발성/비휩랏어 컴퓨터 저장매체를 포함한다. 도 10은 예들 들어 디스크 스토리지(1024)를 나타내고 있다. 디스크 스토리지(1024)는 자기 디스크 드라이브, 플로피 디스크 드라이브, 테이프 드라이브, 재즈 드라이브, 집 드라이브, LS-100 드라이브, 플래시 메모리 카드 또는 메모리 스틱같은 장치를 포함하지만 이제 국한되지 않는다. 또한, 디스크 스토리지(1024)는 스토리지 매체를 컴팩트 디스크 ROM 장치(CD-ROM), CD 기록가능 드라이브(CD-R 드라이브), CD-재기입가능 드라이브(CD-RW 드라이브) 또는 디지털 다기능 디스크 ROM 드라이브(DVD-ROM)을 포함하지만 이에 국한되지 않는 다른 스토리지 매체와 조합으로 또는 개별적으로 포함할 수 있다. 디스크 스토리지 장치(1024)를 시스템 버스(1018)에 용이하게 접속하기 위해서, 통상 인터페이스 (1026)과 같은 분리형 또는 비분리형 인터페이스가 사용된다.
도 10은 적절한 운영 환경(101)에서 설명된 사용자와 기본 컴퓨터간의 중재자로서 동작하는 소프트웨어를 설명함이 이해될 것이다. 이러한 소프트웨어는 운영 체계(1028)을 포함한다. 운영 체계(1028)는 디스크 스토리지(1024) 상에 저장될 수 있으며, 컴퓨터 시스템(1012)의 자원을 제어하고 할당하도록 동작한다. 시스템 애플리케이션(1030)은 시스템 메모리(1016) 내에 또는 디스크 스토리지(1024) 상에 저장된 프로그램 모듈(1032) 및 프로그램 데이터(1034)를 통해 운영 체계(1028)에 의한 자원의 관리를 이용한다. 본 발명은 다양한 운영 쳬계 또는 운영 체계들의 조합을 사용하여 구현될 수 있음이 이해되어져야 한다.
사용자는 입력 장치(들)(1036)를 통해 컴퓨터(1012)에 명령 또는 정보를 입력한다. 입력 장치(1036)는 마우스, 트랙볼, 스타일러스, 터치 패드와 같은 포인팅 장치, 키보드, 마이크로폰, 조이스틱, 게임 패드, 위성 접시, 스캐너, TV 튜너 카드, 디지털 카메라, 디지터 ㄹ비디오 카메라, 웹 카메라를 포함하지만 이에 국한되지는 않는다. 이들 및 다른 입력 장치는 인터페이스 포트(들)(1038)에 의해 시스템 버스(1018)을 통해 처리부(1014)에 접속된다. 인터페이스 포트(들)(1038)은 예를 들어, 직렬 포트, 병렬 포트, 게임 포트 및 범용 직렬 버스(USB)를 포함한다. 출력 장치(들)(1040)는 입력 장치(들)(1036)와 동일한 유형의 포트 중의 일부를 사용한다. 따라서, 예를 들어, USB 포트는 컴퓨터(102)에 입력을 제공하거나 출력 장치(1040)에 컴퓨터(1012)로부터 정보를 출력하도록 사용될 수 있다. 출력 어댑터(1042)는 다른 출력 장치(1040)들 중에서 특정 어댑터를 요구하는 모니터, 스피커 및 프린터와 같은 일부 출력 장치(1040)이다는 점을 나타내도록 제공된다. 출력 어댑터(1042)는 출력 장치(1040)와 시스템 버스(1018) 간의 접속 수단을 제공하는 비디오 및 음성 카드를 예를 들어 포함하지만 이에 국한되지는 않는다. 다른 장치 및/또는 장치의 시스템은 원격 컴퓨터(들)(1044)와 같이 입력 및 출력 성능을 모두 제공함이 주목되어져야 한다.
컴퓨터(1012)는 원격 컴퓨터(들)(1044)과 같은 하나 이상의 원격 컴퓨터에 대한 논리적 접속을 사용하여 네트워크화된 환경에서 동작할 수 있다. 원격 컴퓨터(들)(1044)는 개인용 컴퓨터, 서버, 라우터, 네트워크 PC, 워크스테이션, 마이크로프로세서 기반 기기, 피어 장치 또는 기타 공통 네트워크 노드 등일 수 있으며, 통상 컴퓨터(1012)에 대하여 설명된 요소의 대다수 또는 모두를 포함한다. 간략함을 위해서, 단지 메모리 스토리지 장치(1046)가 원격 컴퓨터(들)(1044)에 설명되어 있다. 원격 컴퓨터(들)(1044)는 네트워크 인터페이스(1048)를 통해 컴퓨터(1012)에 논리적으로 접속되어 있으며, 그 후에, 통신 접속(1050)을 통해 물리적으로 접속된다. 네트워크 인터페이스(1048)는 근거리 네트워크(LAN) 및 원거리 네트워크(WAN)과 같은 통신 네트워크를 포함한다. LAN 기술은 파이버 분산 데이터 인터페이스(FDDI), 구리 분산 데이터 인터페이스(CDDI), 이더넷/IEEE 1102.3, 토큰 링/IEEE 1102.5 등을 포함한다. WAN 기술은 점 대 점 링크, 통합 서비스 디지털 네트워크(ISDN) 및 그 그 변이와 같은 회선 교환 네트워크, 및 패킷 교환 네트워크 및 디지털 가입자선(DSL)을 포함하지만 이에 국한되지는 않는다.
통신 접속(들)(1050)은 네트워크 인터페이스(1048)를 버스(1018)에 접속하는데 사용되는 하드웨어/소프트웨어를 의미한다. 통신 접속(1050)은 컴퓨터(1012) 내부에 있는 것으로 간략하게 예시적하였지만, 컴퓨터(1012) 에 대한 외부에 또한 있을 수 있다. 네트워크 인터페이스(1048)의 접속에 대하여 필요한 하드웨어/소프트웨어는 단시 예시의 목적으로, 일반적인 전화급의 모뎀, 케이블 모뎀 및 DSL 모뎀과 같은 모뎀, ISDAN 어댑터, 및 이더넷 카드와 같은 외장형 및 내장형 기술을 포함한다.
도 11은 본 발명이 상호작용할 수 있는 예시적인 컴퓨팅 환경(1100)의 개략 블록도이다. 시스템(1100)은 하나 이상의 클라이언트(들)(1110)을 포함한다. 클라이언트(들)(1110)은 하드웨어 및/또는 소프트웨어 (예를 들어, 스레드, 프로세스, 컴퓨팅 장치)일 수 있다. 또한, 시스템은 하나 이상의 서버(들)(1130)를 포함한다. 시스템(들)(1130)은 하드웨어 및/또는 소프트웨어 (예를 들어, 스레드, 프로세스, 컴퓨팅 장치)일 수 있다. 서버들(1130)은 예를 들어, 본 발명을 사용함으로써 변환을 수행하는 스레드를 포함할 수 있다. 클라이언트(1110)와 서버(1130) 간의 가능한 통신들 중의 하나는, 둘 이상의 컴퓨터 프로세스 사이에 전송되기에 적합한 데이터 패킷의 형태일 수 있다. 시스템(1100)은 클라이언트(들)(1110)와 서버(들)(1130) 사이의 통신을 용이하게 하도록 사용될 수 있는 통신 프레임워크(1150)를 포함한다. 클라이언트(들)(1110)는 클라이언트(들)(1110)에 국부적인 정보를 저장하는데 사용될 수 있는 하나 이상의 클라이언트 데이터 저장장치(들)(1160)에 동작가능하게 접속된다. 유사하게, 서버(들)(1130)는 상기 서버들(1130)에 국부적인 정보를 저장하는데 사용될 수 있는 하나 이상의 서버 데이터 저장장치(들)(1140)에 동작가능하게 접속된다.
상술한 것은 본 발명의 예들을 포함한다. 물론, 이는 본 발명을 설명하는 목적으로 콤포넌트 또는 방법들의 모든 생각가능한 조합을 설명하고 있는 것은 아니며, 그러나, 본 발명의 다른 조합 및 변경이 가능함을 당업자는 인식할 수 있을 것이다. 따라서, 본 발명은 첨부된 청구항들의 취지 및 범위 내에서 이러한 변경, 변형 및 변화를 포함하려는 것이다. 더욱이, "포함하다(include)"라는 용어로 상세한 설명 또는 청구하에 사용되는 경우에 있어서, 이러한 용어는 "포함하다(comprising)"가 청구항에서 변환어(transitional word)로서 사용될 때 해석되는 경우와 유사하게 용어 "포함하다(comprising)"로 포함(inclusive)되는 것이다.