코드를 살펴보니 정말 컴팩트한 구조였음
직접 컴파일하거나 실행해보진 않았지만, RISC-V 32비트 정수·곱셈·원자 명령 확장을 포함하고 있음
부동소수점 연산은 에뮬레이터가 아니라 컴파일러(gcc 등)가 소프트웨어 함수로 에뮬레이션함
여러 컴파일러에서 지원된다는 점이 매우 영리한 설계라고 생각함
실제 명령어 세트를 구현한 기반 프로젝트는 mini-rv32ima임
이 프로젝트가 WASM처럼 공통 실행 환경을 만들려는 시도와 비슷한 영역에 있는 것 같음
다만 기반이 RISC-V라는 점이 다름
각 접근 방식의 한계나 장점을 더 알고 싶지만, 어쨌든 애플리케이션이 공통 VM 위에서 동작하는 미래로 가고 있는 듯함
현대 웹이 그에 가장 가까운 예시라고 생각함
예전에 WASM과 libriscv를 간단히 비교해봤는데, 브라우저 호환성 때문에 WASM을 선택했음
libriscv도 멋지고 인상적인 프로젝트임
참고로 관련 토론 링크는 여기에 있음
Google 오픈소스 블로그의 Wasefire 글을 보면, 코드 풋프린트가 더 작아 보임
다만 RISC-V는 이런 용도에는 적합하지 않을 수도 있음
예를 들어 즉시값 디코딩을 소프트웨어로 처리하면 느려지지만, 하드웨어에서는 빠름
그래도 RISC-V는 안정적이고 단순하게 구성할 수 있는 타깃임
코드가 정말 깔끔하고 단일 C 파일 구조가 마음에 듦
예제 실행을 위해 Docker를 쓰는 방식도 임베디드 환경에서 매우 편리함
테스트 커버리지도 좋아 보이고, 메트릭을 보는 것도 흥미로울 것 같음
의료기기에 스크립팅 기능을 추가할 때, 핵심 코드를 매번 재검증하지 않아도 되는 장점이 있을 듯함 WASM Micro Runtime 같은 임베디드용 WASM 인터프리터와 비교해보면 흥미로움
Cortex M4F 기준으로 56.3K로 훨씬 큼
아마 WASM이 최소 RISC-V 프로파일보다 복잡한 명령어 집합이기 때문일 것임
Hacker News 의견들
코드를 살펴보니 정말 컴팩트한 구조였음
직접 컴파일하거나 실행해보진 않았지만, RISC-V 32비트 정수·곱셈·원자 명령 확장을 포함하고 있음
부동소수점 연산은 에뮬레이터가 아니라 컴파일러(gcc 등)가 소프트웨어 함수로 에뮬레이션함
여러 컴파일러에서 지원된다는 점이 매우 영리한 설계라고 생각함
실제 명령어 세트를 구현한 기반 프로젝트는 mini-rv32ima임
이 프로젝트가 WASM처럼 공통 실행 환경을 만들려는 시도와 비슷한 영역에 있는 것 같음
다만 기반이 RISC-V라는 점이 다름
각 접근 방식의 한계나 장점을 더 알고 싶지만, 어쨌든 애플리케이션이 공통 VM 위에서 동작하는 미래로 가고 있는 듯함
현대 웹이 그에 가장 가까운 예시라고 생각함
libriscv도 멋지고 인상적인 프로젝트임
참고로 관련 토론 링크는 여기에 있음
다만 RISC-V는 이런 용도에는 적합하지 않을 수도 있음
예를 들어 즉시값 디코딩을 소프트웨어로 처리하면 느려지지만, 하드웨어에서는 빠름
그래도 RISC-V는 안정적이고 단순하게 구성할 수 있는 타깃임
코드가 정말 깔끔하고 단일 C 파일 구조가 마음에 듦
예제 실행을 위해 Docker를 쓰는 방식도 임베디드 환경에서 매우 편리함
테스트 커버리지도 좋아 보이고, 메트릭을 보는 것도 흥미로울 것 같음
의료기기에 스크립팅 기능을 추가할 때, 핵심 코드를 매번 재검증하지 않아도 되는 장점이 있을 듯함
WASM Micro Runtime 같은 임베디드용 WASM 인터프리터와 비교해보면 흥미로움
Cortex M4F 기준으로 56.3K로 훨씬 큼
아마 WASM이 최소 RISC-V 프로파일보다 복잡한 명령어 집합이기 때문일 것임
하지만 WAMR은 GC, JIT, WASI, 스레드, 디버거 지원 등 다양한 확장을 포함함
“Just add rats”라며 ZigDoom 예제를 소개함
타이밍이 절묘함
임베디드 펌웨어 테스트용 경량 에뮬레이터를 찾고 있었는데, 대부분의 대안은 너무 무겁거나 불안정했음
메모리 매핑된 IO 시뮬레이션을 지원하면, 실제 하드웨어 없이 IoT나 마이크로컨트롤러 드라이버 테스트에 유용할 것 같음
에뮬레이터 코어가 이미 메모리 매핑 IO를 지원하지만, uvm32는 이를 호스트의 추가 RAM 블록(프레임버퍼나 별도 힙 등)으로만 사용함
쓰기 트랩은 이 부분, 읽기 트랩은 이 부분에서 처리 가능함