2009-03-06 5 views
1

저는 C#에서 필자가 좋아하는 몇 가지 기능을 사용하여 자체 스크립트 언어를 작성하고 MSIL을 출력 바이트 코드로 사용하기로했습니다 (Reflection.Emit는 매우 유용합니다. 그리고 난 다른 바이트 코드를 생각할 필요가 없다.) 그것은 작동하고, 실행 가능하며, 리플 렉터로 디 컴파일 되어도 실행 가능합니다.) 매우 빠릅니다.JIT를 끄고 MSIL에서 코드 흐름 제어 (자체 VM)

하지만 하나의 프로세스 + 하나의 스레드에서 여러 개의 '프로세스'를 실행하고 할당 된 CPU 시간을 수동으로 제어하고 싶습니다. 또한 .NET 프레임 워크에서 제공하는 훨씬 강력한 IPC를 구현하십시오. JIT를 만들고 자신의 VM을 만들고, .NET Framework (및 제어 메모리 사용 등)를 사용하여 명령을 스테핑 한 다음, 직접 작성하지 않고도 MSIL 해석 전체를 작성해야합니다.

EDIT 1) : 나는 해석 IL 우주 :

EDIT 2)에서 가장 빠른 것은 아니라는 것을 알고 명확히 - 내 VM이 '운영 체제'의 일종되고 싶어 - 그것을 CPU 시간을 가져 와서 프로세스간에 나누고, 메모리 할당을 제어하는 ​​등의 작업을 수행합니다. 그것은 빠르고 효과적이지 않아야하지만 내 실험을위한 개념 증명 일뿐입니다. 모든 명령을 처리하는 수준에서 구현할 필요가 없습니다. .NET에서 수행해야하는 경우 마음이 들지 않습니다. 한 단계 씩 지시하고 다음 단계로 진행할 때까지 기다려야합니다.

EDIT 3) : 나는 ICorDebug가 아마도 Mono의 런타임 구현을보고 내 요구 사항을 달성 할 수 있음을 깨달았습니다.

답변

5

당신은 Mono을 사용할 수 있습니다. 그 옵션을 사용하면 JITting 대신 IL을 해석 할 수 있습니다. 공개 소스라는 사실은 라이센스에 따라 사용자의 필요에 따라 수정할 수 있어야한다는 것을 의미합니다.

Mono는 .NET의 모든 기능을 가지고 있지는 않지만, 확실히 일 수 있습니다.

1

MSIL은 JIT 컴파일러에서 구문 분석하도록 설계되었습니다. 통역사에게 적합하지 않습니다. ADD 명령어가 좋은 예입니다. 이것은 다양한 값 유형 값 (byte, short, int32, int64, ushort, uint32, uint64)을 추가하는 데 사용됩니다. 컴파일러는 어떤 종류의 추가가 필요한지 알고 있지만 MSIL을 생성 할 때 해당 유형 정보를 잃게됩니다.

이제 런타임에 다시 찾아야하며 평가 스택의 값 유형을 확인해야합니다. 아주 느린.

는 쉽게 IL은 공용 언어 런타임의

1

마이크로 소프트의 구현은 하나 개의 실행 시스템, JIT를 사용이 등 ADD8, ADD16 같은 ADD 지침을 헌신하고 해석했다. 모노는 다른 한편으로는 JIT와 통역자와 함께 제공됩니다.

나는, 그러나, 완전히 당신이 자신에게을 수행 할 정확히 이해하지 않고 당신이 마이크로 소프트의 구현에두고 싶은

: 어떤 방법을 완전히 비활성화 JIT 있습니까

하고 자신의 VM을 생성 ?

내 자신에 아무것도를 작성하거나이 내가 전체 MSIL을 해석 할 작성해야 달성하기 위해 필요없이

...?

은 일종의 모순입니다.

당신이 생각하는 경우, 당신은 마이크로 소프트 JIT보다 더 나은 실행 시스템을 작성할 수 있습니다, 당신은 처음부터 그것을 작성해야합니다. 그러나 마이크로 소프트와 모노 JIT는 고도로 최적화 된 컴파일러라는 것을 명심하십시오. (Programming language shootout)

사용자 모드에서는 운영 체제 프로세스의 CPU 시간을 정확하게 예약 할 수 없습니다. 그것은 운영 체제 작업입니다.

녹색 스레드의 일부 구현은 아이디어 일 수 있지만 이는 관리되지 않는 코드의 주제입니다. 원하는 경우 CLR 호스팅 API를 살펴보십시오.

나는 CIL로 언어를 구현하려고한다. 결국, 그것은 원시 x86으로 컴파일됩니다. 검증 가능성에 대해 신경 쓰지 않는다면 필요한 곳에서 포인터를 사용할 수 있습니다.

1

당신이 할 수있는 한 가지 생각은 상태 - 기계 스타일로 코드를 생성하는 것입니다. 이 말은 내가 의미하는 바를 설명하겠습니다.

yield return을 사용하여 C#에서 생성기 메서드를 작성하면이 메서드는 상태 시스템을 구현하는 내부 IEnumerator 클래스로 컴파일됩니다. 메서드의 코드는 yield return 또는 yield break 문으로 종료되는 논리 블록으로 컴파일되며 각 블록은 번호가 매겨진 상태에 해당합니다. 각 yield yield는 값을 제공해야하기 때문에 각 블록은 로컬 필드에 값을 저장하여 끝납니다. 열거 자 개체는 다음 값을 생성하기 위해 현재 블록을 실행하기 위해 현재 상태 번호에 대한 거대한 switch 문으로 구성된 메서드를 호출 한 다음 상태를 전진시키고 로컬 필드의 값을 반환합니다.

스크립트 언어는 메서드가 상태 시스템 개체에 해당하는 비슷한 스타일로 메서드를 생성 할 수 있으며 VM은 할당 된 시간 동안 상태 컴퓨터를 전 달하여 시간을 할당합니다. 이 메서드의 몇 가지 까다로운 부분 : 메서드 호출 및 try/finally 블록과 같은 것들을 구현하는 것은 곧바로 MSIL을 생성하는 것보다 어렵습니다.