KR100466722B1 - 어레이경계검사방법및장치와,이를포함하는컴퓨터시스템 - Google Patents

어레이경계검사방법및장치와,이를포함하는컴퓨터시스템 Download PDF

Info

Publication number
KR100466722B1
KR100466722B1 KR10-1998-0705676A KR19980705676A KR100466722B1 KR 100466722 B1 KR100466722 B1 KR 100466722B1 KR 19980705676 A KR19980705676 A KR 19980705676A KR 100466722 B1 KR100466722 B1 KR 100466722B1
Authority
KR
South Korea
Prior art keywords
array
value
stack
memory
minimum
Prior art date
Application number
KR10-1998-0705676A
Other languages
English (en)
Other versions
KR19990081958A (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
Family has litigation
First worldwide family litigation filed litigation Critical https://patents.darts-ip.com/?family=26681279&utm_source=google_patent&utm_medium=platform_link&utm_campaign=public_patent_search&patent=KR100466722(B1) "Global patent litigation dataset” by Darts-ip is licensed under a Creative Commons Attribution 4.0 International License.
Application filed by 선 마이크로시스템즈 인코퍼레이티드 filed Critical 선 마이크로시스템즈 인코퍼레이티드
Publication of KR19990081958A publication Critical patent/KR19990081958A/ko
Application granted granted Critical
Publication of KR100466722B1 publication Critical patent/KR100466722B1/ko

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/14Protection against unauthorised use of memory or access to memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30021Compare instructions, e.g. Greater-Than, Equal-To, MINMAX
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • G06F12/0875Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches with dedicated cache, e.g. instruction or stack
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/14Protection against unauthorised use of memory or access to memory
    • G06F12/1416Protection against unauthorised use of memory or access to memory by checking the object accessibility, e.g. type of access defined by the memory independently of subject rights
    • G06F12/1425Protection against unauthorised use of memory or access to memory by checking the object accessibility, e.g. type of access defined by the memory independently of subject rights the protection being physical, e.g. cell, word, block
    • G06F12/1441Protection against unauthorised use of memory or access to memory by checking the object accessibility, e.g. type of access defined by the memory independently of subject rights the protection being physical, e.g. cell, word, block for a range
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/22Microcontrol or microprogram arrangements
    • G06F9/26Address formation of the next micro-instruction ; Microprogram storage or retrieval arrangements
    • G06F9/262Arrangements for next microinstruction selection
    • G06F9/264Microinstruction selection based on results of processing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/3012Organisation of register space, e.g. banked or distributed register file
    • G06F9/30134Register stacks; shift registers
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/3017Runtime instruction translation, e.g. macros
    • G06F9/30174Runtime instruction translation, e.g. macros for non-native instruction set, e.g. Javabyte, legacy code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/34Addressing or accessing the instruction operand or the result ; Formation of operand address; Addressing modes
    • G06F9/345Addressing or accessing the instruction operand or the result ; Formation of operand address; Addressing modes of multiple operands or results
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44589Program code verification, e.g. Java bytecode verification, proof-carrying code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4482Procedural
    • G06F9/4484Executing subprograms
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • G06F9/449Object-oriented method invocation or resolution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/45Caching of specific data in cache memory
    • G06F2212/451Stack data

Abstract

본 발명은 어레이 액세스 경계 검사를 포함하는 개선된 프로세서와 컴퓨터 시스템에 관한 것으로서, 어레이 경계 검사 장치는 정보 어레이의 참조된 구성요소가 최대 어레이 크기 경계값과 최소 어레이 크기 경계값내에 있는지를 확인하도록 구성되고, 본 발명의 어레이 경계 검사 장치는 복수의 어레이 경계값을 저장하고 검색하는 연관 메모리 수단을 포함하고, 복수의 어레이 경계값은 각각 복수의 어레이 액세스 명령 중 하나와 연관되고, 입력부는 동시에 어레이 액세스 명령을 식별하는 어레이 액세스 명령 식별자와 저장된 어레이 참조 엔트리의 각각의 일부를 비교하고, 출력부는 어레이 경계 출력값으로서 연관 메모리 수단의 복수의 메모리 기억장소 중 하나에 저장된 복수의 어레이 경계값 중 하나를 제공하도록 구성되고, 제 1 비교 수단은 참조된 구성요소의 값과 최대 어레이 인덱스 경계값을 비교하여 참조된 구성요소의 값이 최대 어레이 인덱스 경계값보다 크면 최대 위반 신호를 제공하고, 제 2 비교 수단은 구성요소의 값과 최소 어레이 크기 경계값을 비교하여 구성요소의 값이 최소 어레이 경계값보다 작으면 최소 위반 신호를 제공하며, 최대 위반 신호 또는 최소 위반 신호 중 어느 한 신호로 예외가 발생하는 것을 특징으로 한다.

Description

어레이 경계 검사 방법 및 장치와, 이를 포함하는 컴퓨터 시스템{AN ARRAY BOUNDS CHECKING METHOD AND APPARATUS, AND COMPUTER SYSTEM INCLUDING THIS}
본 발명은 일반적으로 컴퓨터 시스템, 특히 어레이 액세스 경계 검사를 포함하는 개선된 프로세서와 컴퓨터 시스템에 관한 것이다.
마이크로피시 부록 Ⅰ(MICROFICHE APPENDIX I)에의 상호 참조
마이크로피시 부록 Ⅰ은 본 특허 공보의 일부이며, 총 122 프레임을 갖는 2개의 쉬트(sheets)로 구성되고, JAVA 가상 기억 장치 명세이고, 여기에 첨부된 부록 A는 저작권 보호를 목적으로 하는 중요성을 포함한다. 저작권자는, 미국 특허와 상표 사무소에 특허 파일 또는 기록이 있기 때문에 특허공보나 공개공보가 복사되더라도 이의가 없지만, 그렇지 않다면 저작권자가 모든 저작권을 갖는다.
컴퓨터와 통신 산업분야에서 많은 개인과 단체들은 전 세계에서 빠르게 성장하고 있는 시장인 인터넷을 권하고 있다. 1990년대에 인터넷 사용자의 수가 기하급수적으로 증가하고 있다. 1995년 6월에는 대략 6,642,000개의 호스트가 인터넷에 연결되었고, 이는 1995년 1월의 대략 4,852,000개의 호스트보다 증가된 것이다. 호스트의 수는 매년 75%정도 증가하고 있다. 호스트들 사이에는 약 120,000의 네트워크와 27,000 이상의 웹 서버가 있다. 웹 서버의 수는 53일마다 두 배로 증가하고 있다.
1995년 7월에 1,000,000 이상의 활동하고 있는 인터넷 사용자, 12,505 이상의 유즈넷 뉴스 그룹 및 10,000,000 이상의 유즈넷 리더를 가지고 있어 인터넷이 방대하고 다양한 정보와 멀티미디어 서비스를 위한 큰 시장으로 폭발적으로 커질 것임을 나타내고 있다.
게다가, 인터넷이나 공용 반송파 네트워크에 대해 많은 단체와 회사들이 전용 네트워크나 회사 내의 보다 효과적인 정보 분배의 방법으로써 그들의 내부 정보 시스템을 인트라넷으로 바꾸고 있다. 인트라넷을 위한 기본적인 하부 구조는 서버와 데스크톱을 연결하는 내부 네트워크이고, 이는 방화벽을 지나 인터넷에 연결될 수도 있고 그렇지 않을 수도 있다. 이들 인트라넷은 기업 내에 잘 구축되어 있는 표준 개방 네트워크 프로토콜을 경유하여 데스크톱까지 서비스를 제공한다. 인트라넷은 내부 정보 관리를 간소화하고 브라우저 패러다임을 사용하는 내부 커뮤니케이션을 개선한 것처럼 인트라넷을 사용하는 기업에 많은 이익을 제공한다. 기존의 시스템과 회사의 기업체계 하부구조에 인터넷 기술을 통합하는 것은 인트라넷을 채용하는 측에 대한 현재 기술 투자에 영향을 미친다. 상술한 바와 같이, 인트라넷과 인터넷은 밀접한 관계가 있으며, 인트라넷은 사업상 안전한 의사소통을 하는데 사용되고, 인터넷은 사업과 다른 분야사이의 외부 트랜잭션을 위해 사용된다. 본원의 목적을 위해, "네트워크"라는 용어는 인터넷과 인트라넷을 포함한다. 그러나, 인터넷과 인트라넷의 차이는 어디에 사용가능한지에 따라 발생한다.
1990년대에 선 마이크로시스템즈의 프로그래머는 보편적인 프로그래밍 언어를 썼다. 이 언어는 JAVA 프로그래밍 언어로 이름지어졌다. (JAVA는 CA의 Mountain View에 있는 선 마이크로시스템즈의 상표이다) JAVA 프로그래밍 언어는 초기에 C++ 프로그래밍 언어로 코드화되는 경향이 있었던 프로그래밍 노력에 기인한 것이며, 그 결과 JAVA 프로그래밍 언어는 C++ 프로그래밍 언어와 호환된다. 그러나, JAVA 프로그래밍 언어는 단순하고, 객체지향이고, 분산형이고, 해석되지만 고성능이며, 강력하지만 안전하고, 확실하고, 능동적이고, 중간 구조이고, 간편하며, 다중 스레드 언어이다.
JAVA 프로그래밍 언어는 선 마이크로시스템즈로부터 라이센스받은 많은 큰 하드웨어와 소프트웨어 회사가 인터넷을 위한 프로그래밍 언어로 선택되어졌다. JAVA 프로그래밍 언어와 환경은 현재 프로그래밍 실무에서의 많은 문제점을 해결하기 위해 고안되어졌다. JAVA 프로그래밍 언어는 혼란스러운 형태와 이해가 난해하고 별로 사용되지 않는 C++ 프로그래밍 언어를 생략한다. 이들 생략된 형태는 주로 연산자 과부하, 다중 상속 및 광범한 자동 강제를 포함한다. JAVA 프로그래밍 언어는 더 이상 할당할 필요가 없고 C 프로그래밍 언어에서처럼 메모리가 자유롭기 때문에 프로그래밍의 작업을 단순화하는 자동 무용정보 수집을 포함한다. JAVA 프로그래밍 언어는 C 프로그래밍 언어에서 정의된 포인터의 사용을 제한하고 대신에 어레이 경계가 명확히 검사되는 정확한 어레이를 가지며, 그것에 의해 만은 바이러스와 귀찮은 버그에 대한 취약점을 없앤다. JAVA 프로그래밍 언어는 객체-C 인터페이스와 특수 예외 처리기를 포함한다.
JAVA 프로그래밍 언어는 TCP/IP 프로토콜(Transmission Control Protocol based on Internet protocol), HTTP(Hypertext Transfer Protocol) 및 FTP(File Transfer Protocol)과 쉽게 카피될 수 있도록 루틴의 광범한 라이브러리를 가진다. JAVA 프로그래밍 언어는 네트워크된/배분된 환경에서 사용되는 경향이 있다. JAVA 프로그래밍 언어는 바이러스가 없고 탬퍼가 없는 시스템의 구조가 가능하다. 인증 기술은 공중-키 암호화에 기초한다.
많은 컴퓨터 시스템 애플리케이션은 어레이를 이용한다. 어레이는 1차원 이상, 예를 들어 리스트, 테이블 또는 다차원 데이터 배열의 정보 배열이다.
어레이에 특유한 명령을 구현하는 컴퓨터 시스템에서, 특정 어레이 액세스 명령과 연관 어레이를 일치시키는 데는 통상 반복적인 비교가 요구된다. 다음으로 컴퓨터 시스템의 정의된 체계에 의해 처리될 수 있는 수용 가능한 경계 내에 있다는 것을 확인하기 위해 어레이의 크기를 검사하는 것이 필요하다.
어레이 액세스 명령이 어레이에 의해 정의된 데이터 구성요소만을 액세스하고, 근접한 데이터에 대한 액세스는 불가능하기 때문에 어레이 경계 검사에 따르면 시스템이 보다 강력해진다. 이로 따라 버그가 거의 없고, 시스템 보안이 개선된다. 그러나 통상 단계당 적어도 하나의 사이클을 필요로 하는 단계적인 비교 및 확인은 확인될 때까지는 가치 있는 처리 시간을 낭비하게 된다.
따라서 어레이 액세스를 구현하고, 경계 검사를 가속하는 방법 및 장치가 요구되고, 이에 의해 어레이 정보를 검색하고, 종래의 시스템에 대한 어레이 크기를 확인하는데 필요한 시간이 상당히 감소된다.
도 1은 본 발명의 경계 검사 유닛을 이용하는 가상 기억 장치 하드웨어 프로세서의 한 실시예의 블럭도,
도 2는 본 발명의 한 실시예에 사용된 가상 기억 장치 명령의 발생을 위한 프로세서 흐름도,
도 3은 도 1의 하드웨어 프로세서에서 실행된 명령 파이프라인을 도시하는 도면,
도 4A는 각 매서드 프레임이 도 1의 하드웨어 프로세서에 의해 이용되는 오퍼랜드 스택, 환경 저장 영역 및 로컬 변수 저장 영역을 포함할 때 스택 구조의 논리적 구조의 한 실시예를 도시하는 도면,
도 4B는 각 매서드 프레임이 스택상의 오퍼랜드 스택과 로컬 변수 저장 영역을 포함하고, 매서드 프레임을 위한 환경 저장 영역이 분리 실행 환경 스택상에 포함될 때, 스택 구조의 논리 조직의 대안 실시예가 도시된 도면,
도 4C는 도 4B의 실행 환경 스택과 스택을 위한 스택 관리 유닛의 대안 실시예를 나타내는 도면,
도 4D는 도 1의 스택 관리 유닛에서 로컬 변수 룩-어사이드 캐시의 한 실시예를 도시하는 도면,
도 5는 도 1의 하드웨어 프로세서에 대해 여러 가능한 애드온을 도시한 도면,
도 6A는 번역 유닛, 어레이 액세스 프로세서, 연관 메모리 장치를 포함하는 어레이 바운드 검사 구성요소 및 본 발명의 원리에 따른 실행 유닛을 포함하는 컴퓨터 시스템을 나타내는 도면,
도 6B는 도 6A 또는 도 6C의 컴퓨터 시스템과 함께 사용된 통상적인 어레이 명령을 나타내는 도면 및
도 6C는 본 발명의 원리에 따른 도 1의 가상 컴퓨터 하드웨어 프로세서로 운영하고, 그 일부를 포함하는 컴퓨터 시스템을 나타내는 도면이다.
본 발명의 상기 특징과 다른 특징들은 본 발명의 상세한 설명에 상술된 도면으로부터 나타내어질 것이다. 같거나 유사한 특징들은 본 발명의 상세한 설명과 도면에 있는 동일한 참조번호로 표시되어 있다.
본 발명은 어레이 액세스 경계를 구현하고, 어레이 액세스 경계 검사를 가속하기 위해 내용 참조 가능 메모리 액세스와 같은 완전한 연관 메모리를 이용하고, 이에 의해 어레이 정보를 검색하고, 종래의 시스템에 대한 어레이 크기를 확인하는데 필요한 시간이 감소된다.
본 발명의 한 실시예는 정보 어레이에 대한 각각의 액세스가 최대 어레이 크기 경계값과 최소 어레이 크기 경계값(통상, 0)내에 존재하는 것을 확인하도록 구성되는 어레이 경계 검사 장치를 제공한다. 이 장치는 복수의 어레이 크기값을 저장하고 검색하는 연관 메모리 구성요소를 포함한다. 어레의 크기값의 각각의 쌍은 복수의 어레이 액세스 명령 중 하나와 연관된다. 각각의 어레이 액세스 명령은 어레이내 구성요소를 참조하는데 사용된다. 상기 연관 메모리 구성요소는 제 1 메모리부, 제 2 메모리부, 입력부 및 출력부를 포함한다.
제 1 메모리부는 복수의 어레이 참조 엔트리를 검색하고 저장하도록 구성된 복수의 제 1 메모리 기억장소를 포함한다. 복수의 제 1 메모리 기억장소는 복수의 어레이 참조 엔트리 중 하나를 저장하도록 구성된다. 복수의 어레이 엔트리는 각각 복수의 어레이 액세스 명령 중 하나에 대응한다.
제 2 메모리부는 복수의 어레이 크기값을 검색하고 저장하도록 구성된 복수의 제 2 메모리 기억장소를 포함한다. 복수의 제 2 메모리 기억장소는 각각 한 쌍의 어레이 크기값을 저장하도록 구성되고, 복수의 제 1 메모리 기억장소 중 하나와 연관된다. 복수의 어레이 크기값은 각각 복수의 어레이 액세스 명령 중 하나와 연관된다.
본 발명의 원리에 따르면, 입력부는 제 1 메모리부와 연결되고, 어레이 액세스 명령 식별자를 검색하도록 구성된다. 입력부는 저장된 어레이 참조 엔트리의 각각의 적어도 일부와 어레이 액세스 명령 식별자를 동시에 비교하고, 여기서 어레이 액세스 명령 식별자는 어레이 액세스 명령을 식별한다. 제 2 메모리부에 연결되는 출력부는 어레이 크기 출력값으로서 어레이 액세스 명령 식별자와 맞는 복수의 어레이 참조 엔트리 중 하나를 저장하는 복수의 제 1 메모리 기억장소와 연관되는 복수의 제 2 메모리 기억장소 중 하나에 저장된 한 쌍의 복수의 어레이 크기값을 제공하도록 구성된다.
제 1 비교 구성요소는 참조된 구성요소와 최대 어레이 크기 경계값을 비교하고, 구성요소의 값이 어레이 크기 경계값보다 크면 최대 위반 신호를 제공한다. 제 2 비교 구성요소는 구성요소의 값과 최소 어레이 크기 경계값을 비교하고, 구성요소의 값이 최소 어레이 크기 경계값보다 작으면 최소 위반 신호를 제공한다. 최대 위반 신호 또는 최소 위반 신호 중 어느 한 신호에 따라 예외가 발생한다.
본 발명의 다른 실시예는 상기한 바와 같이 소프트웨어 트랜스레이터, 실행 유닛, 어레이 액세스 프로세서 및 연관 메모리 구성요소를 포함하는 컴퓨터 시스템을 제공한다. 이 실시예에 있어서, 번역 유닛은 소프트웨어 프로그램을 검색하고 번역하며, 이에 따라 복수의 번역된 소프트웨어 명령과 연관된 명령 식별자를 제공하도록 구성된다. 번역된 소프트웨어 명령은 각각 명령 식별자 중 하나에 대응한다. 번역된 명령은 복수의 어레이 액세스 명령을 포함한다. 이 실시예에 있어서, 실행 유닛은 번역된 명령을 검색하고 실행하도록 구성된다. 실행 유닛은 또한 어레이 액세스 경계 예외 서브루틴을 정의하는 번역된 명령의 시퀀스를 실행함으로써 연관 메모리 구성요소와 예외 구성요소에 의해 발생된 예외 출력 신호에 응답하도록 구성된다.
본 발명의 이들 및 다른 특징과 이점들은 발명의 상세한 설명에서 논의된 바와 같이 도면으로부터 명백해질 것이다.
도 1은 가상 기억 장치 명령 하드웨어 프로세서(100)의 한 실시예를 도시하며, 이하부터 하드웨어 프로세서는 "100"이라 하고, 이는 본 발명에 따른 경계 검사 유닛(147)을 포함하며, 프로세서 구조 독립인 가상 기억 장치 명령을 직접 실행한다. 실행 JAVA 가상 기억 장치 명령에서 하드웨어 프로세서(100)의 실행은 하이-엔드 CPU보다 더 나으며, 인텔 펜티엄 마이크로프로세서나 선 마이크로시스템즈 울트라스파크 프로세서(울트라스파크는 CA의 Mountainview의 선 마이크로시스템즈의 상표이고, 펜티엄은 CA의 Sunnyvale의 인텔사의 상표이다)와 같이, 소프트웨어 JAVA 인터프리터나 JAVA 적시(just-in-time) 컴파일러로 동일 가상 기억 장치 명령을 해석하고, 이는 가격이 싸고 전력 소비가 적다. 결과적으로, 하드웨어 프로세서(100)는 이식 가능한 애플리케이션에 아주 적당하다. 하드웨어 프로세서(100)는 무용정보 수집, 스레드 인입현상등과 같은 특징을 이용하는 가상 기억 장치뿐만아니라 다른 가상 기억 장치 스택 기반 구조를 위해 동일한 이점을 제공한다.
이들 특징 때문에, 하드웨어 프로세서(100) 기반 시스템은 실행 특성에 대한 흥미있는 가격을 나타내고, 만약 전체 실행이 되지 않는다면, 적시 컴파일러와 소프트웨어 인터프리터를 포함하는 대안 가상 기억 장치 실행 환경과 비교된다. 그럼에도 불구하고, 본 발명은 가상 기억 자치 하드웨어 프로세서의 실시예에 한정되지 않고, 마이크로코드, 실리콘으로 직접 또는 그것의 조합으로 JAVA 가상 기억 장치를 실행하는 하드웨어를 제공하거나, 특별한 하드웨어 프로세서로부터의 장치 명령으로 JAVA 가상 기억 장치 명령(배치 또는 적시)을 컴파일하고, 소프트웨어 인터프리터로써 JAVA 가상 기억 장치를 에뮬레이트하는 실행을 포함하고, 적당한 스택 기반이나 비 스택 기반 장치 실행을 초래한다. 실행 특성에 대한 가격을 고려해보면, 하드웨어 프로세서(100)는 통상 소프트웨어 인터프리터에 필요한 250킬로바이트 내지 500킬로바이크(Kbytes)의 메모리 기억장치, 예를 들면 랜덤 액세스 메모리 또는 판독 전용 메모리가 제거되는 이점을 가진다.
하드웨어 프로세서(100)의 시뮬레이션은 하드웨어 프로세서(100)가 동일한 가상 기억 장치 명령을 실행하는 하드웨어 프로세서(100)로써 동일 클럭 속도에서 클럭된 펜티엄 프로세서상에서 실행하는 소프트웨어 인터프리터보다 20배나 빠른 속도로 가상 기억 장치 명령을 실행한다는 것을 나타낸다. 하드웨어 프로세서(100)의 다른 시뮬레이션은 하드웨어 프로세서(100)가 동일한 가상 기억 장치 명령을 실행하고 하드웨어 프로세서(100)로써 동일 클럭 속도에서 구동되는 펜티엄 프로세서에 미치는 적시 컴파일러보다 다섯배 빠른 가상 기억 장치 명령을 실행함을 나타낸다.
소프트웨어 가상 기억 장치 명령 인터프리터를 위해 필요한 메모리는 비싸므로 감히 엄두도 내지 못하고, 하드웨어 프로세서(100)가 유리하다. 이러한 응용에는 예를 들면 네트워크 설비, 휴대전화 프로세서, 다른 통신 통합 회로 또는 매입형 프로세서와 같은 저가격 저전압을 위한 인터넷 칩과 휴대용 장치가 있다.
본 발명의 경계 검사 유닛(147)은 액세스가 어레이 경계 바깥에 있지 않다는 것을 보장하기 위해 어레이에 대한 각각의 액세스를 검사하는 고속 하드웨어 회로를 제공한다. 아래에 보다 철저히 기술되는 바와 같이 하드웨어 회로의 사용함으로써 어레이 경계 검사와 정상적으로 연관되는 다중 프로세서 사이클이 제거된다. 경계 검사 유닛(137)을 보다 상세히 고려하기 전에, 본 발명을 포함하는 하드웨어 프로세서의 한 실시예는 하드웨어 가상 컴퓨터 구현에 있어서 경계 검사 유닛(137)의 구현을 위한 배경을 제공하도록 기술되어 있다.
여기서 사용된 바와 같이, 가상 기억 장치는 실제 컴퓨팅 장치처럼 다양한 메모리 영역을 사용하고 설정하는 영역을 가지는 이론적인 컴퓨팅 장치이다. 가상 기억 장치 설명은 하드웨어 프로세서(100)와 같은 가상 기억 장치 실행에 의해 실행되어지는 가상 기억 장치 명령에 독립적인 일련의 프로세서 구조를 정의한다. 각 가상 기억 장치 명령은 실행되는 특별한 작동을 정의한다. 가상 기억 컴퓨팅은 가상 기억 장치의 실행에 기초하거나 가상 기억 장치 명령을 발생하기 위해 사용되는 컴퓨터 언어를 이해할 필요가 없다. 단지 가상 기억 장치 명령을 위한 특별한 파일 포맷을 이해할 필요가 있다.
한 실시예에서, 가상 기억 장치 명령은 JAVA 가상 기억 장치 명령이다. 각 JAVA 가상 기억 장치 명령은 명령 확인 정보, 오퍼랜드 및 다른 필요 정보를 암호화하는 하나 이상의 바이트코드를 포함한다. 참조로 여기에 기재되어 있는 마이크로피시 부록 Ⅰ은 JAVA 가상 기억 장치 명령의 실례(實例)가 되는 세트를 포함한다. 가상 기억 장치 명령 이용의 특별한 세트는 본 발명의 중요한 특색은 아니다. 마이크로피시 부록 Ⅰ과 상기 설명의 가상 기억 장치 명령의 측면에서 당업자라면 가상 기억 장치 명령의 특별한 세트나 JAVA 가상 기억 장치 설명을 위한 본 발명의 변형이 가능하다.
컴퓨터 플랫폼상에서 실행되는 JAVA 컴파일러 JAVAC(도 2)은, JAVA 가상 기억 장치 설명에 따라 컴파일된 명령 세트를 포함하는 컴파일된 명령 시퀀스(203)를 암호화하는 중립 구조 오브젝트 파일 포맷으로 JAVA 컴퓨터 언어로 쓰여진 애플리케이션(201)을 변환한다. 그러나, 본 발명을 위해, 단지 관계 정보와 가상 기억 장치 명령의 소스만이 필요하다. 본 방법 또는 기술은 가상 기억 장치 명령의 소스를 발생시키기 위해 사용되고, 관련 정보는 본 발명에 중요하지 않다.
컴파일된 명령 시퀀스(203)는 소프트웨어 인터프리터나 적시 컴파일러와 같은 JAVA 가상 기억 장치 이용을 실행하는 컴퓨터 플랫폼뿐만아니라 하드웨어 프로세서(100)상에서도 실행가능하다. 그러나, 상술한 바와 같이, 하드웨어 프로세서(100)는 소프트웨어 실행을 능가하는 특별한 실행 이점을 제공한다.
상기 실시예에서, 하드웨어 프로세서(100)(도 1)는 JAVA 가상 기억 장치 명령을 처리하고 바이트코드를 포함한다. 하드웨어 프로세서(100)는 아래에 보다 정확히 설명한 바와 같이, 바이트코드의 대부분을 직접 실행한다. 그러나, 일부 바이트코드의 실행은 마이크로코드를 통해 실행된다.
하드웨어 프로세서(100)에 의해 직접 실행되는 가상 기억 장치 명령을 선택하기 위한 방법이 예로써 여기에 기술되어 있다. JAVA 가상 기억 장치 명령의 30퍼센트는 진정한 하드웨어 자동중계이고, 상기 방법에서의 명령 실행은 일정한 부하와 단순한 스택 작동을 포함한다. 가상 기억 장치 명령의 다음 50%는 대부분 실행되지만, 전체는 아니고, 하드웨어에서 약간의 펌웨어 보조를 필요로 하고; 이들은 어레이 명령과 작동에 기초한 스택을 포함한다. JAVA 가상 기억 장치 명령의 다음 10%는 하드웨어에서 실행되지만, 특별한 펌웨어 지지를 필요로 할 뿐만 아니라 이들은 기능 리턴과 기능 호출을 포함한다. JAVA 가상 기억 장치 명령의 나머지 10%는 하드웨어에서 지지되지 않지만, 마이크로코드 및/또는 펌웨어 트랩에 의해 지지되고; 이들은 예외 조작자와 같은 기능을 포함한다. 여기서 펌웨어는 실행이 하드웨어 프로세서(100)의 작동을 제어할 때 ROM내에 마이크로코드가 저장되는 것을 의미한다.
한 실시예에서, 하드웨어 프로세서(100)는 I/O 버스와 메모리 인터페이스 유닛(110), 명령 캐시(125)를 포함하는 명령 캐시 유닛(120), 명령 디코드 유닛(130), 통일된 실행 유닛(140), 스택 캐시(155)를 포함하는 스택 관리 유닛(150), 데이터 캐시(165)를 포함하는 데이터 캐시 유닛(160), 프로그램 카운터 및 트랩 제어 논리(170)를 포함한다. 이들 각 유닛은 아래에 보다 상세히 설명된다.
또한, 도 1에 도시된 바와 같이, 각 유닛은 다양한 요소를 포함한다. 본 발명으로부터 혼돈을 피하고 명백히 하기 위해, 각 유닛 내의 요소들 사이의 관계는 도 1에 도시된다. 그러나, 다음 설명에 있어서, 당업자라면 유닛과 다양한 유닛 사이에서 각 요소 사이의 결합과 상호관계를 잘 이해할 수 있을 것이다.
파이프라인 단계는 패치, 디코드, 실행 및 재기록 단계를 포함하는 도 1에 도시된 유닛을 사용하여 실행된다. 바람직하다면, 메모리 액세스나 예외 해법을 위한 특별한 단계가 하드웨어 프로세서(100)에 제공되어진다.
도 3은 프로세서(100)의 실시예에서 명령의 실행을 위한 4 단계 파이프라인의 도면이다. 패치 단계(301)에서 가상 기억 장치 명령은 명령 버퍼(124)(도 1)에 위치하고 패치된다. 가상 기억 장치 명령은 (ⅰ)명령 캐시(125)로부터 고정된 크기의 캐시 라인이나 (ⅱ)내부 메모리중 하나로부터 패치된다.
패치에 대해, 명령 테이블 스위치와 룩업스위치는 제외하고(마이크로피시 부록 Ⅰ 참조),각 가상 기억 장치 명령은 1과 5 바이트 길이 사이에 있다. 그래서, 이것을 간단하게 유지하기 위해, 패치내에 주어지는 명령 모두를 보장하기 위해서는 적어도 40바이트가 필요하다.
대안 실시예는 조작부호로 시작되는 예를 들면 4 바이트와 같은 수의 선결된 바이트를 패치한다. 이는 JAVA 가상 기억 장치 명령(마이크로피시 부록 Ⅰ 참조)의 95%를 위해 충분하다. 오퍼랜드의 3 바이트 이상 요구하는 명령을 위해, 4 바이트가 패치된다면 전단부의 다른 사이클은 허용된다. 상기 경우에, 명령 실행은 오퍼랜드의 전체 세트가 아직 이용가능하지 않더라도 제 1 오퍼랜드 패치로 시작되어질 수 있다.
디코드 단계(302)에서(도 3), 명령 버퍼(124)(도 1)의 전단의 가상 기억 장치 명령은 가능하다면 실행되는 명령 폴딩이고 디코드된다. 스택 캐시(155)는 단지 필요하다면 가상 기억 장치 명령에 액세스한다. 스택(400)(도 4A 및 도 4B)의 최상위로 포인터 OPTOP를 유지하는 레지스터 OPTOP는 디코드 단계(302)(도 3)에서 업데이트된다.
여기서 종래에는 레지스터의 값과 레지스터가 동일한 번호가 할당되었다. 더구나, 다음의 논의에서, 포인터를 저장하기 위한 레지스터의 사용은 한 실시예일 뿐이다. 본 발명의 특별한 실행에 따르면, 포인터는 당업자에게 알려진 다른 실시예, 소프트웨어 포인터, 소프트웨어 카운터, 하드웨어 카운터 및 하드웨어 레지스터를 사용하여 실행되어진다. 특별한 실행 선택은 본 발명에 중요치 않고, 전형적으로 교환을 실행하기 위한 가격에 근거하여 만들어진다.
실행 단계(303)에서, 가상 기억 장치 명령은 하나 이상의 사이클을 위해 실행된다. 일반적으로, 실행 단계(303)에서 정수 유닛(142)(도 1)의 ALU는 데이터 캐시 유닛(DCU)(160)으로부터 저장하거나 부하의 어드레스를 계산함으로써 사용되어진다. 만약 필요하다면 트랩은 순서가 정해지고 실행 단계(303)(도 3)의 실행 끝에 선택된다. 흐름 명령을 제어하기 위해, 분기 어드레스는, 종속된 분기 상의 상태뿐만 아니라 실행 단계(303)에서 계산된다.
캐시 단계(304)는 비 파이프라인된 단계이다. 데이터 캐시(165)(도 1)는 실행 단계(303)(도 3)중에 필요하다면 액세스한다. 단계(304)가 비 파이프라인인 이유는 하드웨어 프로세서(100)가 스택 기반 장치이기 때문이다. 그러므로, 부하 다음의 명령은 부하에 의해 리턴되는 값에 거의 따른다. 따라서, 상기 실시예에서 파이프라인은 데이터 캐시 액세스를 위해 하나의 사이클을 고정한다. 이는 파이프라인 단계와 바이패스와 특별 레지스터를 위한 파이프라인에 의해 채택된 다이 영역을 줄인다.
재기록 단계(305)는 파이프라인의 마지막 단계이다. 단계(305)에서 계산된 데이터는 스택 캐시(155)로 돌아와 작성된다.
상기 실시예의 하드웨어 프로세서(100)는 JAVA 가상 기억 장치 스택 기반 구조를 지지하는(마이크로피시 부록 Ⅰ 참조) 스택(400)(도 4A)을 직접 실행한다. 스택(400)상의 64 엔트리는 스택 관리 유닛(150)내의 스택 캐시(155)상에 포함된다. 스택(400)내의 일부 엔트리는 스택 캐시(155)상에 복사될 수도 있다. 데이터상의 작동은 스택 캐시(155)를 통해 실행되어진다.
하드웨어 프로세서(100)의 스택(400)은 매서드에 대한 정보의 저장소로써 주로 사용된다. 시간에 따른 어떠한 위치에서 하드웨어 프로세서(100)는 단일 매서드를 실행한다. 각 매서드는 스택(400)상의 매서드 프레임과 같은 메모리 공간을 가지고, 실행 환경 구조와 오퍼랜드 스택, 일련의 로컬 변수를 위해 할당되어진다.
새로운 매서드 프레임, 즉 매서드 프레임 2(410)는 실행 단계(303)(도 3)내의 매서드 호출상에서 하드웨어 프로세서(100)에 의해 할당되고 현재 매서드의 프레임과 같은 현재 프레임이 된다. 다른 매서드 프레임 뿐만 아니라 현재 프레임(410)(도 4A)도 다음 6 엔트리중 일부를 포함할 수 있고, 다양한 매서드 연상 상황에 따른다.
오브젝트 레퍼런스;
인입선 인수;
로컬 변수;
호출자의 매서드 배경;
오퍼랜드 스택; 및
매서드로부터의 리턴 값.
도 4A에서, 오브젝트 레퍼런스, 인입선 인수 및 로컬 변수는 인수와 로컬 변수 영역(421)에서 포함된다. 호출자의 매서드 배경은 실행 환경(422)에서 포함되고, 때로는 프레임 상태라 일컬어지고, 매서드 호출 명령 다음으로 JAVA optop와 같은 가상 기억 장치 명령의 주소인 리턴 프로그램 카운터 값(431); 소집 매서드의 프레임의 위치인 리턴 프레임(432); 소집 매서드의 상수 풀 테이블로의 포인터인 리턴 상수 풀 포인터(433); 현재 매서드 벡터 테이블의 기본 어드레스인 현재 매서드 벡터(434); 및 현재 매서드 모니터의 어드레스인 현재 감시 어드레스(435)를 차례로 포함한다.
오브젝트 레퍼런스는 매서드 호출을 위해 목표가 된 오브젝트를 나타내는 오브젝트 저장에 대한 간접 포인터이다. JAVA 컴파일러 JAVAC(도 2 참조)은 호출 명령을 발생하기 전에 오퍼랜드 스택(423)상으로 상기 포인터를 누르기 위한 명령을 발생한다. 상기 오브젝트 레퍼런스는 매서드가 실행되는 동안 로컬 변수 제로로써 액세스 가능하다. 상기 간접 포인터는 스태틱 매서드 호출을 위해 정의되는 목표 오브젝트가 없을 때 스태틱 매서드 호출을 위해 유효하지 않다.
인입선 인수의 목록은 소집 매서드로부터 호출된 매서드로 정보를 전송한다. 오브젝트 레퍼런스와 같이, 인입선 인수는 JAVA 컴파일러 발생 명령에 의해 스택(400)상으로 밀려지고, 로컬 변수로써 액세스될 수도 있다. JAVA 컴파일러 JAVAC(도 2 참조)는 현재 매서드(410)(도 4A)를 위한 인수 목록을 정적으로 발생하고, 하드웨어 프로세서(100)는 목록으로부터 인수의 수를 결정한다. 오브젝트 레퍼런스가 논스태틱 매서드 호출을 위한 프레임에 나타날 때, 제 1 인수는 로컬 변수의 하나로써 액세스 가능하다. 스태틱 매서드 호출에서, 제 1 인수는 로컬 변수 0이 된다.
64비트 인수에서, 일반적으로 64비트 엔티티뿐만 아니라, 64비트 엔티티중 상측 32비트, 즉 32 최상위 비트는 스택(400)의 상측에 위치된다, 즉 스택에 마지막으로 푸시된다. 예를 들어, 64비트 엔티티가 스택(400)의 최상위에 위치하는 경우, 64비트 엔티티의 상위 32비트부는 스택의 최상위에 있고, 64비트 엔티티의 하위 32비트부는 스택(400)의 최상위에 바로 인접한 저장 위치에 있다.
현재 매서드(410)를 위한 스택(400)(도 4a)의 로컬 변수 영역은 할당되는 임시 변수 저장 공간을 나타내고 매서드(410)를 실행하는 동안 유효하게 유지된다. JAVA 컴파일러 JAVAC(도 2)는 요구된 로컬 변수의 수를 통계적으로 결정하고, 하드웨어 프로세서(100)는 그에 따라 임시 변수 저장 공간을 할당한다.
매서드가 하드웨어 프로세서(100)에서 실행되는 경우, 로컬 변수는 일반적으로 스택 캐시(155)에 있게 되고, 포인터 VARS(도 1 및 도 4a)로부터의 오프셋으로서 어드레스되며, VARS는 로컬 변수의 위치를 제로로 포인트한다. 명령은 오퍼랜드 스택(423)으로 로컬 변수 값을 로드하기 위해 준비되고, 오퍼랜드 스택으로부터 로컬 변수 영역(421)으로 값을 저장한다.
실행 환경(422)내 정보는 호출자의 매서드 배경을 포함한다. 새로운 프레임이 현재 매서드를 위해 설계되는 경우, 하드웨어 프로세서(100)는 호출자 매서드 배경을 새로 할당된 프레임(410)으로 푸시하고, 그 뒤에 반환전에 호출자의 매서드 배경을 복구하기 위해 정보를 이용한다. 포인터 FRAME(도 1 및 도 4a)는 현재 매서드의 실행 환경으로의 포인터이다. 실시예에서, 레지스터 세트(144)(도 1)내 각각의 레지스터는 32비트 폭이다.
오퍼랜드 스택(423)은 현재 매서드내 가상 컴퓨터 명령의 실행을 지원하기 위해 할당된다. 프로그램 카운터 레지스터 PC(도 1)는 연산 코드와 같은 실행될 다음 명령의 주소를 포함한다. 오퍼랜드 스택(423)(도 4a)상의 위치는 명령 실행을 위한 소스 및 타겟 저장 위치 모두를 제공하는 가상 컴퓨터 명령의 오퍼랜드를 저장하기 위해 사용된다. 오퍼랜드 스택(423)의 크기는 JAVA 컴파일러 JAVAC(도 2)에 의해 통계적으로 결정되고, 하드웨어 프로세서(100)는 그에 따라 오퍼랜드 스택(423)을 위한 공간을 할당한다. 레지스터 OPTOP(도 1 및 도 4a)는 오퍼랜드 스택(423)의 최상위로의 포인터를 보유한다.
실행된 매서드는 그 실행 결과를 호출자의 스택 최상위로 반환할 수 있어서, 호출자는 오퍼랜드 스택 레퍼런스로 반환값을 액세스할 수 있다. 반환값은 오브젝트 레퍼런스 또는 인수가 매서드 실행전에 푸시되는 영역에 위치된다.
JAVA 가상 컴퓨터의 시뮬레이션 결과는 매서드 실행이 실행 시간의 주요부분(20-40%)을 소모한다는 것을 나타낸다. 가상 컴퓨터 명령의 실행을 진척시키기 위해 이러한 흥미있는 타겟을 제공하면, 매서드 실행을 위한 하드웨어 지원은 좀더 완벽하게 후술되는 바와 같이 하드웨어 프로세서(100)에 포함된다.
새롭게 실행된 매서드의 스택 프레임의 시작, 즉 호출자에 의해 통과된 오브젝트 레퍼런스 및 인수는 오브젝트 레퍼런스 및 입력 인수가 호출자의 스택의 최상위로부터 나오기 때문에 스택(400)에 이미 저장된다. 상기한 바와 같이, 스택(400)상에 이러한 아이템들에 이어서, 로컬 변수들이 로드되고, 실행 환경이 로드된다.
이러한 처리를 가속화하기 위한 한가지 방법은 하드웨어 프로세서(100)가 요구된 로컬 변수와 배경에서의 실행 환경을 로드하고, 간단한 1비트 스코어보딩과 같이 지금까지 로드된 것을 나타내는 것이다. 하드웨어 프로세서(100)는 스택(400)이 완전히 로드되지 않을지라도 가능한 한 빨리 호출된 매서드의 바이트코드를 실행하려고 시도한다. 만일 이미 로드된 변수로 액세스가 이뤄지면, 스택(400)의 로드와 실행의 중첩이 이뤄지고, 그렇지 않으면 하드웨어 인터록이 발생하며, 하드웨어 프로세서(100)는 단지 변수(들)가 로드되기를 기다린다.
도 4b는 매서드 실행을 가속화하기 위한 또다른 매서드를 설명하고 있다. 전체 매서드 프레임을 스택(400)에 저장하는 대신, 각각의 매서드 프레임의 실행 환경은 매서드 프레임의 오퍼랜드 스택 및 로컬 변수 영역으로부터 분리되어 저장된다. 따라서, 이 실시예에서, 스택(400B)은 로컬 변수 영역(421) 및 오퍼랜드 스택(423)만을 갖는 수정된 매서드 프레임(410B)과 같은 수정된 매서드 프레임을 포함한다. 매서드 프레임의 실행 환경(422)은 실행 환경 메모리(440)에 저장된다. 실행 환경 메모리(440)에 실행 환경을 저장하는 것은 스택 캐시(155)내 데이터의 양을 감소시킨다. 따라서, 스택 캐시(155)의 크기가 감소될 수 있다. 또한, 실행 환경 메모리(440) 및 스택 캐시(155)가 동시에 액세스될 수 있다. 따라서, 매서드 실행은 스택(400B)으로의 데이터의 로드 또는 저장과 동시에 실행 환경을 로드 또는 저장함으로써 가속화될 수 있다.
스택 관리 유닛(150)의 한 실시예에서, 실행 환경 메모리(440)의 메모리 구조 또한 스택이 된다. 수정된 매서드 프레임이 스택 캐시(155)를 통해 스택(400B)으로 푸시됨에 따라, 대응하는 실행 환경은 실행 환경 메모리(440)로 푸시된다. 예를 들어, 도 4b에 도시된 바와 같이, 수정된 매서드 프레임(0 내지 2)이 스택(400B)에 있기 때문에, 실행 환경(EE)(0 내지 2)은 각각 실행 환경 메모리 회로(440)에 저장된다.
매서드 실행을 좀더 향상시키기 위해, 실행 환경 캐시는 매서드 실행동안 실행 환경을 보존하고 검색하는 속도를 개선하기 위해 추가될 수 있다. 스택(400)을 캐시하기 위한 스택 캐시(155), 드리블 관리 유닛(151) 및 스택 제어 유닛(152) 에서 좀더 상세히 후술된 구조는 실행 환경 메모리(440)를 캐시하는데 적용될 수도 있다.
도 4c는 스택(400B) 및 실행 환경 메모리(440) 모두를 지원하도록 수정된 스택 관리 유닛(150)의 실시예를 설명하고 있다. 특히, 도 4c의 스택 관리 유닛(150)의 실시예에서는 실행 환경 스택 캐시(450), 실행 환경 드리블 관리 유닛(460) 및 실행 환경 스택 제어 유닛(470)을 추가한다. 일반적으로, 실행 드리블 관리 유닛(460)은 스필(spill) 연산 또는 충전 연산동안 실행 환경 캐시(450)와 실행 환경 메모리(440) 사이에 전체 실행 환경을 전송한다.
I/O 버스 및 메모리 인터페이스 유닛
I/O 버스 및 때때로 인터페이스 유닛(110)으로 불리는 메모리 인터페이스 유닛(110)(도 1)은 실시예에서 외부 메모리를 포함하고 선택적으로 하드웨어 프로세서(100)와 동일한 다이에 메모리 기억장치 및/또는 인터페이스를 포함할 수 있는 메모리 계층구조와 하드웨어 프로세서(100) 사이에 인터페이스를 구현한다. 이 실시예에서, I/O 제어기(111)는 외부 I/O 장치와 인터페이스하고, 메모리 제어기(112)는 외부 메모리와 인터페이스한다. 본 명세서에서, 외부 메모리는 하드웨어 프로세서(100) 외부에 있는 메모리를 의미한다. 그러나, 외부 메모리는 하드웨어 프로세서(100)와 동일한 다이상에 포함될 수 있거나, 하드웨어 프로세서(100)를 포함하는 다이의 외부에 있을 수 있거나, 또는 온 및 오프 다이 모두를 포함할 수 있다.
또다른 실시예에서, I/O 장치로의 요구는 하드웨어 프로세서(100)를 포함하는 전체 시스템의 어드레스 맵을 유지하는 메모리 제어기(112)를 통한다. 이 실시예의 메모리 버스에서, 하드웨어 프로세서(100)는 유일한 마스터이고, 메모리 버스를 사용하는 것을 중재할 필요가 없다.
그러므로, I/O 버스 및 메모리 인터페이스 유닛(110)과 인터페이스하는 입출력 버스의 대안은 PCI, PCMCIA, 또는 다른 표준 버스의 직접 지원을 제공하는 메모리 맵 설계를 지원하는 것을 포함한다. 빠른 그래픽(w/ VIS 또는 다른 기술)은 하드웨어 프로세서(100)를 갖는 다이상에 선택적으로 포함될 수 있다.
I/O 버스 및 메모리 인터페이스 유닛(110)은 외부 메모리로의 읽기 및 쓰기 요구를 생성한다. 특히, 인터페이스 유닛(110)은 명령 캐시 및 데이터 캐시 제어기(121,161)를 위한 인터페이스를 외부 메모리에 제공한다. 인터페이스 유닛(110)은 외부 메모리로 액세스하기 위해 명령 캐시 제어기(121) 및 데이터 캐시 제어기(161)로부터의 외부 요구를 위한 중재 논리를 포함하고, 요구에 응하여 메모리 버스상의 읽기 또는 쓰기 요구를 외부 메모리로 초기화한다. 데이터 캐시 제어기(161)로부터의 요구는 항상 명령 캐시 제어기(121)로부터의 요구에 관련하여 더 높은 우선순위로 처리된다.
인터페이스 유닛(110)은 요구하는 제어기가 데이터를 래치할 수 있도록 요구하는 명령 캐시 제어기(121) 또는 읽기 사이클상의 데이터 캐시 제어기(161)로 인지 신호를 제공한다. 쓰기 사이클에서, 인터페이스 유닛(110)으로부터의 인지 신호는 요구하는 명령 캐시 제어기(121) 또는 데이터 캐시 제어기(161)가 하나의 미결이 있는 경우 새로운 요구를 생성하지 않도록 흐름 제어를 위해 사용된다. 인터페이스 유닛(110)은 또한 메모리 버스상에서 외부 메모리로 생성된 에러를 처리한다.
명령 캐시 유닛
명령 캐시 유닛(ICU)(120)(도 1)은 명령 캐시(125)로부터 가상 컴퓨터 명령을 꺼내고, 명령 디코드 유닛(130)으로 명령을 제공한다. 이러한 실시예에서, 명령 캐시 적중인 경우, 한 사이클에서 명령 캐시 제어기(121)는 명령 캐시(125)로부터 좀더 상세히 후술되는 정수 실행 유닛(IEU)이 명령을 프로세스할 준비가 될 때까지 명령이 보유되는 명령 버퍼(124)로 명령을 전송한다. 이것은 하드웨어 프로세서(100)내 파이프라인(300)의 나머지를 패치 단계(301)로부터 분리시킨다. 만일 배치의 명령 버퍼 형태를 지원하는 복잡도를 초래하는 것이 바람직하지 않은 경우, 임의의 한 명령 레지스터는 대부분의 오브젝트에 충분하다. 그러나, 명령 패치, 캐시, 및 버퍼는 후술된 바와 같이 명령 폴딩(folding)을 지원하기 위해 충분한 명령 대역폭을 제공해야 한다.
하드웨어 프로세서(100)의 전단은 하드웨어 프로세서(100)의 나머지로부터 폭넓게 분리된다. 이상적으로, 사이클당 하나의 명령이 실행 파이프라인으로 배출된다.
명령은 명령 디코드 유닛(130)으로부터의 신호에 응하여 바이트 정렬기 회로(122)에 의해 임의의 8비트 경계에서 정렬된다. 따라서, 하드웨어 프로세서(100)의 전단은 어떠한 바이트 위치로부터 패치하는 것을 충분히 처리한다. 또한, 하드웨어 프로세서(100)는 캐시(125)의 다중 캐시 라인에 걸리는 명령의 문제를 처리한다. 이러한 경우, 연산 코드가 제 1 바이트이기 때문에, 디자인은 오퍼랜드를 위한 패치 잠재의 여분의 사이클을 묵인할 수 있다. 따라서, 바이트 코드의 패치와 실행간의 매우 간단한 연결 단절이 가능하다.
명령 캐시 실수의 경우, 명령 캐시 제어기(121)는 놓쳐진 명령을 위한 외부 메모리 요구를 I/O 버스 및 메모리 인터페이스 유닛(110)으로 생성한다. 만일 명령 버퍼(124)가 비어있거나 또는 거의 비어있으면, 명령 캐시 실수가 있는 경우, 명령 디코드 유닛(130)은 정지된다, 즉 파이프라인이 정지된다. 특히, 명령 캐시 제어기(121)는 파이프라인(300)을 정지할지 여부를 결정하기 위해 명령 버퍼 비어있음 신호에 따라 사용되는 캐시 실수때 정지 신호를 생성한다. 명령 캐시(125)는 자기 수정 코드를 조정하기 위해 무효화될 수 있는데, 예를 들어 명령 캐시 제어기(121)는 명령 캐시(125)내 특정 라인을 무효화할 수 있다.
따라서, 명령 캐시 제어기(121)는 패치될 다음 명령, 즉 액세스될 필요가 있는 명령 캐시(125)내 명령어를 결정하고, 명령 캐시(125)내 태그 RAM 및 데이터를 위한 어드레스, 데이터, 및 제어 신호를 생성한다. 캐시 적중의 경우, 4바이트의 데이터는 한 사이클에서 명령 캐시(125)로부터 패치되고, 최대 4바이트는 명령 버퍼(124)로 쓰여질 수 있다.
바이트 정렬기 회로(122)는 명령 캐시 RAM의 외부에 데이터를 정렬하고, 정렬된 데이터를 명령 버퍼(124)로 공급한다. 좀더 상세히 후술된 바와 같이, 명령 버퍼(124)내 앞의 두 개 바이트는 가상 컴퓨터 명령의 길이를 결정하기 위해 디코드된다. 좀더 상세히 후술된 바와 같이 명령 버퍼(124)는 대기행렬의 유효 명령을 탐지하고, 엔트리를 갱신한다.
명령 캐시 제어기(121)는 또한 데이터 경로를 제공하고, 명령 캐시 실수를 처리하기 위한 제어를 제공한다. 명령 캐시 실수의 경우, 명령 캐시 제어기(121)는 I/O 버스 및 메모리 인터페이스 유닛(110)으로 캐시 충전 요구를 생성한다.
외부 메모리로부터 데이터를 수신하는 경우, 명령 캐시 제어기(121)는 명령 캐시(125)로 데이터를 쓰고, 상기 데이터는 또한 명령 버퍼(124)로 우회된다. 데이터가 외부 메모리로부터 유효하게 되자마자, 그리고 캐시 충전 완료전에 데이터는 명령 버퍼(124)로 우회된다.
명령 캐시 제어기(121)는 명령 버퍼(124)가 가득 차거나 또는 분기 또는 트랩이 발생할 때까지 연속적인 데이터를 패치하기를 계속한다. 한 실시예에서, 명령 버퍼(124)는 만일 버퍼(124)내에 8바이트 이상의 유효 엔트리가 있는 경우 가득찬 것으로 간주된다. 따라서, 일반적으로 8바이트의 데이터는 명령 캐시 유닛(120)에 의해 인터페이스 유닛(110)으로 전송된 캐시 충전 요구에 응하여 외부 메모리로부터 명령 캐시(125)로 쓰여진다. 만일 명령 캐시 실수를 처리하는 동안 분기 또는 트랩이 발생하는 경우, 실수 프로세싱이 완료된 후에만 트랩 또는 분기가 실행된다.
명령 캐시 충전 트랜잭션 동안 에러가 발생되는 경우, 오류 표시가 생성되고 가상 컴퓨터 명령에 따라 명령 버퍼(124)에 저장된다, 즉 오류 비트가 설정되다. 라인은 명령 캐시(125)로 쓰여지지 않는다. 따라서, 잘못된 캐시 충전 트랜잭션은 오류 비트가 설정되는 것을 제외하고 캐시가능하지 않은 것처럼 동작한다. 명령이 디코드되는 경우, 트랩이 발생된다.
명령 캐시 제어기(121)는 또한 캐시 불가능 명령 읽기를 서비스한다. 레지스터 세트(144)내 프로세서 상태 레지스터의 ICE(명령 캐시 인에이블)비트는 로드가 캐시될 수 있는지 여부를 정의하기 위해 사용된다. 만일 ICE 비트가 클리어되면, 명령 캐시 유닛(120)은 모든 로드를 캐시 불가능한 로드로 취급한다. 명령 캐시 제어기(121)는 캐시 불가능한 명령을 위해 인터페이스 유닛(110)으로 캐시 불가능한 요구를 발생한다. 데이터가 캐시 불가능한 명령을 위해 캐시 충전 버스상에서 유효한 경우, 데이터는 명령 버퍼(124)로 우회되고, 명령 캐시(125)로 쓰여지지 않는다.
이 실시예에서, 명령 캐시(125)는 직접 사상되는, 8바이트 라인 크기 캐시이다. 명령 캐시(125)는 하나의 사이클 잠재를 갖는다. 캐시 크기는 K가 킬로를 의미할 때 0K, 1K, 2K, 4K, 8K, 및 16K 바이트로 구성가능하다. 디폴트 크기는 4K 바이트이다. 각각의 라인은 라인과 관련된 캐시 태그 엔트리를 갖는다. 각각의 캐시 태그는 20비트 어드레스 태그 필드 및 디폴트 4K 바이트 크기를 위한 1 유효비트를 포함한다.
한 실시예에서 12바이트 딥 FIFO(first-in, first-out) 버퍼인 명령 버퍼(124)는 성능 이유로 파이프라인(300)의 나머지로부터 패치 단계(301)(도 3)를 단절한다. 버퍼(124)(도 1)내 각각의 명령은 관련된 유효 비트 및 에러 비트를 갖는다. 유효 비트가 설정되는 경우, 그 유효 비트와 관련된 명령은 유효 명령이다. 에러 비트가 설정되는 경우, 그 에러 비트와 관련된 명령의 패치는 잘못된 트랙잭션이다. 명령 버퍼(124)는 명령 버퍼(124)까지 그리고 명령 버퍼로부터 데이터를 통과시키기 위해 신호를 생성하고, 명령 버퍼(124)내 유효 엔트리, 즉 유효 비트 세트를 갖는 엔트리를 기억하는 명령 버퍼 제어 회로(도시되지 않음)를 포함한다.
한 실시예에서, 4바이트는 주어진 사이클에서 명령 버퍼(124)로 수신될 수 있다. 최대 5바이트까지, 최대 2개 가상 컴퓨터 명령을 표시하는 것은 주어진 사이클에서 명령 버퍼(124)로 읽혀질 수 있다. 다중 바이트 가상 컴퓨터 명령의 폴딩 제공 및/또는 두 개 이상의 가상 컴퓨터 명령의 폴딩을 제공하는 대안적인 실시예는 더 높은 입출력 대역폭을 제공한다. 당업자는 정렬 논리, 순환 버퍼 디자인 등을 포함하는 다수의 적절한 명령 버퍼 디자인을 인식할 것이다. 분기 또는 트랩이 발생되는 경우, 명령 버퍼(124)내 모든 엔트리가 비어지고, 분기/트랩 데이터는 명령 버퍼(124)의 최상위로 이동한다.
도 1의 실시예에 통합된 실행 유닛(140)이 도시되어 있다. 그러나, 또다른 실시예에서, 명령 디코드 유닛(130), 정수 유닛(142) 및 스택 관리 유닛(150)은 단정도 정수 실행 유닛으로 간주되고, 부동소수점 실행 유닛(143)은 분리된 선택적 유닛이 된다. 다른 실시예에서, 실행 유닛내 여러 요소는 또다른 프로세서의 실행 유닛을 사용하여 구현될 수 있다. 일반적으로, 도 1의 여러 유닛내에 포함된 여러 요소는 한 실시예에서만 예시적이다. 각각의 유닛은 도시된 요소 모두 또는 일부로 구현될 수 있다. 다시, 비용 대 성능 균형에 종속하여 결정이 이뤄진다.
명령 디코드 유닛
전술한 바와 같이, 가상 컴퓨터 명령은 파이프라인(300)의 디코드 단계(302)(도 3)에서 디코드된다. 실시예에서, 두 개의 가상 컴퓨터 명령에 대응하는, 2 바이트는, 명령 버퍼(124)(도 1)로부터 인출된다. 두 개의 바이트는 병렬적으로 디코드되어 두 개의 바이트가 두 개의 가상 컴퓨터 명령 예를 들면 단일의 동등한 오퍼레이션 안으로 폴드될수 있는 스택 명령의 제 1 로드 탑 및 제 2 애드 탑의 두 개의 스택 엔트리 명령에 대응하는지 결정한다. 폴딩은 두 개 또는 그이상의 가상 컴퓨터 명령에 대응하는 단일의 동등한 오퍼레이션의 공급에 관한 것이다.
실시예의 하드웨어 프로세서(100)의 실시예에 있어서, 단일-바이트 제 1 명령은 제 2 명령과 폴드된다. 그러나, 다른 실시예는, 명령 디코더 복잡성 및 증가된 명령 대역폭에 의한 비용에도 불구하고, 두개 이상의 가상 컴퓨터 명령 예를 들면 두 개 내지 네 개의 가상 컴퓨터 명령 및 멀티-바이트 가상 컴퓨터 명령의 폴딩을 제공한다. 발명의 명칭이 "INSTRUCTION FOLDING FOR A STACK-BASED MACHINE"이고, 마크 트렘블레이 및 제임스 마이클 오'코너등이 발명자이며, 본 출원의 양수인에게 양도되고, 본 출원과 동일자로 출원되었으며, 여기서는 참고로 소개된 미국특허출원 제 08/786,351 호를 참조하라. 실시예 프로세서(100)의 실시예에 있어서, 제 1 가상 컴퓨터 명령에 대응하는 제 1 바이트가 멀티-바이트 명령이면, 제 1 및 제 2 명령은 폴드되지 않는다.
선택적인 현재 오브젝트 로더 폴더(132)는, 전술한 발명의 명칭이 "INSTRUCTION FOLDING FOR A STACK-BASED MACHINE"이고, 마크 트렘블레이 및 제임스 마이클 오'코너등이 발명자이며, 본 출원의 양수인에게 양도되고, 본 출원과 동일자로 출원되었으며, 여기서는 참고로 소개된 미국특허출원 제 08/786,351 호에 보다 상세히 설명된 바와 같은 명령 폴딩, 그 모의 결과가 특히 빈번한 것으로 나타나서 최적화를 위한 바람직한 타겟이 되는 가상 컴퓨터 명령 시퀀스를 이용한다. 특히, 이 매서드는 전형적으로 대응되는 오브젝트의 레퍼런스 오브젝트의 오퍼랜드 스택상으로의 로드를 발동시키고 오브젝트로부터 필드를 인출한다.
고속 번역은 가상 컴퓨터 명령 세트의 부분이 아니며(3장의 마이크로피시 부록 I 참조), 자바(JAVA) 가상 컴퓨터 실행 밖에서는 보이지 않는다. 그러나, 가상 컴퓨터 실행내에서는, 고속 번역은 효과적인 최적화로 판명되었다. (마이크로피시 부록 I의 부록 A 참조; 이들은 본 명세서의 일부분임.) 저속-고속 트랜스레이터 캐시(131)에서 고속 번역에 대한 다양한 명령을 갱신하기 위하여 기록을 유지하는 것은 고속 가상 컴퓨터 명령에 대한 정상적인 가상 컴퓨터 명령을 변화시켜 고속 번역으로부터 얻어지는 큰 이점을 취하게 한다. 특히, 발명의 명칭이 "NON-QUICK INSTRUCTION ACCELERATOR AND METHOD OF IMPLEMENTING SAME"이고, 마크 트렘블레이 및 제임스 마이클 오'코너등이 발명자이며, 본 출원의 양수인에게 양도되고, 본 출원과 동일자로 출원되었으며, 여기서는 참고로 소개된 미국특허출원 제 08/788,805 호에 보다 상세히 설명된 바와같이, 명령의 실행 개시에 필요한 정보가 처음으로 집합되었을 때, 정보는 저속-고속 트랜스레이터 캐시(131)에서의 태그로서 프로그램 카운터 PC의 값에 따라 캐시에 저장되고 명령은 고속 변이로 인식된다. 한 실시예에서, 이는 자가-수정 코드로 실행된다.
그와 같은 명령의 뒤이은 호출이 있게 되면, 명령 디코드 유닛(130)은 명령이 고속 변이로 인식되었는지와 저속-고속 트랜스레이터 캐시(131) 명령의 실행 개시에 필요한 정보를 단순히 검색했는지를 검지한다. 저속-고속 트랜스레이터 캐시는 하드웨어 프로세서(100)의 선택적인 부분이다.
분기와 관련하여, 고속 분기 해상도의 매우 짧은 파이프는 대부분의 실행에 충분하다. 그러나, 예를 들면, 분기 예측기 회로(133)등의 적절한 단순한 분기 예측 매커니즘이 도입될 수 있다. 분기 예측기 회로(133)를 위한 실행은 오프코드에 기초한 분기, 오프셋에 기초한 분기, 또는 투-비트 카운터 매커니즘에 기인한 분기를 포함한다.
JAVA 가상 컴퓨터 명세는 명령을 invokenonvirtual로 규정하고, 오프코드(183)는 실행될 때 매서드를 가져온다. 오프코드의 뒤에는 인덱스 바이트 1 과 인덱스 바이트 2가 뒤따른다.(마이크로피시 부록 I 참조) 오퍼랜드 스택(423)은 이 명령이 실행될 때 오브젝트에 대한 레퍼런스와 몇 개의 인수를 포함한다.
인덱스 바이트 1 및 2는 현재 클래스의 상수 풀내로의 인덱스를 생성한다. 그 인덱스에서의 상수 풀내의 항목은 완전한 매서드 기호 및 클래스를 나타낸다. 기호는 마이크로피시 부록 I에 규정되었고 그 설명은 여기서 참고로 소개되었다.
각 매서드용의 매서드 기호, 짧은, 특이한 인식기는 지시된 클래스의 매서드 테이블내에서 향상된다. 향상의 결과는 매서드의 형태와 매서드용의 인수의 수를 나타내는 매서드의 블럭이다. 오브젝트 레퍼런스 및 인수는 이 매서드의 스택을 팝하고 새로운 매서드의 로컬 변수의 초기 값이 된다. 그 후 실행은 새로운 매서드의 제 1 명령과 함께 다시 시작한다. 실행되면, 명령 invokevirtual, 오프코드(182) 및 invokestatic, 오프코드(184)는 방금 설명한 바와 동일한 처리를 호출한다. 각 경우, 포인터는 매서드 블럭을 향상시키기 위해 사용된다.
하드웨어 프로세서(100)의 선택적 부분이기도 한 매서드 인수 캐시(134)는, 제 1 실시예에서 사용되어, 태그로서의 매서드 블럭에 대한 포인터를 따라, 매서드에 대한 제 1 호출 이후에 사용하기 위한 매서드의 매서드 블럭을 저장한다. 명령 디코드 유닛(130)은 인덱스 바이트 1 과 2를 사용하여 포인터를 생성하고 그 후 포인터를 사용하여 캐시(134)내에서 그 포인터를 위한 매서드 블럭을 검색한다. 이는 새롭게 가져온 매서드를 위한 스택 프레임의 구축을 보다 빠르게 이어서 일어나는 매서드의 배경내에서 한다. 다른 실시예는 캐시(134)로의 레퍼런스로서 프로그램 카운터 또는 매서드 인식기를 사용할 수 있다. 캐시 미스가 있는 경우, 명령은 정상 패션에서 실행되고 따라서 캐시(134)는 갱신된다. 어느 캐시 엔트리가 재기록되었는지 결정하기 위해 사용된 특정 처리는 본 발명의 특징 국면이 아니다. 예를 들면, 적어도 최근에 사용된 기준이 실행될 수 있다.
다른 실시예에 있어서, 매서드에 대한 제 1 호출 이후에 태그로서 매서드의 프로그램 카운터 PC 값에 따라 사용하기 위해, 매서드 블럭에 대한 포인터를 저장하기 위해 매서드 인수 캐시(134)가 사용된다. 명령 디코드 유닛(130)은 프로그램 카운터 PC 값을 사용하여 캐시(134)에 액세스한다. 프로그램 카운터 PC 값이 캐시(134)내의 하나의 태그와 같으면, 캐시(134)는 그 포인터와 함께 저장된 태그를 명령 디코드 유닛(130)에 공급한다. 명령 디코드 유닛(130)은 공급된 포인터를 사용하여 매서드용 매서드 블럭을 검색한다. 이들 두 실시예를 고려하면, 다른 실시예는 본 기술분야의 당업자에게 명확해질 것이다.
하드웨어 프로세서(100)의 선택적인 요소인 와이드 인덱스 진행기(136)는 명령 와이드를 위한 명령 폴딩의 특정 실시예이다. 와이드 인덱스 진행기(136)는 오프코드 인코딩을 바로 뒤이은 가상 컴퓨터 명령을 위한 인덱스 오퍼랜드의 연장으로 취급한다. 이 방식으로, 와이드 인덱스 진행기(136)는 명령 디코드 유닛(130)이 로컬 변수의 수가 명령 와이드를 위한 분리된 실행 사이클을 야기하지 않고 단일 바이트 인덱스와 어드레스 가능한 수를 초과할 때 로컬 변수 기억장치(421)로 인덱스들을 제공할 수 있게 한다.
명령 디코더(135)의 요소들, 특히 명령 폴딩, 저속-고속 트랜스레이터 캐시(131), 현재 오브젝트 로더 폴더(132), 분기 예측기(133), 매서드 인수 캐시(134), 및 와이드 인덱스 진행기(136)는 소프트웨어 인터프리터 또는 적시 컴파일러를 사용하는 실행에 있어서도 유용하며, 이는 이들 요소들은 소프트웨어 인터프리터 또는 적시 컴파일러의 동작을 가속하기 위해 사용될 수 있기 때문이다. 상기 실행에 있어서, 전형적으로 가상 컴퓨터 명령은 예를 들면 선 프로세서, DEC 프로세서, 인텔 프로세서, 또는 모토로라 프로세서중 어느 하나를 사용하는 인터프리터 또는 컴파일러를 실행시키는 프로세서를 위한 명령으로 변환되고, 예를 들면 요소들의 동작은 그 프로세서의 실행 유지를 위해 수정된다. 가상 컴퓨터 명령으로부터 다른 프로세서 명령으로의 변환은 ROM 내의 변환기 또는 단순한 소프트웨어 변환기에 의해 가능하다. 이중 명령 세트 프로세서의 부가적인 예를 위해, 발명의 명칭이 "PROCESSOR FOR EXECUTING INSTRUCTION SETS RECEIVED FROM A NETWORK OR FROM A LOCAL MEMORY"이고, 마크 트렘블레이 및 제임스 마이클 오'코너등이 발명자이며, 본 출원의 양수인에게 양도되고, 여기서는 참고로 소개된 미국특허출원 제 08/787,618 호를 참조하라.
정수 실행 유닛
정수 실행 유닛(IEU)은, 명령 디코드 유닛(130), 정수 유닛(142) 및 스택 관리 유닛(150)을 포함하고, 부동소수점 관련 명령을 제외한 모든 가상 컴퓨터 명령의 실행에 책임이 있다. 부동소수점 관련 명령은 부동소수점 유닛(143)에서 실행된다.
정수 실행 유닛(IEU)은 전방 종단에서 명령 캐시 유닛(120)과 상호작용하여 명령을 인출하고, 부동소수점 유닛(FPU)(143)과 상호작용하여 부동소수점 명령을 실행하고, 마지막으로 데이터 캐시 유닛(DCU)(160)과 상호작용하여 관련 명령을 로드하고 저장한다. 정수 실행 유닛(IEU)은 또한 정수 동작과 관련된 특정 가상 컴퓨터 명령을 실행시키기 위한 명령을 포함하는 마이크로코드 ROM(141)을 포함한다.
정수 실행 유닛(IEU)은 스택(400)의 캐시된 부분, 즉 스택 캐시(155)를 포함한다. 스택 캐시(155)는 오퍼랜드 스택과 오퍼랜드 스택(423) 및 로컬 변수 기억장치(421) 엔트리 등의 현재 매서드와 관련된 로컬 변수 엔트리를 위한 빠른 저장을 제공한다. 그럼에도 불구하고, 스택 캐시(155)는, 스택 캐시(155)내에 나타날 수 있는 오퍼랜드 스택 엔트리 및 로컬 변수 모두 모두 또는 모든 로컬 변수 엔트리 보다 적은 로컬 변수 엔트리 및 오퍼랜드 스택의 수에 따라, 현재 매서드와 관련된 로컬 변수 엔트리 및 모든 오퍼랜드 스택을 위한 충분한 기억영역을 제공할 수 있다. 마찬가지로, 부가 엔트리 예를 들면 매서드를 호출하기 위한 로컬 변수 엔트리 및 또는 오퍼랜드 스택은, 공간이 허용되면 스택 캐시(155)내에 나타날 수 있다.
스택 캐시(155)는, 한 실시예에서 레지스터 파일로서 물리적으로 실행되는 64 엔트리 32 비트 와이드 어레이이다. 스택 캐시(155)는 세 개의 판독 포트를 구비하며, 이들중 둘은 정수 실행 유닛(IEU)에 지정되고 하나는 드리블 관리 유닛(151)에 지정된다. 스택 캐시(155)는 또한 두 개의 기록 포트를 구비하며, 이들중 하나는 정수 실행 유닛(IEU)에 지정되고 나머지 하나는 드리블 관리 유닛(151)에 지정된다.
정수 유닛(142)은 스택 캐시(155)내에서 로컬 변수 등의 변수, 및 오퍼랜드 스택 값에 액세스하기 위해 사용되는 다양한 포인터를 유지한다. 정수 유닛(142)은 또한 스택 캐시 히트가 발생했는지 검지하기 위한 포인터를 유지한다. 실행시간 예외는 캐치되고 마이크로코드 ROM(141) 및 회로(170)내의 정보를 사용하여 실행되는 예외 조정기에 의해 처리된다.
정수 유닛(142)은 계산 동작을 지지하기 위한 32-비트 ALU를 포함한다. ALU에 의해 지지되는 동작은 더하기, 빼기, 시프트, 배타적 논리합, 비교, 초과, 미만 및 바이패스 등을 포함한다. ALU는 또한 분리된 비교기가 분기 명령의 출현을 결정하는 동안 조건적 분기의 어드레스를 결정하기 위해 사용된다.
파이프라인을 통해 깨끗하게 실행되는 가장 공통적인 명령 세트는 ALU 명령의 그룹이다. ALU 명령은 디코드 단계(302)내의 스택(400)의 최상위로부터 오퍼랜드를 판독하고 실행 단계(303)내의 ALU를 사용하여 결과를 계산한다. 그 결과는 재기록 단계(305)에서 스택(400)에 재 기록된다. 연속되는 ALU 동작이 스택 캐시(155)에 액세스중이면 필요하게 되는 바이패스의 두 가지 수준이 있다.
본 실시예에 있어서 스택 캐시 포트는 32-비트 와이드 이기 때문에, 배정도 및 긴 데이터 동작은 두 개의 사이클을 갖는다. 시프터는 또한 ALU의 부분으로 나타난다. 오퍼랜드가 디코드 단계(302)의 명령을 위해 불가능하거나, 또는 실행 단계(303)의 시작에서 최대이면, 인터록은 실행단계(303) 이전에 파이프라인 단계를 홀드한다.
정수 실행 유닛(IEU)의 명령 캐시 유닛 인터페이스는, 명령 캐시 유닛(120)이 명령을 유효 비트를 따라 고정된 필드내의 명령어 디코드 유닛(130)으로 운반하는 유효/수용 인터페이스이다. 명령 디코더(135)는 얼마나 많은 바이트 정렬기 회로(122)가 시프트할 필요가 있는지, 또는 얼마나 많은 바이트 명령 디코드 유닛(130)이 디코드 단계(302)에서 소비할 수 있는지 시그널링함으로써 응답한다. 명령 캐시 유닛 인터페이스는 또한 명령 캐시 유닛(120)에 분기 오-예측 조건을 알리고, 실행 단계(303)내의 분기 어드레스를 알린다. 트랩은, 취해질 때, 또한 명령 캐시 유닛(120)에 지정된다. 명령 캐시 유닛(120)은 어느 유효 비트도 명령 디코드 유닛(130)에 참가시키지 않음으로써 명령 캐시 유닛(120)을 홀드할수 있다. 명령 디코드 유닛(130)은 시프트 신호를 바이트 정렬기 회로(122)에 참가시키지 않음으로써 명령 캐시 유닛(12)을 홀드할 수 있다.
정수 실행 유닛 IEU의 데이터 캐시 인터페이스는 유효-수용 인터페이스이고, 여기서 정수 유닛(142)은 실행단계(303)에서 그 특성 예를 들면 논-캐시, 특별 저장등에 따라 로드 또는 저장 동작을 데이터 캐시 유닛(160)내의 데이터 캐시 제어기(161)에 신호한다. 데이터 캐시 유닛(160)은 데이터를 로드로 복귀시킬 수 있고, 제어 정수 유닛(142)은 데이터 제어 유닛 홀드 신호를 사용한다. 데이터 캐시 히트 이면, 데이터 캐시 유닛(160)은 요구된 데이터를 복귀시키고, 그 후 파이프라인을 해제한다.
저장 동작이면, 정수 유닛(142)은 또한 데이터를 실행 단계(303)의 어드레스에 따라 공급한다. 데이터 캐시 유닛(160)은 데이터 캐시 유닛(160)이 사용중, 예를 들면 라인 충전 등이면, 캐시 단계(304)의 파이프라인을 홀드할 수 있다.
부동소수점 동작은 특별히 정수 실행 유닛 IEU에 의해 처리된다. 명령 디코더(135)는 인출하고 부동소수점 유닛(143) 관련 명령을 디코드한다. 명령 디코더(135)는 실행을 위한 부동소수점 동작 오퍼랜드를 디코드 단계(302)의 부동소수점 유닛(142)으로 보낸다. 부동소수점 유닛(143)이 부동소수점 동작을 실행하면서 비지한 동안, 정수 유닛(142)은 파이프라인을 정지하고 부동소수점 유닛(143)이 정수 유닛(142)에 결과가 가능하다고 신호할 때까지 대기한다.
부동소수점 유닛(143)으로부터의 부동소수점 준비 신호는 부동소수점 동작의 실행 단계(303)가 종료되었음을 나타낸다. 부동소수점 준비 신호에 응답하여, 결과는 정수 유닛(142)에 의해 스택 캐시(155)내로 다시 기록된다. 부동소수점 로드 및 저장은 전적으로 정수 실행 유닛 IEU에 의해 취급되며, 이는 부동소수점 유닛(143) 및 정수 유닛(142) 모두를 위한 오퍼랜드가 스택 캐시(155)내에서 발견되기 때문이다.
스택 관리 유닛
스택 관리 유닛(150)은 정보를 저장하고, 오퍼랜드를 실행 유닛(140)에 제공한다. 스택 관리 유닛(150)은 또한 스택 캐시(155)의 오버플로우 및 언더플로우를 관리한다.
한 실시예에 있어서, 스택 관리 유닛(150)은 전술한 바와 같이 한 실시예에서 세 개의 판독 포트, 두 개의 기록 포트 레지스터 파일인 스택 캐시(155); 두 개의 판독 포트 및 실행 유닛(140)의 오퍼랜드를 검색하고 재기록 레지스터 또는 데이터 캐시(156)로부터 스택 캐시(155)로 저장하기 위해 사용되는 하나의 기록 포트를 위해 필요한 제어 신호를 제공하는 스택 제어 유닛(152); 및 오버플로우 또는 언더플로우가 스택 캐시(155)내에 있을 때마다 스택 캐시(155) 내외의 데이터를 메모리로 드리블하는 드리블 관리자(151)를 포함한다. 도 1에 도시된 실시예에 있어서, 메모리는 데이터 캐시(165) 및 메모리 인터페이스 유닛(110)에 의해 인터페이스된 메모리 기억영역을 포함한다. 일반적으로, 메모리는 캐시, 어드레스 가능 판독/기록 메모리 기억장치, 이차 기억장치 등을 포함하는 적절한 메모리 하이어러키를 포함한다. 드리블 관리자(151)는 또한 백그라운드 드리블링 오브젝트을 위해서만 사용되는 스택 캐시(155)의 하나의 기록 포트 및 하나의 판독 포트를 위해 필요한 제어 신호를 제공한다.
한 실시예에 있어서, 스택 캐시(155)는 오버플로우 또는 겹쳐쓰기를 피하기 위해 예측 가능한 방식으로 성장 또는 축소하도록 보증하는 순환 버퍼로서 기능한다. 데이터 캐시(165)로부터 및 데이터 캐시로의 값의 저장 및 재저장은, 한 실시예에 있어서, 고/저 양수표를 사용하는 드리블 관리자(151)에 의해 제어된다.
스택 관리 유닛(150)은 주어진 사이클내에서 두 개의 32-비트 오퍼랜드가 잇는 실행 유닛(140)을 제공한다. 스택 관리 유닛(150)은 단일 32-비트 결과를 주어진 사이클에 저장할 수 있다.
드리블 관리자(151)는 데이터 캐시(165)로부터의 및 데이터 캐시로의 스택 캐시(155)내외의 데이터를 드리블링함으로써 스택 캐시(155)의 충전 및 스필을 다룬다. 드리블 관리자(151)는 스택 오버플로우 또는 언더플로우 조건이 검지될 때 파이프라인을 지연 시키기 위한 지연 신호를 생성한다. 드리블 관리자(151)는 또한 데이터 캐시 유닛(160)으로 보내진 요청의 트랙을 유지한다. 데이터 캐시 유닛(160)으로의 단일 요청은 32-비트 연속 로드 또는 저장 요청이다.
스택 캐시(155)의 하드웨어 구조는, 롱 오퍼랜드(배정도 정수 및 배정도 부동소수점 수)를 제외하고, 오프코드를 위한 내재하는 오퍼랜드 인출은 오프코드 실행에 대한 지연에 더하지 않는다. 오퍼랜드 스택(423)(도 4A)내의 엔트리수 및 스택 캐시(155)내에 유지되는 로컬 변수 기억장치(421)는 하드웨어/성능 균형을 나타낸다. 적어도 몇 개의 오퍼랜드 스택(423) 및 로컬 변수 기억장치(421) 엔트리가 좋은 성능을 얻기 위해 필요하다. 도 1에 도시된 실시예에 있어서, 적어도 오퍼랜드 스택(423)의 최상위 세 개의 엔트리 및 첫 번째 4개 로컬 변수 기억장치(421) 엔트리가 바람직하게 스택 캐시(155)내에 나타난다.
스택 캐시(155)(도 1)에 의해 제공되는 하나의 주요 기능은 여분의 사이클 없이 항상 최상위 두 개의 레지스터로의 액세스가 가능한 레지스터 파일을 에뮬레이트하는 것이다. 작은 하드웨어 스택은, 백그라운드내의 메모리로/로부터의 값을 로드/저장하기 위한 적당한 정보가 제공되면 충분하며, 따라서 유입되는 가상 컴퓨터 명령을 위한 스택 캐시(155)를 준비한다.
위에서 설명한 바와 같이, 스택(400)상의 모든 아이템은 (크기에 관계없이) 32-비트 워드로 위치된다. 이는 많은 작은 데이터 아이템이 사용될 때 스페이스를 낭비하는 경향이 있지만, 이는 상대적으로 간단히 하고 먹싱 또는 태깅으로부터 자유롭게 한다. 따라서 스택(400)내의 엔트리는 값을 나타내고 바이트의 수를 나타내지 않는다. 배정도 정수 및 배정도 부동소수점 수는 두 개의 엔트리를 필요로 한다. 판독 및 기록 포트의 수를 적게 하기 위해, 두 개의 배정도 정수를 판독하기 위한 2 사이클 또는 두 개의 배정도 부동소수점 수가 필요하다.
드리블 관리자(151)에 의해 스택 캐시(155)로부터 메모리로 오퍼랜드 스택을 스필링 및 충전하기 위한 매커니즘은 다른 몇 가지 형태에서 하나를 취할 수 있다. 어느 시간에 하나의 레지스터는 충전될 수 있거나 스필될 수 있고, 또는 몇 가지 레지스터의 블럭은 단번에 충전되거나 스필될 수 있다. 단순한 스코어보드 매서드가 스택 관리를 위해 적절하다. 그 가장 단순한 형태에 있어서, 단일 비트는 스택 캐시(155)내의 레지스터가 현재 타당한지 나타낸다. 또한, 스택 캐시(155)의 몇몇 실시예는 레지스터의 데이터 내용이 스택(400)에 저장되었는지 즉, 레지스터가 더티한지 나타내기 위해 단일 비트를 사용한다. 한 실시예에 있어서, 고 양수표/저 양수표 발견적 교수법은 언제 엔트리가 스택(400)에 저장되고 스택(400)으로부터 회복되는지 결정한다(도 4A).
이와 다르게, 스택의 최상위가 고정된 또는 다르게 엔트리의 프로그램 가능한 수에 의해 스택 캐시(155)의 하위에 액세스할 때, 하드웨어는 레지스터의 스택(400)으로부터 스택 캐시(155)로의 로딩을 시작한다. 스택 관리 유닛(150) 및 드리블 관리 유닛(151)의 다른 실시예에 대해서는 본 출원과 동일자로 출원된 마크 트렘블레이와 제임스 마이클 오코너 명의의 미국 특허출원 제 08/787,736 호, "스택 캐싱 방법 및 장치" 및 미국 특허출원 제 08/787,617 호, "다중 메모리 구조를 사용한 스택 캐싱"을 참조하십시요.
한 실시예에 있어서, 스택 관리 유닛(150)은 또한 선택적인 로컬 변수 룩-어사이드 캐시(153)를 포함한다. 캐시(153)는 매서드의 로컬 변수 및 오퍼랜드 스택(423) 모두 스택 캐시(155)상에 위치하지 않는 적용에 있어서 가장 중요하다. 이 경우에, 캐시(153)가 하드웨어 프로세서(100)내에 포함되지 않을 때, 로컬 변수가 액세스될 때 스택 캐시(155)에 미스가 있고, 실행 유닛(140)은 데이터 캐시 유닛(160)에 액세스하고, 이는 결국 실행을 느리게 한다. 반대로, 캐시(153)가 있으면, 로컬 변수는 캐시(153)로부터 검색되고 실행에 지연이 없다.
로컬 변수 룩-어사이드 캐시(153)의 한 실시예가 도 4D에 스택(400)상의 매서드 0 에서 2를 위해 도시되었다. 매서드 0을 위한 로컬 변수 제로에서 M, 여기서 M은 정수, 이 캐시(153)의 플레인(421A_0)에 저장되고 플레인(421A_0)은 매서드 수(402)가 제로일 때 액세스된다. 매서드 1을 위한 로컬 변수 제로에서 N(여기서 N은 정수)은 캐시(153)의 플레인(421A_1)에 저장되고 플레인(421A_1)은 매서드 수(402)가 1일 때 액세스된다. 매서드 1을 위한 로컬 변수 제로에서 P, 여기서 P는 정수, 는 캐시(153)의 플레인(421A_2)에 저장되고 플레인(421A_2)은 매서드 수(402)가 2일 때 액세스된다. 캐시(153)의 다양한 플레인은 크기가 다를 수 있음에 주의하십시요.
새로운 매서드가 실시될 때, 예를 들면 매서드 2가 실시될 때, 캐시(153)내의 새로운 플레인(421A_2)이 그 매서드를 위한 로컬 변수로 로드되고, 한 실시예에서 카운터인 매서드 수 레지스터(402)는 변화 예를 들면 증가되어 새로운 매서드의 로컬 변수를 포함하는 캐시(153)의 플레인을 지시한다. 로컬 변수는 캐시(153)의 내에서 정렬되어 캐시(153)는 효과적으로 직접 사상 캐시임을 알아야한다. 따라서, 로컬 변수가 현재의 매서드를 위해 필요할 때, 변수는 캐시(153)내의 가장 최근 플레인 즉, 매서드 수(402)에 의해 인식된 플레인으로부터 직접 액세스된다. 현재의 매서드가 예를 들면 매서드 2로 복귀할 때, 매서드 수 레지스터(402)는 변하고, 예를 들면 감소하여 캐시(153)의 이전 플레인(421A_1)을 지시한다. 캐시(153)는 필요한 한 넓고 깊게 만들어진다.
데이터 캐시 유닛
데이터 캐시 유닛(160)(DCU)은 데이터 캐시(165)내의 데이터를 위한 모든 요청을 관리한다. 데이터 캐시 요청은 드리블링 관리자(151) 또는 실행 유닛(140)으로부터 나온다. 데이터 캐시 제어기(161)는 이들 요청 사이에서 실행 유닛 요청에 우선권을 주면서 조정한다. 요청에 응답하여, 데이터 캐시 제어기(161)는 데이터 캐시(165)내의 태그 RAM 및 데이터를 위한 어드레스, 데이터 및 제어 신호를 생성한다. 데이터 캐시 히트를 위해, 데이터 캐시 제어기(161)는 데이터 RAM 출력을 재정렬하여 올바른 데이터를 제공한다.
데이터 캐시 제어기(161)는 또한 데이터 캐시 미스인 경우 및 논-캐시어블 로드 및 저장인 경우, I/O 버스 및 메모리 인터페이스 유닛(110)에 대한 요청을 생성한다. 데이터 캐시 제어기(161)는 논-캐시어블 요청을 처리하기 위한 제어 논리 및 데이터 경로를 제공하고, 캐시 미스를 다루기 위한 데이터 경로 기능 및 데이터 경로를 제공한다.
데이터 캐시 히트를 위해, 데이터 캐시 유닛(160)은 데이터를 로드를 위한 하나의 사이클 내의 실행 유닛(140)으로 복귀시킨다. 데이터 캐시 유닛(160)은 또한 기록 히트를 위한 하나의 사이클을 취한다. 캐시 미스인 경우, 데이터 캐시 유닛(160)은 요청된 데이터가 외부 메모리로부터 가능할 때까지 파이프 라인을 지연시킨다. 논-캐시어블 로드 및 저장 모두를 위해, 데이터 캐시(165)는 바이패스되고 요청은 I/O 버스와 메모리 인터페이스 유닛(161)으로 보내진다. 데이터 캐시(165)에 대한 비-정렬 로드 및 저장은 소프트웨어내에 트랩된다.
데이터 캐시(165)는 쌍방향 세트 연관, 재기록, 기록 할당, 16바이트 라인 캐시이다. 캐시 사이즈는 0, 1, 2, 4, 8, 16 킬로바이트 사이즈로 구성 가능하다. 각 라인과 관련된 캐시 저장 엔트리를 구비한다. 캐시 미스일 대, 16 바이트의 데이터는 외부 메모리로부터 캐시(165)에 기록된다.
각 데이터 캐시 태그는 n-비트 어드레스 태그, 필드, 하나의 유효 비트, 및 하나의 더티 비트를 포함한다. 각 캐시 태그는 또한 교체 폴리시를 위해 사용되는 가장 최근 사용된 비트와 관련된다. 다중 캐시 사이즈를 유지하기 위해, 태그 필드의 폭은 또한 변화될 수 있다. 프로세서 서비스 레지스터내 캐시 이네이블 비트가 세트되지 않으면, 로드 및 저장은 데이터 캐시 제어기(161)에 의해 논-캐시어블 지시로 취급된다.
단일의 16바이트 재기록 버퍼가 교체될 필요가 있는 더티 캐시 라인을 재기록하기 위해 제공된다. 데이터 캐시 유닛(161)은 판독에 최대 4 바이트를 제공하고 최대 4 바이트의 데이터는 단일 사이클내에서 캐시(165)에 기록될 수 있다.
메모리 할당 가속기
한 모의 형태에 있어서, 데이터 캐시 유닛(160)은 메모리 할당 가속기(166)를 포함한다. 전형적으로, 새로운 오브젝트가 생성되면, 오브젝트의 필드는 외부 메모리로부터 인출되어, 데이터 캐시(165)에 저장되고, 펄스는 제로로 클리어된다. 이는 시간을 소비하는 과정이므로 메모리 할당 가속기(166)에 의해 제거된다. 새로운 오브젝트가 생성될 때, 어떤 필드도 외부 메모리로부터 검색되지 않는다. 그보다는, 메모리 할당 가속기(166)는 단순히 제로 라인을 데이터 캐시(165)에 저장하고 데이터 캐시의 라인을 더티로 표시한다. 메모리 할당 가속기(166)는 특히 재기록 캐시에 이점이 있다. 메모리 할당 가속기(166)가 외부 메모리 액세스를 없애기 때문에, 하드웨어프로세서(100)의 성능은 향상된다.
부동소수점 유닛
부동소수점 유닛(FDU)(141)은 마이크로 코드 시퀀서, 입력/출력 레지스터가 있는 입력/출력부, 부동소수점 가산기 즉 ALU, 및 부동소수점 승산/제산 유닛을 포함한다. 마이크로 코드 시퀀서는 마이크로 코드 플로우 및 마이크로 코드 분기를 제어한다. 입력/출력부는 입력/출력 데이터 전송을 위한 제어, 및 입력 데이터 로딩과 출력 데이터 언로딩 레지스터를 제공한다. 이들 레지스터는 또한 중간 결과 기억영역을 제공한다.
부동소수점 가산기-ALU는 부동소수점 가산, 부동소수점 감산, 및 전환 동작을 수행하기 위해 사용되는 조합 논리를 포함한자. 부동소수점 승산/제산 유닛은 승산/제산 및 나머지를 수행하기 위한 하드웨어를 포함한다.
부동소수점 유닛(143)은 32-비트 데이터 경로가 잇는 마이크로 코드 엔진으로 구성된다. 이 데이터 경로는 종종 결과 계산동안 여러번 재사용된다. 배정도 동작은 단정도 동작의 사이클 수보다 두배 내지 네배의 사이클을 필요로 한다. 부동소수점 준비 신호는 주어진 부동소수점 동작의 완료에 앞서 1-사이클로 주장한다. 이는 정수 유닛(142)이 어떠한 낭비된 인터페이스 사이클 없이 부동소수점 유닛 출력 레지스터를 판독하게 한다. 따라서, 출력 데이터는 부동소수점 준비 신호가 표명된 후 한 사이클을 판독하기 위해 가능하다. 마이크로피시 부록 Ⅰ의 JAVA 가상 컴퓨터 사양은 하드웨어에 독립적이기 때문에, 가상 컴퓨터 명령은 특정한 일반적 형태의 프로세서, 예를 들면 복잡 명령 세트 컴퓨터(CISC) 프로세서, 또는 축소 명령 세트 컴퓨터(RISC) 프로세서 등에 대하여 최적화되지는 않는다. 실제로, 일부 가상 컴퓨터 명령은 CISC 특성을 가지고 있고 다른 일부는 RISC 특성을 갖는다. 이 이중 특성은 동작 및 하드웨어 프로세서(100)의 최적화를 복잡하게 한다.
예를 들면, JAVA 가상 컴퓨터 사양은 종래의 스위치 스테이트먼트인 명령 룩업스위치(lookup switch)를 위한 오프 코드(171)를 규정한다. 명령 캐시 유닛(120)으로의 데이터 스트링은 오프 코드(171), 제로에서 3 바이트의 패딩이 뒤따르는 N-웨이 스위치 스테이트먼트 인식을 포함한다. 패딩 바이트의 수는 첫 번째 오퍼랜드 바이트가 4의 배수인 어드레스에서 시작하도록 선택된다.
데이터 스트링내에서 패딩 바이트를 뒤따르는 것은 일련의 부호 달린 4-바이트 크기의 쌍이다. 첫 번째 쌍은 특별하다. 첫 번째 쌍내의 제 1 오퍼랜드는, 정수 키로 불리는 인수 또는 이와 다르게 스위치 스테이트먼트의 현재 일치 값이 스위치 스테이트먼트내의 일치 값의 어느것과도 같지 않을 때 사용되는 스위치 스테이트먼트를 위한 디폴트 오프셋이다.
데이터 스트림내의 각 뒤이은 오퍼랜드 쌍은 매치 값인 제 1 오퍼랜드, 오프셋인 제 2 오퍼랜드를 구비한다. 정수 키가 매치 값의 어느 하나와 같은면, 쌍내의 오프 셋은 스위치 스테이트먼트의 어드레스에 가산되어 실행이 분기되는 어드레스를 규정한다. 반대로, 정수 키가 매치 값의 어느것과도 같지 않으면, 첫 번째 쌍내의 디폴트 오프셋은 스위치 스테이트먼트의 어드레스에 가산되어 실행이 분기되는 어드레스를 규정한다. 이 가상 컴퓨터 명령의 직접 실행은 많은 사이클을 필요로 한다.
하드웨어 프로세서(100)의 성능을 향상시키기 위해, 룩업 스위치 가속기(145)는 하드웨어 프로세서(100)에 포함된다. 룩업 스위치 가속기(145)는 하나 이상의 룩업 스위치 스테이트먼트에 관련된 정보를 저장하는 관련 메모리를 포함한다. 각 룩업 스위치 스테이트먼트를 위해, 즉 각 명령 룩업 스위치를 위해, 이 정보는 룩업 스위치 인식기 값, 즉 룩업 스위치 스테이트먼트에 관련된 프로그램 카운터 값, 복수의 매치 값 및 대응하는 복수의 점프 오프 셋 값을 포함한다.
룩업 스위치 가속기(145)는 하드웨어 프로세서(100)에 의해 수신된 현재 지시가 관련 메모리 내에 저장된 룩업 스위치 스테이트먼트에 대응하는지 결정한다. 또한 룩업 스위치 가속기(145)는 현재 명령에 관련된 현재 매치 값이 관련 메모리에 저장된 매치 값의 하나와 대응하는지 결정한다. 룩업 스위치 가속기(145)는, 현재 명령이 메모리에 저장된 룩업 스위치 스테이트먼트에 대응되고 현재 매치 값이 메모리내에 저장된 매치 값의 하나에 대응될 때, 관련 메모리로부터의 점프 오프셋 값에 액세스하며, 여기서 액세스된 점프 오프셋 값은 현재 매치 값에 대응된다.
룩업 스위치 가속기(145)는 또한 관련 메모리가 매치와 현재 룩업 스위치 스테이트먼트에 관련된 점프 오프셋 값을 이미 포함하지 않을 때, 현재 룩업 스위치 스테이트먼트와 관련된 점프 오프 셋 값 및 매치를 검색하기 위한 회로를 포함한다. 룩업 스위치 가속기(145)는, 발명의 명칭이 "LOOK-UP SWITCH ACCELERATOR AND METHOD OF OPERATING SAME"이고, 마크 트렘블레이 및 제임스 마이클 오'코너등이 발명자이며, 본 출원의 양수인에게 양도되고, 여기서는 참고로 소개된 미국특허출원 제 08/788,811 호에 상세히 기재되어 있다.
오브젝트의 매서드의 실행 개시 과정에 있어서, 실행 유닛(140)은 매서드 벡터에 액세스하여, 매서드 벡터내의 매서드 포인터의 하나 즉 부정의 하나의 레벨을 검색한다. 실행 유닛(140)은 액세스된 매서드 포인터를 사용하여 대응하는 매서드 즉 부정의 두 번째 레벨에 액세스하다.
실행 유닛(140)내의 부정 레벨을 감소시키기 위해, 각 오브젝트를 오브젝트에 의해 액세스되는 각 매서드의 전용 카피가 구비된다. 실행 유닛(140)은 그 후 부정의 단일 레벨을 사용하여 매서드에 액세스한다. 즉, 각 매서드는 오브젝트로부터 나온 포인터에 의해 직접 액세스된다. 이는 매서드 포인터에 의해 이전에 도입된 부정의 레벨을 제거한다. 부정의 레벨을 감소시킴으로써, 실행 유닛(140)의 동작은 가속될 수 있다. 부정의 레벨을 감소시킴으로써, 실행 유닛(140)의 동작은 가속될 수 있다. 부정의 레벨을 감소시킴으로써 실행 유닛(140)을 가속하는 것은, 발명의 명칭이 "REPLICATING CODE TO ELIMINATE A LEVEL OF INDIRECTION DURING EXECUTION"이고, 마크 트렘블레이 및 제임스 마이클 오'코너등이 발명자이며, 본 출원의 양수인에게 양도되고, 여기서는 참고로 소개된 미국특허출원 제 08/787,846 호에 상세히 기재되어 있다.
getfield-putfield 가속기
다른 특정 기능적인 유닛 및 구조의 다양한 변환 룩어사이드 버퍼(TLB) 형태는 선택적으로 하드웨어 프로세서(100)에 포함되어 상수 풀에 대한 액세스를 가속시킨다. 예를 들면, JAVA 가상 컴퓨터 사양은 실행될 때 오브젝트 내에 필드를 설정하는 명령 putfield, 오프 코드(181)로 실행될 때 오브젝트로부터 필드를 인출하는 getfield, 오프 코드(180)를 결정한다. 이들 명령에 있어서, 오프코드는 인덱스 바이트 1 및 인덱스 바이트 2가 뒤따른다. 오퍼랜드 스택(423)은 명령 putfield를 위한 값이 뒤따르는 오브젝트에 대한 레퍼런스와 명령 getfield를 위한 오브젝트에 대한 레퍼런스만을 포함한다.
인덱스 바이트 1 및 2는 현재 클래스의 상수 풀내로 인덱스를 생성하기 위해 사용된다. 그 인덱스에서의 상수 풀내의 항목은 클래스 이름 및 필드 이름에 대한 필드 레퍼런스이다. 항목은 바이트내 필드폭과 바이트내 필드 오프셋을 모두 갖는 필드 블럭 포인터로 분해된다.
실행 유닛(140)내의 선택적인 getfield-putfield 가속기(146)는 캐시내 명령 getfield 또는 명령 putfield를 위한 필드 블럭 포인터를 저장하고, 태그로써 필드 블럭 포인터로 분해된 상수 풀내에서 항목을 인식하기 위해 사용된 인덱스에 따라, 명령의 첫 번째 호출후에 사용한다. 계속해서, 실행 유닛(140)은 인덱스 바이트 1 및 2를 사용하여 인덱스를 생성하고 인덱스를 getfield-putfield 가속기(146)로 공급한다. 인덱스가 태그로써 저장된 인덱스의 어느 하나와 매치되면, 즉 히트가 있으면, 그 태그와 관련된 필드 블럭 포인터는 검색되고 실행 유닛(140)에 의해 사용된다. 반대로, 매치가 발견되지 않으면, 실행 유닛(140)은 위에서 설명한 동작을 실행한다. getfield-putfield 가속기(146)는 자가 수정 코드, 위에서 설명한 고속 명령 변환 실시예에서 사용된 자가 수정 코드 없이 실행된다.
한 실시예에 있어서, getfield-putfield 가속기(146)는 인덱스들을 홀드하여 태그로써 기능하는 첫 번째 부분과, 필드 블럭 포인터를 홀드하는 두 번째 부분을 구비한 관련 메모리를 포함한다. 인덱스가 입력부를 통해 관련 메모리의 제 1 부분에 공급될 때, 그리고 저장된 인덱스들의 하나와 매치가 있으면, 입력 인덱스와 매치된 저장된 인덱스와 관련된 필드 블럭 포인터를 관련 메모리의 제 2 부분으로부터의 출력이다.
경계 검사 유닛
실행 유닛(140)내 경계 검사 유닛(147)(도 1)은 요소로의 각각의 액세스를 검사하여 액세스가 어레이내의 로케이션에 대한 것인지 결정하는 선택적인 하드웨어 회로이다. 액세스가 어레이 외부의 로케이션에 대한 것일 때, 경계 검사 유닛(147)은 액티브 어레이 경계 예외 신호를 실행 유닛(140)에 발한다. 액티브 어레이 경계 예외 신호에 응답하여, 실행 유닛(140)은 마이크로 코드 ROM(141)에 저장된 예외 핸들러의 실행을 시작시켜, 아웃 오브 경계 어레이 액세스는 취급한다.
한 실시예에 있어서, 경계 검사 유닛(147)은, 그 내부에 어레이를 위한 어레이 인식기, 예를 들면 프로그램 카운터 값, 및 어레이를 위한 최소값 및 최대값이 저장된 관련 메모리 요소를 포함한다. 어레이가 액세스될 때, 즉 그 어레이를 위한 어레이 인식기가 관련 메모리 요소에 적용될 때, 그리고 어레이가 관련 메모리 요소내에 나타난다고 할 때, 저장된 최소값은 제 1 비교기 요소에 대한 제 1 입력 신호이고, 저장된 최대값은 제 2 비교기 요소에 대한 제 1 입력 신호이고, 때때로 비교 요소라고도 불린다. 제 1 및 제 2 비교기 요소에 대한 제 2 입력 신호를 어레이 요소의 액세스에 관련된 값이다.
어레이 요소의 액세스에 관련된 값이 저장된 최대값보다 적거나 같을 때 및 저장된 최소 값보다 크거나 같을 때에는 어느 비교기 요소도 출력 신호를 생성하지 않는다. 경계 검사 유닛(147)의 한 실시예에 대한 보다 상세한 설명은 아래에 제공된다.
JAVA 가상 컴퓨터 명세는 특정 명령이 특정 예외를 야기할 수 있음을 규정한다. 이들 예외 조건의 검사가 실행되고, 이들을 처리하기 위한 하드웨어/소프트웨어 매커니즘은 마이크로코드 ROM(147) 및 프로그램 카운터 및 트랩 제어 논리(170)내의 정보에 의해 하드웨어 프로세서(100)에 제공된다. 다른 것은 트랩 엑터 스타일 또는 단일 트랩 타겟을 갖고 트랩 형태를 스택상에 푸싱하는 것을 포함하여, 제공된 트랩 핸들러 루틴이 적절한 동작을 결정하게 한다.
어떠한 외부 캐시도 하드웨어 프로세서(100)의 구성을 위해 필요하지 않다. 어떠한 변환 룩어사이드 버퍼도 유지될 필요가 없다.
도 5는 독특한 시스템을 만들기 위한 하드웨어 프로세서(100)에 대한 몇 개의 가능한 부가 요소들을 나타낸다. 여덟 개의 기능을 유지하기 위한 회로, 즉 본 발명의 하드웨어 프로세서(100)로서의 동일 칩 속에 집적될 수 있는 NTSC 인코더(501), MPEG(502), 에더넷 제어기(503), VIS(504), ISDN(505), I/O 제어기(506). ATM 어셈블리/리어셈블리(507) 및 무선 링크(508)가 도시되어 있다.
도 6A는 번역 유닛(610), 어레이 액세스 프로세서(612), 연관 메모리 구성요소(614) 및 실행 유닛(616)을 포함하는 컴퓨터 시스템(600)을 나타낸다. 번역 유닛(610)은 소프트웨어 프로그램 정보(609), 예를 들어 JAVA 가상 컴퓨터 명령을 수신하고, 프로그램 정보(609)를 각각 번역된 명령 중 하나에 대응하는 버스(611)상의 어레이 액세스 명령과 버스(613)상의 어레이 액세스 명령 식별자를 포함하는 번역된 명령으로 번역한다. 각각의 어레이 액세스 명령은 어레이내의 구성요소를 참조한다.
번역 유닛(610)은 가상 컴퓨터 명령을 특정 컴퓨터 체계에 대한 고유 명령으로 변환하는 ROM, 가상 컴퓨터 명령을 특정 컴퓨터 체계에 대한 고유 명령으로 변환하는 소프트웨어 프로그램 또는 입력되는 명령에 대한 번역이 불필요한 경우에는 단순히 명령 디코더일 수 있다.
한 실시예에서 번역 유닛(610)은 어레이 액세스 명령이 자주 이용되는지를 판정한다. 예를 들어 프로파일 피드백을 이용하여 번역 유닛(610)은 동적 실행 카운트가 이들 문 식별자와 연관 메모리에 대응하는 경계를 로드함으로써 실행 이점을 제공할 만큼 충분히 높은 어레이 액세스 명령을 식별한다. 다른 실시예에서, 각각의 어레이에 대한 적당한 어레이 정보는 어레이가 형성될 때 연관 메모리에 저장되고, 연관 메모리가 충만하면 적당한 대체 정책이 구현된다.
어레이가 형성되면, 어레이 액세스 프로세서(612)는 번역된 소프트웨어 명령의 버스(613)상의 어레이 액세스 명령 식별자와 버스(611)상의 어레이 정의 명령을 수신한다. 어레이 액세스 프로세서(612)는 이 정보를 이용하여 어레이 참조 엔트리 ARRAYi(615)와 최소 및 최대 어레이 크기값 MINi(617A) 및 MAXi(617B)를 발생하고, 이들은 연관 메모리 구성요소(614)에 저장되는 어레이 참조 엔트리 ARRAYi(615)와 연관된다. 한 실시예에서, 어레이 액세스 프로세서(612)는 식별자와, 최소 및 최대 어레이 크기값을 연관 메모리 구성요소(614)로 로드하기 위해 실행 유닛(616)에 의해 실행되는 단순한 명령이다. 이들 명령은 마이크로코드이거나 번역 유닛(610)에 의해 제공될 수 있다.
연관 메모리 구성요소(614)는 어레이의 구성요소가 액세스될 때 구성요소가 그 어레이에 대한 최대 어레이 크기값 MAXi(617B)와 최소 어레이 크기값 MINi(617A)(통상 0)내에 존재한다는 것을 확인하도록 구성된다. 아래에 기술되고, 도 6A에 나타낸 실시예에 있어서, 어레이 경계 검사 장치는 도 6B에 도시된 다음의 어레이 액세스 명령 load_array [ARRAY3] [ELEM26]에 응답한다.
제 1 메모리부(618A)는 복수의 어레이 참조 엔트리 ARRAYi(615)를 수신하고 저장하도록 구성된 복수의 제 1 메모리 기억장소를 포함하고, 여기서 i는 1 내지 N이다. 복수의 어레이 참조 엔트리의 각각은 번역 유닛(610)에 의해 제공되는 번역된 소프트웨어 명령의 복수의 어레이 액세스 명령 중 하나에 대응한다.
제 2 메모리부(618B)는 최소 어레이 크기값 MINi(617A)과 최대 어레이 크기값 MAXi(617B)를 수신하고 저장하도록 구성된 복수의 제 2 메모리 기억장소를 포함한다. 제 2 메모리부(618B)의 복수의 제 2 메모리 기억장소는 각각 제 1 메모리부(618A)의 복수의 메모리 기억장소의 각각과 연관된 한 세트의 최소 및 최대 어레이 크기값(617A, 617B)을 저장하도록 구성된다. 따라서, 어레이 크기값의 각각의 세트들은 번역된 소프트웨어 명령의 복수의 어레이 액세스 명령 중 하나와 연관된다.
제 1 메모리부(618A)에 연결되는 입력부(622)는 번역된 소프트웨어 명령에 대하여 버스(613)상의 어레이 액세스 명령 식별자를 수신하고, 동시에 어레이 액세스 명령 식별자(613)와 제 1 메모리부(618A)에 저장된 어레이 참조 엔트리 ARRAYi(615)의 각각의 일부분을 비교하도록 구성된다. 각각의 어레이 액세스 명령 식별자(613)는 번역된 소프트웨어 명령의 고유 어레이 액세스 명령을 식별한다.
제 2 메모리부(618B)에 연결되는 출력부(624)는 번역된 소프트웨어 명령의 버스(613)상의 어레이 액세스 명령 식별자와 일치하는 복수의 어레이 참조 엔트리 ARRAYi(615) 중 하나를 저장하는 복수의 메모리 기억장소 중 하나와 연관되는 제 2 메모리부(618B)의 복수의 제 2 메모리 기억장소 중 하나에 저장된 어레이 크기값(MINi(617A), MAXi(617B)) 세트 중 한 세트인 최소 어레이 크기 출력값(630)과 최대 어레이 크기 출력값(621)을 제공하도록 구성된다. 참조된 구성요소의 최대 어레이 크기 출력값(621)과 값(619)은 참조된 구성요소의 값(619)이 최대 어레이 크기 출력값(621)보다 크면 최대 위반 신호 라인(628)에 최대 위반 신호를 제공하기 위해 비교기(626)에 의해 비교된다. 이와 마찬가지로, 최소 어레이 크기 출력값(630)(통상 0)는 참조된 구성요소의 값(619)이 최소 어레이 크기 출력값(630)보다 작으면 최소 위반 신호 라인(634)에 최소 위반 신호를 제공하기 위해 비교기(632)에 의해 참조된 구성요소의 값(619)과 비교된다. 라인(628)상에서 최대 위반 신호 또는 라인(634)상에서 최소 위반 신호가 발생하면, OR 게이트(638)에 의해 라인(636)상에 예외 출력 신호를 발생한다.
따라서, 도 6A와 도 6B의 예에서 어레이 액세스 명령 "load_array [ARRAY3] [ELEM26]"(도 6B 참조)는 어레이 참조 엔트리 ARRAY3과 연관된 어레이의 구성요소(26)를 참조한다. 통상, 스택 최상위의 값은 어레이 3의 구성요소 26에 로드된다. 구성요소 26가 어레이 3의 경계 바깥에 있으면, 경계 검사가 이용되지 않는 경우 메모리의 정보는 겹쳐쓰여질 수 있다.
연관 메모리 구성요소(614)의 열(690)은 어레이 참조 엔트리 ARRAY3과 연관된다. 입력부(622)는 버스(613)상의 연관된 어레이 액세스 명령 식별자 ARRAY3와 어레이 참조 엔트리 ARRAY3 사이의 일치를 제공한다. 이 일치는 어레이 참조 엔트리 ARRAY3과 연관된 값 MIN3(이 예에서는 0)과 값 MAX3(이 예에서는 99)이 각각 출력부(624)를 통해 버스(630, 621)상에 제공되도록 한다. MAX3 값 99는 참조된 구성요소가 참조된 어레이에 대한 설정된 최대 경계값보다 적다는 것을 확인하기 위해 값 26과 비교된다. 이와 마찬가지로, MIN3 값 0는 참조된 구성요소가 참조된 어레이에 대한 설정된 최소 경계값보다 크다는 것을 확인하기 위해 값 26과 비교된다. 값 26은 설정된 경계내에 있기 때문에, 버스(636)상에서의 예외 신호는 발생하지 않는다(도 6A).
해당 분야의 숙련된 자라면 상기한 것에 부가하여 다양한 논리 함수가 경계를 확인하고, 예외 신호를 발생하는데 사용될 수 있다는 것을 인식할 수 있을 것이다. 비교 함수(626, 632)와 OR 게이트(638)의 사용은 다만 설명을 위한 것이고, 본 발명을 한정하는 것은 아니다.
한 실시예에서, 실행 유닛(616)은 어레이 액세스 경계 예외 서브루틴을 규정하는 번역된 명령의 시퀀스를 실행함으로써 라인(636)상의 예외 출력 신호에 응답하도록 구성된다.
도 6C는 도 6A의 컴퓨터 시스템(600)과 유사한 컴퓨터 시스템(600C)을 나타낸다. 도 6C에 도시된 본 발명의 실시예에서, 어레이 액세스 프로세서(612), 연관 메모리 구성요소(614), 비교기(626, 632) 및 OR 게이트(638)는 도 1의 경계 검사 유닛(147)을 포함한다. 이 실시예에서, 명령 캐시(125)(도 1 및 도 6C)는 소프트웨어 프로그램 정보(609)를 도 6A의 번역 유닛을 기능을 수행하는 명령 디코더(135)(도 1 및 도 6C)로 전송한다. 컴퓨터 시스템(600)과 비교할 때, 컴퓨터 시스템(600C)에서 명령 디코더(135)(도 1 및 도 6C)는 셋업 절차의 일부분으로서 어떤 어레이 액세스 명령이 자주 이용되는지를 판정하고, 동적 실행 카운트가 이런 문장 식별자와 대응하는 경계를 연관 메모리로 로드함으로써 실행 결과를 제공할 만큼 충분히 높은 어레이 액세스 명령을 식별한다. 어레이 액세스 프로세서(612)는 어레이 액세스 명령(611)과, 번역된 소프트웨어 명령의 어레이 액세스 명령 식별자(613)를 수신하고, 유닛(147)으로의 로드를 위한 어레이 참조 엔트리 ARRAYi(615)와 연관된 어레이 참조 엔트리 ARRAYi(615)와 최소 및 최대 어레이 크기값 MINi(617A) 및 MAXi(617B)를 선택적으로 출력한다.
본 발명의 실시예에서 어레이 액세스 프로세서(612), 연관 메모리 장치(614), 비교기(626) 및 OR 게이트(638)의 동작은 모두 도 6A에 도시되고, 앞에서 상세히 논의된 유사한 인용부호를 갖는 유닛의 동작과 동일하다.
도 6C에 도시된 본 발명의 실시예에서 버스(636)상의 OR 게이트(638)의 예외 출력 신호는 실행 유닛(140)의 정수 유닛(142)에 연결된다(도 1 및 도 6C). 정수 유닛(142)은 어레이 액세스 경계 예외 서브루틴을 규정하는 번역된 명령의 시퀀스를 실행함으로써 버스(636)상의 예외 출력 신호에 응답하도록 구성된다.
해당 분야의 통상의 지식을 가진 자라면 상기 개시에 의해 필요에 따라 여러 가지 방법으로 본 발명의 실시예에 부가하거나 상기 실시예를 변형할 수 있고, 본 발명의 여러 태양의 범위나 사상내에 있을 것이다. 따라서, 본 발명이 속하는 분야의 숙련자에게는 명백한 여러 변경 및 변형은 본 발명의 범위와 사상내에 있는 것으로 간주된다.
마이크로피시 부록Ⅰ
JAVA 가상 컴퓨터 명세
1993, 1994, 1995 Sun Microsystems, Inc.
2550 Garcia Avenue, Mountain View, California
94043-1100 U.S.A.
모든 권리는 보존되었다. 이 BATA 특성은 공개되었으며, 관련 서류는 저작권에 의해 보호되며, 그의 사용, 복사, 배포 및 편집을 제한하는 라이센스에 의해 배포된다. 이 공개 또는 관련 서류는 선 또는 그의 라이센서의 위임없이 어떤 수단에 의해 어떤 형태로 재생산될 수 있다.
이 생산물의 일부는 UNIX 시스템 연구소와 캘리포니아대학에 각각 인가된 상표명 UNIX와 바클리 4.3 BSD 시스템즈에서 비롯될 수 있다. 이 공개의 제삼자의 원천 소프트웨어는 저작권에 의해 보호되며 선의 원천 공급자에 라이센스되어 있다.
제한된 권리 범례 : 미국정부에 의한 사용, 복사 또는 개시는 DFARS 252.227-7013(c)(1)(ⅱ) 및 FAR 52.227-19에 설정된 제한에 구속된다.
이 매뉴얼에 기술된 공개는 하나 이상의 미국특허, 외극특허 또는 계류출원에 의해 보호될 수 있다.
상표
선, 선 마이크로시스템즈, 선 마이크로시스템즈 컴퓨터 코퍼레이션, 선 로고, 선 마이크로시스템즈 컴퓨터 코퍼레이션 로고, WebRunner, JAVA, FirstPerson 및 Firstperson 로고 및 에이전트는 선 마이크로시스템즈 인코퍼레이티드의 상표 또는 등록 상표이다. "Duke"캐릭터는 선 마이크로시스템즈 인코포레이티드의 저작권 1992-1995 Copyright (c)이다. 모든 권리는 보존되었다. 상표명 UNIX는 미국 및 다른 나라에서 상표등록되었으며, X/Open Company, Ltd를 통해 독점적으로 라이센스되었다. OPEN LOOK는 노벨 인코퍼레이티드의 등록 상표이다. 여기에 언급된 모든 다른 생산물명은 그들 각각의 자신들의 상표이다.
SCD 컴플레이언트 로고를 포함하는 모든 SPARC 상표는 SPARC 인터내셔날 인코퍼레이티드의 상표 또는 등록상표이다. SPARCstation, SPARCserver, SPARCengine, SPARCworks 및 SPARCcompiler는 선 마이크로시스템즈 인코퍼레이티드에 독점적으로 인가되어 있다. 상표 SPARC를 부착한 제품은 선 마이크로시스템즈 인코퍼레이티드에 의해 개발된 구성물에 기초한다.
OPEN LOOK 및 SunTM Graphical User Interfaces는 그의 사용자와 라이센스자에 대해 선 마이크로시스템즈 인코퍼레이티드에 의해 개발되었다. 선은 컴퓨터 산업을 위해 시각 및 도형 사용자 조화의 관점에서 연구 또는 개발한 제록스의 선구자적 노력을 인정한다. 선은 제록스로부터 Xerox Graphical User Interface에 비독점적 라이센서를 소유하였으며 또한 OPEN LOOK GUIs와 선의 라이센스 동의에 따라 선의 라이센스를 포함한다.
X 윈도우 시스템은 MIT의 상표 및 제품이다.
이 공개는 특정 목적 또는 비침해에 대한 시장성, 합리성의 암시적 근거에 한정하지 않고 어떠한 종류의 근거, 표현 또는 암시없이 "그대로" 제공된다.
이 공개는 기술적 오류 또는 기록 에러를 포함할 수 있다. 변경은 안내서에 정기적으로 부가될 수 있다 : 이들 변경은 공개의 새로운 증보판에 조합될 것이다. 선 마이크로시스템즈 인코포레이티드는 적절한 시기에 이 공보에 기재된 제품 및/또는 프로그램을 개선 및/또는 변경을 가할 수 있다.
머리말
이 서류는 JAVA 가상 컴퓨터 및 그의 교육 프로그램의 버전 1.0을 기술한다. 우리는 컴파일러 기록자를 타겟으로 하기를 원하는 컴파일러 기록자를 위한 명세서로서, 및 추종 JAVA 가상 컴퓨터를 구현하기를 원하는 다른 사람들을 위한 명세서로써 작용하도록 이 서류를 기록하였다.
JAVA 가상 컴퓨터는 실제 컴퓨터상에 소프트웨어로 에뮬레이트하는 것에 의해 구현되는 상상의 기계이다. JAVA 가상 컴퓨터의 코드는 클래스 파일에 기억되어 있으며, 각 클래스 파일은 하나 이상의 공용 클래스 코드를 포함한다.
JAVA 가상 컴퓨터의 간단하고 능률적인 에뮬레이션은 컴퓨터의 포맷이 콤팩트하고 능률적인 바이트코드이기 때문에 가능하다. 컴파일된 C의 본래의 코드속도 액세스의 구현은 비록 선이 구현화에 대한 공개를 하지 않았지만 컴퓨터에 바이트코드를 변환하는 것에 가능하다.
이 서류의 나머지는 이하와 같이 구성되어 있다.
1장은 JAVA 가상 컴퓨터의 구조를 기술한다.
2장은 클래스 파일 포맷을 기술한다.
3장은 바이트코드를 기술하며,
부록 A는 JAVA 가상 컴퓨터의 선의 구현에 의한 어떤 구성을 포함한다. 명세서의 일부분은 정확하지 않지만 우리는 명세서가 구현에 참조가 되도록 여기에 이들을 기술한다. JAVA 가상 컴퓨터의 다른 구현은 이용가능하며 우리는 미래의 공개로부터 부록 A를 제거할 것이다.
선은 JAVA 가상 컴퓨터 상표와 로고를 이 명세서의 구현에 사용하기 위해 인가할 것이다. 여러분이 JAVA 가상 컴퓨터의 구현을 고려하여 우리와 접촉하길 원한다면 아래의 주소로 E메일을 보내주길 바라며, 우리는 여러분의 구현을 위해 100% 지원할 것이다.
JAVA Virtual Machine의 구현에 대한 명세서상의 논평이나 질문은 우리의 전자우편주소인 JAVA@JAVA.sun.com.으로 보내주길 바랍니다.
1. JAVA 가상 컴퓨터 체계
1.1 지원된 데이터 형식
가상 기계 데이터 형식은 JAVA 언어의 기본 데이터 형식을 포함한다.
byte//1 바이트 부호 달린 2의 보수
short//2바이트 부호 달린 2의 보수
int//4바이트 부호 달린 2의 보수
long//8바이트 부호 달린 2의 보수
float//4바이트 IEEE 754 단정도
double//8바이트 IEEE 754 배정도
char//2바이트 부호 없는 유니코드 문자
대략 모든 JAVA형 검색은 컴파일 때 이루어진다. 전술한 초기 형태의 데이터는 JAVA의 실행을 허용하도록 하드웨어에 의해 표시될 필요는 없다. 대신에, 초기 값으로 작동하는 바이트코드는 예를 들면 iadd, ladd, fadd 및 dadd 명령의 오퍼랜드 형태를 표시하며, 2개의 번호를 더한 형태는 각각 int, long, float 및 double이다.
가상 컴퓨터는 불 형태를 위한 명령을 분리하지 않는다. 대신에, 정수 복귀를 포함하는 정수 명령이 불 값을 연산하는데 사용되며; 바이트 어레이는 불의 어레이를 위해 사용된다.
가상 컴퓨터는 점진적인 언더플로우를 지원하며 IEEE 754 포맷에 부동소수점 포인트를 특정화한다. IEEE 포맷을 지원하지 않는 구형 컴퓨터 체계는 JAVA 분수 프로그램을 대단히 느리게 실행하게 된다.
다른 가상 컴퓨터 데이터 형태는 이하의 것을 포함한다.
오브젝트//JAVA 오브젝트에 대한 4바이트 레퍼런스
복귀번지//jsr/ret/jsr_w/ret_w 명령으로 사용된 4바이트
주:JAVA 어레이는 오브젝트로서 처리되었다.
이 명세서는 오브젝트를 위해 어떤 특정한 내부 구조를 요구하지 않는다. 우리들의 구현에 있어서 오브젝트 레퍼런스는 한 쌍의 포인터: 하나는 오브젝트용 매서드 테이블, 다른 하나는 오브젝트를 위해 할당된 데이터로 처리된다. 다른 구현은 인라인 캐시 보다는 매서드 테이블 처리를 사용할 수 있으며, 이러한 방법은 하드웨어의 급속한 변화, 즉 현재와 2000년 사이에서 일어나는 급속한 변화와 유사하다.
JAVA 가상 컴퓨터 바이트코드에 의해 표현된 프로그램은 바람직한 형태 억제를 유지하는 것이 기대되며, 구현은 이러한 형태 억제를 위반하는 바이코드 프로그램을 실행하도록 거부될 수 있다.
반면, JAVA 가상 컴퓨터는 32비트 어드레스 공간 컴퓨터에서 운전되도록 바이트코드 데오니션에 의해 한정되어지며, 이는 바이트코드를 64비트 형식으로 자동적으로 변환하는 JAVA 가상 컴퓨터의 버전을 만드는 것이 가능하다. 이 전송 기술은 JAVA 가상 컴퓨터 명세서의 기술사상을 넘어선다.
1.2 레지스터
어떤 관점에 있어서, 가상 컴퓨터는 단일 매서드의 코드를 실행하며, pc 레지스터는 실행되어지는 다음 바이트코드의 어드레스를 포함한다.
각 매서드는 메모리를 유지하기 위해 할당된 메모리 공간을 가진다.
vars 레지스터로 언급된 로컬 변수 설정;
optop 레지스터로 언급된 오퍼랜드 스택; 및
frame 레지스터로 언급된 실행 환경 구조
로컬 변수 크기와 오퍼랜드 스택은 컴파일 때로 알려져 있기 때문에 이 공간의 모두는 한 번에 할당될 수 있으며, 실행환경 구조의 크기는 해석자로 잘 알려져 있다.
이들 레지스터 모두는 32비트 폭을 가진다.
1.3 로컬 변수
각 JAVA 매서드는 로컬 변수의 고정 크기 설정을 사용한다. 그들은 vars 레지스터로부터의 워드 오프셋으로써 어드레스된다. 로컬 변수는 모두 32비트 폭이다.
배정도 정수와 배정도는 제 1 로컬 변수의 인덱스로 어드레스된다(예를 들면, 인덱스를 구비한 로컬 변수는 인덱스 n 및 n+1에서의 기억을 활성적으로 사용하는 배정도를 포함하고 있다). 가상 컴퓨터 명세서는 64비트 정렬되는 로컬 변수에서의 64비트 값을 요구하지 않는다. 구현자는 배정도 정수와 배정도를 2개의 워드로 분할하도록 적절한 방식을 결정한다.
명령은 오퍼랜드 스택상에 로컬 변수 값을 로드하여 오퍼랜드 스택으로부터 로컬 변수내로 값을 기억하기 위해 제공되어 있다.
1.4 오퍼랜드 스택
컴퓨터 명령은 오퍼랜드 스택, 그들의 연산 및 스택으로의 결과 복귀로부터 오퍼랜드를 모두 취한다. 우리는 인텔 486 마이크로프로세서와 같은 약간 또는 불규칙 레지스터를 구비한 컴퓨터상에 컴퓨터를 효과적으로 쉽게 에뮬레이트 하도록 스택 조직을 선택하였다.
오퍼랜드 스택은 32비트 폭이다. 매서드에 대한 매개 변수를 패스하여 얻어진 매서드를 수신할 뿐만 아니라 연산에 대한 변수를 공급하여 얻어진 연산을 세이브하도록 사용되어진다.
예를 들면, 명령 iadd의 실행은 2개의 정수를 함께 가산한다. 2개의 정수는 이전 명령에 의해 푸시된 오퍼랜드 스택상의 2개의 최상위 워드인 것을 기대한다. 양 정수는 스택, added 및 오퍼랜드 스택상에 푸시된 그들의 합으로부터 팝된다. 보조계산기가 오퍼랜드 스택상에 위치될 수 있으며 단일 오퍼랜드의 결과는 다음 계산에 의해 사용될 수 있다.
각각의 초기 데이터 형태는 그 형태의 오퍼랜드상에서 어떻게 연산할 것인지를 알고 있는 특정 명령을 가진다. 각 오퍼랜드는 2개의 위치를 요구하는 배정도 이중 오퍼랜드를 이상하고는 스택상의 단일위치를 요구한다.
오퍼랜드는 그들의 형태에 적합한 오퍼레이터로 연산되어야만 한다. 예를 들면, 2개의 오퍼랜드를 푸시하여 그들을 길게 처리하면 비합법적으로 된다. 이 제한은 바이트코드 입증자에 의해 선의 구현에서 강요된다. 그러나, 작은 수의 연산(dup opcodes and swap)은 형태에 관계없이 주어진 폭의 열 값으로서 실행시간 데이터 영역으로 연산한다.
가상 컴퓨터 명령의 이하의 설명에 있어서, 오퍼랜드 스택상의 명령의 실행 효과는 좌측에서 우측으로 성장하는 스택을 구비한 그대로 표현되며, 각각은 32비트 워드로 분리되어 표현된다. 따라서:
stack: ..., value1, value2 ⇒ ..., value3
연산의 바로 밑의 value1을 구비한 스택의 최상에 value2를 갖는 것에 의해 연산이 시작된다. 명령 실행의 결과로써, value1 및 value2는 스택으로부터 팝되며 명령에 의해 계산되어진 value3으로 대체된다. 생략으로 표현된 스택의 나머지는 명령의 실행에 의해 영향을 받지 않는다.
배정도 및 이중 형태는 오퍼랜드상에 2개의 32비트 워드를 취한다:
stack: ..., ⇒ ..., value-word1, value-word2
이 명세서는 2개의 워드가 어떻게 64비트의 배정도 또는 이중 값으로부터 선택되었는지는 언급하지 않으며 단지 내부적으로 일정한 특정 구현만이 필요하다.
1.5 실행 환경
명령 환경내에 포함된 정보는 활성 연결, 정상 매서드 복귀 및 이상 전파에 사용된다.
1.5.1 동적 연결
실행 환경은 매서드 코드의 활성 연결을 지원하는 현재 매서드 및 현재 클래스를 위해 해석자 기호 테이블에 레퍼런스를 포함한다. 클래스는 호출되어지는 매서드에 대한 매서드를 위한 코드를 파일하며 부호로 액세스되어지도록 가변될 수 있다. 동적 연결은 활성 매서드 호출로 부호화 매서드 호출을 번역하며 아직 규정되지 않은 부호를 해석하는데 필요한 클래스를 로딩하며, 이들 가변의 실행 시간과 결합된 기억 구조에서 적절한 오프셋으로 가변 액세스를 변환한다.
이 매서드와 변형의 늦은 결합은 이 코드를 중단하는 매서드를 사용하는 다른 클래스로 변경된다.
1.5.2 정상 매서드 복귀
현재 매서드의 실행이 정상적으로 완료되었다면, 값은 호출 매서드로 복귀된다. 이는 호출 매서드가 복귀 형태로 적절한 복귀 명령을 실행시킬 때 발생된다.
실행 환경은 매서드 호출 명령을 스킵하도록 적절하게 증가된 호출기의 카운터 프로그램을 구비한 호출기의 레지스터를 재기억하는 경우에 사용된다. 실행은 그후 호출 매서드의 실행 환경으로 연속된다.
1.5.3 이상 및 에러 전파
Throwable의 서브클래스의 에러 또는 이상으로서 JAVA에서 알려진 이상 조건은 이하의 이유로 인해 일어난다:
필요한 클래스 파일을 찾는데 실패한 것과 같은 동적 연결 실패;
널 포인터를 통한 레퍼런스와 같은 실행시간 에러;
다른 스레드로부터 Thread.stop로 기동하는 것과 같은 비동기 사건; 및
기동 상태를 사용하는 프로그램.
이상이 발생할 때:
현재 매서드와 결합된 catch clauses의 리스트는 검사된다. 각 캐시 구는 활성을 위해 명령 범위를 기술하고 조정하도록 이상의 형태를 기술하며, 그를 조정하도록 코드의 어드레스를 가진다.
명령이 이상이 적절한 명령 범위내에 있고 이상 형태가 캐시 구를 조정하는 제와 형태의 서브형태를 일으키면 이상은 캐시 구를 매치한다. 매칭 캐시 구이 발견되었다면, 시스템은 특정 조정기에 분기된다. 조정기가 발견되지 않았다면, 처리는 현재 매서드의 네스트된 모든 캐시 구가 소비될 때까지 반복된다.
리스트의 캐시 구의 오더는 중요하다. 가상 컴퓨터 실행은 첫 번째 매칭 캐시 구에 연속한다. JAVA 코드가 구성되었기 때문에 어떠한 프로그램 카운터 값에 대해 프로그램 카운터 값을 발생시키는 이상에 대해 바람직한(응용가능성을 포함하고 있는 최내부) 이상 조정자를 찾기 위한 선형 오더에서 검색될 수 있는 단일 리스트로 한가지 매서드에 대해 모든 이상 조정자를 소트하는 것이 가능하다. 캐시 구 매칭이 없다면 현재 매서드는 그의 결과로써 캐치되지 않은 이상을 가진다. 상기 매서드의 실행 상태가 호출되며 이 매서드는 실행 환경으로부터 재기억되며, 이 호출기에서 발생된 이상을 통하여 실행의 전파는 연속된다.
1.5.4 추가 정보
실행 환경은 디버깅 정보와 같은 추가의 구현-특정 정보로 확장될 수 있다.
1.6 가비지 수집 히프
JAVA 히프는 할당된 클래스 예시(오브젝트)로부터의 실행시간 데이터 영역이다. JAVA 언어는 무가치하게 수집되도록 설계되어 있어 프로그래머에게 명빽하게 이 오브젝트를 미할당하는 능력을 주지 않는다. JAVA 언어는 무가치한 수집의 어떠한 특정 종류를 미리 제한하지 않으며: 다양한 알고리즘이 시스템의 요구에 따라 사용될 수 있다.
1.7 매서드 영역
매서드 영역은 종래의 언어에서의 컴파일된 코드에 대한 기억 또는 UNIX 프로세서에서의 텍스트 세그먼트에 대해 아날로그적이다. 이는 매서드 코드(컴파일된 JAVA 코드)와 기호 데이터를 기억한다. 현재 JAVA 구현에 있어서, 매서드 코드는 미래에 공개 계획되어 있지만 무가치한 수집 힙의 일부분은 아니다.
1.8 JAVA 명령 세트
JAVA 명령 세트내의 명령은 실행되어지는 연산을 특정화하는 1바이트 opcode 및 연산에 의해 사용되어질 매개 변수 또는 데이터를 제공하는 0 이상의 operands로 구성되어 있다. 많은 명령은 오퍼랜드가 없으며, 단지 opcode로만 구성되어 있다.
가상 컴퓨터 실행의 내부 루프가 효과적이다:
do {
opcode형 패치
opcode 값에 따른 작용 실행
} while(할 것이 더 있음);
추가 오퍼랜드의 수 및 크기는 opcode에 의해 판정된다. 추가 오퍼랜드가 크기내에 1바이트 이상이면, big-endian 오더-high order byte first에 기억되어 있다. 예를 들면, 16비트 변수는 이하의 값의 2바이트로써 기억되어 있다:
first_byte * 256 + second_byte
바이트코드 명령 스트림은 그들의 명령내에 4바이트 2진수로 정렬되는 테이블스위치와 룩업스위치 명령인 실행을 구비한 단지 바이트 정열이다.
이들 결정은 컴파일된 조밀한 JAVA 프로그램에 대한 가상 컴퓨터 코드를 유지하고 실행의 어떤 가능한 비용을 콤팩트화하는 의식 바이어스를 굴절시킨다.
1.9 제한
클래스당 상수 폴은 65535의 최대 엔트리를 가진다. 이는 단일 클래스의 전체 복잡성의 내부 한정으로서 작용한다.
매서드당 코드의 양은 이상 테이블, 라인보호 테이블 및 로컬 변수 테이블내의 코드의 인덱스의 크기에 의해 65535 바이트로 한정되어 있다.
이 한정에서, 주해의 오직 다른 한정은 255로 한정된 매서드 호출내의 동의 워드수이다.
2. 클래스 파일 포맷
이 장은 JAVA 클래스(.class) 파일 포맷을 기술한다.
각 클래스 파일은 JAVA 클래스 또는 JAVA 인터페이스의 컴파일된 버전을 포함한다. 컴파일 JAVA 인터페이스는 이하의 명세서에 따르는 모든 클래스 파일을 처리할 수 있어야 한다.
JAVA 클래스 파일은 8비트 바이트의 스트림으로 구성되어 있다. 16비트와 32비트 모두는 각각 16비트 또는 32비트 바이트로 읽혀지는 것에 의해 구성된다. 바이트는 high gytes come first인 네트워크(big-endian)오더와 함께 결합되어 있다. 이 포맷은 JAVA.io.DataInput과 JAVA.io.DataOutput 인터페이스 및 JAVA.io.DataInputStream과 JAVA.io.DataOutpotStream과 같은 클래스로 지원된다.
클래스 파일 포맷은 구조 표기를 사용하여 기술한다. 구조내의 연속 충전되는 삽입 어구 또는 정렬 없이 외부적으로 표현되어 나타난다. 가변 크기 어레이, 가변 크기 요소는 종종 호출된 테이블이며 이들 구조내의 공통 위치이다.
형태 u1, u2 및 u4는 readUnsignedByte, readUnsignedShort 및 JAVA.io.DataInput 인터페이스의 readInt와 같은 매서드에 의해 읽혀지는 부호 없는 1-, 2-, 또는 4바이트 양을 각각 의미한다.
2.1 포맷
다음의 의사(pseudo) 구조는 클래스 파일의 포맷의 가장 중요한 기술을 설명하고 있다:
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attribute[attribute_count];
}
magic
이 필드는 0xCAFEBABE 값을 가져야 한다.
minor_version, major_version
이 필드들은 이러한 클래스 파일을 생성한 JAVA 컴파일러의 버전 번호를 포함한다. 가상 컴퓨터의 구현은 일반적으로 특정 메이저 버전번호의 마이너 버전번호 0-n의 일부 범위를 지원할 것이다. 만일 마이너 버전번호가 증가되면, 새로운 코드는 구 가상 컴퓨터상에서 실행하지 않을 것이지만, 최대 n+1 버전을 실행할 수 있는 새로운 가상 컴퓨터를 만드는 것이 가능하다.
메이저 버전번호의 변경은 어떠한 매서드로 구 메이저 버전을 지원할 수 없는 다른 가상 컴퓨터를 요구하는 메이저 비호환성 변경을 나타낸다.
현재 메이저 버전번호는 45이고; 현재 마이너 버전번호는 3이다.
constant_pool_count
이 필드는 클래스 파일내 상수 풀내 엔트리의 개수를 나타낸다.
constant_pool
상수 풀은 값의 테이블이다. 이들 값은 클래스 구조 또는 코드에 의해 언급되는 여러 문자열 상수, 클래스명, 필드명등이 된다.
constant_pool[0]은 항상 컴파일러에 의해 사용되지 않고, 어떠한 목적으로 구현에 사용될 수 있다.
constant_pool[0] 엔트리 1 내지 constant_pool_count-1의 각각은 섹션 2.3에 설명된 바와 같은 제 1 "태그" 바이트로 포맷이 주어지는 가변 길이 엔트리이다.
access_flags
이 필드는 클래스, 매서드 및 필드 선언에 사용된 최대 16 변경자의 마스크를 포함하고 있다. 후술된 field_info 및 method_info의 유사한 필드상에서 동일한 인코딩이 사용된다. 다음에 인코딩이 있다:
플래그명 의미 사용주체
ACC_PUBLIC 0x0001 모두에게 가시적임 클래스, 매서드,변수
ACC_PRIVATE 0x0002 정의된 클래스에만 가시적임 매서드, 변수
ACC_PROTECTED 0x0004 서브클래스에게 가시적임 매서드, 변수
ACC_STATIC 0x0008 변수 또는 매서드가 정적임 매서드, 변수
ACC_FINAL 0x0010 초기화이후에 추가적인 하위분류, 중첩, 또는 지정 없음 클래스, 매서드,변수
ACC_SYNCHRONIZED 0x0020 모니터 록에서 랩 사용 매서드
ACC_VOLATILE 0x0040 캐시할 수 없음 변수
ACC_TRANSIENT 0x0080 영구 객체 관리자에 의한 쓰기 또는 읽기 없음 변수
ACC_NATIVE 0x0100 JAVA이외의 언어로 구현됨 매서드
ACC_INTERFACE 0x0200 인터페이스 클래스
ACC_ABSTRACT 0x0400 제공된 본체 없음 클래스, 매서드
this_class
이 필드는 상수 풀내 인덱스이다; constant_pool[this_class]는 CONSTANT_class이어야 한다.
super_class
이 필드는 상수 풀내 인덱스이다. 만일 super_class의 값이 제로가 아니라면, constant_pool[super_class]는 클래스이어야 하고, 상수 풀내에 이러한 클래스의 슈퍼클래스의 인덱스를 제공한다.
만일 super_class의 값이 제로라면, 정의되는 클래스는 JAVA.lang.Object이어야 하고, 어떠한 슈퍼클래스도 가져서는 안된다.
interfaces_count
이 필드는 이 클래스가 구현하는 인터페이스의 개수를 제공한다.
interfaces
이 테이블내 각각의 값은 상수 풀내 인덱스이다. 만일 테이블 값이 제로가 아니라면(0≤i<interfaces_count인 경우 interface[i]!=0), constant_pool[interfaces[i]]는 이 클래스가 구현하는 인터페이스이어야 한다.
fields_count
이 필드는 이 클래스에 의해 정의된 동적 및 정적 모두의 예시 변수의 개수를 제공한다. 상기 필드 테이블은 이 클래스에 의해 묵시적으로 정의되는 변수만을 포함한다. 그것은 이 클래스로부터 액세스 가능하지만 슈퍼클래스로부터 상속되는 그들 예시 변수들을 포함하지 않는다.
fields
이 테이블내 각각의 값은 좀더 완벽한 상기 클래스내 필드의 설명이 된다. field_info 구조에 대한 추가 정보를 얻으려면 섹션 2.4를 참조.
methods_count
이 필드는 이 클래스에 의해 정의된 정적 및 동적 매서드의 개수를 나타낸다. 이 테이블은 이 클래스에 의해 묵시적으로 정의되는 매서드만을 포함한다. 상속된 매서드는 포함하지 않는다.
methods
이 테이블내 각각의 값은 좀더 완벽한 상기 클래스내 매서드의 설명이 된다. method_info 구조에 관한 추가 정보를 얻으려면 섹션 2.5 참조.
attributes_count
이 필드는 이 클래스에 관한 추가 속성의 개수를 나타낸다.
attributes
클래스는 그것과 관련된 임의의 개수의 선택적 속성을 가질 수 있다. 현재, 인지된 클래스 속성만이 "SourceFile" 속성이 되고, SourceFile 속성은 이 클래스 파일이 컴파일된 소스 파일명을 나타낸다.
2.2 기호(signatures)
기호는 어레이, 필드 또는 매서드의 형태를 나타내는 문자열이다.
기호 필드는 변수의 값 또는 기능에의 인수의 값을 나타낸다. 그것은 다음의 문법에 의해 생성된 일련의 바이트가 된다.
<field_signature> ::= <field_type>
<field_type> ::= <base_type>|<object_type>|<array_type>
<base_type> ::= B|C|D|F|I|J|S|Z
<object_type> ::= L<fullclassname>;
<array_type> ::= <optional_size><field_type>
<optional_size> ::= [0-9]
기본 형태의 의미는 다음과 같다.
B byte 지정된 바이트
C char 문자
D double 배정도 IEEE 부동수
F float 단정도 IEEE 부동수
I int 정수
J long 배정도 정수
L<fullclassname>; ... 주어진 클래스의 오브젝트
S short 지정된 단정도수
Z boolean 참 또는 거짓
[<field sig> ... 어레이
반환 형태 기호는 매서드로부터의 값의 반환을 나타낸다. 그것은 다음의 문법에 따른 일련의 바이트가 된다:
<return_signature> ::= <field_type> | V
문자 V는 매서드가 어떠한 값도 반환하지 않는다는 것을 나타낸다. 그렇지 않으면, 기호는 반환값의 형태를 나타낸다.
인수 기호는 매서드로 통과된 인수를 나타낸다:
<argument_signature> ::= <field_type>
매서드 기호는 매서드가 원하는 인수 및 매서드가 반환하는 값을 나타낸다.
<method_signature> ::= (<arguments_signature>)<return_signature>
<arguments_signature> ::= <argument_signature>*
2.3 상수 풀
상수 풀내 각각의 아이템은 1바이트 태그로 시작한다. 아래의 테이블은 유효 태그 및 그 값을 나열하고 있다.
상수 타입
CONSTANT_ClassCONSTANT_FieldrefCONSTANT_MethodrefCONSTANT_InterfaceMethodrefCONSTANT_StringCONSTANT_IntegerCONSTANT_FloatCONSTANT_LongCONSTANT_DoubleCONSTANT_NameAndTypeCONSTANT_Utf8CONSTANT_Unicode 791011834561212
그러면, 각각의 태그 바이트는 지정 상수에 관한 추가 정보를 제공하는 하나 또는 그 이상의 바이트에 따른다.
2.3.1 CONSTANT_Class
CONSTANT_Class는 클래스 또는 인터페이스를 나타내기 위해 제공된다.
CONSTANT_Class_info {
u1 tag;
u2 name_index;
}
tag
태그는 CONSTANT_Class 값을 가질 것이다.
name_index
constant_pool[name_index]는 클래스의 문자열 명을 제공하는 CONSTANT_Utf8이다.
어레이가 오브젝트이기 때문에, 연산 코드 anewarray 및 multianewarray는 상수 풀내 CONSTANT_Class 아이템을 통해 어레이 "classes"을 참조할 수 있다. 이러한 경우, 클래스명은 그 기호가 된다. 예를 들어, int[][]를 위한 클래스명은 [[I , Thread[]를 위한 클래스명은 "[LJAVA.lang.Thread;"가 된다.
2.3.2 CONSTANT_{Fieldref,Methodref,InterfaceMethodref}
필드, 매서드 및 인터페이스 매서드는 유사한 구조에 의해 표현된다.
CONSTANT_Fieldref_info {
u1 tag;
u2 class_index;
u2 name_and_type_index;
}
CONSTANT_Methodref_info {
u1 tag;
u2 class_index;
u2 name_and_type_index;
}
CONSTANT_InterfaceMethodref_info {
u1 tag;
u2 class_index;
u2 name_and_type_index;
}
tag
태그는 CONSTANT_Fieldref,CONSTANT_Methodref,CONSTANT_InterfaceMethodref 값을 가질 것이다.
class_index
constant_pool[class_index]는 필드 또는 매서드를 내포하는 인터페이스 또는 클래스명을 제공하는 CONSTANT_Class 형태의 엔트리가 될 것이다.
CONSTANT_Fieldref 및 CONSTANT_Methodref에서, CONSTANT_Class 아이템은 실제 클래스가 되어야 한다. CONSTANT_InterfaceMethodref에서, 아이템은 제공된 매서드를 구현하기 위해 지원하는 인터페이스가 되어야 한다.
name_and_type_index
constant_pool[name_and_type_index]는 CONSTANT_NameAndType 형태의 엔트리가 될 것이다. 이 상수 풀 엔트리는 필드 또는 매서드의 기호 및 이름을 나타낸다.
2.3.3 CONSTANT_String
CONSTANT_String은 짜여진 형태의 문자열의 상수 오브젝트를 나타내기 위해 사용된다.
CONSTANT_String_info {
u1 tag;
u2 string_index;
}
tag
태그는 CONSTANT_String 값을 가질 것이다.
string_index
constant_pool[string_index]는 문자열 오브젝트가 초기화되는 값을 제공하는 CONSTANT_utf8 문자열이다.
2.3.4 CONSTANT_Integer 및 CONSTANT_Float
CONSTANT_Integer 및 CONSTANT_Float는 4바이트 상수를 나타낸다.
CONSTANT_Integer_info {
u1 tag;
u4 bytes;
}
CONSTANT_Float_info {
u1 tag;
u4 bytes;
}
tag
태그는 CONSTANT_Integer 또는 CONSTANT_Float 값을 가질 것이다.
bytes
정수에서, 4바이트가 정수값이 된다. 실수에서, 그들은 IEEE 754 표준 표시의 부동소수점값이다. 이들 바이트는 네트워크 순서(높은 바이트 먼저)에 따른다.
2.3.5 CONSTANT_Long 및 CONSTANT_Double
CONSTANT_Long 및 CONSTANT_Double는 8바이트 상수를 나타낸다.
CONSTANT_Long-info {
u1 tag;
u4 high_bytes;
u4 low_bytes;
}
CONSTANT_Double_info {
u1 tag;
u4 high_bytes;
u4 low_bytes;
}
모든 8바이트 상수는 상수 풀내 두 개 스폿을 차지한다. 만일 이것이 상수 풀내에서 nth 아이테이라면, 다음 아이템은 n+2로 번호가 매겨질 것이다.
tag
태그는 CONSTANT_Long 또는 CONSTANT_Double 값을 가질 것이다.
high_bytes, low_bytes
CONSTANT_Long에서, 64비트 값은 (high_bytes << 32) +low_bytes가 된다.
CONSTANT_Double에서, 64비트 값의 high_bytes 및 low_bytes는 함께 표준 IEEE 754 표시의 배정도 부동소수점수를 나타낸다.
2.3.6 CONSTANT_NameAndType
CONSTANT_NameAndType은 그것이 속하는 클래스를 나타내지 않고서 필드 또는 매서드를 표현하기 위해 사용된다.
CONSTANT_NameAndType_info {
u1 tag;
u2 name_index;
u2 signature_index;
}
tag
태그는 CONSTANT_NameAndType 값을 가질 것이다.
name_index
constant_pool[name_index]는 필드 또는 매서드명을 제공하는 CONSTANT_Utf8 문자열이다.
signature_index
constant_pool[signature_index]는 필드 또는 매서드의 기호를 제공하는 CONSTANT_Utf8 문자열이다.
2.3.7 CONSTANT_Utf8 및 CONSTANT_Unicode
CONSTANT_Utf8 및 CONSTANT_Unicode는 상수 문자열 값을 표시하기 위해 사용된다.
CONSTANT_Utf8 문자열은 비어있지 않은 ASCII 문자만을 내포하는 문자열이 문자당 1바이트만을 사용하여 표시될 수 있도록 "엔코드"되지만, 최대 16비트의 문자까지 표시될 수 있다.
0x0001 내지 0x007F 범위내 모든 문자들은 하나의 바이트로 표시된다:
빈 문자(0x0000) 및 0x0080 내지 0x07FF 범위의 문자는 한 쌍의 두 개 바이트로 표시된다.
0x0800 내지 0xFFFF 범위의 문자는 3바이트로 표시된다:
이러한 포맷과 "표준" UTF-8 포맷간에는 두 가지 차이가 있다. 첫째, 빈 바이트(0x00)는 1바이트보다 2바이트 포맷으로 인코드되어, 문자열이 빈 곳을 갖지 않도록 한다. 둘째, 1바이트, 2바이트 및 3바이트 포맷만이 사용된다. 더 긴 포맷은 인식하지 않는다.
CONSTANT_Utf8_info {
u1 tag;
u2 length;
u1 bytes[length];
}
CONSTANT_Unicode_info {
u1 tag;
u2 length;
u1 bytes[length];
}
tag
태그는 CONSTANT_Utf8 또는 CONSTANT_Unicode 값을 가질 것이다.
length
문자열내 바이트의 수. 이들 문자열은 종료된 빈곳이 아니다.
bytes
문자열의 실제 바이트.
2.4 필드
각각의 필드를 위한 정보는 즉시 클래스 파일내 field_count 필드에 이어진다. 각각의 필드는 가변 길이 field_info 구조에 의해 설명된다. 이 구조의 포맷은 다음과 같다:
field_info {
u2 access_flags;
u2 name_index;
u2 signature_index;
u2 attributes_count;
attribute_info attributes[attribute_count];
}
access_flags
이것은 다양한 특성 및 그들이 다른 클래스에서 매서드에 의해 액세스할 수 있는 매서드를 설명하기 위해 클래스, 매서드 및 필드에 의해 사용된 한 세트의 16 플래그이다.
필드를 위해 설정될 수 있는 가능한 필드로 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_VOLATILE, 및 ACC_TRANSIENT가 있다.
적어도 ACC_PUBLIC, ACC_PROTECTED 및 ACC_PRIVATE중의 하나는 어떠한 매서드를 위해 설정될 수 있다.
name_index
constant_pool[name_index]는 필드명인 CONSTANT_Utf8 문자열이다.
signature_index
constant_pool[signature_index]는 필드 기호인 CONSTANT_Utf8 문자열이다. 기호에 관한 추가정보를 얻으려면 섹션 "기호" 참조.
attributes_count
이 값은 이 필드에 관한 추가 속성의 수를 나타낸다.
attributes
필드는 그것과 관련된 임의의 수의 선택적 속성을 가질 수 있다. 현재, 인지된 필드 속성만이 "ConstantValue" 속성이 되고, ConstantValue 속성은 이 필드가 스태틱 상수임을 나타내고, 그 필드의 상수값을 나타낸다.
어떠한 다른 속성은 스킵된다.
2.5 매서드
각각의 매서드를 위한 정보는 즉시 클래스 파일내 method_count 필드에 이어진다. 각각의 매서드는 가변 길이 method_info 구조에 의해 설명된다. 구조는 다음의 포맷을 갖는다:
method_info {
u2 access_flags;
u2 name_index;
u2 signature_index;
u2 attributes_count;
attribute_info attributes[attribute_count];
}
access_flags
이것은 다양한 특성 및 그들이 다른 클래스에서 매서드에 의해 액세스할 수 있는 매서드를 설명하기 위해 클래스, 매서드 및 필드에 의해 사용된 한 세트의 16 플래그이다. 이 필드내에 다양한 비트를 제공하는 "Access Flags" 테이블 참조.
매서드를 위해 설정될 수 있는 가능한 필드로 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE 및 ACC_ABSTRACT가 있다.
적어도 ACC_PUBLIC, ACC_PROTECTED 및 ACC_PRIVATE중의 하나는 어떠한 매서드를 위해 설정될 수 있다.
name_index
constant_pool[name_index]는 매서드명을 제공하는 CONSTANT_Utf8 문자열이다.
signature_index
constant_pool[signature_index]는 필드 기호를 제공하는 CONSTANT_Utf8 문자열이다. 기호에 관한 추가정보를 얻으려면 섹션 "기호" 참조.
attributes_count
이 값은 이 필드에 관한 추가 속성의 수를 나타낸다.
attributes
필드는 그것과 관련된 임의의 수의 선택적 속성을 가질 수 있다. 각각의 속성은 이름 및 다른 추가 정보를 갖는다. 현재, 인지된 필드 속성만이 "Code" 및 "Exceptions" 속성이 되고, Code 및 Exceptions 속성은 각각 이 매서드를 수행하기 위해 실행되는 바이트코드 및 매서드의 실행 결과가 되도록 선언되는 JAVA 예외들을 설명한다.
어떠한 다른 속성은 스킵된다.
2.6 속성(Attributes)
속성은 클래스 포맷내 여러 다른 위치에서 사용된다. 모든 속성은 다음과 같은 포맷을 갖는다:
GenericAttribute_info {
u2 attribute_name;
u4 attribute_length;
u1 info[attribute_length];
}
attribute_name은 클래스의 상수 풀내 16비트 인덱스이다; constant_pool[attribute_name]의 값은 속성명을 제공하는 CONSTANT_Utf8 문자열이다. 필드 attribute_length는 잇따른 정보의 길이를 바이트로 나타낸다. 이 길이는 6바이트의 attribute_name 및 attribute_length을 포함하지 않는다.
다음의 텍스트에서, 속성을 받아들일 때마다 현재 이해되는 속성명을 제공한다. 앞으로, 속성이 좀더 추가될 것이다. 클래스 파일 리더(reader)는 스킵하는 것이 요구되고, 그들이 이해할 수 없는 어떠한 속성내 정보는 무시한다.
2.6.1 SourceFile
"SourceFile" 속성은 다음의 포맷을 갖는다:
SourceFile_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 sourcefile_index;
}
attribute_name_index
constant_pool[attribute_name_index]는 CONSTANT_Utf8 문자열 "SourceFile"이다.
attribute_length
SourceFile_attribute의 길이는 2이어야 한다.
sourcefile_index
constant_pool[sourcefile_index]는 이 클래스 파일이 컴파일된 소스 파일을 제공하는 CONSTANT_Utf8 문자열이다.
2.6.2 ConstantValue
"ConstantValue" 속성은 다음의 포맷을 갖는다:
ConstantValue_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 constantvalue_index;
}
attribute_name_index
constant_pool[attribute_name_index]는 CONSTANT_Utf8 문자열 "ConstantValue"이다.
attribute_length
ConstantValue_attribute의 길이는 2이어야 한다.
sourcefile_index
constant_pool[constantvalue_index]는 이 필드를 위한 상수값을 제공한다.
상수 풀 엔트리는 다음의 테이블에 도시된 바와 같이, 필드에 적절한 형태 중의 하나가 되어야 한다.
long CONSTANT_Long
float CONSTANT_Float
double CONSTANT_Double
int, short, char, byte, boolean CONSTANT_Integer
2.6.3 코드
"Code" 속성은 다음의 포맷을 갖는다:
Code_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 max_stack;
u2 max_locals;
u4 code_length;
u1 code[code_length];
u2 exception_table_length;
{ u2 start_pc;
u2 end_pc;
u2 handler_pc;
u2 catch_type;
} exception_table[exception_table_length];
u2 attributes_count;
attribute_info attributes[attribute_count];
}
attribute_name_index
constant_pool[attribute_name_index]는 CONSTANT_Utf8 문자열 "Code"이다.
attribute_length
이 필드는 초기 6바이트를 제외한 "Code" 속성의 전체 길이를 나타낸다.
max_stack
이 매서드의 실행동안 사용될 오퍼랜드 스택상의 최대 엔트리 수. 오퍼랜드 스택에 관한 추가 정보를 얻으려면 본 명세서내 다른 장을 참조.
max_locals
이 매서드에 의해 사용된 로컬 변수 슬롯의 수. 로컬 변수에 관한 추가 정보를 얻으려면 본 명세서내 다른 장을 참조.
code_length
이 매서드를 위한 가상 컴퓨터 코드내 바이트의 수.
code
이들은 상기 매서드를 구현하는 가상 컴퓨터 코드의 실제 바이트이다. 메모리를 읽을 경우, 만일 코드의 제 1 바이트가 4 다중 경계상에서 정렬되면, 연산 코드 엔트리 tableswitch 및 tablelookup는 정렬될 것이다; 정렬 요구에 관한 추가 정보를 얻으려면 그것에 관한 설명 참조.
exception_table_length
다음의 예외 테이블내 엔트리의 수.
exception_table
예외 테이블내 각각의 엔트리는 상기 코드내 하나의 예외 처리기를 설명한다.
start_pc, end_pc
두 개 fieldsstart_pc 및 end_pc는 예외 처리기가 활동중인 코드내 범위를 나타낸다. 양쪽 필드의 값은 코드의 시작으로부터의 오프셋(offsets)이 된다. start_pc는 포함되고, end_pc는 제외된다.
handler_pc
이 필드는 예외 처리기의 시작 주소를 나타낸다. 필드값은 코드의 시작으로부터의 오프셋이 된다.
catch_type
만일 catch_type이 제로가 아니라면, constant_pool[catch_type]은 이러한 예외 처리기가 파악하도록 설계되는 예외 클래스가 될 것이다. 이 예외 처리기는 만일 실행된 예외가 주어진 클래스의 예가 되는 경우에만 호출되어야 한다.
만일 catch_type이 제로라면, 이 예외 처리기는 모든 예외에서 호출되어야 한다.
attributes_count
이 필드는 코드에 관한 추가 속성의 수를 나타낸다. "Code" 속성은 그 자신이 속성을 가질 수 있다.
attributes
"Code" 속성은 그것과 관련된 임의의 선택적 속성의 수를 가질 수 있다. 각각의 속성은 이름 및 다른 추가 정보를 갖는다. 현재, 정의된 코드 속성은 "LineNumberTable" 및 "LocalVariableTable"만이고, 양쪽 모두 디버깅 정보를 포함한다.
2.6.4 예외 테이블
이 테이블은 매서드가 실행하기로 선언하는 예외를 나타내는 컴파일러에 의해 사용된다.
Exceptions_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 number_of_exceptions;
u2 exception_index_table[number_of_exceptions];
}
attribute_name_index
constant_pool[attribute_name_index]는 CONSTANT_Utf8 문자열 "Exceptions"가 될 것이다.
attribute_length
이 필드는 초기 6바이트를 제외한 Exceptions_attribute의 전체 길이를 나타낸다.
number_of_exceptions
이 필드는 다음의 예외 인덱스 테이블내 엔트리의 수를 나타낸다.
exception_index_table
이 테이블내 각각의 값은 상수 풀내 인덱스이다. 각각의 테이블 요소에서, (0 ≤ I < number_of_exceptions인 경우 exception_index_table[i]!=0)이면, constant_pool[exception_index+table[i]]는 이 클래스가 실행하도록 선언하는 예외가 된다.
2.6.5 LineNumberTable
이 속성은 가상 컴퓨터 코드의 부분이 상기 소스내 주어진 위치에 대응하도록 결정하기 위해 디버거 및 예외 처리기에 의해 사용된다. LineNumberTable_attribute는 다음의 포맷을 갖는다:
LineNumberTable_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 line_number_table_length;
{ u2 start_pc;
u2 line_number;
} line_number_table[line_number_table_length];
}
u2 exception_index_table[number_of_exceptions];
}
attribute_name_index
constant_pool[attribute_name_index]는 CONSTANT_Utf8 문자열 "LineNumberTable"가 될 것이다.
attribute_length
이 필드는 초기 6바이트를 제외한 LineNumberTable_attribute의 전체 길이를 나타낸다.
line_number_table_length
이 필드는 다음의 라인 개수 테이블내 엔트리의 수를 나타낸다.
line_number_table
라인 개수 테이블내 각각의 엔트리는 소스 파일내 라인 수가 코드내 주어진 지점에서 변경되는 것을 나타낸다.
start_pc
이 필드는 소스내 새로운 라인을 위한 코드가 시작하는 코드내 위치를 나타낸다. source_pc <<SHOULD THAT BEstart_pc?>>는 코드의 시작으로부터의 오프셋이다.
line_number
파일내 주어진 위치에서 시작하는 라인 수.
2.6.6 LocalVariableTable
이 속성은 매서드의 동적 실행동안 주어진 로컬 변수의 값을 결정하기 위해 디버거에 의해 사용된다. LocalVariableTable_attribute의 포맷은 다음과 같다:
LocalVariableTable_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 local_variable_table_length;
{ u2 start_pc;
u2 length;
u2 name_index;
u2 signature_index;
u2 slot;
} local_variable_table[local_variable_table_length];
}
attribute_name_index
constant_pool[attribute_name_index]는 CONSTANT_Utf8 문자열 "LocalVariableTable"가 될 것이다.
attribute_length
이 필드는 초기 6바이트를 제외한 LineNumberTable_attribute의 전체 길이를 나타낸다.
local_variable_table_length
이 필드는 다음의 로컬 변수 테이블내 엔트리의 수를 나타낸다.
local_variable_table
로컬 변수 테이블내 각각의 엔트리는 로컬 변수가 값을 갖는 동안 그 코드 범위를 나타낸다. 그것은 또한 스택에서 변수가 발견될 수 있는 값을 나타낸다.
start_pc, length
주어진 로컬 변수는 start_pc와 start_pc+length 사이의 코드에서 값을 갖는다. 두 값 모두 코드의 시작으로부터의 오프셋이 된다.
name_index, signature_index
constant_pool[name_index] 및 constant_pool[signature_index]는 로컬 변수의 이름과 기호를 제공하는 CONSTANT_Utf8 문자열이다.
slot
주어진 변수는 매서드의 프레임내 slotth 로컬 변수가 될 것이다.
3. 가상 컴퓨터 명령 세트
3.1 명령을 위한 포맷
JAVA 가상 컴퓨터 명령어는 본 명세서에서 다음 형태의 엔트리로 표현된다.
instruction name
명령의 간단한 설명
구문:
opcode = number
operand1
operand2
...
스택: ...., value1, value2 => ..., value3
명령의 기능을 설명하고, 실행동안 실시될 수 있는 어떠한 예외를 나타내는 longer description.
구문 테이블내 각각의 라인은 단일 8비트 바이트를 나타낸다.
JAVA 가상 컴퓨터의 연산은 종종 스택으로부터 그들의 오퍼랜드를 취하고, 스택상에 다시 그 결과를 집어넣는다. 규칙으로서, 본 명세서에서는 스택이 연산의 소스 또는 종단이 되는 경우는 언급하지 않을 것이지만, 그렇지 않은 경우는 항상 언급할 것이다. 예를 들어, 명령 iload는 "로컬 변수로부터 정수를 로드"하라는 짧은 설명을 갖는다. 묵시적으로, 정수는 스택으로 로드된다. 명령 iadd는 "정수 덧셈"으로 설명된다; 그 소스 및 종단 모두 스택이 된다.
계산의 제어 흐름에 영향을 주지않는 명령은 다음의 명령의 연산 코드로 가상 컴퓨터 프로그램 카운터를 항상 전진시키는 것으로 가정될 수 있다. 제어 흐름에 영향을 주는 명령만이 프로그램 카운터상에서 그들이 갖는 효과를 묵시적으로 언급할 것이다.
3.2 스택상에 상수 푸시(push)하기
bipush
1바이트 부호 달린 정수 푸시
구문:
bipush = 16
byte1
스택: ...=> ..., value
byte1은 부호 달린 8비트 값으로 해석된다. 이 값은 정수로 확장되고, 오퍼랜드 스택으로 푸시된다.
sipush
2바이트 부호 달린 정수 푸시
구문:
sipush = 17
byte1
byte2
스택: ... => ..., item
byte1 및 byte2는 부호 달린 16비트 값으로 어셈블된다. 이 값은 정수로 확장되고, 오퍼랜드 스택으로 푸시된다.
ldc1
상수 풀로부터 아이템 푸시
구문:
ldc1 = 18
indexbyte1
스택: ... => ..., item
indexbyte1은 현재 클래스의 상수 풀로의 기호되지 않은 8비트 인덱스로서 사용된다. 그 인덱스에서의 아이템은 해결되고, 스택으로 푸시된다. 만일 문자열이 푸시되고 있고, 그것을 할당하기에 충분한 메모리가 없다면, OutOfMemoryError가 실행된다.
주의: 문자열 푸시는 오브젝트 레퍼런스를 하게 한다.
ldc2
상수 풀로부터 아이템 푸시
구문:
ldc2 = 19
indexbyte1
indexbyte2
스택: ... => ..., item
indexbyte1 및 indexbyte2는 현재 클래스의 상수 풀로 기호되지 않은 16비트 인덱스를 구성하기 위해 사용된다. 그 인덱스에서의 아이템은 해결되고 스택으로 푸시된다. 만일 문자열이 푸시되고 있고, 그것을 할당하기에 충분한 메모리가 없다면, OutOfMemoryError가 실행된다.
주의: 문자열 푸시는 오브젝트 레퍼런스를 하게 한다.
ldc2w
상수 풀로부터 long 또는 double 푸시
구문:
ldc2w = 20
indexbyte1
indexbyte2
스택: ... => ..., constant-word1, constant-word2
indexbyte1 및 indexbyte2는 현재 클래스의 상수 풀로 기호되지 않은 16비트 인덱스를 구성하기 위해 사용된다. 그 인덱스에서의 2 워드 상수는 해결되고 스택으로 푸시된다.
aconst_null
비어있는 오브젝트 레퍼런스 푸시
구문:
aconst_null = 1
스택: ... => ..., null
빈 오브젝트 레퍼런스를 스택으로 푸시.
iconst_m1
정수 constant-1 푸시
구문:
iconst_ml = 2
스택: ... => ..., 1
integer-1을 스택으로 푸시.
iconst_<n>
정수 상수 푸시
구문:
iconst_<n>
스택: ... => ..., <n>
형태: iconst_0 = 3, iconst_1 = 4, iconst_2 = 5, iconst_3 = 6, iconst_4 = 7, iconst_5 = 8
정수 <n>을 스택으로 푸시.
lconst_<l>
배정도 정수 상수 푸시
구문:
lconst_<l>
스택: ... => ..., <l>-word1, <l>-word2
형태: lconst_0 = 9, lconst_1 = 10
배정도 정수 <l>을 스택으로 푸시.
fconst_<f>
단정도 부동소수점 푸시
구문:
fconst_<f>
스택: ... => ..., <f>
형태: fconst_0 = 11, fconst_1 = 12, fconst_2 = 13
단정도 부동소수점 수 <f>을 스택으로 푸시.
dconst_<d>
배정도 부동소수점 푸시
구문:
dconst_<d>
스택: ... => ..., <d>-word1, <d>-word2
형태: dconst_0 = 14, dconst_1 = 15
배정도 부동소수점 수 <d>을 스택으로 푸시.
3.3 스택으로 로컬 변수 로드하기
lload
로컬 변수로부터 정수 로드
구문:
iload=21
vindex
스택: ... => ..., value
현재 JAVA 프레임내 vindex에서의 로컬 변수의 값은 오퍼랜드 스택으로 푸시된다.
iload_<n>
로컬 변수로부터 정수 푸시
구문:
iload_<n>
스택: ... => ..., value
형태: iload_0 = 26, iload_1 = 27, iload_2 = 28, iload_3 = 29
현재 JAVA 프레임내 <v>에서의 로컬 변수의 값은 오퍼랜드 스택으로 푸시된다.
이 명령은 오퍼랜드 <n>이 묵시적이라는 것을 제외하고는 <n>의 vindex를 가진 iload에서와 동일하다.
iload
로컬 변수로부터 long integer 로드
구문:
iload=22
vindex
스택: ... => ..., value-word1, value-word2
현재 JAVA 프레임내 vindex 및 vindex+1에서의 로컬 변수의 값은 오퍼랜드 스택으로 푸시된다.
lload_<n>
로컬 변수로부터 long integer 로드
구문:
iload_<n>
스택: ... => ..., value-word1, value-word2
형태: lload_0 = 30, lload_1 = 31, lload_2 = 32, lload_3 = 33
현재 JAVA 프레임내 <n> 및 <n>+1에서의 로컬 변수의 값은 오퍼랜드 스택으로 푸시된다.
이 명령은 오퍼랜드 <n>이 묵시적이라는 것을 제외하고는 <n>의 vindex를 가진 lload에서와 동일하다.
fload
로컬 변수로부터 단정도 부동소수점 로드
구문:
fload=23
vindex
스택: ... => ..., value
현재 JAVA 프레임내 vindex에서의 로컬 변수의 값은 오퍼랜드 스택으로 푸시된다.
fload_<n>
로컬 변수로부터 단정도 부동소수점 로드
구문:
fload_<n>
스택: ... => ..., value
형태: fload_0 = 34, fload_1 = 35, fload_2 = 36, fload_3 = 37
현재 JAVA 프레임내 <n>에서의 로컬 변수의 값은 오퍼랜드 스택으로 푸시된다.
이 명령은 오퍼랜드 <n>이 묵시적이라는 것을 제외하고는 <n>의 vindex를 가진 fload에서와 동일하다.
dload
로컬 변수로부터 double float 로드
구문:
dload=24
vindex
스택: ... => ..., value-word1, value-word2
현재 JAVA 프레임내 vindex 및 vindex+1에서의 로컬 변수의 값은 오퍼랜드 스택으로 푸시된다.
dload_<n>
로컬 변수로부터 double float 로드
구문:
dload_<n>
스택: ... => ..., value-word1, value-word2
형태: dload_0 = 38, dload_1 = 39, dload_2 = 40, dload_3 = 41
현재 JAVA 프레임내 <n> 및 <n>+1에서의 로컬 변수의 값은 오퍼랜드 스택으로 푸시된다.
이 명령은 오퍼랜드 <n>이 묵시적이라는 것을 제외하고는 <n>의 vindex를 가진 dload에서와 동일하다.
aload
로컬 변수로부터 오브젝트 레퍼런스 로드
구문:
aload=25
vindex
스택: ... => ..., value
현재 JAVA 프레임내 vindex에서의 로컬 변수의 값은 오퍼랜드 스택으로 푸시된다.
aload_<n>
로컬 변수로부터 오브젝트 레퍼런스 로드
구문:
aload_<n>
스택: ... => ..., value
형태: aload_0 = 42, aload_1 = 43, aload_2 = 44, aload_3 = 45
현재 JAVA 프레임내 <n>에서의 로컬 변수의 값은 오퍼랜드 스택으로 푸시된다.
이 명령은 오퍼랜드 <n>이 묵시적이라는 것을 제외하고는 <n>의 vindex를 가진 aload에서와 동일하다.
3.4 로컬 변수로 스택값 저장하기
istore
로컬 변수로 정수 저장
구문:
istore=54
vindex
스택: ..., value => ...
값은 정수이어야 한다. 현재 JAVA 프레임내 로컬 변수 vindex는 값으로 설정된다.
istore_<n>
로컬 변수로 정수 저장
구문:
istore_<n>
스택: ..., value => ...
형태: istore_0 = 59, istore_1 = 60, istore_2 = 61, istore_3 = 62
값은 정수이어야 한다. 현재 JAVA 프레임내 로컬 변수 <n>은 값으로 설정된다.
이 명령은 오퍼랜드 <n>이 묵시적이라는 것을 제외하고는 <n>의 vindex를 가진 istore에서와 동일하다.
lstore
로컬 변수로 long integer 저장
구문:
lstore=55
vindex
스택: ..., value-word1, value-word2 => ...
값은 long integer이어야 한다. 현재 JAVA 프레임내 로컬 변수 vindex+1은 값으로 설정된다.
lstore_<n>
로컬 변수로 long integer 저장
구문:
lstore_<n>
스택: ..., value-word1, value-word2 =>
형태: lstore_0 = 63, lstore_1 = 64, lstore_2 = 65, lstore_3 = 66
값은 정수이어야 한다. 현재 JAVA 프레임내 로컬 변수 <n> 및 <n>+1은 값으로 설정된다.
이 명령은 오퍼랜드 <n>이 묵시적이라는 것을 제외하고는 <n>의 vindex를 가진 lstore에서와 동일하다.
fstore
로컬 변수로 단정도 부동소수점 저장
구문:
fstore=56
vindex
스택: ..., value => ...
값은 단정도 부동소수점 수이어야 한다. 현재 JAVA 프레임내 로컬 변수 vindex는 값으로 설정된다.
fstore_<n>
로컬 변수로 단정도 부동소수점 저장
구문:
fstore_<n>
스택: ..., value => ...
형태: fstore_0 = 67, fstore_1 = 68, fstore_2 = 69, fstore_3 = 70
값은 단정도 부동소수점 수이어야 한다. 현재 JAVA 프레임내 로컬 변수 <n>은 값으로 설정된다.
이 명령은 오퍼랜드 <n>이 묵시적이라는 것을 제외하고는 <n>의 vindex를 가진 fstore에서와 동일하다.
dstore
로컬 변수로 double float 저장
구문:
dstore=57
vindex
스택: ..., value-word1, value-word2 => ...
값은 배정도 부동소수점 수이어야 한다. 현재 JAVA 프레임내 로컬 변수 vindex 및 vindex+1은 값으로 설정된다.
dstore_<n>
로컬 변수로 double float 저장
구문:
dstore_<n>
스택: ..., value-word1, value-word2 => ...
형태: dstore_0 = 71, dstore_1 = 72, dstore_2 = 73, dstore_3 = 74
값은 배정도 부동소수점 수이어야 한다. 현재 JAVA 프레임내 로컬 변수 <n> 및 <n>+1은 값으로 설정된다.
이 명령은 오퍼랜드 <n>이 묵시적이라는 것을 제외하고는 <n>의 vindex를 가진 dstore에서와 동일하다.
astore
로컬 변수로 오브젝트 레퍼런스 저장
구문:
astore=58
vindex
스택: ..., value => ...
값은 반환 주소 또는 오브젝트에 대한 레퍼런스이어야 한다. 현재 JAVA 프레임내 로컬 변수 vindex는 값으로 설정된다.
astore_<n>
로컬 변수로 오브젝트 레퍼런스 저장
구문:
astore_<n>
스택: ..., value => ...
형태: astore_0 = 75, astore_1 = 76, astore_2 = 77, astore_3 = 78
값은 반환 주소 또는 오브젝트에 대한 레퍼런스이어야 한다. 현재 JAVA 프레임내 로컬 변수 <n>은 값으로 설정된다.
이 명령은 오퍼랜드 <n>이 묵시적이라는 것을 제외하고는 <n>의 vindex를 가진 astore에서와 동일하다.
iinc
로컬 변수 상수 증가
구문:
iinc=132
vindex
const
스택: 변화 없음
현재 JAVA 프레임내 로컬 변수 vindex는 정수를 포함해야 한다. const가 부호 달린 8비트 양으로 처리되는 경우, const 값만큼 그 값이 증가한다.
3.5 로드, 저장 및 증가를 위한 와이더 인덱스
wide
로드, 저장 및 증가에서 로컬 변수를 액세스하기 위한 와이더 인덱스.
구문:
wide=196
vindex2
스택: 변화없음
이 바이트코드는 다음의 바이트코드중의 하나에 선행해야 한다: iload, lload, fload, dload, aload, istore, lstore, fstore, dstore, astore, iinc. 다음의 바이트코드의 vindex 및 이 바이트코드로부터의 vindex2는 현재 JAVA 프레임내 로컬 변수로 부호 없는 16비트 인덱스로 어셈블된다. 다음의 바이트코드는 이 와이더 인덱스 사용을 제외하고 정상적으로 연산된다.
3.6 어레이 관리하기
newarray
새로운 어레이 할당
구문:
newarray=196
atype
스택: ..., size => result
size는 정수이어야 한다. 그것은 새로운 어레이내 요소의 수를 나타낸다.
atype은 할당될 어레이의 형태를 나타내는 내부 코드이다. atype으로 가능한 값은 다음과 같다:
T_BOOLEAN 4
T_CHAR 5
T_FLOAT 6
T_DOUBLE 7
T_BYTE 8
T_SHORT 9
T_INT 10
T_LONG 11
size 요소를 보유할 수 있는 새로운 어레이 atype이 할당되고, result는 이 새로운 오브젝트에 대한 레퍼런스가 된다. atype의 size 아이템을 포함하기에 충분히 큰 어레이의 할당이 시도된다. 어레이의 모든 요소는 제로로 초기화된다.
만일 size가 제로보다 작다면, NegativeArraySizeExecution이 실행된다. 만일 상기 어레이를 할당하기에 충분한 메모리가 없다면, OutOfMemoryError가 실행된다.
anewarray
새로운 레퍼런스 어레이를 오브젝트에 할당
구문:
anewarray=189
indexbyte1
indexbyte2
스택: ..., size => result
size는 정수이어야 한다. 그것은 새로운 어레이내 요소의 수를 나타낸다.
indexbyte1 및 indexbyte2는 현재 클래스의 상수 풀로 인덱스를 구성하기 위해 사용된다. 그 인덱스에서의 아이템은 해결된다. 결과적인 엔트리는 클래스이어야 한다.
size 요소를 보유할 수 있는, 표시된 클래스 형태의 새로운 어레이가 할당되고, result는 이 새로운 오브젝트에 대한 레퍼런스가 된다. 주어진 클래스 형태의 size 아이템을 포함하기에 충분히 큰 어레이의 할당이 시도된다. 어레이의 모든 요소는 비어있는 것으로 초기화된다.
만일 size가 제로보다 작다면, NegativeArraySizeExecution이 실행된다. 만일 상기 어레이를 할당하기에 충분한 메모리가 없다면, OutOfMemoryError가 실행된다.
anewarray는 1차원의 오브젝트 레퍼런스 어레이를 생성하기 위해 사용된다. 예를 들어, new Thread[7]을 생성하기 위해 다음과 같은 코드가 사용된다:
bipush 7
anewarray <Class "JAVA.lang.Thread">
anewarray는 또한 제 1 차원의 다차원 어레이를 생성하기 위해 사용될 수 있다. 예를 들어, 다음과 같은 어레이 선언:
new int[6][]
이 다음과 같은 코드로 생성될 수 있다:
bipush 6
anewarray <Class "[I">
어레이 클래스명에 관한 정보를 얻으려면 "클래스 파일 포맷"장에서 CONSTANT_Class를 참조.
multianewarray
새로운 다차원 어레이 할당
구문:
multianewarray=197
indexbyte1
indexbyte2
dimensions
스택: ..., size1, size2...sizen => result
각각의 size는 정수이어야 한다. 각각은 어레이의 차원으로 요소의 수를 나타낸다.
indexbyte1 및 indexbyte2는 현재 클래스의 상수 풀로 인덱스를 구성하기 위해 사용된다. 그 인덱스에서의 아이템은 해결된다. 결과적인 엔트리는 1 또는 그 이상의 차원의 어레이 클래스이어야 한다.
차원은 다음과 같은 특징으로 갖는다:
1 이상의 정수이어야 한다.
생성되는 차원수를 나타낸다. 어레이 클래스의 차원 수 이하이어야 한다.
스택에서 팝되는 요소 수를 나타낸다. 모두 제로 이상인 정수이어야 한다. 차원의 크기와 같이 사용된다.
예를 들어, new int[6][3][]을 생성하기 위해 다음과 같은 코드가 사용된다:
bipush 6
bipush 3
multianewarray <Class "[[[I"> 2
만일 스택상의 size 인수중의 하나가 제로보다 작다면, NegativeArraySizeExecution이 실행된다. 만일 상기 어레이를 할당하기에 충분한 메모리가 없다면, OutOfMemoryError가 실행된다.
result는 새로운 어레이 오브젝트에 대한 레퍼런스가 된다.
주의: 1차원을 생성하는 경우 newarray 또는 anewarray를 사용하기에 좀더 충분하다.
어레이 클래스명에서 정보를 얻으려면 "클래스 파일 포맷"장에서 CONSTANT_Class를 참조.
arraylength
어레이의 길이를 구함
구문:
arraylength = 190
스택: ..., objectref => ..., length
objectref는 어레이 오브젝트에 대한 레퍼런스이어야 한다. 어레이의 길이가 결정되고, 스택의 최상위에서 objectref를 교체한다.
만일 objectref가 비어있다면, NullPointerException이 실행된다.
iaload
어레이로부터 정수 로드
구문:
iaload = 46
스택: ..., arrayref, index => ..., value
arrayref는 정수 어레이에 대한 레퍼런스이어야 한다. index는 정수이어야 한다. 어레이내 위치 번호 index에서의 정수 value가 검색되고, 스택의 최상위로 푸시된다.
만일 arrayref가 비어있다면, NullPointerException이 실행된다. 만일 index가 어레이의 경계내에 있지 않다면, ArrayIndexOutOfBoundsException이 실행된다.
laload
어레이로부터 배정도 정수 로드
구문:
laload = 47
스택: ..., arrayref, index => ..., value-word1, value-word2
arrayref는 배정도 정수 어레이에 대한 레퍼런스이어야 한다. index는 정수이어야 한다. 어레이내 위치 번호 index에서의 배정도 정수 값이 검색되고, 스택의 최상위로 푸시된다.
만일 arrayref가 비어있다면, NullPointerException이 실행된다. 만일 index가 어레이의 경계내에 있지 않다면, ArrayIndexOutOfBoundsException이 실행된다.
faload
어레이로부터 단정도 부동소수점 로드
구문:
faload = 48
스택: ..., arrayref, index => ..., value
arrayref는 단정도 부동소수점 수 어레이에 대한 레퍼런스이어야 한다. index는 정수이어야 한다. 어레이내 위치 번호 index에서의 단정도 부동소수점 수 value가 검색되고, 스택의 최상위로 푸시된다.
만일 arrayref가 비어있다면, NullPointerException이 실행된다. 만일 index가 어레이의 경계내에 있지 않다면, ArrayIndexOutOfBoundsException이 실행된다.
daload
어레이로부터 double float 로드
구문:
daload = 49
스택: ..., arrayref, index => ..., value-word1, value-word2
arrayref는 배정도 부동소수점 수 어레이에 대한 레퍼런스이어야 한다. index는 정수이어야 한다. 어레이내 위치 번호 index에서의 배정도 부동소수점 수 value가 검색되고, 스택의 최상위로 푸시된다.
만일 arrayref가 비어있다면, NullPointerException이 실행된다. 만일 index가 어레이의 경계내에 있지 않다면, ArrayIndexOutOfBoundsException이 실행된다.
aaload
어레이로부터 오브젝트 레퍼런스 로드
구문:
aaload = 50
스택: ..., arrayref, index => ..., value
arrayref는 오브젝트 레퍼런스 어레이에 대한 레퍼런스이어야 한다. index는 정수이어야 한다. 어레이내 위치 번호 index에서의 오브젝트 레퍼런스가 검색되고, 스택의 최상위로 푸시된다.
만일 arrayref가 비어있다면, NullPointerException이 실행된다. 만일 index가 어레이의 경계내에 있지 않다면, ArrayIndexOutOfBoundsException이 실행된다.
baload
어레이로부터 부호 달린 바이트 로드
구문:
baload = 51
스택: ..., arrayref, index => ..., value
arrayref는 부호 달린 바이트 어레이에 대한 레퍼런스이어야 한다. index는 정수이어야 한다. 어레이내 위치 번호 index에서의 부호 달린 바이트 value가 검색되고, 정수로 확장되며, 스택의 최상위로 푸시된다.
만일 arrayref가 비어있다면, NullPointerException이 실행된다. 만일 index가 어레이의 경계내에 있지 않다면, ArrayIndexOutOfBoundsException이 실행된다.
caload
어레이로부터 문자 로드
구문:
caload = 52
스택: ..., arrayref, index => ..., value
arrayref는 문자 어레이에 대한 레퍼런스이어야 한다. index는 정수이어야 한다. 어레이내 위치 번호 index에서의 문자 value가 검색되고, 정수로 제로 확장되며, 스택의 최상위로 푸시된다.
만일 arrayref가 비어있다면, NullPointerException이 실행된다. 만일 index가 어레이의 경계내에 있지 않다면, ArrayIndexOutOfBoundsException이 실행된다.
saload
어레이로부터 단정도 로드
구문:
saload = 53
스택: ..., arrayref, index => ..., value
arrayref는 단정도 정수 어레이에 대한 레퍼런스이어야 한다. index는 정수이어야 한다. 어레이의 위치 번호 index에서의 부호 달린 단정도 정수 값이 검색되고, 정수로 확장되며, 스택의 최상위로 푸시된다.
만일 arrayref가 비어있다면, NullPointerException이 실행된다. 만일 index가 어레이의 경계내에 있지 않다면, ArrayIndexOutOfBoundsException이 실행된다.
iastore
정수 어레이로 저장
구문:
iastore = 79
스택: ..., arrayref, index, value => ...
arrayref는 정수 어레이에 대한 레퍼런스이어야 한다. index는 정수이어야 하며, value가 정수이어야 한다. 어레이내 위치 index에서 정수 value가 저장된다.
만일 arrayref가 비어있다면, NullPointerException이 실행된다. 만일 index가 어레이의 경계내에 있지 않다면, ArrayIndexOutOfBoundsException이 실행된다.
lastore
배정도 정수 어레이로 저장
구문:
lastore = 80
스택: ..., arrayref, index, value-word1, value-word2 => ...
arrayref는 배정도 정수 어레이에 대한 레퍼런스이어야 하고, index는 정수이어야 하며, value는 배정도 정수이어야 한다. 어레이내 위치 index에서 배정도 정수 값이 저장된다.
만일 arrayref가 비어있다면, NullPointerException이 실행된다. 만일 index가 어레이의 경계내에 있지 않다면, ArrayIndexOutOfBoundsException이 실행된다.
fastore
단정도 부동소수점 어레이로 저장
구문:
fastore = 81
스택: ..., arrayref, index, value => ...
arrayref는 단정도 부동소수점 수의 어레이에 대한 레퍼런스이어야 하고, index는 정수이어야 하며, value는 단정도 부동소수점 수이어야 한다. 어레이내 위치 index에서 단정도 부동소수점 값이 저장된다.
만일 arrayref가 비어있다면, NullPointerException이 실행된다. 만일 index가 어레이의 경계내에 있지 않다면, ArrayIndexOutOfBoundsException이 실행된다.
dastore
배정도 부동소수점 어레이로 저장
구문:
dastore=82
스택: ..., arrayref, index, value-word1, value-word2 => ...
arrayref는 배정도 부동소수점 수의 어레이에 대한 레퍼런스이어야 하고, index는 정수이어야 하며, value는 배정도 부동소수점 수이어야 한다. 어레이내 위치 index에서 배정도 부동소수점 값이 저장된다.
arrayref가 비어있다면, NullPointerException이 실행된다. index가 어레이의 경계내에 있지 않다면, ArrayIndexOutOfBoundsException이 실행된다.
aastore
오브젝트 레퍼런스 어레이로 저장
구문:
aastore=83
스택: ..., arrayref, index, value => ...
arrayref는 오브젝트 레퍼런스 어레이에 대한 레퍼런스이어야 하고, index는 정수이어야 하며, value는 오브젝트 레퍼런스이어야 한다. 어레이내 위치 index에서 오브젝트 레퍼런스 값이 저장된다.
arrayref가 비어있다면, NullPointerException이 실행된다. index가 어레이의 경계내에 있지 않다면, ArrayIndexOutOfBoundsException이 실행된다. value의 실제 형태는 어레이 요소의 실제 형태와 일치되어야 한다. 예를 들어, 클래스 Object 어레이의 클래스 Thread의 예시를 저장하는 것은 정당하지만, 그렇지 않으면 정당하지 않다. 호환가능하지 않은 오브젝트 레퍼런스를 저장하기 위한 시도가 이뤄지는 경우 ArrayStoreException이 실행된다.
bastore
부호 달린 바이트 어레이로 저장
구문:
bastore = 84
스택: ..., arrayref, index, value => ...
arrayref는 부호 달린 바이트 어레이에 대한 레퍼런스이어야 하고, index는 정수이어야 하며, 그리고 value는 정수이다. 정수 value는 어레이내의 위치 index에 저장된다. value가 너무 커서 부호 달린 바이트가 되지 못한다면, 절단된다.
arrayref가 널이면, NullPointerException이 기동된다. index가 어레이의 경계 내부에 있지 않다면 ArrayIndexOutOfBoundsException이 기동된다.
castore
문자 어레이로 저장
구문:
castore = 85
스택: ..., arrayref, index, value => ...
arrayref는 문자의 어레이여야 하고, index는 정수이어야 하며, value는 정수이다. 정수 index는 어레이의 위치 index에 저장된다. value가 너무 커서 문자가 될 수 없다면, 절단된다.
arrayref가 널이면, NullPointerException이 기동된다. index가 어레이의 경계 내부에 있지 않다면 ArrayIndexOutOfBoundsException이 기동된다.
sastore
단정도 어레이로 저장
구문:
sastore = 86
스택: ..., arrayref, index, value => ...
arrayref는 단정도 어레이이어야 하고, index는 정수이어야 하며, 그리고 value는 정수이다. 정수 value는 상기 어레이의 위치 index에 저장된다. value가 너무 커서 짧게 될 수 없다면, 절단된다.
arrayref가 널이면, NullPointerException이 기동된다. index가 어레이의 경계 내부에 있지 않다면 ArrayIndexOutOfBoundsException이 기동된다.
3.7 스택 명령(Stack Instructions)
nop
하는 일 없음
구문:
nop = 0
스택: 변화 없음
하는일 없음.
pop
상위 스택 워드 팝
구문:
pop = 87
스택: ..., any => ...
스택으로부터 최상위 워드를 팝함.
pop2
상위 두 개의 스택 워드팝
구문:
pop2 = 89
스택: ..., any2, any1 => ...
스택으로부터 두 개의 최상위 워드를 팝함.
dup
상위 스택 워드 복사
구문:
dup = 89
스택: ..., any => ..., any, any
스택상의 최상위 워드를 복사함.
dup2
상위 두 개의 스택 워드 복사
구문:
dup2 = 92
스택: ..., any2, any1 => ..., any2, any1,any2, any1
스택상의 최상위 두 워드를 복사함.
dup_x1
상위 스택 워드 복사하고, 두 개를 내려놓음
구문:
dup_x1 = 90
스택: ..., any2, any1 => ..., any1, any2, any1
스택상의 최상위 워드를 복사하고 스택 내에 복사한 두 개의 워드를 삽입함.
dup2_x1
상위 두 개의 스택 워드를 복사하고, 두 개를 내려놓음
구문:
dup_x1 = 93
스택: ..., any3, any2, any1 => ..., any2, any1, any3, any2, any1
스택상의 최상위 두 워드를 복사하고 스택 내에 복사한 두 개의 워드를 삽입함.
dup_x2
상위 스택 워드를 복사하고 세 개를 내려놓음
구문:
dup_x2 = 91
스택: ..., any3, any2, any1 => ..., any1, any3, any2, any1
스택상의 최상위 워드를 복사하고 스택 내에 복사한 세 개의 워드를 삽입함.
dup2_x2
상위 두 개의 스택 워드를 복사하고 세 개를 내려놓음
구문:
dup2_x2 = 94
스택: ..., any4, any3, any2, any1 => ..., any2, any1, any4, any3, any2, any1
스택상의 최상위 두 워드를 복사하고 스택 내에 복사한 세 개의 워드를 삽입함.
swap
상위 두 개의 스택 워드를 스왑함
구문:
swap = 95
스택: ..., any2, any1 => ..., any2, any1
스택상의 최상위 두 성분을 스왑함.
3.8 산술 연산 명령(Arithmetic Instructions)
iadd
정수 가산
구문:
iadd = 96
스택: ..., value1, value2 => ..., result
value1 및 value2는 정수이어야 한다. 상기 값들은 가산되고 그들의 정수 합에 의해 스택상에서 교체된다.
ladd
배정도 정수 가산
구문:
ladd = 97
스택: ..., value1-word1, value1-word2, value2-word2 => ..., result-word2
value1 및 value2는 정수이어야 한다. 상기 값들은 가산되고 그들의 배정도 정수 합에 의해 상기 스택상에서 교체된다.
fadd
단정도 부동소수점 가산
구문:
fadd = 98
스택: ..., value1, value2 => ..., result
value1 및 value2는 단정도 부동소수점 수이어야 한다. 상기 값들은 더해지고 그들의 단정도 부동소수점 합에 의해 상기 스택상에서 교체된다.
dadd
배정도 부동소수점 가산
구문:
dadd = 99
스택: ..., value1-word1, value1-word2, value2-word1, value2-word2 => ..., result-word1, result-word2
value1 및 value2는 배정도 부동소수점 수이어야 한다. 상기 값들은 더해지고 그들의 배정도 부동소수점 합에 의해 상기 스택상에서 교체된다.
isub
정수 감산
구문:
isub = 100
스택: ..., value1, value2 => ..., result
value1 및 value2는 정수이어야 한다. value2는 value1에서 감산되고, 양 값 모두 그들의 정수 차에 의해 상기 스택상에서 교체된다.
lsub
배정도 정수 감산
구문:
lsub = 101
스택: ..., value1-word1, value1-word2, value2-word1, value2-word2 => ..., result-word1, result-word2
value1 및 value2는 배정도 정수이어야 한다. value2는 value1에서 감산되고, 양 값은 모두 그들의 배정도 정수 차에 의해 상기 스택상에서 교체된다.
fsub
단정도 부동소수점 감산
구문:
fsub = 102
스택: ..., value1, value2 => ..., result
value1 및 value2는 단정도 부동소수점 수이어야 한다. value2는 value1 에서 감산되고, 양 값은 모두 그들의 단정도 부동소수점 차에 의해 상기 스택상에서 교체된다.
dsub
배정도 부동소수점 감산
구문:
dsub = 103
스택: ..., value1-word1, value1-word2, value2-word1, value2-word2 => ..., result-word1, result-word2
value1 및 value2는 배정도 부동소수점 수이어야 한다. value2는 value1 에서 감산되고, 양 값은 모두 그들의 배정도 부동소수점 차에 의해 상기 스택상에서 교체된다.
imul
정수 승산
구문:
imul = 104
스택: ..., value1, value2 => ..., result
value1 및 value2는 정수이어야 한다. 양 값은 모두 그들의 정수 곱에 의해 상기 스택상에서 교체된다.
lmul
배정도 정수 승산
구문:
imul = 105
스택: ..., value1-word1, value1-word2, value2-word1, value2-word2 => ..., result-word1, result-word2
value1 및 value2는 배정도 정수이어야 한다. 양 값은 모두 그들의 배정도 정수 곱에 의해 상기 스택상에서 교체된다.
fmul
단정도 부동소수점 승산
구문:
fmul = 106
스택: ..., value1, value2 => ..., result
value1 및 value2 는 단정도 부동소수점 수이어야 한다. 양 값은 모두 그들의 단정도 부동소수점 곱에 의해 상기 스택상에서 교체된다.
dmul
배정도 부동소수점 승산
구문:
dmul = 107
스택: ..., value1-word1, value1-word2, value2-word1, value2-word2 => ..., result-word1, result-word2
value1 및 value2는 배정도 부동소수점 수이어야 한다. 양 값은 모두 그들의 배정도 부동소수점 곱에 의해 상기 스택상에서 교체된다.
idiv
정수 제산
구문:
idiv = 108
스택: ..., value1, value2 => ..., result
value1 및 value2는 정수이어야 한다. value1은 value2로 나누어지고, 양 값은 모두 그들의 정수 몫에 의해 상기 스택상에서 교체된다.
결과는 그것과 0 사이의 가장 가까운 정수로 절단된다. 0으로 나누고자 하는 시도는 기동되는 "/by zero" ArithmeticException으로 귀착한다.
ldiv
배정도 정수 제산
구문:
ldiv = 109
스택: ..., value1-word1, value1-word2, value2-word1, value2-word2 => ..., result-word1, result-word2
value1 및 value2는 배정도 정수이어야 한다. value1은 value2로 나누어지고, 양 값은 모두 그들의 배정도 정수 몫에 의해 상기 스택상에서 교체된다.
결과는 그것과 0 사이의 가장 가까운 정수로 절단된다. 0으로 나누고자 하는 시도는 기동되는 "/by zero" ArithmeticException으로 귀착한다.
fdiv
단정도 부동소수점 제산
구문:
fdiv = 110
스택: ..., value1, value2 => ..., result
value1 및 value2는 단정도 부동소수점 수이어야 한다. value1은 value2 로 나누어지고, 양 값은 모두 그들의 단정도 부동소수점 몫에 의해 상기 스택상에서 교체된다.
0으로 나누면 몫은 NaN이 된다.
ddiv
배정도 부동소수점 나누기
구문:
ddiv = 111
스택: ..., value1-word1, value1-word2, value2-word1, value2-word2 => ..., result-word1, result-word2
value1 및 value2는 배정도 부동소수점 수이어야 한다. value1은 value2로 나누어지고, 양 값은 모두 그들의 배정도 부동소수점 몫에 의해 상기 스택상에서 교체된다.
0으로 나누면 몫은 NaN이 된다.
irem
정수 나머지
구문:
irem = 112
스택: ..., value1, value2 => ..., result
value1 및 value2는 둘 다 정수이어야 한다. value1은 value2로 나누어지고, 양 값은 모두 그들의 정수 나머지에 의해 상기 스택상에서 교체된다.
0으로 나누고자 하는 시도는 기동되는 "/by zero" ArithmeticException으로 귀착한다.
lrem
배정도 정수 나머지
구문:
lrem = 113
스택: ..., value1-word1, value1-word2, value2-word1, value2-word2 => ..., result-word1, result-word2
value1 및 value2 는 모두 배정도 정수이어야 한다. value1은 value2로 나누어지고, 양 값은 모두 그들의 배정도 정수 나머지에 의해 상기 스택상에서 교체된다.
0으로 나누고자 하는 시도는 기동되는 "/by zero" ArithmeticException 로 귀착한다.
frem
단정도 부동소수점 나머지
구문:
frem = 114
스택: ..., value1, value2 => ..., result
value1 및 value2는 둘 다 단정도 부동소수점 수이어야 한다. value1은 value2로 나누어지고, 그 몫은 정수로 잘린다. 그 곱은 value1에서 감산된다. 그 결과, 단정도 부동소수점 수와 같이, 양 값은 상기 스택상에서 교체된다.
result = value1 - (integral_part(value/value2)*value2)이고, 여기서 integral_part()는 짝수로 되는 같은 수를 갖는 가장 근접한 정수로 사사오입한다.
0으로 나누고자 하면 결과는 NaN이 된다.
drem
배정도 부동소수점 나머지
구문:
drem = 115
스택: ..., value1-word1, value1-word2, value2-word1, value2-word2 => ..., result-word1, result-word2
value1 및 value2는 둘 다 배정도 부동소수점 수이어야 한다. value1은 value2로 나누어지고, 그 몫은 정수로 잘리고, 그다음 value2와 곱해진다. 그 곱은 value1에서 감산된다. 그 결과, 배정도 부동소수점 수와 같이, 양 값은 상기 스택상에서 교체된다.
result = value1 - (integral_part(value/value2)*value2)이고, 여기서 integral_part()는 짝수로 되는 같은 수를 갖는 가장 근접한 정수로 사사오입한다.
0으로 나누고자 하면 결과는 NaN이 된다.
ineg
정수 부정
구문:
ineg = 116
스택: ..., value => ..., result
value는 정수이어야 한다. 이것은 그의 산술 연산 부정에 의해 상기 스택상에 되놓인다.
lneg
배정도 정수 부정
구문:
lneg = 117
스택: ..., value1-word1, value1-word2 => ..., result-word1
value는 정수이어야 한다. 이것은 그의 산술 연산 부정에 의해 상기 스택상에 되놓인다.
fneg
단정도 부동소수점 부정
구문:
fneg = 118
스택: ..., value => ..., result
value는 단정도 부동소수점 수이어야 한다. 이것은 그의 산술 연산 부정에 의해 상기 스택상에 되놓인다.
dneg
배정도 부동소수점 부정
구문:
dneg = 119
스택: ..., value1-word1, value1-word2 => ..., result-word1, result-word2
value는 배정도 부동소수점 수이어야 한다. 이것은 그의 산술 연산 부정에 의해 상기 스택상에 놓는다.
3.9 논리 명령(Logical Instructions)
ishl
정수 왼쪽 시프트
구문:
ishl = 120
스택: ..., value1, value2 => ..., result
value1 및 value2는 정수이어야 한다. value1은 value2의 하위 5비트에 의해 표시된 양에 의해 왼쪽으로 시프트된다. 상기 정수 결과는 두 값 모두를 상기 스택상에 놓는다.
ishr
정수 산술 연산 오른쪽 시프트
구문:
ishr = 122
스택: ..., value1, value2 => ..., result
value1 및 value2는 정수이어야 한다. value1은 value2의 하위 5비트에 의해 표시된 양에 의해 (부호 확장을 가지고) 산술 연산적으로 오른쪽으로 시프트된다. 상기 정수 결과는 두 값을 모두 상기 스택상에 놓는다.
iushr
정수 논리 오른쪽 시프트
구문:
iushr = 124
스택: ..., value1, value2 => ..., result
value1 및 value2는 정수이어야 한다. value1은 value2의 하위 5비트에 의해 표시된 양에 의해 (부호 확장 없이) 산술 연산적으로 오른쪽으로 시프트된다. 상기 정수 결과는 두 값을 모두 상기 스택상에 놓는다.
lshl
배정도 정수 왼쪽 시프트
구문:
lshl = 121
스택: ..., value1-word1, value1-word2, value2 => ..., result-word1, result-word2
value1은 배정도 정수이어야 하고 value2는 정수이어야 한다. value1은 value2의 하위 6비트에 의해 표시된 양에 의해 왼쪽으로 시프트된다. 상기 배정도 정수 결과는 두 값을 모두 상기 스택상에 놓는다.
lshr
배정도 정수 산술 연산 오른쪽 시프트
구문:
lshr = 123
스택: ..., value1-word1, value1-word2, value2 => ..., result-word1, result-word2
value1은 배정도 정수이어야 하고 value2는 정수이어야 한다. value1은 value2의 하위 6비트에 의해 표시된 양에 의해 (부호 확장을 가지고) 산술 연산적으로 오른쪽으로 시프트된다. 상기 배정도 정수 결과는 두 값을 모두 상기 스택상에 놓는다.
lushr
배정도 정수 논리 오른쪽 시프트
구문:
lushr = 125
스택: ..., value1-word1, value1-word2, value2-word1, value2-word2 => ..., result-word1, result-word2
value1은 배정도 정수이어야 하고 value2는 정수이어야 한다. value1은 value2의 하위 6비트에 의해 표시된 양에 의해 (부호 확장 없이) 논리적으로 오른쪽으로 시프트된다. 상기 배정도 정수 결과는 두 값을 모두 상기 스택상에 놓는다.
iand
정수 불 AND
구문:
iand = 126
스택: ..., value1, value2 => ..., result
value1 및 value2는 정수이어야 한다. 이들은 그들의 비트방향 논리 and(논리곱)에 의해 상기 스택상에 놓여진다.
land
배정도 정수 불 AND
구문:
land = 127
스택: ..., value1-word1, value1-word2, value2-word1, value2-word2 => ..., result-word1, result-word2
value1 및 value2는 배정도 정수이어야 한다. 이들은 그들의 비트방향 논리 and(논리곱)에 의해 상기 스택상에 놓여진다.
ior
정수 불 OR
구문:
ior = 128
스택: ..., value1, value2 => ..., result
value1 및 value2는 정수이어야 한다. 이들은 그들의 비트방향 논리 or(논리합)에 의해 상기 스택상에 놓여진다.
lor
배정도 정수 불 OR
구문:
lor = 129
스택: ..., value1-word1, value1-word2, value2-word1, value2-word2 => ..., result-word1, result-word2
value1 및 value2는 배정도 정수이어야 한다. 이들은 그들의 비트방향 논리 or(논리합)에 의해 상기 스택상에 놓여진다.
ixor
정수 불 XOR
구문:
ixor = 130
스택: ..., value1, value2 => ..., result
value1 및 value2는 모두 정수이어야 한다. 이들은 그들의 비트방향 exclusive or(배타적 논리합)에 의해 상기 스택상에 놓여진다.
lxor
배정도 정수 불 XOR
구문:
lxor = 131
스택: ..., value1-word1, value1-word2, value2-word1, value2-word2 => ..., result-word1, result-word2
value1 및 value2는 모두 배정도 정수이어야 한다. 이들은 그들의 비트방향 exclusive or(배타적 논리합)에 의해 상기 스택상에 놓여진다.
3.10 변환 연산(Conversion Operations)
i2l
정수-배정도 정수 변환
구문:
i2l = 133
스택: ..., value => ..., result-word1, result-word2
value는 정수이어야 한다. 이것은 배정도 정수로 변환된다. 그 결과는 스택의 value를 대체한다.
i2f
정수-단정도 부동소수점
구문:
i2f = 134
스택: ..., value => ..., result
value는 정수이어야 한다. 이것은 단정도 부동소수점 수로 변환된다. 그 결과는 스택의 value를 대체한다.
i2d
정수-배정도 부동소수점
구문:
i2d = 135
스택: ..., value => ..., result-word1, result-word2
value는 정수이어야 한다. 이것은 배정도 부동소수점 수로 변환된다. 그 결과는 스택의 value를 대체한다.
l2i
배정도 정수-정수
구문:
l2i = 136
스택: ..., value-word1, value-word2 => ..., result
value는 배정도 정수이어야 한다. 이것은 하위측 32비트를 취해 정수로 변환된다. 그 결과는 스택의 value를 대체한다.
l2f
배정도 정수-단정도 부동소수점
구문:
l2f = 137
스택: ..., value-word1, value-word2 => ..., result
value는 배정도 정수이어야 한다. 이것은 단정도 부동소수점 수로 변환된다. 그 결과는 스택의 value를 대체한다.
l2d
배정도 정수-배정도 부동소수점
구문:
l2d = 138
스택: ..., value-word1, value-word2 => ..., result-word1, result-word2
value는 배정도 정수이어야 한다. 이것은 배정도 부동소수점 수로 변환된다. 그 결과는 스택의 value를 대체한다.
f2i
단정도 부동소수점-정수
구문:
f2i = 139
스택: ..., value => ..., result
value는 단정도 부동소수점 수이어야 한다. 이것은 정수로 변환된다. 그 결과는 스택의 value를 대체한다.
f2l
단정도 부동소수점-배정도 정수
구문:
f2l = 140
스택: ..., value => ..., result-word1, result-word2
value는 단정도 부동소수점 수이어야 한다. 이것은 배정도 정수로 변환된다. 그 결과는 스택의 value를 대체한다.
f2d
단정도 부동소수점-배정도 부동소수점
구문:
f2d = 141
스택: ..., value => ..., result-word1, result-word2
value는 단정도 부동소수점 수이어야 한다. 이것은 배정도 부동소수점 수로 변환된다. 그 결과는 스택의 value를 대체한다.
d2i
배정도 부동소수점-정수
구문:
d2i = 142
스택: ..., value-word1, value-word2 => ..., result
value는 배정도 부동소수점 수이어야 한다. 이것은 정수로 변환된다. 그 결과는 스택의 value를 대체한다.
d2l
배정도 부동소수점-배정도 정수
구문:
d2l = 143
스택: ..., value-word1, value-word2 => ..., result-word1, result-word2
value는 배정도 부동소수점 수이어야 한다. 이것은 배정도 정수로 변환된다. 그 결과는 스택의 value를 대체한다.
d2f
배정도 부동소수점-단정도 부동소수점
구문:
2df = 144
스택: ..., value-word1, value-word2 => ..., result
value는 배정도 부동소수점 수이어야 한다. 이것은 단정도 부동소수점 수로 변환된다. 만일 오버플로우가 발생하면, 그 결과는 value와 동일한 부호를 갖는 무한대가 되어야 한다. 그 결과는 스택의 value를 대체한다.
int2byte
정수-부호 달린 바이트
구문:
int2byte = 157
스택: ..., value => ..., result
value는 정수이어야 한다. 이것은 부호 달린 8-비트 결과로 절단되고, 다음으로 부호는 정수로 확장된다. 그 결과는 스택의 value를 대체한다.
int2char
정수-char
구문:
int2char = 146
스택: ..., value => ..., result
value는 정수이어야 한다. 이것은 부호 없는 16-비트 결과로 절단되고, 다음으로 0가 정수로 확장된다. 그 결과는 스택의 value를 대체한다.
int2short
정수-short
구문:
int2short = 147
스택: ..., value => ..., result
value는 정수이어야 한다. 이것은 부호 달린 16-비트 결과로 절단되고, 다음으로 부호는 정수로 확장된다. 그 결과는 스택의 value를 대체한다.
3.11 제어 전송 명령(Control Transfer Instructions)
ifeq
0인 경우의 분기
구문:
ifeg = 153
branchbyte1
branchbyte2
스택: ..., value => ...
value는 정수이어야 한다. 이것은 상기 스택으로부터 팝된다. value가 0이면, branchbyte1 및 branchbyte2는 부호 달린 16-비트 오프셋을 구성하기 위해 사용된다. 이 명령의 어드레스로부터의 그 오프셋에서 실행이 진행된다. 그렇지 않으면 상기 ifeq 다음에 오는 명령에서 실행은 진행된다.
ifnull
널인 경우의 분기
구문:
ifnull = 198
branchbyte1
branchbyte2
스택: ..., value => ...
value는 오브젝트에 대한 레퍼런스이어야 한다. 이것은 상기 스택으로부터 팝된다. value가 널이면, branchbyte1 및 branchbyte2는 부호 달린 16-비트 오프셋을 구성하기 위해 사용된다. 이 명령의 어드레스로부터의 그 오프셋에서 실행이 진행된다. 그렇지 않으면 실행은 상기 ifnull 다음에 오는 명령에서 진행된다.
iflt
0보다 작은 경우의 분기
구문:
iflt = 155
branchbyte1
branchbyte2
스택: ..., value => ...
value는 정수이어야 한다. 이것은 상기 스택으로부터 팝된다. value가 0보다 작다면, branchbyte1 및 branchbyte2는 부호 달린 16-비트 오프셋을 구성하기 위해 사용된다. 이 명령의 어드레스로부터의 그 오프셋에서 실행이 진행된다. 그렇지 않으면 실행은 상기 iflt 다음에 오는 명령에서 진행된다.
ifle
0보다 작거나 같은 경우의 분기
구문:
ifle = 158
branchbyte1
branchbyte2
스택: ..., value => ...
value는 정수이어야 한다. 이것은 상기 스택으로부터 팝된다. value가 0보다 작거나 같다면, branchbyte1 및 branchbyte2는 부호 달린 16-비트 오프셋을 구성하기 위해 사용된다. 이 명령의 어드레스로부터의 그 오프셋에서 실행이 진행된다. 그렇지 않으면 실행은 상기 ifle 다음에 오는 명령에서 진행된다.
ifne
0이 아닌 경우의 분기
구문:
ifne = 154
branchbyte1
branchbyte2
스택: ..., value => ...
value는 정수이어야 한다. 이것은 상기 스택으로부터 팝된다. value가 0이 아니라면, branchbyte1 및 branchbyte2는 부호 달린 16-비트 오프셋을 구성하기 위해 사용된다. 이 명령의 어드레스로부터의 그 오프셋에서 실행이 진행된다. 그렇지 않으면 실행은 상기 ifne 다음에 오는 명령에서 진행된다.
ifnonnull
널이 아닌 경우의 분기
구문:
ifnonnull = 199
branchbyte1
branchbyte2
스택: ..., value => ...
value는 오브젝트의 레퍼런스이어야 한다. 이것은 상기 스택으로부터 팝된다. value가 널이 아니라면, branchbyte1 및 branchbyte2는 부호 달린 16-비트 오프셋을 구성하기 위해 사용된다. 이 명령의 어드레스로부터의 그 오프셋에서 실행이 진행된다. 그렇지 않으면 실행은 상기 ifnonnull 다음에 오는 명령에서 진행된다.
ifgt
0보다 큰 경우의 분기
구문:
ifft = 157
branchbyte1
branchbyte2
스택: ..., value => ...
value는 정수이어야 한다. 이것은 상기 스택으로부터 팝된다. value가 0보다 크다면, branchbyte1 및 branchbyte2는 부호 달린 16-비트 오프셋을 구성하기 위해 사용된다. 이 명령의 어드레스로부터의 그 오프셋에서 실행이 진행된다. 그렇지 않으면 실행은 상기 ifgt 다음에 오는 명령에서 진행된다.
ifge
0보다 크거나 같은 경우의 분기
구문:
ifge = 156
branchbyte1
branchbyte2
스택: ..., value => ...
value는 정수이어야 한다. 이것은 상기 스택으로부터 팝된다. value가 0보다 크거나 같다면, branchbyte1 및 branchbyte2는 부호 달린 16-비트 오프셋을 구성하기 위해 사용된다. 이 명령의 어드레스로부터의 그 오프셋에서 실행이 진행된다. 그렇지 않으면 실행은 상기 ifge 다음에 오는 명령에서 진행된다.
if_icmpeq
정수가 동일한 경우의 분기
구문:
if_icmpeg = 159
branchbyte1
branchbyte2
스택: ..., value1, value2 => ...
value1 및 value2는 정수이어야 한다. 이들은 모두 상기 스택으로부터 팝된다. value1이 value2와 같다면, branchbyte1 및 branchbyte2는 부호 달린 16-비트 오프셋을 구성하기 위해 사용된다. 이 명령의 어드레스로부터의 그 오프셋에서 실행이 진행된다. 그렇지 않으면 실행은 명령 if_icmpeq 다음에 오는 명령에서 진행된다.
if_icmpne
정수가 같지 않은 경우의 분기
구문:
if_icmpne = 160
branchbyte1
branchbyte2
스택: ..., value1, value2 => ...
value1 및 value2는 정수이어야 한다. 이들은 모두 상기 스택으로부터 팝된다. value1이 value2와 같지 않다면, branchbyte1 및 branchbyte2는 부호 달린 16-비트 오프셋을 구성하기 위해 사용된다. 이 명령의 어드레스로부터의 그 오프셋에서 실행이 진행된다. 그렇지 않으면 실행은 명령 if_icmpne 다음에 오는 명령에서 진행된다.
if_icmplt
정수가 보다 작은 경우의 분기
구문:
if_icmplt = 161
branchbyte1
branchbyte2
스택: ..., value1, value2 => ...
value1 및 value2는 정수이어야 한다. 이들은 모두 상기 스택으로부터 팝된다. value1이 value2보다 작다면, branchbyte1 및 branchbyte2는 부호 달린 16-비트 오프셋을 구성하기 위해 사용된다. 이 명령의 어드레스로부터의 그 오프셋에서 실행이 진행된다. 그렇지 않으면 실행은 명령 if_icmplt 다음에 오는 명령에서 진행된다.
if_icmpgt
정수가 보다 큰 경우의 분기
구문:
if_icmpgt = 163
branchbyte1
branchbyte2
스택: ..., value1, value2 => ...
value1 및 value2는 정수이어야 한다. 이들은 모두 상기 스택으로부터 팝된다. 만일 value1이 value2보다 크다면, branchbyte1 및 branchbyte2는 부호 달린 16-비트 오프셋을 구성하기 위해 사용된다. 이 명령의 어드레스로부터의 그 오프셋에서 실행이 진행된다. 그렇지 않으면 실행은 명령 if_icmpgt 다음에 오는 명령에서 진행된다.
if_icmple
정수가 작거나 같은 경우의 분기
구문:
if_icmple = 164
branchbyte1
branchbyte2
스택: ..., value1, value2 => ...
value1 및 value2는 정수이어야 한다. 이들은 모두 상기 스택으로부터 팝된다. value1이 value2보다 작거나 같다면, branchbyte1 및 branchbyte2는 부호 달린 16-비트 오프셋을 구성하기 위해 사용된다. 이 명령의 어드레스로부터의 그 오프셋에서 실행이 진행된다. 그렇지 않으면 실행은 명령 if_icmple 다음에 오는 명령에서 진행된다.
if_icmpge
정수가 크거나 같은 경우의 분기
구문:
if_icmpge = 162
branchbyte1
branchbyte2
스택: ..., value1, value2 => ...
value1 및 value2는 정수이어야 한다. 이들은 모두 상기 스택으로부터 팝된다. value1이 value2보다 크거나 같다면, branchbyte1 및 branchbyte2는 부호 달린 16-비트 오프셋을 구성하기 위해 사용된다. 이 명령의 어드레스로부터의 그 오프셋에서 실행이 진행된다. 그렇지 않으면 실행은 명령 if_icmpge 다음에 오는 명령에서 진행된다.
lcmp
배정도 정수 비교
구문:
lcmp = 148
스택: ..., value1-word1, value1-word2, value2-word1, => ..., result
value1 및 value2는 배정도 정수이어야 한다. 이들은 모두 상기 스택으로부터 팝되고 비교된다. value1이 value2보다 크다면, 정수 값 1이 상기 스택상으로 푸시된다. value1이 value2와 같다면, value 0가 상기 스택상으로 푸시된다. value1이 value2보다 작다면, value -1이 상기 스택상으로 푸시된다.
fcmpl
단정도 부동소수점 비교(NaN 상의 1)
구문:
fcmpl = 149
스택: ..., value1, value2 => ..., result
value1 및 value2는 단정도 부동소수점 수이어야 한다. 이들은 모두 상기 스택으로부터 팝되고 비교된다. value1이 value2보다 크다면, 정수 값 1이 상기 스택상으로 푸시된다. value1이 value2와 같다면, value 0가 상기 스택상으로 푸시된다. value1이 value2보다 작다면, value -1이 상기 스택상으로 푸시된다.
만일 value1 또는 value2 중 하나가 NaN라면, value -1이 상기 스택상으로 푸시된다.
fcmpg
단정도 부동소수점 비교(NaN 상의 1)
구문:
fcmpg = 150
스택: ..., value1, value2 => ..., result
value1 및 value2는 단정도 부동소수점 수이어야 한다. 이들은 모두 상기 스택으로부터 팝 되고 비교된다. value1이 value2보다 크다면, 정수 값 1이 상기 스택상으로 푸시된다. value1이 value2와 같다면, value 0가 상기 스택상으로 푸시된다. value1이 value2보다 작다면, value -1이 상기 스택상으로 푸시된다.
value1 또는 value2 중 하나가 NaN라면, value 1이 상기 스택상으로 푸시된다.
dcmpl
배정도 부동소수점 비교(NaN 상의 -1)
구문:
dcmpl = 151
스택: ..., value1-word1, value1-word2, value2-word1, value2-word2 => ..., result
value1 및 value2는 배정도 부동소수점 수이어야 한다. 이들은 모두 상기 스택으로부터 팝되고 비교된다. value1이 value2보다 크다면, 정수 값 1이 상기 스택상으로 푸시된다. value1이 value2와 같다면, value 0가 상기 스택상으로 푸시된다. value1이 value2보다 작다면, value 1이 상기 스택상으로 푸시된다.
value1 또는 value2 중 하나가 NaN라면, value 1이 상기 스택상으로 푸시된다.
dcmpg
배정도 부동소수점 비교(NaN 상의 1)
구문:
dcmpg = 152
스택: ..., value1-word1, value1-word2, value2-word1, value2-word2 => ..., result
value1 및 value2는 배정도 부동소수점 수이어야 한다. 이들은 모두 상기 스택으로부터 팝되고 비교된다. value1이 value2보다 크다면, 정수 값 1이 상기 스택상으로 푸시된다. value1이 value2와 같다면, value 0가 상기 스택상으로 푸시된다. value1이 value2보다 작다면, value -1이 상기 스택상으로 푸시된다.
value1 또는 value2 중 하나가 NaN라면, value 1이 상기 스택상으로 푸시된다.
if_acmpeg
오브젝트 레퍼런스가 같은 경우의 분기
구문:
if_acmpeg = 165
branchbyte1
branchbyte2
스택: ..., value1, value2 => ...
value1 및 value2는 오브젝트에 대한 레퍼런스이어야 한다. 이들은 모두 상기 스택으로부터 팝된다. 참조된 오브젝트가 동일하지 않다면, branchbyte1 및 branchbyte2는 부호 달린 16-비트 오프셋을 구성하기 위해 사용된다.
실행은 이 명령의 어드레스로부터의 그 오프셋에서 진행된다. 그렇지 않으면 실행은 상기 if_acmpeg 다음에 오는 명령에서 진행된다.
if_acmpne
오브젝트 레퍼런스가 같지 않은 경우의 분기
구문:
if_acmpne = 166
branchbyte1
branchbyte2
스택: ..., value1, value2 => ...
value1 및 value2는 오브젝트에 대한 레퍼런스이어야 한다. 이들은 모두 상기 스택으로부터 팝된다. 참조된 오브젝트가 동일하지 않다면, branchbyte1 및 branchbyte2는 부호 달린 16-비트 오프셋을 구성하기 위해 사용된다.
실행은 이 명령의 어드레스로부터의 그 오프셋에서 진행된다. 그렇지 않으면 실행은 명령 if_acmpne 다음에 오는 명령에서 진행된다.
goto
모든 경우의 분기
구문:
goto = 167
branchbyte1
branchbyte2
스택: 변화 없음
branchbyte1 및 branchbyte2는 부호 달린 16-비트 오프셋을 구성하기 위해 사용된다. 실행은 이 명령의 어드레스로부터의 그 오프셋에서 진행된다.
goto_w
모든 경우의 분기(광역 인덱스)
구문:
goto_w = 200
branchbyte1
branchbyte2
branchbyte3
branchbyte4
스택: 변화 없음
branchbyte1, branchbyte2, branchbyte3 및 branchbyte4는 부호 달린 32-비트 오프셋을 구성하기 위해 사용된다.
실행은 이 명령의 어드레스로부터의 그 오프셋에서 진행된다.
jsr
서브루틴 점프
구문:
jsr = 168
branchbyte1
branchbyte2
스택: ... => ..., return-address
branchbyte1 및 branchbyte2는 부호 달린 16-비트 오프셋을 구성하기 위해 사용된다. 상기 jsr 다음에 즉시 따라오는 명령의 어드레스가 상기 스택상으로 푸시된다. 이 명령의 어드레스로부터의 오프셋에서 실행이 진행된다.
jsr_w
서브루틴 점프(광역 인덱스)
구문:
jsr_w = 201
branchbyte1
branchbyte2
branchbyte3
branchbyte4
스택: ... => ..., return-address
branchbyte1, branchbyte2, branchbyte3 및 branchbyte4는 부호 달린 32-비트 오프셋을 구성하기 위해 사용된다. 상기 jsr_w 다음에 즉시 따라오는 명령의 어드레스가 상기 스택상으로 푸시된다. 이 명령의 어드레스로부터의 오프셋에서 실행이 진행된다.
ret
서브루틴으로부터 복귀
구문:
ret = 169
vindex
스택: 변화 없음
현재 JAVA 프레임내의 로컬 변수 vindex 는 리턴 어드레스를 포함해야 한다. 상기 로컬 변수의 내용은 상기 pc로 기록된다.
jsr이 상기 어드레스를 상기 스택상으로 푸시하고 ret가 그것을 로컬 변수에서 얻게됨에 유의하라. 이 부조화는 의도적인 것이다.
ret_w
서브루틴으로부터 복귀(광역 인덱스)
구문:
ret_w = 209
vindexbyte1
vindexbyte2
스택: 변화 없음
vindexbyte1 및 vindexbyte2는 현재 JAVA 프레임내의 로컬 변수로 부호 없는 16-비트 인덱스내로 어셈블된다. 상기 로컬 변수는 리턴 어드레스를 포함해야 한다. 상기 로컬 변수의 내용은 상기 pc로 기록된다. 더 많은 정보에 대해서는 ret 명령을 참조하라.
3.12 함수 리턴(Function Return)
ireturn
함수로부터 정수 리턴
구문:
ireturn = 172
스택: ..., value1 => ..., [empty]
value는 정수이어야 한다. 상기 값 value는 앞선 실행 환경의 스택상으로 푸시된다. 상기 오퍼랜드 스택상의 다른 값들은 버려진다. 그러면 해석기는 그의 호출자로 제어를 되돌려보낸다.
lreturn
함수로부터 배정도 정수 리턴
구문:
lreturn = 173
스택: ..., value-word1, value-word2 => ..., [empty]
value는 배정도 정수이어야 한다. 상기 값 value는 앞선 실행 환경의 스택상으로 푸시된다. 상기 오퍼랜드 스택상의 다른 값들은 버려진다. 그러면 해석기는 그의 호출자로 제어를 되돌려보낸다.
freturn
함수로부터 단정도 부동소수점 리턴
구문:
freturn = 174
스택: ..., value => ..., [empty]
value는 단정도 부동소수점 수이어야 한다. 상기 값 value는 앞선 실행 환경의 스택상으로 푸시된다. 상기 오퍼랜드 스택상의 다른 값들은 버려진다. 그러면 해석기는 그의 호출자로 제어를 되돌려보낸다.
dreturn
함수로부터 배정도 부동소수점 리턴
구문:
dreturn = 175
스택: ..., value-word1, value-word2 => ..., [empty]
value는 배정도 부동소수점 수이어야 한다. 상기 값 value는 앞선 실행 환경의 스택상으로 푸시된다. 상기 오퍼랜드 스택상의 다른 값들은 버려진다. 그러면 해석기는 그의 호출자로 제어를 되돌려보낸다.
areturn
함수로부터 오브젝트 레퍼런스 리턴
구문:
areturn = 176
스택: ..., value => ..., [empty]
value는 오브젝트에 대한 레퍼런스이어야 한다. 상기 값 value는 앞선 실행 환경의 스택상으로 푸시된다. 상기 오퍼랜드 스택상의 다른 값들은 버려진다. 그러면 해석기는 그의 호출자로 제어를 되돌려보낸다.
return
프로시저로부터 (무효) 리턴
구문:
return = 177
스택: ... => ..., [empty]
오퍼랜드 스택상의 모든 값들이 버려진다. 그러면 해석기는 그의 호출자로 제어를 되돌려보낸다.
breakpoint
중지 및 브레이크포인트 처리기로 제어 전송
구문:
breakpoint = 202
스택: 변화 없음
3.13 테이블 점핑(Table Jumping)
tableswitch
인덱스 및 점프에 의한 점프 테이블 액세스
구문:
tableswitch= 170
...0-3 byte pad...
default-offset1
default-offset2
default-offset3
default-offset4
low1
low2
low3
low4
high1
high2
high3
high4
...jump offsets...
스택: ..., index => ...
tableswitch는 가변 길이 명령이다. 상기 tableswitch opcode 바로 다음으로, 다음 바이트가 4를 곱하는 어드레스에서 시작되도록 제로와 세 개의 0 사이에 패딩으로서 삽입된다. 상기 패딩 다음에 일련의 부호 달린 4-바이트 양이 온다: default-offset, low, high, 그리고 다음으로 high-low+1이 또한 4비트 오프셋을 부호를 붙인다. 상기 high-low+1 부호 달린 4-바이트 오프셋은 0-기반 점프 테이블처럼 취급된다.
index는 정수이어야 한다. index가 low 보다 작거나 또는 index가 high 보다 크다면, default-offset가 이 명령의 어드레스에 더해진다. 그렇지 않으며, low는 index에서 감산되고, 상기 jump 테이블의 index-low번째 성분이 추출되며, 그리고 이 명령의 어드레스에 더해진다.
lookupswitch
키 매치 및 점프에 의한 점프 테이블 액세스
구문:
lookupswitch= 171
...0-3 byte pad...
default-offset1
default-offset2
default-offset3
default-offset4
npairsl
npairs2
npairs3
npairs4
...match-offset pairs...
스택: ..., key => ...
lookupswitch는 가변 길이 명령이다. 상기 lookupswitch opcode 바로 직후, 4가 곱해지는 어드레서에서 다음 바이트가 시작되도록 패딩하는 것처럼 제로와 세 개의 0 사이에 삽입된다.
상기 패딩 바로 다음에 여러개의 부호 달린 4-바이트 양의 쌍이 있게된다. 첫 번째 쌍은 특별하다. 그 쌍의 상기 첫 번째 조항은 디폴트 오프셋이고, 그 쌍의 두 번째 조항은 그 다음의 쌍의 수를 가져다 준다. 각각의 연속 쌍은 match 및 offset으로 구성되어 있다.
상기 key는 정수이어야 한다. 스택 상의 정수 key는 상기 match 각각과 비교된다. 그들 중 하나와 같다면, offset가 이 명령의 어드레스에 더해진다. key가 상기 match의 어느 것과도 매치되지 않는다면, 상기 디폴트 오프셋이 이 명령의 어드레스에 더해진다.
3.14 오브젝트 필드 조작(Manipulation Object Fields)
putfield
오브젝트내 필드 설정
구문:
putfield = 181
indexbyte1
indexbyte2
스택: ..., objectref, value => ...
또는
스택: ..., objectref, value-word1, value-word2 => ...
indexbyte1 및 indexbyte2는 현재 클래스의 상수 풀로의 인덱스를 구성하는데 사용된다. 상기 상수 풀 항목은 클래스명 및 필드명에 대한 필드 레퍼런스가 될 것이다. 상기 항목은 상기 필드 폭(바이트 단위) 및 상기 필드 오프셋(바이트 단위)을 갖는 필드 블럭 포인터로 분해된다.
objectref에 의해 참조된 오브젝트의 처음부터 오프셋에서의 필드는 상기 스택의 최상위의 값으로 세트될 것이다.
이 명령은 32-비트와 64-비트 광역 필드 모두를 처리한다.
objectref 가 널이면, NullPointerException가 발생된다.
지정된 필드가 스태틱 필드이면, IncompatibleClassChangeError가 기동된다.
getfield
오브젝트로부터 필드 패치
구문:
getfield = 180
indexbyte1
indexbyte2
스택: ..., objectref => ..., value
또는
스택: ..., objectref => ..., value-word1, value-word2
indexbyte1 및 indexbyte2는 현재 클래스의 상수 풀로의 인덱스를 구성하는데 사용된다. 상기 상수 풀 항목은 클래스명 및 필드명에 대한 필드 레퍼런스가 될 것이다. 상기 항목은 상기 필드 폭(바이트 단위) 및 상기 필드 offset(바이트 단위)을 갖는 필드 블럭 포인터로 분해된다.
objectref는 오브젝트의 레퍼런스이어야 한다. objectref에 의해 참조된 오브젝트의 처음부터 offset에서의 값은 상기 스택 최상위의 objectref를 대체한다.
이 명령은 32-비트와 64-비트 광역 필드 모두를 다룬다.
objectref가 널이면, NullPointerException이 발생된다.
지정된 필드가 스태틱 필드이면, IncompatibleClassChangeError가 기동된다.
putstatic
클래스내 스태틱 필드 설정
구문:
putstatic = 179
indexbyte1
indexbyte2
스택: ..., value => ...
또는
스택: ..., value-word1, value-word2 => ...
indexbyte1 및 indexbyte2는 현재 클래스의 상수 풀로의 인덱스를 구성하는데 사용된다. 상기 상수 풀 항목은 클래스의 스태틱 필드에 대한 필드 레퍼런스가 될 것이다. 그 필드는 상기 스택의 최상위의 값을 가지도록 설정될 것이다.
이 명령은 32-비트와 64-비트 광역 필드 모두를 처리한다.
지정된 필드가 스태틱 필드이면, IncompatibleClassChangeError가 기동된다.
getstatic
클래스로부터 스태틱 필드 입수
구문:
getstatic = 178
indexbyte1
indexbyte2
스택: ..., => ..., value
또는
스택: ..., => ..., value-word1, value-word2
indexbyte1 및 indexbyte2는 현재 클래스의 상수 풀로의 인덱스를 구성하는데 사용된다. 상기 상수 풀 항목은 클래스의 스태틱 필드에 대한 필드 레퍼런스가 될 것이다.
이 명령은 32-비트와 64-비트 광역 필드 모두를 처리한다.
지정된 필드가 스태틱 필드이면, IncompatibleClassChangeError가 발생된다.
3.15 매서드 호출(Method Invocation)
매서드 호출을 구현하는 4개의 명령이 있다.
invokevirtual 오브젝트의 런타임(가상) 형태에 기초하여 디스패치하는 오 브젝트의 예시 매서드 호출. 이것은 JAVA의 정상적인 매서 드 디스패치이다.
invokenonvirtual 오브젝트의 컴파일-시간 (비가상) 형태에 기초하여 디스패 치하는 오브젝트의 예시 매서드 호출. 이것은 예를 들어 keywordsuper 또는 슈퍼클래스 명을 매서드 한정자로 사용 할 때 사용된다.
invokestatic 명명된 클래스의 클래스(스태틱) 매서드 호출.
invokeinterface 적절한 매서드를 찾기 위해 특정 런타임 오브젝트에 의해 구현된 매서드를 검색하는 인터페이스에 의해 구현되는 매 서드 호출.
invokevirtual
예시 매서드 호출, 런타임 형태에 기초한 디스패치
구문:
invokevirtual = 182
indexbyte1
indexbyte2
스택: ..., objectref, [arg1, [arg2 ...]], ... => ...
오퍼랜드 스택은 오브젝트의 레퍼런스 및 소수의 인수를 포함해야 한다. indexbyte1 및 indexbyte2는 현재 클래스의 상수 풀로의 인덱스를 구성하는데 사용된다. 상수 풀의 그 인덱스에서의 항목은 완전한 매서드 기호와 클래스를 포함한다. 오브젝트의 매서드 테이블에 대한 포인터가 오브젝트 레퍼런스에서 복원된다. 매서드 기호는 상기 매서드 테이블에서 검색된다. 매서드 기호는 테이블의 매서드 기호 중 하나와 정확히 일치하도록 제공된다.
룩업 결과는 명명된 클래스의 매서드 테이블내의 인덱스인데, 그 형태의 매서드 테이블내를 보기 위해 오브젝트의 동적 형태와 같이 사용되며, 여기서 일치된 매서드에 대한 매서드 블럭에 대한 포인터가 발견된다. 매서드 블럭은 매서드의 형태(고유의, 동기된 등)와 오퍼랜드 스택에 예측딘 인수의 수를 나타낸다.
매서드가 동기된 것으로 표시되면 objectref와 연관된 모니터가 입력된다.
objectref 및 인수는 매서드 스택에서 팝되고, 새로운 매서드의 로컬 변수의 초기값으로 된다. 실행은 새로운 매서드의 첫번째 명령으로 계속된다.
오퍼랜드 스택의 오브젝트 레퍼런스가 널이면, NullPointerException이 기동된다. 매서드 호출 동안 스택 오버플로우가 검출되면, StackOverflowError가 기동된다.
invokenonvirtual
컴파일-시간 형태에 기초하여 디스패치하는 예시 매서드 호출
구문:
inokenonvirtual = 183
indexbyte1
indexbyte2
스택: ..., objectref, [arg1, [arg2 ...]], ... => ...
오퍼랜드 스택은 오브젝트의 레퍼런스와 소수의 인수를 포함해야 한다. indexbyte1 및 indexbyte2는 현재 클래스의 상수 풀로의 인덱스를 구성하는데 사용된다. 상수 풀의 그 인덱스에서의 항목은 완전한 매서드 기호를 포함한다. 매서드 기호는 매서드 테이블에서 검색된다. 매서드 기호는 테이블의 매서드 기호 중 하나와 정확히 일치하도록 제공된다.
룩업 결과는 매서드 블럭이다. 매서드 블럭은 매서드의 형태(고유의, 동기된 등)와 오퍼랜드 스택에서 예측된 인수(nargs)의 수를 나타낸다.
매서드가 동기된 것으로 표시되면 objectref와 연관된 모니터가 입력된다.
objectref 및 인수는 이 매서드의 스택에서 팝되고 새로운 매서드의 로컬 변수의 초기값으로 된다. 실행은 새로운 매서드의 첫번째 명령으로 계속된다.
오퍼랜드 스택상의 오브젝트 레퍼런스가 널이면, NullPointerException이 기동된다. 매서드 호출 동안 스택 오버플로우가 검출되면, StackOverflowError가 기동된다.
invokestatic
클래스 (스태틱) 매서드 호출
구문:
invokestatic = 184
indexbyte1
indexbyte2
스택: ..., [arg1, [arg2 ...]], ... => ...
오퍼랜드 스택은 소수의 인수를 포함해야 한다. indexbyte1 및 indexbyte2는 현재 클래스의 상수 풀로의 인덱스를 구성하는데 사용된다. 상수 풀의 그 인덱스에서의 항목은 완전한 매서드 기호 및 클래스를 포함한다. 매서드 기호는 표시된 클래스의 매서드 테이블에서 검색된다. 매서드 기호는 클래스의 매서드 테이블의 매서드 기호 중 하나와 정확히 일치하도록 제공된다.
룩업 결과는 매서드 블럭이다. 매서드 블럭은 매서드의 형태(고유의, 동기된 등)와 오퍼랜드 스택에서 예측된 인수(nargs)의 수를 나타낸다.
매서드가 동기된 것으로 표시되면 분류와 관련된 모니터가 들어간다.
인수는 이 매서드 스택에서 팝되고 새로운 매서드의 로컬 변수의 초기값으로 된다. 실행은 새로운 매서드의 첫번째 명령으로 계속된다.
매서드 호출 동안 스택 오버플로우가 검출되면, StackOverflowError가 기동된다.
invokeinterface
인터페이스 매서드 호출
구문:
invokeinterface = 185
indexbyte1
indexbyte2
nargs
reserved
스택: ..., objectref, [arg1, [arg2 ...]], ... => ...
오퍼랜드 스택은 오브젝트와 nargs-1 인수에 대한 레퍼런스를 포함해야 한다. indexbyte1과 indexbyte2는 현재 클래스의 상수 풀(pool)로 인덱스를 재구성하는데 사용된다. 상수 풀의 인덱스에서의 항목은 완전한 매서드(method) 기호를 포함한다. 오브젝트의 매서드 테이블에 대한 포인터는 오브젝트 레퍼런스로부터 복원된다. 매서드 기호는 매서드 테이블에서 색인된다. 매서드 기호는 테이블의 매서드 기호 중 하나와 정확히 일치하도록 제공된다.
색인 결과는 매서드 블럭이다. 매서드 블럭은 매서드의 형태(고유의, 동기된 등등)를 나타내지만, invokevirtual과 invokenonvirtual와는 달리 가용 인수의 수(nargs)는 바이트코드로부터 취해진다.
매서드가 markedsynchronized이면, objectref와 연관된 모니터가 입력된다.
objectref와 인수가 매서드의 스택에서 팝되어 새로운 매서드의 로컬 변수의 초기값이 된다. 실행은 새로운 매서드의 첫 번째 명령으로 계속된다.
오퍼랜드 스택의 objectref가 널(null)이면, NullPointerException이 기동된다. 매서드 호출 동안 스택 오버플로우가 검출되면 StackOverflowError이 기동된다.
3.16 예외 핸들링
athrow
기동 예외 또는 오류
구문:
athrow = 191
스택: ..., objectref => [undefined]
objectref는 기동되는 Throwable의 서브클래스인 오브젝트의 레퍼런스이어야 한다. 현재의 JAVA 스택 프레임은 이 클래스 또는 이 클래스의 슈퍼클래스를 캐치하는 가장 최근의 캐치 클로즈에 대하여 검색된다. 일치하는 캐치 리스트 항이 발견되면, pc는 캐치 리스트 항으로 표시된 어드레스로 세트되고, 실행을 계속한다.
적절한 캐치 클로즈가 현재의 스택 프레임에서 발견되지 않으면, 그 프레임은 팝되고, 오브젝트가 다시 기동된다. 하나가 발견되면, 그것은 이 예외에 대한 코드의 위치를 포함한다. 현재의 스택 프레임에서 적절한 캐치가 발견되지 않으면, 그 프레임은 팝되고, objectref가 다시 기동된다.
3.17 다양한 오브젝트 동작
new
새로운 오브젝트 형성
구문:
new = 187
indexbyte1
indexbyte2
스택: ... => ..., objectref
indexbyte1과 indexbyte2는 현재 클래스의 상수 풀에 인덱스를 구성하는데 사용된다. 그 인덱스에서의 항은 클래스 포인터 class로 분해될 수 있는 클래스명이어야 한다. 다음에 그 클래스에 대한 새로운 예시가 형성되고, 오브젝트에 대한 레퍼런스가 스택에 푸시된다.
checkcast
오브젝트가 지정된 형태인지 확인
구문:
checkcast = 192
indexbyte1
indexbyte2
스택: ..., objectref => ..., objectref
indexbyte1과 indexbyte2는 현재 클래스의 상수 풀에 인덱스를 구성하는데 사용된다. 상수 풀의 그 인덱스에서 스트링은 클래스 포인터 class로 분해될 수 있는 클래스명인 것으로 가정된다. objectref는 오브젝트에 대한 레퍼런스이어야 한다.
checkcast는 objectref가 클래스 class의 오브젝트에 대한 레퍼런스에 가해질 수 있는지를 판정한다. 널 objectref는 어떤 클래스에도 가해질 수 있다. 그렇지 않으면 참조된 오브젝트는 class의 예시 또는 그의 슈퍼클래스 중 하나이어야 한다. objectref가 class에 가해질 수 있으면, 실행은 다음 명령으로 진행하고, objectref는 스택에 남게 된다.
objectref가 class에 가해질 수 없으면 ClassCastException이 기동된다.
instanceof
오브젝트가 지정된 형태의 것인지 판정
구문:
instanceof = 193
indexbyte1
indexbyte2
스택: ..., objectref => ..., result
indexbyte1과 indexbyte2는 현재 클래스의 상수 풀에 인덱스를 구성하는데 사용된다. 상수 풀의 그 인덱스에서의 스트링은 클래스 포인터 class로 분해될 수 있는 클래스명인 것으로 가정된다. objectref는 오브젝트에 대한 레퍼런스이어야 한다.
instanceof는 objectref가 클래스 class의 오브젝트에 대한 레퍼런스인 것으로 가해질 수 있는지를 판정한다. 이 명령은 objectref가 class의 예시 또는 그의 슈퍼클래스 중 하나이면 objectref를 1로 겹쳐쓴다. 그렇지 않으면 objectref는 0으로 겹쳐쓰여진다. objectref가 널이면, 0으로 겹쳐쓰여진다.
3.18 모니터
monitorenter
코드의 모니터된 영역 들어감
구문:
monitorenter = 194
스택: ..., objectref => ...
objectref는 오브젝트에 대한 레퍼런스이어야 한다.
인터프리터는 로크(lock) 매커니즘을 통한 objectref에 대한 배타적인 액세스을 얻고자 한다. 다른 스레드(thread)가 이미 objectref를 로크했으면, 핸재의 스레드는 오브젝트의 로크가 풀릴 때까지 대기한다. 오브젝트가 로크되어 있지 않으면, 배타적인 로크를 얻는다.
objectref가 널이면, NullPointerException이 대신 기동된다.
monitorexit
코드의 모니터된 영역 나옴
구문:
monitorexit = 195
스택: ..., objectref => ...
objectref는 오브젝트에 대한 레퍼런스이어야 한다. 오브젝트에 대한 로크는 해제하였다. 이것이 이 스레드가 그 오브젝트에 대하여 갖는 최종 로크이면(하나의 스레드는 단일 오브젝트에 대하여 다중 로크를 갖도록 허용된다), 오브젝트가 이용 가능한 것을 대기하고 있는 다른 스레드가 진행하도록 허용된다.
objectref가 널이면, NullPointerException이 대신 기동된다.
부록 A: 최적화
_quick가 끝에 붙은 다음의 의사 명령 세트들은 JAVA 가상 컴퓨터 명령의 변형이다. 이들은 바이트코드를 해석하는 속도를 개선하는데 사용된다. 이들은 가상 컴퓨터 명세 또는 명령 세트의 일부는 아니고, JAVA 가상 컴퓨터 구현의 외부에서는 볼 수 없는 것이다. 그러나, 가상 컴퓨터 구현의 내부에서 이들은 효과적인 최적화로 판명되었다.
JAVA 소스 코드로부터 JAVA 가상 컴퓨터 명령 세트로의 컴파일러는 다만 non-_quick 명령만을 제거한다. _quick 의사 명령이 사용되면, _quick 변형을 갖는 non-_quick의 예시는 각각 자체 _quick 변형에 의한 실행시 겹쳐쓰여진다. 그 명령 예시에 대한 이후의 실행은 _quick 변형일 것이다.
모든 경우에 있어서, 명령이 첨자 _quick를 갖는 대안을 가지면, 명령을 상수 풀을 참조한다. _quick 최적화가 사용되면, _quick 변형을 갖는 각각의 non-_quick 명령은 다음을 수행한다.
상수 풀의 지정된 항목을 분해한다;
상수 풀의 항목이 몇가지 이유로 분해될 수 없으면 오류를 발신한다;
그것 자체를 명령의 _quick 버전으로 변환한다. 명령 putstatic, getstatic, putfield 및 getfield는 각각 2개의 _quick 버전을 갖는다;
예정된 동작을 실행한다.
이것은 명령이 _quick 변형으로 자신을 겹쳐쓰는 부가적인 스텝을 제외하고는 _quick 최적화가 없는 명령의 동작과 동일하다.
명령의 _quick 변형은 상수 풀의 항목이 이미 분해되었고, 이 분해는 어떤 오류도 발생하지 않는다고 가정한다. 이것은 분해된 항목에 대해서 예정된 동작을 간단히 실행한다.
주: 몇가지 호출 매서드만이 오브젝트의 매서드 테이블로의 단일 바이트 오프셋을 지원할 뿐이다. 256 이상의 매서드를 갖는 오브젝트에 대하여 몇몇 호출은 이런 바이트코드만으로는 빨라질 수 없다.
이 부록은 의사 명령의 opcode 값을 제공하지 않는데, 그 이유는 이들이 보이지 않고, 변경되기 때문이다.
A.1 상수 풀 분해
클래스가 판독되면, 크기가 n인 상수의 어레이 constant_pool []이 형성되고, 클래스의 한 필드에 할당된다. constant_pool [0]은 constant_pool의 어느 필드가 이미 분해되었는지를 나타내는 동적으로 할당된 어레이에 대한 포인트로 세트된다. constant_pool [1] 내지 constant_pool [nconstants-1]은 이 상수 항목에 대응하는 "형태" 필드의 포인트로 세트된다.
상수 풀을 참조하는 명령이 실행될 때, 인덱스가 발생되고, 인덱스가 이미 분해되었는지를 확인하기 위해 constant_pool [0]이 검사된다. 그렇다면, constant_pool [index]의 값이 리턴된다. 그렇지 않으면, constant_pool [index]의 값은 실제 포인터 또는 데이터로 분해되고, constant_pool [index]에 어떤 값이 존재하든지 겹쳐쓴다.
A.2 스택으로 상수를 푸시(_quick 변형)
idcl_quick
상수 풀로부터 스택으로 항목 푸시
구문:
idcl_quick
indexbyte1
스택: ...=>..., item
indexbyte1은 현재 클래스의 상수 풀로의 부호가 없는 8비트 인덱스로서 사용된다. 그 인덱스에서의 항목이 스택으로 푸시된다.
idc2_quick
상수 풀로부터 스택으로 항목 푸시
구문:
idc2_quick
indexbyte1
indexbyte2
스택: ...=>..., item
indexbyte1과 indexbyte2는 현재 클래스의 상수 풀로의 인덱스를 구성하는데 사용된다. 그 인덱스의 constant는 분해되고, 그 인덱스의 item은 스택으로 푸시된다.
idc2w_quick
상수 풀로부터 스택으로 배정도 정수 또는 배정도 부동소수점 푸시
구문:
idc2w_quick
indexbyte1
indexbyte2
스택: ...=>...,constant-word1,constant-word2
indexbyte1과 indexbyte2는 현재 클래스의 상수 풀로의 인덱스를 구성하는데 사용된다. 그 인덱스의 constant가 스택으로 푸시된다.
A.3 어레이 관리(_quick 변형)
anewarray_quick
오브젝트에 새로운 레퍼런스 어레이 할당
구문:
anewarray_quick
indexbyte1
indexbyte2
스택: ...,size=>result
size는 정수이어야 한다. 이것은 새로운 어레이에서 구성요소의 수를 나타낸다.
indexbyte1과 indexbyte2는 현재 클래스의 상수 풀로의 인덱스를 구성하는데 사용된다. 엔트리는 클래스이어야 한다.
표시된 클래스 형태와 size 구성요소를 유지할 수 있는 새로운 어레이가 할당되고, result는 이 새로운 어레이에 대한 레퍼런스이다. 지정된 클래스 형태의 size 항목을 포함할 만큼 충분히 큰 어레이의 할당이 시도된다. 어레이의 모든 구성요소는 0으로 초기화된다.
size가 0보다 적으면, NegativeArraySizeException이 기동된다. 어레이를 할당할 만큼 충분한 메모리가 존재하지 않으면, OutOfMemoryError가 기동된다.
multianewarray_quick
새로운 다차원 어레이 할당
구문:
multianewarray_quick
indexbyte1
indexbyte2
dimensions
스택: ...,size1,size2,...sizen=>result
각 size는 정수이어야 한다. 각각은 1차원 어레이에서 구성요소의 수를 나타낸다.
indexbyte1과 indexbyte2는 현재 클래스의 상수 풀로의 인덱스를 구성하는데 사용된다. 생성되는 엔트리는 클래스이어야 한다.
dimensions는 다음과 같은 양상을 갖는다.
이것은 ≥1인 정수이어야 한다. 이는 형성되는 차원의 수를 나타낸다. 이것은 ≤(어레이 클래스의 차원 수)이어야 한다.
이는 스택에서 팝되는 구성요소의 수를 나타낸다. 이 모두는 0보다 크거나 같은 정수이어야 한다. 이들은 차원의 크기로 사용된다.
스택의 size 인수 중 어느 하나가 0보다 작으면, NegativeArraySizeException이 기동된다. 어레이를 할당한 만큼 충분한 메모리가 존재하지 않으면 OutOfMemoryError가 기동된다.
result는 새로운 어레이 오브젝트에 대한 레퍼런스이다.
A.4 오브젝트 필드 조작(_quick 변형)
putfield_quick
오브젝트의 필드 설정
구문:
putfield2_quick
offset
unused
스택: ...,objectref,value=>...
objectref는 오브젝트에 대한 레퍼런스이어야 한다. value는 지정된 필드에 적합한 형태의 값이어야 한다. offset은 그 오브젝트의 필드에 대한 오프셋이다. value는 오프셋에서 오브젝트에 기록된다. objectref와 value는 모두 스택으로부터 팝된다.
objectref가 널이면, NullPointerException이 발생된다.
putfield2_quick
오브젝트의 배정도 정수 또는 배정도 부동소수점 필드 설정
구문:
putfield2_quick
offset
unused
스택: ...,objectref,value-word1,value-word2=>...
objectref는 오브젝트에 대한 레퍼런스이어야 한다. value는 지정된 필드에 적합한 형태의 값이어야 한다. offset은 그 오브젝트의 필드에 대한 오프셋이다. value는 offset에서 오브젝트에 기록된다. objectref와 value는 스택으로부터 팝된다.
objectref가 널이면, NullPointerException이 발생된다.
getfield_quick
오브젝트로부터 필드 패치
구문:
getfield_quick
offset
unused
스택: ...,objectref=>...,value
objectref는 오브젝트에 대한 조정자이어야 한다. objectref에 의해 참조된 오브젝트로의 offset의 값은 스택 최상위의 objectref를 대체한다.
objectref가 널이면, NullPointerException이 발생된다.
getfield2_quick
오브젝트로부터 필드 패치
구문:
getfield2_quick
offset
unused
스택: ...,objectref=>...,value-word1,value-word2
objectref는 오브젝트에 대한 조정자이어야 한다. objectref에 의해 참조된 오브젝트로의 오프셋의 값은 스택 최상위의 objectref를 대체한다.
objectref가 널이면, NullPointerException이 발생된다.
putstatic_quick
클래스의 스태틱 필드 설정
구문:
putstatic_quick
indexbyte1
indexbyte2
스택: ...,value=>...
indexbyte1과 indexbyte2는 현재 클래스의 상수 풀로의 인덱스를 구성하는데 사용된다. 상수 풀 항목은 클래스의 스태틱 필드에 대한 필드 레퍼런스일 것이다. 값은 그 필드에 대한 적절한 형태이어야 한다. 그 필드는 값 value를 갖도록 설정될 것이다.
putstatic2_quick
클래스의 스태틱 필드 설정
구문:
putstatic2_quick
indexbyte1
indexbyte2
스택: ...,value-word1,value-word2=>...
indexbyte1과 indexbyte2는 현재 클래스의 상수 풀로의 인덱스를 구성하는데 사용된다. 상수 풀 항목은 클래스의 스태틱 필드에 대한 필드 레퍼런스일 것이다. 그 필드는 배정도 정수 또는 배정도 부동 소수점 수 중 하나이어야 한다. value는 그 필드에 적당한 형태이어야 한다. 그 필드는 값 value를 갖도록 설정될 것이다.
getstatic_quick
클래스로부터 스태틱 필드 입수
구문:
getstatic_quick
indexbyte1
indexbyte2
스택: ...,=>...,value
indexbyte1과 indexbyte2는 현재 클래스의 상수 풀로의 인덱스를 구성하는데 사용된다. 상수 풀 항목은 클래스의 스태틱 필드에 대한 필드 레퍼런스일 것이다. 그 필드의 값은 스택의 handle를 대체할 것이다.
getstatic2_quick
클래스로부터 스태틱 필드 입수
구문:
getstatic2_quick
indexbyte1
indexbyte2
스택: ...,=>...,value-word1,value-word2
indexbyte1과 indexbyte2는 현재 클래스의 상수 풀로의 인덱스를 구성하는데 사용된다. 상수 풀 항목은 클래스의 스태틱 필드에 대한 필드 레퍼런스일 것이다. 그 필드는 배정도 정수 또는 배정도 부동 소수점 수이어야 한다. 그 필드의 값은 스택의 handle을 대체할 것이다.
A.5 매서드 호출(_quick 변형)
invokevirtual_quick
런타임 형태에 기초하여 디스패칭하는 예시 매서드 호출
구문:
invokevirtual_quick
offset
nargs
스택: ...,objectref,[arg1,[arg2...]]=>...
오퍼랜드 스택은 objectref, 오브젝트에 대한 레퍼런스 및 nargs-1 인수를 포함해야 한다. 오브젝트의 동적 형태에 의해 결정되는 것처럼 오브젝트의 매서드 테이블의 offset에서 매서드 블럭이 복원된다. 매서드 블럭은 매서드의 형태(고유의, 동기된 등)를 나타낸다.
매서드가 동기된 것으로 표시되면, 오브젝트와 연관된 모니터가 입력된다.
새로운 JAVA 스택 프레임에 대한 로컬 변수 어레이의 베이스는 스택의 objectref에 대한 포인트로 세트되고, objectref와 제공된 인수(arg1, arg2,...)는 새로운 프레임의 첫번째 nargs 로컬 변수를 구성한다. 매서드에 의해 사용된 로컬 변수의 전체 수가 결정되고, 로컬에 대해 충분한 공간이 남겨진 후 새로운 프레임에 대한 실행 환경이 푸시된다. 이 매서드 호출에 대한 오퍼랜드 스택의 베이스는 실행 환경후 첫번째 워드로 세트된다. 마직막으로 실행은 일치된 매서드의 첫번째 명령으로 계속된다.
objectref가 널이면, NullPointerException이 기동된다. 매서드 호출 동안 스택 오버플로우가 검출되면, StackOverflowError이 기동된다.
invokevirtualobject_quick
특히 어레이에 대하여 클래스 JAVA.lang.Object의 예시 매서드 호출
구문:
invokevirtualobject_quick
offset
nargs
스택: ...,objectref,[arg1,[arg2...]]=>...
오퍼랜드 스택은 objectref, 오브젝트 또는 어레이에 대한 레퍼런스 및 nargs-1 인수를 포함해야 한다. JAVA.lang.Object의 매서드 블럭의 offset에서의 매서드 블럭이 복원된다. 매서드 블럭은 매서드의 형태(고유의, 동기된 등)를 나타낸다.
매서드가 동기된 것으로 표시되면, handle과 연관된 모니터가 입력된다.
새로운 JAVA 스택 프레임에 대한 로컬 변수 어레이의 베이스는 스택의 objectref에 대한 포인트로 세트되고, objectref와 제공된 인수(arg1, arg2,...)는 새로운 프레임의 첫번째 nargs 로컬 변수를 구성한다. 매서드에 의해 사용된 로컬 변수의 전체 수가 결정되고, 로컬에 대해 충분한 공간이 남겨진 후 새로운 프레임의 실행 환경이 푸시된다. 이 매서드 호출에 대한 오퍼랜드 스택의 베이스는 실행 환경 후 첫번째 워드로 세트된다. 마지막으로, 실행은 일치된 매서드의 첫번째 명령으로 계속된다.
objectref가 널이면, NullPointerException이 기동된다. 매서드 호출 동안 스택 오버플로우가 검출되면, StackOverflowError가 기동된다.
invokenonvirtual_quick
컴파일 시간 형태에 기초하여 디스패칭하는 예시 매서드 호출
구문:
invokenonvirtual_quick
indexbyte1
indexbyte2
스택: ...,objectref,[arg1,[arg2...]]=>...
오퍼랜드 스택은 objectref, 오브젝트에 대한 레퍼런스 및 소수의 인수를 포함해야 한다. indexbyte1과 indexbyte2는 현재 클래스의 상수 풀로의 인덱스를 구성하는데 사용된다. 상수 풀의 그 인덱스에 대한 항목은 매서드 슬롯 인덱스와 클래스에 대한 포인터를 포함한다. 표시된 클래스의 매서드 슬롯 인덱스에서의 매서드 블럭이 복원된다. 매서드 블럭은 매서드의 형태(고유의, 동기된 등)와 오퍼랜드 스택에 예측된 인수의 수(nargs)를 나타낸다.
매서드가 동기된 것으로 표시되면, 오브젝트와 연관된 모니터가 입력된다.
새로운 JAVA 스택 프레임에 대한 로컬 변수 어레이의 베이스는 스택의 objectref에 대한 포인트로 세트되고, objectref와 제공된 인수(arg1, arg2,...)는 새로운 프레임의 첫번째 nargs 로컬 변수를 구성한다. 매서드에 의해 사용된 로컬 변수의 전체 수가 결정되고, 로컬에 대하여 충분한 공간이 남겨진 후 새로운 프레임의 실행 환경이 푸시된다. 이 매서드 호출에 대한 오퍼랜드 스택의 베이스는 실행 환경후 첫번째 워드로 세트된다. 마지막으로, 실행은 일치된 매서드의 첫번째 명령으로 계속된다.
objectref가 널이면, NullPointerException이 기동된다. 매서드 호출 동안 스택 오버플로우가 검출되면, StackOverflowError가 기동된다.
invokestatic_quick
클래스(스태틱) 매서드 호출
구문:
invokestatic_quick
indexbyte1
indexbyte2
스택: ...,[arg1,[arg2...]]=>...
오퍼랜드 스택은 소수의 인수를 포함해야 한다. indexbyte1과 indexbyte2는 현재 클래스의 상수 풀로의 인덱스를 구성하는데 사용된다. 상수 풀의 그 인덱스에서의 항목은 매서드 슬롯 인덱스와 클래스에 대한 포인터를 포함한다. 표시된 클래스의 매서드 슬롯 인덱스에서의 매서드 블럭이 복원된다. 매서드 블럭은 매서드의 형태(고유의, 동기된 등)와 오퍼랜드 스택에 예측된 인수의 수(nargs)를 나타낸다.
매서드가 동기된 것으로 표시되면, 매서드의 클래스와 연관된 모니터가 입력된다.
새로운 JAVA 스택 프레임에 대한 로컬 변수 어레이의 베이스는 스택의 첫번째 인수에 대한 포인트로 세트되고, 제공된 인수(arg1, arg2,...)는 새로운 프레임의 첫번째 nargs 로컬 변수를 구성한다. 매서드에 의해 사용된 로컬 변수의 전체 수가 결정되고, 로컬에 대해 충분한 공간이 남겨진 후 새로운 프레임의 실행 환경이 푸시된다. 이 매서드 호출에 대한 오퍼랜드 스택의 베이스는 실행 환경후 첫번째 워드로 세트된다. 마지막으로, 실행은 일치된 매서드의 첫번째 명령으로 계속된다.
오퍼랜드 스택의 오브젝트 조정자가 널이면, NullPointerException이 기동된다. 매서드 호출 동안 스택 오버플로우가 검출되면, StackOverflowError가 기동된다.
invokeinterface_quick
인터페이스 매서드 호출
구문:
invokeinterface_quick
idbyte1
idbyte2
narg2
guess
스택: ...,objectref,[arg1,[arg2...]]=>...
오퍼랜드 스택은 objectref, 오브젝트에 대한 레퍼런스 및 nargs-1 인수를 포함해야 한다. idbyte1과 idbyte2는 현재 클래스의 상수 풀로의 인덱스를 구성하는데 사용된다. 상수 풀의 그 인덱스에서의 항목은 완전한 매서드 기호를 포함한다. 오브젝트의 매서드 테이블에 대한 포인터는 오브젝트 handle로부터 복원된다.
매서드 기호는 오브젝트의 매서드 테이블에서 검색된다. 용이한 방법으로서, 슬롯 guess에서의 매서드 기호가 제일 먼저 검색된다. 이것이 실패하면, 매서드 테이블에 대한 완전한 검색이 실행된다. 매서드 기호는 테이블의 매서드 기호들 중 하나와 정확히 일치하도록 제공된다.
매서드가 동기된 것으로 표시되면, handle과 연관된 모니터가 입력된다.
새로운 JAVA 스택 프레임에 대한 로컬 변수 어레이의 베이스는 스택의 handle에 대한 포인트로 세트되고, handle과 제공된 인수(arg1, arg2,...)는 새로운 프레임의 첫번째 nargs 로컬 변수를 구성한다. 매서드에 의해 사용된 로컬 변수의 전체 수가 결정되고, 로컬에 대하여 충분한 공간이 남겨진 후 새로운 프레임의 실행 환경이 푸시된다. 이 매서드 호출에 대한 오퍼랜드 스택의 베이스는 실행 환경후 첫번째 워드로 세트된다. 마지막으로, 실행은 일치된 매서드의 첫번째 명령으로 계속된다.
objectref가 널이면, NullPointerException이 기동된다. 매서드 호출 동안 스택 오버플로우가 검출되면, StackOverflowError가 기동된다.
guess는 최종 추측이다. 각각의 시간 동안 추측은 사용되었던 매서드 오프셋으로 세트된다.
A.6 다양한 오브젝트 동작(_quick 변형)
new_quick
새로운 오브젝트 형성
구문:
new_quick
indexbyte1
indexbyte2
스택: ...=>...,objectref
indexbyte1과 indexbyte2는 현재 클래스의 상수 풀로의 인덱스를 구성하는데 사용된다. 그 인덱스에서의 항목은 클래스이어야 한다. 다음에, 그 클래스에 대한 새로운 예시가 형성되고, 그 오브젝트에 대한 레퍼런스 objectref가 스택에 푸시된다.
checkcast_quick
오브젝트가 지정된 형태인지 확인
구문:
checkcst_quick
indexbyte1
indexbyte2
스택: ...,objectref=>...,objectref
objectref는 오브젝트에 대한 레퍼런스이어야 한다. indexbyte1과 indexbyte2는 현재 클래스의 상수 풀로의 인덱스를 구성하는데 사용된다. 상수 풀의 그 인덱스에서의 오브젝트는 이미 분해되었음에 틀림없다.
다음에 checkcast는 objectref가 클래스 class의 오브젝트에 대한 레퍼런스로 가해질 수 있는지 판정한다. 널 레퍼런스가 어떤 class에도 가해질 수 있고, 그렇지 않으면 objectref 형태의 슈퍼클래스가 class에 대해 검색된다. 클래스가 objectref 형태의 슈퍼클래스인 것으로 결정되거나 objectref가 널이면, objectref에 가해질 수 있다. class에 가해질 수 없으면 ClassCastException이 기동된다.
instanceof_quick
오브젝트가 지정된 형태인지 판정
구문:
instanceof_quick
indexbyte1
indexbyte2
스택: ...,objectref=>...,result
objectref는 오브젝트에 대한 레퍼런스이어야 한다. indexbyte1과 indexbyte2는 현재 클래스의 상수 풀로의 인덱스를 구성하는데 사용된다. 상수 풀의 그 인덱스에서의 클래스 class의 항목은 이미 분해되었음에 틀림없다.
instanceof는 objectref가 클래스 class의 오브젝트에 가해질 수 있는지를 판정한다. 널 objectref가 어떤 class에도 가해질 수 있고, 그렇지 않으면 objectref 형태의 슈퍼클래스가 class에 대해 검색된다. class가 objectref 형태의 슈퍼클래스인 것으로 결정되면, result는 1(참)이다. 그렇지 않으면, result는 0(거짓)이다. handle이 널이면, result는 0(거짓)이다.
본 발명은 어레이 액세스 경계를 구현하고, 어레이 액세스 경계 검사를 가속하기 위해 내용 참조 가능 메모리 액세스와 같은 완전한 연관 메모리를 이용하고, 이에 의해 어레이 정보를 검색하고, 종래의 시스템에 대한 어레이 크기를 확인하는데 필요한 시간이 감소된다.

