3P by neo 2023-07-22 | favorite | 댓글 1개
  • 작가는 학습 프로젝트로 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을 작성하면서 많은 재미와 배움을 얻었습니다.
Hacker News 의견
  • JVM에서 Rust로 작성된 가비지 컬렉터의 구현은 힙에 대한 참조의 적절한 루팅을 보장하는 데 관한 질문을 던집니다.
  • 기사에서는 복제된 저장소에서 테스트를 실행하면 클래스패스에 항목을 추가하는 오류가 발생한다고 언급합니다.
  • 댓글러는 과거에 자바 OS 프로젝트에서 작업한 경험을 회상하며 Rust로 JVM을 구현하는 것의 메모리 안전성 이점을 강조합니다.
  • JVM에서 제네릭 지원에 대한 질문이 있으며, 모든 것이 타입 소거로 인해 Object로 처리되는지에 대해 묻습니다.
  • 댓글러는 함수 서명에서 라이프타임 사용의 제한과 오류 처리에 미치는 영향에 대해 묻습니다.
  • 이 프로젝트는 그 성취와 학습 경험을 칭찬받습니다.
  • 프로젝트 창시자에게 직업 제안이 확장됩니다.
  • Go로 작성된 다른 JVM 구현에 대한 링크가 공유됩니다.
  • 댓글러는 프로젝트에 감탄하며 Rust 시작 가이드에 대한 안내를 요청합니다.
  • 이 프로젝트는 흥미로운 기반 메커니즘을 갖춘 JVM의 기초층으로서 설명됩니다.
  • 취미 운영 체제 프로젝트에 유머러스한 언급이 있습니다.
  • 유사한 프로젝트에 대한 링크가 공유됩니다.