문제

x86에서 가상 머신을 구현할 것이며 어떤 종류의 디자인이 최상의 결과를 얻을 수 있는지 궁금합니다. 주스를 낭비하기 위해 무엇을 집중해야합니까? x86 어셈블리에서 전체 가상 머신을 구현해야합니다.

나는 많은 지침이없고 그들의 양식을 선택할 수 있습니다. 이 지침은 블록의 SmallTalk의 구문으로 직접 프로젝트를 진행합니다. 나는 내가 생각하고 있던 교육 디자인을 제공한다.

^ ...       # return
^null     # return nothing
object    # address to object
... selector: ... # message pass (in this case arity:1 selector: #selector:)
var := ... # set
var # get

내가 생각했던 VM의 종류 :

mov eax, [esi]
add esi, 2
mov ecx, eax
and eax, 0xff
and ecx, 0xff00 # *256
shr ecx, 5          # *8
jmp [ecx*4 + operations]
align 8:
    operations:
dd retnull
dd ret
# so on...
    retnull:          # jumps here at retnul
# ... retnull action
    ret:
# ... ret action
#etc.

또 다른 가상 머신 구현이 필요한 이유를 묻기 시작하지 마십시오. 해석 적 루틴은 필요할 때마다 선택하는 재고 물건이 아닙니다. 다른 곳에서 제안하는 대부분의 가상 머신은 성능 비용으로 휴대 성을 향해 가중치를 부여합니다. 내 목표는 이식성이 아니며 내 목표는 성능입니다.

이 통역사가 전혀 필요한 이유는 SmallTalk 블록이 같은 방식으로 해석되지 않기 때문입니다.

A := B subclass: [
    def a:x [^ x*x]
    clmet b [...]
    def c [...]
    def d [...]
]

[ 2 < x ] whileTrue: [...]

(i isNeat) ifTrue: [...] ifFalse: [...]

List fromBlock: [
    "carrots"
    "apples"
    "oranges" toUpper
]

해석 적 루틴에서 오는 진정한 혜택이 필요합니다. 즉, 프로그램을 읽을 위치의 선택입니다. 물론 좋은 컴파일러는 대부분의 시간을 다음과 같은 명백한 경우를 컴파일해야합니다. 'iftrue : iffalse'또는 'whiletrue : '또는 목록 예제. 통역사의 필요성은 항상 블록이 기대하는 치료법을 확신 할 수없는 경우에 항상 영향을 줄 수 있기 때문에 사라지는 것이 아닙니다.

도움이 되었습니까?

해결책

나는 여기에 휴대성에 대한 혼란이 있다는 것을 알기 때문에 문제를 명확히해야한다고 생각합니다. 이것들은 나의 겸손한 의견이므로 물론 당신은 그들에게 반대 할 수 있습니다.

나는 당신이 accross에 왔다고 생각합니다 http://www.complang.tuwien.ac.at/forth/threading/ VM을 진지하게 작성하는 것을 고려한다면 설명 된 기술에 머물지 않을 것입니다.

이미 언급 된 VM을 대상으로하는 코드 크기 감소, 컴파일러 복잡성 감소 (종종 더 빠른 컴파일로 변환됨), 휴대 성 (VM의 지점은 언어, VM 자체가 휴대용이 아닌지는 중요하지 않습니다).

예제의 동적 특성을 고려하면 VM은 JIT 컴파일러 다른 인기있는 것보다 더. 따라서 Altough S.Lott는이 경우 요점을 놓쳤습니다. 그의 언급은 그 자리에 있습니다. 매우 역동적 인 언어를 위해 VM을 설계하려면 해석을 두 단계로 분리 할 것입니다.

  1. 새로운 종류의 토큰을 도입 할 수있는 새로운 종류의 토큰을 도입 할 수있는 AST 스트림과 관련하여 AST 스트림과 상담하고이를보다 의미있는 형태 (예 : 블록을 취하고 나중에 실행을 위해 어딘가에 보관 해야하는지 결정)로 변환하는 생산자 단계. 본질적으로 여기서 구문 분석에서 손실 될 수있는 컨텍스트 민감한 정보를 복구합니다.

  2. 생성 된 스트림을 1에서 가져 오는 소비자 단계는 다른 기계와 마찬가지로 맹목적으로 실행합니다. 당신이 그것을 좋아한다면, 당신은 저장된 스트림을 푸시하고 점프 명령 포인터 대신에 그것을 할 수 있습니다.

당신이 말했듯이, 망할 프로세서가 다른 방식으로 어떻게 작동하는지 모방하는 것은 필요한 역동적 (또는 보안과 같은 다른 기능)을 달성하지 못합니다. 그렇지 않으면 컴파일러를 작성합니다.

물론 1 단계에서 임의로 COMLEX 최적화를 추가 할 수 있습니다.

다른 팁

정말 빨리 무언가를 원한다면 사용해보십시오 LLVM. 높은 수준의 프로그램 설명에서 대부분의 프로세서에 대한 기본 코드를 생성 할 수 있습니다. 가장 편리한 내용에 따라 조립 언어를 사용하거나 LLVM 구조를 생성 할 수 있습니다.

그것이 당신의 문제에 가장 적합한 지 확실하지 않지만 나머지 프로그램과 함께 컴파일 할 수없는 성능의 중요한 실행을 수행한다면 분명히 사용할 것입니다.

통역사의 요점 ~이다 휴대 성, 대부분. 내가 생각할 수있는 가장 빠른 접근법은 JIT 컴파일러와 마찬가지로 메모리에서 직접 x86 코드를 생성하는 것입니다. 물론 더 이상 통역사가 없습니다. 컴파일러가 있습니다.

그러나 어셈블러에 통역사를 작성하면 최상의 성능을 제공 할 것입니다 (어셈블러 전문가이고 프로젝트가 범위가 매우 제한되지 않는 한). 고급 언어를 사용하면 Symbol Lookup 및 Register 할당 전략을위한 더 나은 알고리즘에 집중할 수 있습니다.

인코딩되지 않은 명령어로 설정 한 상태에서 파견 루틴 속도를 높일 수 있습니다.

mov eax, [esi]
add esi, 4
add eax, pOpcodeTable
jmp eax

CPU의 펜티엄 4에서 각각의 파견에 대해 오버 헤드 <4 사이클이 있어야한다.

추가로 성능의 이유로 각 원시 루틴에서 ESI (IP)를 증가시키는 것이 좋습니다. 증분이 다른 지침과 짝을 이룰 수 있기 때문입니다.

mov eax, [esi]
add eax, pOpcodeTable
jmp eax

~ 1-2 실수 오버 헤드.

성능에 중점을 둔 가상 머신을 만드는 이유는 무엇입니까? 왜 x86 코드를 직접 작성하지 않습니까? 더 빠른 것은 없습니다.

당신이 원한다면 매우 빠르게 해석 된 언어를보십시오 앞으로. 그들의 디자인은 매우 깔끔하고 복사하기가 매우 쉽습니다.

당신이 JIT를 좋아하지 않는다면 목표는 이식성이 아닙니다. Google에 관심이 있다고 생각합니다 nativeclient 프로젝트. 그들은 정적 분석가, 샌드 박스 및 기타를 수행합니다. 호스트는 RAW X86 지침을 실행할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top