Claims (11)

  1. 어레이에 대한 각각의 액세스가 최대 어레이 크기 경계값과 최소 어레이 크기 경계값내에 있는지를 확인하도록 구성된 어레이 경계 검사 장치에 있어서,
    어레이내의 구성요소의 위치값을 참조하는 복수의 어레이 액세스 명령 중 하나와 연관되는 어레이 크기값을 저장하고 검색하도록 구성된 연관 메모리 수단(associative memory element)과,
    연관 메모리 수단의 출력부에 실행 가능하게 연결되고, 지정된 최대 어레이 크기값과 상기 어레이내의 참조된 구성요소의 위치값을 비교하여, 상기 어레이내의 참조된 구성요소의 위치값이 상기 지정된 최대 어레이 크기값보다 크면 최대 위반 신호(maximum violation signal)를 제공하도록 구성된 제 1 비교 수단과,
    연관 메모리 수단의 출력부에 실행 가능하게 연결되고, 지정된 최소 어레이 크기값과 상기 어레이내의 참조된 구성요소의 위치값을 비교하여, 상기 어레이내의 참조된 구성요소의 위치값이 상기 지정된 최소 어레이 크기값보다 작으면 최소 위반 신호(minimum violation signal)를 제공하도록 구성된 제 2 비교 수단을
    포함하는 것을 특징으로 하는 어레 경계 검사 장치.
  2. 제 1 항에 있어서,
    상기 제 1 및 제 2 비교 수단에 실행 가능하게 연결되고, 상기 최대 위반 신호 또는 최소 위반 신호 중 어느 한 신호의 수신에 응답하여 예외 신호(exception signal)를 제공하도록 구성된 예외 수단(exception element)을 추가로 포함하는 것을 특징으로 하는 어레이 경계 검사 장치.
  3. 제 1 항에 있어서,
    상기 연관 메모리 수단은 추가로
    각각이 상기 복수의 어레이 액세스 명령 중 하나에 대응하는 복수의 어레이 참조 엔트리를 수신하고 저장하도록 구성되며, 각각이 상기 복수의 어레이 참조 엔트리 중 하나를 저장하도록 구성된 복수의 제 1 메모리 기억장소를 포함하는 제 1 메모리부와,
    상기 제 1 메모리부에 연결되고, 어레이 액세스 명령을 식별하는 어레이 액세스 명령 식별자를 수신하며, 동시에 상기 어레이 액세스 명령 식별자와 상기 저장된 어레이 참조 엔트리의 각각의 적어도 일부를 비교하도록 구성된 입력부와,
    복수의 어레이 크기값을 수신하고 저장하는 복수의 제2 메모리 기억장소를 갖는 제2 메모리부-여기서, 상기 복수의 제2 메모리 기억장소의 각각은 상기 어레이 크기값의 하나를 저장하며 상기 복수의 제1 메모리 기억장소와 연관되고, 상기 복수의 어레이 크기값의 각각은 상기 복수의 어레이 액세스 명령 중 하나와 연관되며 최대 어레이 크기값 및 최소 어레이 크기값을 포함함-를 구비하고,
    상기 연관 메모리 수단의 상기 출력부는 상기 제 2 메모리부에 실행 가능하게 연결되고, 어레이 크기 출력값으로서 어레이 액세스 명령 식별자와 일치하는 상기 복수의 어레이 참조 엔트리 중 하나가 저장되는 상기 복수의 제 1 메모리 기억장소 중 하나와 연관되는 상기 복수의 제 2 메모리 기억장소 중 하나에 저장된 상기 복수의 어레이 크기값 중 하나를 어레이 크기 출력값으로서 제공하도록 구성되는 것을 특징으로 하는 어레이 경계 검사 장치.
  4. 어레이의 참조된 구성요소가 최대 어레이 크기 경계값과 최소 어레이 크기 경계값내에 있는지를 확인하도록 구성된 어레이 경계 검사 장치에 있어서,
    (a) 각각이 상기 어레이내 구성요소의 위치값을 참조하는 복수의 어레이 액세스 명령 중 하나와 연관되는 어레이 크기값을 저장하고 검색하도록 구성되는 연관 메모리 수단-여기서, 상기 연관 메모리 수단은
    (ⅰ) 각각이 상기 복수의 어레이 액세스 명령 중 하나에 대응하는 복수의 어레이 참조 엔트리를 검색하고 저장하도록 구성되며, 각각이 상기 복수의 어레이 참조 엔트리 중 하나를 저장하도록 구성되는 복수의 제 1 메모리 기억장소를 포함하는 제 1 메모리부와,
    (ⅱ) 각각이 복수의 어레이 액세스 명령 중 하나와 연관되고, 최대 어레이 크기값과 최소 어레이 크기값을 포함하는 복수의 어레이 크기값을 수신하고 저장하도록 구성되고, 각각이 어레이 크기값 중 하나를 저장하도록 구성되고, 복수의 제 1 메모리 기억장소 중 하나에 연관되는 복수의 제 2 메모리 기억장소를 포함하는 제 2 메모리부와,
    (ⅲ) 상기 제 1 메모리부에 실행 가능하게 연결되고, 어레이 액세스 명령을 식별하는 어레이 액세스 명령 식별자를 수신하고, 동시에 상기 어레이 액세스 명령 식별자와 저장된 어레이 참조 엔트리의 각각의 적어도 일부를 비교하는 입력부와,
    (ⅳ) 상기 제 2 메모리부에 실행 가능하게 연결되고, 어레이 크기 출력값으로서 어레이 액세스 명령 식별자와 일치하는 복수의 어레이 참조 엔트리 중 하나가 저장되는 복수의 제 1 메모리 기억장소 중 하나와 연관되는 복수의 제 2 메모리 기억장소 중 하나에 저장된 복수의 어레이 크기값 중 하나를 제공하도록 구성된 출력부를 포함함-과,
    (b) 상기 출력부에 실행 가능하게 연결되고, 최대 어레이 크기 출력값과 상기 어레이내의 상기 어레이내의 참조된 구성요소의 위치값을 비교하고, 상기 어레이내의 참조된 구성요소의 위치값이 최대 어레이 크기 출력값보다 크면 최대 위반 신호를 제공하도록 구성된 제 1 비교 수단과,
    (c) 상기 출력부에 실행 가능하게 연결되고, 최소 어레이 크기 출력값과 상기 어레이내의 참조된 구성요소의 위치값을 비교하고, 상기 어레이내의 참조된 구성요소의 위치값이 최소 어레이 크기 출력값보다 작으면 최소 위반 신호를 제공하도록 구성된 제 2 비교 수단과,
    (d) 상기 제 1 및 제 2 비교 수단에 실행 가능하게 연결되고, 최대 위반 신호 또는 최소 위반 신호 중 어느 한 신호의 수신에 응답하여 예외 출력 신호를 제공하도록 구성된 예외 수단을
    포함하는 것을 특징으로 하는 어레이 경계 검사 장치.
  5. 어레이의 참조된 구성요소가 최대 어레이 크기 경계값과 최소 어레이 크기 경계값내에 있는지를 확인하는 방법에 있어서,
    각각이 복수의 어레이 참조 엔트리 중 하나를 저장하도록 구성된 복수의 제 1 메모리 기억장소를 포함하는 제 1 메모리부에 각각이 복수의 어레이 액세스 명령 중 하나에 대응하는 복수의 어레이 참조 엔트리를 저장하는 단계와,
    각각이 복수의 제 1 메모리 기억장소 중 하나와 연관되는 복수의 제 2 메모리 기억장소를 포함하는 제 2 메모리부에 복수의 어레이 명령 중 하나와 연관되고 최대 어레이 크기값과 최소 어레이 크기값을 포함하는 복수의 어레이 크기값을 저장하는 단계와,
    동시에 어레이 액세스 명령을 식별하는 어레이 액세스 명령 식별자와 상기 저장된 복수의 어레이 참조 엔트리의 각각의 적어도 일부를 비교하는 단계와.
    어레이 액세스 명령 식별자와 일치하는 복수의 어레이 참조 엔트리 중 하나가 저장되는 복수의 제 1 메모리 기억장소 중 하나와 연관되는 복수의 제 2 메모리 기억장소 중 하나에 저장된 복수의 어레이 크기값 중 하나를 어레이 크기 출력값으로서 제공하는 단계-여기서, 상기 어레이 크기 출력값은 상기 최대 어레이 크기값을 최대 어레이 크기 출력값으로, 상기 최소 어레이 크기값을 최소 어레이 크기 출력값으로 포함함-와,
    상기 최대 어레이 크기 출력값과 상기 어레이내의 참조된 구성요소의 위치값을 비교하고, 상기 어레이내의 참조된 구성요소의 위치값이 최대 어레이 크기 출력값보다 크면 최대 위반 신호를 발생하는 단계와,
    최소 어레이 크기 출력값과 상기 어레이내의 참조된 구성요소의 위치값을 비교하고, 상기 어레이내의 참조된 구성요소의 위치값이 최소 어레이 크기 출력값보다 작으면 최소 위반 신호를 발생하는 단계와,
    최대 위반 신호 또는 최소 위반 신호 중 어느 한 신호의 발생에 응답하여 예외 출력 신호를 제공하는 단계를
    포함하는 것을 특징으로 하는 방법.
  6. 어레이의 참조된 구성요소가 최대 어레이 크기 경계값과 최소 어레이 크기 경계값내에 있는지를 확인하는 방법에 있어서,
    각각이 어레이내 구성요소의 위치값을 참조하는 복수의 어레이 액세스 명령 중 하나와 연관되는 어레이 크기값을 저장하고 검색하도록 구성된 연관 메모리 수단을 제공하는 단계와,
    상기 연관 메모리 수단의 출력부에 실행 가능하게 연결되고, 지정된 최대 어레이 크기값과 상기 어레이내의 참조된 구성요소의 위치값을 비교하고, 상기 어레이내의 참조된 구성요소의 위치값이 지정된 최대 어레이 크기값보다 크면 최대 위반 신호를 제공하도록 구성된 제 1 비교 수단을 제공하는 단계와,
    상기 연관 메모리 수단의 출력부에 실행 가능하게 연결되고, 지정된 최소 어레이 크기값과 상기 어레이내의 참조된 구성요소의 위치값을 비교하고, 상기 어레이내의 참조된 구성요소의 위치값이 지정된 최소 어레이 크기값보다 작으면 최소 위반 신호를 제공하도록 구성된 제 2 비교 수단을 제공하는 단계와,
    상기 제 1 및 제 2 비교 수단에 실행 가능하게 연결되고, 최대 위반 신호 또는 최소 위반 신호 중 어느 한 신호의 수신에 응답하여 예외 신호를 제공하도록 구성된 예외 수단을 제공하는 단계를
    포함하는 것을 특징으로 하는 방법.
  7. 제 6 항에 있어서,
    각각이 복수의 어레이 액세스 명령 중 하나에 대응하는 복수의 어레이 참조 엔트리를 수신하고 저장하도록 구성되고, 각각이 복수의 어레이 참조 엔트리 중 하나를 저장하도록 구성되는 복수의 제 1 메모리 기억장소를 포함하는 연관 메모리 수단에 제 1 메모리부를 제공하는 단계와,
    상기 제 1 메모리부에 실행 가능하게 연결되고, 어레이 액세스 명령을 식별하는 어레이 액세스 명령 식별자를 수신하고, 동시에 어레이 액세스 명령 식별자와 저장된 복수의 어레이 참조 엔트리의 각각의 적어도 일부를 비교하도록 구성된 입력부를 제공하는 단계와,
    각각이 복수의 어레이 액세스 명령 중 하나와 연관되고, 최대 어레이 크기값과 최소 어레이 크기값을 포함하는 복수의 어레이 크기값을 수신하고 저장하도록 구성되고, 각각이 어레이 크기값 중 하나를 저장하도록 구성되고, 복수의 제 1 메모리 기억장소 중 하나와 연관되는 복수의 제 2 메모리 기억장소를 포함하는 연관 메모리 수단의 제 2 메모리부를 제공하는 단계와,
    상기 제 2 메모리부에 실행 가능하게 연결되고, 어레이 크기 출력값으로서 어레이 액세스 명령 식별자와 일치하는 복수의 어레이 참조 엔트리 중 하나가 저장되는 복수의 제 1 메모리 기억장소 중 하나와 연관되는 복수의 제 2 메모리 기억장소 중 하나에 저장된 복수의 어레이 크기값 중 하나를 제공하도록 구성된 출력부를 제공하는 단계를
    추가로 포함하는 것을 특징으로 하는 방법.
  8. 어레이의 참조된 구성요소가 최대 어레이 크기 경계값과 최소 어레이 크기 경계값내에 있는지를 확인하도록 구성된 어레이 경계 검사 장치를 제공하는 방법에 있어서,
    (a) 각각이 복수의 어레이 액세스 명령 중 하나와 연관되는 복수의 어레이 크기값을 저장하고 검색하도록 구성되는 연관 메모리 수단-여기서, 상기 연관 메모리 수단은
    (ⅰ) 각각이 복수의 어레이 액세스 명령 중 하나에 대응하는 복수의 어레이 참조 엔트리를 검색하고 저장하도록 구성되고, 각각이 복수의 어레이 참조 엔트리 중 하나를 저장하도록 구성되는 복수의 제 1 메모리 기억장소를 포함하는 제 1 메모리부와,
    (ⅱ) 각각이 복수의 어레이 액세스 명령 중 하나와 연관되고, 최대 어레이 크기값과 최소 어레이 크기값을 포함하는 복수의 어레이 크기값을 수신하고 저장하도록 구성되고, 각각이 어레이 크기값 중 하나를 저장하도록 구성되고, 복수의 제 1 메모리 기억장소 중 하나에 연관되는 복수의 제 2 메모리 기억장소를 포함하는 제 2 메모리부와,
    (ⅲ) 상기 제 1 메모리부에 실행 가능하게 연결되고, 어레이 액세스 명령을 식별하는 어레이 액세스 명령 식별자를 수신하고, 동시에 상기 어레이 액세스 명령 식별자와 저장된 복수의 어레이 참조 엔트리의 각각의 적어도 일부를 비교하는 입력부와,
    (ⅳ) 상기 제 2 메모리부에 실행 가능하게 연결되고, 어레이 액세스 명령 식별자와 일치하는 복수의 어레이 참조 엔트리 중 하나가 저장되는 복수의 제 1 메모리 기억장소 중 하나와 연관되는 복수의 제 2 메모리 기억장소 중 하나에 저장된 복수의 어레이 크기값 중 하나를 어레이 크기 출력값으로서 제공하도록 구성된 출력부를 포함함-을 제공하는 단계와,
    (b) 상기 출력부에 실행 가능하게 연결되고, 최대 어레이 크기 출력값과 상기 어레이내의 참조된 구성요소의 위치값을 비교하고, 상기 어레이내의 참조된 구성요소의 위치값이 최대 어레이 크기 출력값보다 크면 최대 위반 신호를 제공하도록 구성된 제 1 비교 수단을 제공하는 단계와,
    (c) 상기 출력부에 실행 가능하게 연결되고, 최소 어레이 크기 출력값과 상기 어레이내의 참조된 구성요소의 위치값을 비교하고, 상기 어레이내의 참조된 구성요소의 위치값이 최소 어레이 크기 경계값보다 작으면 최소 위반 신호를 제공하도록 구성된 제 2 비교 수단을 제공하는 단계와,
    (d) 상기 제 1 및 제 2 비교 수단에 실행 가능하게 연결되고, 최대 위반 신호 또는 최소 위반 신호 중 어느 한 신호의 수신에 응답하여 예외 출력 신호를 제공하도록 구성된 예외 수단을 제공하는 단계를
    포함하는 것을 특징으로 하는 방법.
  9. 컴퓨터 시스템에 있어서,
    소프트웨어 프로그램을 수신하고 변역하고, 이 소프트웨어 프로그램에 따라 복수의 어레이 액세스 명령을 포함하는 복수의 번역된 명령과, 각각이 복수의 번역된 명령 중 하나에 대응하는 복수의 명령 식별자를 제공하도록 구성된 번역 유닛과,
    복수의 명령 식별자에 따라 복수의 번역된 명령을 수신하고, 수신된 번역된 명령을 실행하도록 구성된 실행 유닛과,
    각각이 어레이내 구성요소의 위치값을 참조하는 복수의 어레이 액세스 명령 중 하나와 연관되는 어레이 크기값을 저장하고 검색하도록 구성된 연관 메모리 수단과,
    상기 연관 메모리 수단의 출력부에 실행 가능하게 연결되고, 지정된 최대 어레이 크기값과 상기 어레이내의 참조된 구성요소의 위치값을 비교하고, 상기 어레이내의 참조된 구성요소의 위치값이 지정된 최대 어레이 크기값보다 크면 최대 위반 신호를 제공하도록 구성된 제 1 비교 수단과,
    상기 연관 메모리 수단의 출력부에 실행 가능하게 연결되고, 지정된 최소 어레이 크기값과 상기 어레이내의 참조된 구성요소의 위치값을 비교하고, 상기 어레이내의 참조된 구성요소의 위치값이 지정된 최소 어레이 크기값보다 작으면 최소 위반 신호를 제공하도록 구성된 제 2 비교 수단과,
    상기 제 1 및 제 2 비교 수단와 상기 실행 유닛에 실행 가능하게 연결되고, 최대 위반 신호 또는 최소 위반 신호 중 어느 한 신호의 수신에 응답하여 실행 유닛에 예외 신호를 제공하도록 구성된 예외 수단을
    포함하는 것을 특징으로 하는 컴퓨터 시스템.
  10. 제 9 항에 있어서,
    상기 연관 메모리 수단은
    각각이 복수의 어레이 액세스 명령 중 하나에 대응하는 복수의 어레이 참조 엔트리를 수신하고 저장하도록 구성되고, 각각이 복수의 어레이 참조 엔트리 중 하나를 저장하도록 구성되는 복수의 제 1 메모리 기억장소를 포함하는 제 1 메모리부와,
    상기 제 1 메모리부에 실행 가능하게 연결되고, 어레이 액세스 명령을 식별하는 어레이 액세스 명령 식별자를 수신하고, 동시에 어레이 액세스 명령 식별자와 저장된 복수의 어레이 참조 엔트리의 각각의 적어도 일부를 비교하도록 구성된 입력부와,
    각각이 복수의 어레이 액세스 명령 중 하나와 연관되고, 최대 어레이 크기값과 최소 어레이 크기값을 포함하는 복수의 어레이 크기값을 수신하고 저장하도록 구성되고, 각각이 어레이 크기값 중 하나를 저장하고, 복수의 제 1 메모리 기억장소 중 하나와 연관되는 복수의 제 2 메모리 기억장소를 포함하는 제 2 메모리부를 추가로 포함하고,
    상기 연관 메모리 수단의 출력부는 상기 제 2 메모리부에 실행 가능하게 연결되고, 어레이 크기 출력값으로서 어레이 액세스 명령 식별자와 일치하는 복수의 어레이 참조 엔트리 중 하나가 저장되는 복수의 제 1 메모리 기억장소 중 하나와 연관되는 복수의 제 2 메모리 기억장소 중 하나에 저장된 복수의 어레이 크기값 중 하나를 제공하도록 구성되는 것을 특징으로 하는 컴퓨터 시스템.
  11. 컴퓨터 시스템에 있어서,
    소프트웨어 프로그램을 수신하고 번역하고, 이 소프트웨어 프로그램에 따라 복수의 어레이 액세스 명령을 포함하는 복수의 번역된 명령과, 각각이 복수의 번역된 명령 중 하나에 대응하는 복수의 명령 식별자를 제공하도록 구성된 번역 유닛과,
    복수의 명령 식별자에 따라 복수의 번역된 명령을 수신하고, 수신된 번역된 명령을 실행하는 실행 유닛과,
    각각이 복수의 어레이 액세스 명령 중 하나와 연관되는 복수의 어레이 크기값을 저장하고 검색하도록 구성되는 연관 메모리 수단-여기서, 상기 연관 메모리 수단은
    (ⅰ) 각각이 복수의 어레이 액세스 명령 중 하나에 대응하는 복수의 어레이 참조 엔트리를 검색하고 저장하도록 구성되고, 각각이 복수의 어레이 참조 엔트리 중 하나를 저장하도록 구성되는 복수의 제 1 메모리 기억장소를 포함하는 제 1 메모리부와,
    (ⅱ) 각각이 복수의 어레이 액세스 명령 중 하나와 연관되고, 최대 어레이 크기값과 최소 어레이 크기값을 포함하는 복수의 어레이 크기값을 수신하고 저장하도록 구성되고, 각각이 어레이 크기값 중 하나를 저장하도록 구성되고, 복수의 제 1 메모리 기억장소 중 하나에 연관되는 복수의 제 2 메모리 기억장소를 포함하는 제 2 메모리부와,
    (ⅲ) 상기 제 1 메모리부에 실행 가능하게 연결되고, 어레이 액세스 명령을 식별하는 어레이 액세스 명령 식별자를 수신하고, 동시에 상기 어레이 액세스 명령 식별자와 복수의 저장된 어레이 참조 엔트리의 각각의 적어도 일부를 비교하는 입력부와,
    (ⅳ) 상기 제 2 메모리부에 실행 가능하게 연결되고, 어레이 크기 출력값으로서 어레이 액세스 명령 식별자와 일치하는 복수의 어레이 참조 엔트리 중 하나가 저장되는 복수의 제 1 메모리 기억장소 중 하나와 연관되는 복수의 제 2 메모리 기억장소 중 하나에 저장된 복수의 어레이 크기값 중 하나를 제공하도록 구성된 출력부를 구비함-과,
    상기 연관 메모리 수단의 출력부에 실행 가능하게 연결되고, 상기 어레이내의 참조된 구성요소의 위치값과 최대 어레이 크기 출력값을 비교하고, 상기 어레이내의 참조된 구성요소의 위치값이 최대 어레이 크기 출력값보다 크면 최대 위반 신호를 제공하도록 구성된 제 1 비교 수단과,
    상기 연관 메모리 수단의 출력부에 실행 가능하게 연결되고, 상기 어레이내의 참조된 구성요소의 위치값과 최소 어레이 크기 출력값을 비교하고, 상기 어레이내의 참조된 구성요소의 위치값이 최소 어레이 크기 출력값보다 작으면 최소 위반 신호를 제공하도록 구성된 제 2 비교 수단과,
    상기 제 1 및 제 2 비교 수단와 상기 실행 유닛에 실행 가능하게 연결되고, 최대 위반 신호 또는 최소 위반 신호 중 어느 한 신호의 수신에 응답하여 실행 유닛에 예외 출력 신호를 제공하도록 구성된 예외 수단을 포함하고,
    상기 실행 유닛은 어레이 액세스 경계 예외 서브루틴을 정의하는 번역된 명령의 시퀀스를 실행함으로써 예외 출력 신호에 응답하도록 구성되는 것을 특징으로 하는 컴퓨터 시스템.
