가상 머신을 만들고 싶습니다. 좋은 참조가 있습니까? [닫은]


22

게임 코드를 실행하는 플랫폼 독립적 인 방법으로 가상 머신을 구축하려고합니다 (본질적으로 스크립팅).

내가 게임에서 알고있는 가상 머신은 Infocom의 Z-Machine , LucasArts의 SCUMM , id Software의 Quake 3과 같은 오래된 머신 입니다. .net 개발자 인 저는 CLR에 대해 잘 알고 있으며 CIL 지침 을 검토하여 실제로 VM 수준 (언어 수준)에서 구현하는 내용에 대한 개요를 얻었습니다. 작년 에 6502 어셈블러 에서 약간의 손을 ve 습니다.

문제는 하나를 구현하기를 원하기 때문에 조금 더 깊이 파고 들어야합니다. 스택 기반 및 등록 기반 VM이 있다는 것을 알고 있지만 실제로 어떤 방법이 더 나은지, 하이브리드 방식이 더 많은지 알 수는 없습니다. 메모리 관리를 처리하고 VM의 일부 하위 유형을 결정하고 ldstr 과 같은 기능이 작동하는 이유 를 이해해야 합니다.

Z-Machine 자료를 제외한 유일한 참고서는 CLI Annotated Standard 이지만 VM에 대한 더 일반적이고 기본적인 강의가 있는지 궁금합니다. 기본적으로 Dragon Book 과 같지만 VM 용입니까? 레지스터 기반 VM을 사용하는 Donald Knuth의 컴퓨터 프로그래밍 기술에 대해 알고 있지만 아직 완성되지 않았기 때문에 해당 시리즈가 얼마나 적용 가능한지 잘 모르겠습니다.

설명 : 목표는 전문화 된 VM을 구축하는 것입니다. 예를 들어 Infocom의 Z-Machine에는 배경색 설정 또는 사운드 재생을위한 OpCode가 포함되어 있습니다. 따라서 OpCodes 대 스크립트 (언어 TBD)를 가져 와서 바이트 코드를 생성하는 컴파일러로 VM에 얼마나 많은 양이 필요한지 알아 내야하지만 실제로는 내가하고있는 일을 이해해야합니다.


¹ 현대 기술을 사용하면 고급 스크립팅 언어를 즉석에서 해석 할 수 있습니다. 그러나 그 재미는 어디에 있습니까? :) 요즘 가상 머신은 종종 VMWare 유형 OS 가상화와 관련되어 있기 때문에 구글에 조금 어렵습니다 ...


6
스택 기반 기계가 할 그것을 튜링 완료주의가 필요 그렇지 않으면 단지입니다 스택 외부 메모리를 PDA
래칫 괴물

