- 작가는 학습 프로젝트로 rjvm이라는 이름의 Rust로 작성된 JVM을 만들었습니다.
- 이 JVM은 장난감 구현이며, 제네릭, 스레드, 리플렉션, 어노테이션, I/O 또는 JIT 컴파일을 지원하지 않습니다.
- 이 JVM은 제어 흐름 문장, 기본 및 객체 생성, 가상 및 정적 메소드 호출, 예외 처리, 가비지 수집 및 jar 파일에서의 클래스 해결을 구현합니다.
- 작가는 OpenJDK 7의 실제 rt.jar을 사용하여 테스트 스위트를 구현했습니다.
- 코드는 reader, vm 및 vm_cli 세 가지 크레이트로 구성되어 있습니다.
- reader 크레이트는 .class 파일을 구문 분석하고 그 내용을 모델링할 수 있습니다.
- vm 크레이트에는 코드를 실행할 수 있는 가상 머신이 포함되어 있습니다.
- vm_cli 크레이트는 VM을 위한 간단한 명령 줄 런처입니다.
- 작가는 다른 사람들이 사용할 수 있도록 reader 크레이트를 별도의 저장소로 추출하는 것을 고려하고 있습니다.
- .class 파일을 로드하는 것은 Java 코드를 실행하는 첫 번째 단계입니다.
- 클래스 파일에는 클래스에 대한 메타데이터, 슈퍼클래스 및 인터페이스 이름, 필드 및 메소드와 그들의 디스크립터 및 바이트코드가 포함되어 있습니다.
- vm 크레이트의 주요 API는 Vm::invoke로, 이를 사용하여 메소드를 실행합니다.
- vm 크레이트는 Rust로 구현된 Java 바이트코드 메소드와 네이티브 메소드를 모두 지원합니다.
- JVM은 스택 기반으로, 바이트코드 명령은 값 스택과 로컬 변수에서 작동합니다.
- 값과 객체는 Rust의 enum과 struct를 사용하여 모델링됩니다.
- 메소드 실행은 바이트코드 명령을 하나씩 실행하고, 프로그램 카운터를 업데이트하며, 스택과 로컬 변수를 조작하는 것을 포함합니다.
- JVM은 가상 및 정적 조회를 포함한 다양한 유형의 메소드 호출을 지원합니다.
- 예외는 예외 테이블을 사용하여 구현되며, 메소드의 정상적인 제어 흐름을 중단할 수 있습니다.
- 작가는 Rust의 Result와 패턴 매칭을 사용하여 예외 구현에 자랑스럽습니다.
- JVM은 stop-the-world 반공간 복사 알고리즘을 사용하여 가비지 컬렉터를 포함하고 있습니다.
- 가비지 컬렉터는 메모리를 두 개의 반공간으로 분할하고, 한 반공간에서 다른 반공간으로 살아 있는 객체를 복사합니다.
- 작가는 Rust로 rjvm을 작성하면서 많은 재미와 배움을 얻었습니다.