KR10-1998-0705676A 1996-01-24 1997-01-23 어레이경계검사방법및장치와,이를포함하는컴퓨터시스템 KR100466722B1 (ko)

Applications Claiming Priority (5)

Application Number Priority Date Filing Date Title
US1052796P 1996-01-24 1996-01-24
US64224896A 1996-05-02 1996-05-02
US08/642,248 1996-05-02
US8/642,248 1996-05-02
US60/010,527 1996-05-07

Publications (2)

Publication Number Publication Date
KR19990081958A KR19990081958A (ko) 1999-11-15
KR100466722B1 true KR100466722B1 (ko) 2005-04-14

Family

ID=26681279

Family Applications (1)

Application Number Title Priority Date Filing Date
KR10-1998-0705676A KR100466722B1 (ko) 1996-01-24 1997-01-23 어레이경계검사방법및장치와,이를포함하는컴퓨터시스템

Country Status (6)

Country Link
US (1) US6014723A (ko)
EP (1) EP0976050B1 (ko)
JP (1) JP2000501217A (ko)
KR (1) KR100466722B1 (ko)
DE (1) DE69713400T2 (ko)
WO (1) WO1997027544A1 (ko)

Families Citing this family (103)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1178504C (zh) * 1997-03-21 2004-12-01 卡纳尔股份有限公司 向mpeg接收/译码器下载数据的方法和mpeg传输系统
US6343375B1 (en) * 1998-04-24 2002-01-29 International Business Machines Corporation Method for optimizing array bounds checks in programs
WO2000026902A1 (en) * 1998-11-04 2000-05-11 Syvox Corporation Apparatus and method for improved memory and resource management in a single-user or multi-user speech recognition system
US6233725B1 (en) * 1998-12-03 2001-05-15 International Business Machines Corporation Method and apparatus to coordinate and control the simultaneous use of multiple just in time compilers with a java virtual machine
US20050149694A1 (en) * 1998-12-08 2005-07-07 Mukesh Patel Java hardware accelerator using microcode engine
US7225436B1 (en) * 1998-12-08 2007-05-29 Nazomi Communications Inc. Java hardware accelerator using microcode engine
US6332215B1 (en) * 1998-12-08 2001-12-18 Nazomi Communications, Inc. Java virtual machine hardware for RISC and CISC processors
JP4235299B2 (ja) * 1998-12-22 2009-03-11 キヤノン株式会社 カラー画像形成装置の製造方法
FR2790844B1 (fr) * 1999-03-09 2001-05-25 Gemplus Card Int Procede et dispositif de surveillance du deroulement d'un programme, dispositif programme permettant la surveillance de son programme
US6363523B1 (en) * 1999-11-12 2002-03-26 Sun Microsystems, Inc. Optimization of N-base typed arithmetic expressions
US8453133B2 (en) 1999-11-12 2013-05-28 Oracle America, Inc. Optimization of N-base typed arithmetic instructions via rework
JP3556556B2 (ja) * 2000-02-08 2004-08-18 株式会社東芝 命令コード変換装置及び情報処理システム
US6578094B1 (en) * 2000-03-02 2003-06-10 International Business Machines Corporation Method for preventing buffer overflow attacks
US7028170B2 (en) * 2000-03-08 2006-04-11 Sun Microsystems, Inc. Processing architecture having a compare capability
AU2001245519A1 (en) * 2000-03-08 2001-09-17 Sun Microsystems, Inc. Processing architecture having an array bounds check capability
US6408383B1 (en) * 2000-05-04 2002-06-18 Sun Microsystems, Inc. Array access boundary check by executing BNDCHK instruction with comparison specifiers
US6782407B1 (en) * 2000-09-26 2004-08-24 Koninklijke Philips Electronics N.V. System and method for low overhead boundary checking of java arrays
GB2367654B (en) 2000-10-05 2004-10-27 Advanced Risc Mach Ltd Storing stack operands in registers
GB2367653B (en) 2000-10-05 2004-10-20 Advanced Risc Mach Ltd Restarting translated instructions
US20020069402A1 (en) * 2000-10-05 2002-06-06 Nevill Edward Colles Scheduling control within a system having mixed hardware and software based instruction execution
EP1197847A3 (en) * 2000-10-10 2003-05-21 Nazomi Communications Inc. Java hardware accelerator using microcode engine
US8176296B2 (en) 2000-10-26 2012-05-08 Cypress Semiconductor Corporation Programmable microcontroller architecture
US6724220B1 (en) 2000-10-26 2004-04-20 Cyress Semiconductor Corporation Programmable microcontroller architecture (mixed analog/digital)
US8160864B1 (en) 2000-10-26 2012-04-17 Cypress Semiconductor Corporation In-circuit emulator and pod synchronized boot
US8103496B1 (en) 2000-10-26 2012-01-24 Cypress Semicondutor Corporation Breakpoint control in an in-circuit emulation system
US8149048B1 (en) 2000-10-26 2012-04-03 Cypress Semiconductor Corporation Apparatus and method for programmable power management in a programmable analog circuit block
GB2369464B (en) 2000-11-27 2005-01-05 Advanced Risc Mach Ltd A data processing apparatus and method for saving return state
US7076771B2 (en) 2000-12-01 2006-07-11 Arm Limited Instruction interpretation within a data processing system
US7284274B1 (en) * 2001-01-18 2007-10-16 Cigital, Inc. System and method for identifying and eliminating vulnerabilities in computer software applications
US7137103B2 (en) * 2001-03-08 2006-11-14 International Business Machines Corporation Coverage analysis of message flows
GB2376099B (en) * 2001-05-31 2005-11-16 Advanced Risc Mach Ltd Program instruction interpretation
GB2376098B (en) * 2001-05-31 2004-11-24 Advanced Risc Mach Ltd Unhandled operation handling in multiple instruction set systems
GB2376097B (en) 2001-05-31 2005-04-06 Advanced Risc Mach Ltd Configuration control within data processing systems
GB2376100B (en) * 2001-05-31 2005-03-09 Advanced Risc Mach Ltd Data processing using multiple instruction sets
US6975679B2 (en) * 2001-06-01 2005-12-13 Microchip Technology Incorporated Configuration fuses for setting PWM options
US20030005268A1 (en) * 2001-06-01 2003-01-02 Catherwood Michael I. Find first bit value instruction
US6601160B2 (en) 2001-06-01 2003-07-29 Microchip Technology Incorporated Dynamically reconfigurable data space
US6552625B2 (en) 2001-06-01 2003-04-22 Microchip Technology Inc. Processor with pulse width modulation generator with fault input prioritization
US6604169B2 (en) 2001-06-01 2003-08-05 Microchip Technology Incorporated Modulo addressing based on absolute offset
US7003543B2 (en) * 2001-06-01 2006-02-21 Microchip Technology Incorporated Sticky z bit
US6976158B2 (en) * 2001-06-01 2005-12-13 Microchip Technology Incorporated Repeat instruction with interrupt
US7007172B2 (en) * 2001-06-01 2006-02-28 Microchip Technology Incorporated Modified Harvard architecture processor having data memory space mapped to program memory space with erroneous execution protection
US6728856B2 (en) 2001-06-01 2004-04-27 Microchip Technology Incorporated Modified Harvard architecture processor having program memory space mapped to data memory space
US20030023836A1 (en) * 2001-06-01 2003-01-30 Michael Catherwood Shadow register array control instructions
US7467178B2 (en) * 2001-06-01 2008-12-16 Microchip Technology Incorporated Dual mode arithmetic saturation processing
US20020184566A1 (en) * 2001-06-01 2002-12-05 Michael Catherwood Register pointer trap
US6952711B2 (en) * 2001-06-01 2005-10-04 Microchip Technology Incorporated Maximally negative signed fractional number multiplication
US7020788B2 (en) * 2001-06-01 2006-03-28 Microchip Technology Incorporated Reduced power option
US6985986B2 (en) * 2001-06-01 2006-01-10 Microchip Technology Incorporated Variable cycle interrupt disabling
US6937084B2 (en) * 2001-06-01 2005-08-30 Microchip Technology Incorporated Processor with dual-deadtime pulse width modulation generator
US6934728B2 (en) * 2001-06-01 2005-08-23 Microchip Technology Incorporated Euclidean distance instructions
US20030028696A1 (en) * 2001-06-01 2003-02-06 Michael Catherwood Low overhead interrupt
US20030005269A1 (en) * 2001-06-01 2003-01-02 Conner Joshua M. Multi-precision barrel shifting
US20030023958A1 (en) * 2001-07-17 2003-01-30 Patel Mukesh K. Intermediate language accelerator chip
US7062761B2 (en) * 2001-07-10 2006-06-13 Micron Technology, Inc. Dynamic arrays and overlays with bounds policies
US7127559B2 (en) * 2001-07-10 2006-10-24 Micron Technology, Inc. Caching of dynamic arrays
US8769508B2 (en) * 2001-08-24 2014-07-01 Nazomi Communications Inc. Virtual machine hardware for RISC and CISC processors
US20040021483A1 (en) * 2001-09-28 2004-02-05 Brian Boles Functional pathway configuration at a system/IC interface
US6552567B1 (en) 2001-09-28 2003-04-22 Microchip Technology Incorporated Functional pathway configuration at a system/IC interface
US7406674B1 (en) 2001-10-24 2008-07-29 Cypress Semiconductor Corporation Method and apparatus for generating microcontroller configuration information
US8078970B1 (en) 2001-11-09 2011-12-13 Cypress Semiconductor Corporation Graphical user interface with user-selectable list-box
US8042093B1 (en) 2001-11-15 2011-10-18 Cypress Semiconductor Corporation System providing automatic source code generation for personalization and parameterization of user modules
US6971004B1 (en) 2001-11-19 2005-11-29 Cypress Semiconductor Corp. System and method of dynamically reconfiguring a programmable integrated circuit
US8069405B1 (en) 2001-11-19 2011-11-29 Cypress Semiconductor Corporation User interface for efficiently browsing an electronic document using data-driven tabs
US7844437B1 (en) 2001-11-19 2010-11-30 Cypress Semiconductor Corporation System and method for performing next placements and pruning of disallowed placements for programming an integrated circuit
US20040215444A1 (en) * 2002-03-25 2004-10-28 Patel Mukesh K. Hardware-translator-based custom method invocation system and method
US8103497B1 (en) 2002-03-28 2012-01-24 Cypress Semiconductor Corporation External interface for event architecture
US7260658B2 (en) * 2002-05-31 2007-08-21 Oracle International Corporation Verifying input/output command data by separately sending data to be written and information about contents of the data
US7231666B2 (en) * 2002-06-20 2007-06-12 International Business Machines Corporation Method and apparatus for preventing buffer overflow security exploits
US7290080B2 (en) * 2002-06-27 2007-10-30 Nazomi Communications Inc. Application processors and memory architecture for wireless applications
KR100497671B1 (ko) * 2002-07-08 2005-07-25 주식회사 인터와이즈 메모리 접근 위반 처리 방법 및 이를 위한 컴퓨터 시스템
US7131118B2 (en) * 2002-07-25 2006-10-31 Arm Limited Write-through caching a JAVA® local variable within a register of a register bank
KR100506522B1 (ko) * 2003-02-24 2005-08-03 삼성전자주식회사 자바 프로그램에서 바이트 코드의 컴파일 시간 단축시스템 및 방법
US7290254B2 (en) * 2003-03-25 2007-10-30 Intel Corporation Combining compilation and instruction set translation
GB2399897B (en) * 2003-03-26 2006-02-01 Advanced Risc Mach Ltd Memory recycling in computer systems
GB2412192B (en) * 2004-03-18 2007-08-29 Advanced Risc Mach Ltd Function calling mechanism
US7802080B2 (en) 2004-03-24 2010-09-21 Arm Limited Null exception handling
US7930526B2 (en) * 2004-03-24 2011-04-19 Arm Limited Compare and branch mechanism
US7295049B1 (en) 2004-03-25 2007-11-13 Cypress Semiconductor Corporation Method and circuit for rapid alignment of signals
US7448029B2 (en) * 2004-04-26 2008-11-04 International Business Machines Corporation Modification of array access checking in AIX
US7836434B1 (en) * 2004-05-04 2010-11-16 Oracle America, Inc. Method and system for analyzing array access to a pointer that is referenced as an array
US7636795B2 (en) * 2004-06-30 2009-12-22 Intel Corporation Configurable feature selection mechanism
EP1622009A1 (en) * 2004-07-27 2006-02-01 Texas Instruments Incorporated JSM architecture and systems
FR2874103B1 (fr) * 2004-08-03 2006-11-17 Trango Systems Sarl Utilisation de la mmu pour la detection de borne de memoire tampon
US8544020B1 (en) 2004-09-14 2013-09-24 Azul Systems, Inc. Cooperative preemption
US7332976B1 (en) * 2005-02-04 2008-02-19 Cypress Semiconductor Corporation Poly-phase frequency synthesis oscillator
US7400183B1 (en) 2005-05-05 2008-07-15 Cypress Semiconductor Corporation Voltage controlled oscillator delay cell and method
KR100725393B1 (ko) * 2005-05-19 2007-06-07 삼성전자주식회사 자바 가상 머신에서 바이트 코드의 수행 시간을 줄이는시스템 및 방법
US20060271510A1 (en) * 2005-05-25 2006-11-30 Terracotta, Inc. Database Caching and Invalidation using Database Provided Facilities for Query Dependency Analysis
US7577801B1 (en) 2005-12-06 2009-08-18 Azul Systems, Inc. Array access
US8067948B2 (en) 2006-03-27 2011-11-29 Cypress Semiconductor Corporation Input/output multiplexer bus
US8006239B2 (en) * 2007-01-16 2011-08-23 Nec Laboratories America, Inc. Program analysis using symbolic ranges
US7737724B2 (en) 2007-04-17 2010-06-15 Cypress Semiconductor Corporation Universal digital block interconnection and channel routing
US8040266B2 (en) * 2007-04-17 2011-10-18 Cypress Semiconductor Corporation Programmable sigma-delta analog-to-digital converter
US9564902B2 (en) * 2007-04-17 2017-02-07 Cypress Semiconductor Corporation Dynamically configurable and re-configurable data path
US8516025B2 (en) 2007-04-17 2013-08-20 Cypress Semiconductor Corporation Clock driven dynamic datapath chaining
US8130025B2 (en) 2007-04-17 2012-03-06 Cypress Semiconductor Corporation Numerical band gap
US8026739B2 (en) 2007-04-17 2011-09-27 Cypress Semiconductor Corporation System level interconnect with programmable switching
US9720805B1 (en) 2007-04-25 2017-08-01 Cypress Semiconductor Corporation System and method for controlling a target device
US8049569B1 (en) 2007-09-05 2011-11-01 Cypress Semiconductor Corporation Circuit and method for improving the accuracy of a crystal-less oscillator having dual-frequency modes
US7712093B1 (en) 2009-03-19 2010-05-04 International Business Machines Corporation Determining intra-procedural object flow using enhanced stackmaps
US8533695B2 (en) 2010-09-28 2013-09-10 Microsoft Corporation Compile-time bounds checking for user-defined types
US11681806B2 (en) 2019-10-15 2023-06-20 International Business Machines Corporation Protecting against out-of-bounds buffer references

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0594376A (ja) * 1991-10-02 1993-04-16 Toshiba Corp ポータブルコンピユータ
JPH06149675A (ja) * 1992-11-11 1994-05-31 Kofu Nippon Denki Kk キャッシュメモリ装置