1
첫 번째 질문은 얼마나 멀리 가고 싶습니까? 나는 SCUMM / SCUMMVM을 결코 보지 않았지만 그래픽 일에 대해 잘 알고 있다고 가정하지만 CIL은 ... 그래서 메모리 모델 (스택 기반 레지스터 기반, 혼합, 혼잡, ..) 및 opcode ( 즉, 어셈블러 명령어) 다음 VM의 첫 번째 버전은 루프 do { switch(opcode) {case OP1: ... case OP2: ...} while (nextop);일 수도 있고 아마도 컴파일러 일 수도 있습니다. 그리고 재미는 실제로 시작하기위한 최적화입니다.
Johannes

3
간단한 Forth 런타임 구현부터 시작해보십시오.
SK-logic

1
Quake 3가상 머신 은 정확히 무엇입니까?
Ramhound

3
@Ramhound ID 기술 엔진은 오랫동안 내부 가상화의 일부 형식을 사용했습니다. 이 기사 또는 Wikipedia의 정보 가 더 잘 설명 될 수 있습니다.
Daniel B

답변:


18

Lua 를 확인하여 시작합니다 . 샘플 구현과 최종적으로 자체 롤링하지 않기로 결정한 경우 즉시 사용 가능한 VM / 언어로 사용할 수 있습니다.

소스 코드는 매우 읽기 쉽고 Annotated 소스 코드도 있습니다. 그리고 주요 저자 인 Roberto Ierusalimschy가 작성한 일부 디자인 문서 .

대신 자신의 그것을 사용하도록 선택하는 경우 마지막으로, 당신은 게임 개발자들 사이에서 오랫동안 마음에 드는 것 것을 찾을 수 있습니다, 그리고 거기에 매우 고성능 JIT 구현 .

스택 대 레지스터 기반의 경우 스택 기반 VM을 디자인하기가 더 쉽다고 생각하지만 컴파일러는 더 복잡 할 수 있습니다. Iesualimschy 논문에서 언급했듯이 Lua는 최초의 레지스터 기반 언어 VM 중 하나 였지만 그 후에는 LLVM, Dalvik 및 일부 최신 JavaScript VM이 등장했습니다.


2
레지스터 기계 대 스택 정보 (문자 없음) "레지스터 기반 기계가 어렵 구축, 그러나 우리는 우리의 컴파일러 측면에 대한 연구를 기존의 t 혜택"나는 앵무새 / Perl6에서 견적을 기억하는 것은 DEVS
요하네스

+1 Lua는 뛰어난 바이트 코드 구현과 VM에 대한 학습을위한 매우 깨끗한 디자인을 갖추고 있습니다. 또한 많은 사람들이 자신의 요구에 맞게 Lua를 사용자 정의하여 처음부터 시작하지 않으려는 경우 상당히 확장 가능하다는 것을 알 수 있습니다.
CodexArcanum

여전히이 과정을 거칩니다. VM에 대한 개발자의 또 다른 훌륭한 문서 : inf.puc-rio.br/~roberto/talks/lua-ll3.pdf
Michael Stum

2

현재로서는 귀하를 연결시킬 특정 자료가 없지만, 과거에 비슷한 주제를 연구 한 결과 Smalltalk VM도 훌륭한 학습 보조 도구 인 것으로 나타났습니다 . 스몰 토크가 사용하는 바이트 코드에 관한 많은 학술 논문과 기사가 있으며, 그 바이트 코드를 사용하기 위해 인터프리터와 VM을 작성합니다. Google 은 많은 독서 자료를 검색 smalltalk vm implementation하거나 smalltalk bytecode interpreter산출해야합니다.

소스 코드를 보거나 구현을 시도하려면 Squeak 또는 Pharo 버전을 권장합니다.

Self는 기본적으로 프로토 타입 기반 객체 (JavaScript와 유사)가있는 Smalltalk이므로 관련 언어 / VM Self 도 관심이있을 수 있습니다.


0

[script] 소스 코드가 머신이나 런타임 환경에 어떻게 들어가는 지 분석하는 것부터 시작하겠습니다.

HTML 문서와 같은 것이 있다면 <a onclick="dosomething();">매우 빠른 컴파일러가 필요합니다.이 경우 바이트 코드 실행 속도는 그다지 중요하지 않습니다. 사용 사례가 완전한 컴파일을 감당할 수있는 Java / .NET에 더 가까운 경우 VM 아키텍처 및 바이트 코드 구조는 더 가까운 Java 바이트 코드 또는 IL이됩니다.

다른 기준은 내가 "접착제"라고 부르는 것입니다. 원래 스크립트는 풀 언어로 개발되었습니다. 스크립트는 다양한 기본 함수 (Perl, Python, Ruby, JS)를 함께 연결하는 방법을 정의합니다. 이 경우 대부분의 코드가 언어 자체로 작성된 함수 인 경우 VM 및 바이트 코드의 효과는 Java / .NET의 경우보다 훨씬 덜 중요합니다.

그리고 내가 사용할 마지막 주요 기준은 언어의 확장 성입니다. C ++에서 구현 된 많은 기본 객체 / 함수를 언어 런타임에 추가하려는 경우 C ++과의 통합을 위해 VM 아키텍처가 "편리해야"합니다. 예를 들어 스크립트 C ++ 객체를 그대로 노출하려는 경우 유일한 옵션은 힙 관리로 참조 횟수를 계산하는 것입니다 (Python과 같은 통합의 예로 boost :: python 참조). 이동 / 컴팩 팅 힙 / GC를 사용할 계획이라면 다른 이야기가 될 것입니다. Lua의 기본 기능을 런타임에 추가하는 방법은 약간 까다 롭습니다 [C ++ 개발자에게는].

다시 말해, 일반적인 사용 사례를 먼저 정의하려고하면 읽을 내용을 제안하는 것이 더 쉬울 것입니다.


1
최신 JavaScript 컴파일러는 매우 복잡하며 생성 된 코드를 얼마나 많이 최적화해야하는지에 대한 의문이 있습니다.
johannes

자바 스크립트 실행 성능이 중요합니다. 작은 스크립트가 아니라 더 큰 JS가 많은 사이트에 적합합니다. JS 엔진이 JIT 컴파일러를 사용하는 이유가 있습니다 (V8에는 인터프리터 도 없으며 기계 코드로 바로 이동 함).

@delnan : JS 유스 케이스는 파이썬과 다릅니다. 파이썬에서는 광선 추적 알고리즘 구현과 같은 것이 필요할 때 기본 라이브러리를 수행하고 스크립트에서 호출합니다. 이것은 JIT 솔루션보다 항상 빠르거나 느리지 않습니다. JS 영역에서는 네이티브 코드와 같은 고급 스러움이 없으므로 JS VM을 최대한 빨리 만드는 것이 유일한 옵션입니다. 그러나 가격으로 다시. 간단한 인터프리터에서 HTML "<button onclick ="dosomethingnative () ">의"dosomethingnative () "평가는 V8보다 훨씬 빠릅니다.
c-smile

@ c-smile 정확히 내 요점.

@delnan : 그러나 요점은 상당히 다릅니다. 일반적인 사용 사례를 분석 한 다음에 만 VM의 아키텍처, 언어 구문 등의 종류를 결정할 수 있습니다.
c-smile
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.