Family Cites Families (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US3573855A (en) * 1968-12-31 1971-04-06 Texas Instruments Inc Computer memory protection
US3905023A (en) * 1973-08-15 1975-09-09 Burroughs Corp Large scale multi-level information processing system employing improved failsaft techniques
US4079453A (en) * 1976-08-20 1978-03-14 Honeywell Information Systems Inc. Method and apparatus to test address formulation in an advanced computer system
US4084225A (en) * 1976-09-24 1978-04-11 Sperry Rand Corporation Virtual address translator
US4262332A (en) * 1978-12-28 1981-04-14 International Business Machines Corporation Command pair to improve performance and device independence
JPH0782458B2 (ja) * 1985-09-06 1995-09-06 株式会社日立製作所 データ処理装置
US5146592A (en) * 1987-09-14 1992-09-08 Visual Information Technologies, Inc. High speed image processing computer with overlapping windows-div
US5014235A (en) * 1987-12-15 1991-05-07 Steven G. Morton Convolution memory
US5341483A (en) * 1987-12-22 1994-08-23 Kendall Square Research Corporation Dynamic hierarchial associative memory
US4905188A (en) * 1988-02-22 1990-02-27 International Business Machines Corporation Functional cache memory chip architecture for improved cache access
US5777608A (en) * 1989-03-10 1998-07-07 Board Of Regents, The University Of Texas System Apparatus and method for in-parallel scan-line graphics rendering using content-searchable memories
JPH0471050A (ja) * 1990-07-12 1992-03-05 Oki Electric Ind Co Ltd スタック領域保護回路
US5373290A (en) * 1991-09-25 1994-12-13 Hewlett-Packard Corporation Apparatus and method for managing multiple dictionaries in content addressable memory based data compression
US5583988A (en) * 1994-03-09 1996-12-10 National Instruments Corporation Method and apparatus for providing runtime checking features in a compiled programming development environment
US5644709A (en) * 1994-04-21 1997-07-01 Wisconsin Alumni Research Foundation Method for detecting computer memory access errors
JP3713312B2 (ja) * 1994-09-09 2005-11-09 株式会社ルネサステクノロジ データ処理装置

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0594376A (ja) * 1991-10-02 1993-04-16 Toshiba Corp ポータブルコンピユータ
JPH06149675A (ja) * 1992-11-11 1994-05-31 Kofu Nippon Denki Kk キャッシュメモリ装置

Also Published As

Publication number Publication date
EP0976050A1 (en) 2000-02-02
DE69713400T2 (de) 2002-10-31
EP0976050B1 (en) 2002-06-12
DE69713400D1 (de) 2002-07-18
KR19990081958A (ko) 1999-11-15
US6014723A (en) 2000-01-11
WO1997027544A1 (en) 1997-07-31
JP2000501217A (ja) 2000-02-02

Similar Documents

Publication Publication Date Title
KR100466722B1 (ko) 어레이경계검사방법및장치와,이를포함하는컴퓨터시스템
KR100618756B1 (ko) 네트워크또는로컬메모리로부터수신된명령세트를실행하는프로세서및컴퓨터시스템
KR100529416B1 (ko) 스택기반컴퓨터를위한명령폴딩방법및장치
KR100584964B1 (ko) 스택 메모리 구조에서의 캐싱 장치
US7930689B2 (en) Method and system for accessing indirect memories
US6076141A (en) Look-up switch accelerator and method of operating same
Yellin et al. The java virtual machine specification
US5970242A (en) Replicating code to eliminate a level of indirection during execution of an object oriented computer program
US6065108A (en) Non-quick instruction accelerator including instruction identifier and data set storage and method of implementing same
Case Implementing the Java virtual machine
US8806459B2 (en) Java stack machine execution kernel dynamic instrumentation
KR100618718B1 (ko) 스택메모리구조에서의캐싱방법및장치
Yiyu et al. A Java processor with hardware-support object-oriented instructions

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
FPAY Annual fee payment

Payment date: 20121226

Year of fee payment: 9

FPAY Annual fee payment

Payment date: 20131220

Year of fee payment: 10

FPAY Annual fee payment

Payment date: 20141231

Year of fee payment: 11

FPAY Annual fee payment

Payment date: 20151217

Year of fee payment: 12

FPAY Annual fee payment

Payment date: 20161220

Year of fee payment: 13

EXPY Expiration of term