2010-07-11 3 views
6

.NET 플랫폼 용 언어의 백엔드를 만들려고합니다. 프런트 엔드 및 인터프리터는 Delphi로 작성되었습니다. 관리되지 않는 API는 형식 정의 만 허용하지만 MSIL은 방출하지 않습니다.비 관리 코드에서 MSIL을 생성하는 방법은 무엇입니까?

비 관리 코드에서 MSIL을 생성하는 방법에는 어떤 것이 있습니까? 이것을 얻기 위해 Reflection.Emit 및 ILasm을 사용하지 않고? 감사합니다.

답변

5

델파이의 .NET 코드 생성기는 적절한 헤더 등으로 x86 코드 생성과 마찬가지로 바이트 코드로 IL을 직접 메모리로 방출합니다. 즉, 코드 생성기는 인코딩 된 IL 형식에 해당하는 바이트, 예외 테이블 등을 직접 내 보냅니다 . 이것은 API를 사용하는 것이 아니라 구식 방식입니다. 한 번에 한 바이트 씩 코드를 작성하십시오.

나중에 델파이의 내장 링커는 IMetaDataEmit 등으로 메타 데이터를 생성하고, IMetaDataEmit::SetRVA은 코드가 실행 파일에 어디에 위치 할 것인지 메타 데이터에 알려줍니다. 메타 데이터는 IMetaDataEmit::SaveToMemory으로 복사 된 다음 링커가 작성한 PE로 복사되며 이에 따라 CLR 헤더가 메타 데이터 시작을 가리 키도록 패치됩니다.

많은 코드가 있습니다. 그 중 대부분은 분기 최적화 및 사용되지 않는 코드 제거 (스마트 링크)와 같은 작업을 수행하는 기존의 x86 링커를 통해 델파이에 스레드됩니다. 일반적으로 엄격하게 말하면 .NET에 필요합니다.

우리 모두 다시해야한다면 메타 데이터 생성을위한 .NET API를 피하고 사양에서 모든 것을 직접 생성 할 수 있습니다. API는 결국 최적화를위한 블랙 박스가되었고 상당한 양의 컴파일 시간이 추가되었습니다.

+0

고맙습니다, 배리. –

3

비 관리 코드? TBH, 내가 가진 가장 좋은 제안은 "P/Invoke 사용"또는 "수행 할 작업을 파악하고 다시 구현"입니다.

까지 관리되지 않는 코드를 포팅 할 수있는 항목을 찾아서 작동하더라도 정확히 프레임 워크를 활용하지는 않습니다. 그리고 그것은 관리되지 않는 것과 관리되는 것 사이에 정확히 1 : 1이 아닙니다.

+1

관리되지 않는 관리 마샬링 (Pinvoke, reverse pinvoke, IJW, COM)을 사용하여 MSIL을 직접 (네이티브 Delphi에서 읽음) 내보낼 수있는 API가 필요합니다. PE 파일을 생성하도록 제안합니까? –

2

어렵게 만들고 있습니다. Codeplex.com에서 제공되는 Irony 및 Common Compiler Infrastructure 라이브러리는 관리 코드로 구현 된 컴파일러를 대상으로합니다. 다음 옵션은 IMetaDataAssemblyEmit, IMetaDataAssemblyImport, IMetaDataEmit2와 같이 관리되지 않는 메타 데이터 인터페이스를 사용하는 것입니다. 그러나 이러한 COM 인터페이스는 cor.h SDK 헤더 파일에 선언되어 있으며 C/C++ 프로그램에서만 사용할 수 있습니다. 사용할 수있는 유형 라이브러리가 없습니다. 인터페이스 선언을 힘들게 복사하는 것부터 시작해서, 델파이 선언으로 변환하는 도구가 필요합니다. 그것이 존재하는지 확실하지 않습니다.

+1

2 일 전에 수동으로 pas 파일로 변환 (cor.h corhdr.h). 그래서 Unmanaged API는 내 컴파일러의 원시 측 프론트 엔드에서 사용할 수 있습니다. 그러나 API는 메소드 구현을 위해 MSIL을 내보내는 것을 지원하지 않습니다. –

+0

ICeeGen은 사용되지 않습니다. 나는 교체를 모른다. –

2

MSIL 또는 CIL은 본질적으로 기계어 코드과 동일합니다. 언어를 구문 분석하고 기계어로 변환 할 때 컴파일러이 있습니다. 초기 언어 컴파일러는 일반적으로 기계 코드를 수동으로 생성합니다. 즉, 소스 언어의 각 종류의 명령 또는 표현식에 대해 어셈블러 명령어의 "템플릿"을 작성하여 번역하십시오. 프로그램의 중간 표현을 통해 작업하면서 해당 템플릿을 선택하고 프로그램 별 세부 정보를 채우고 CIL을 내 보냅니다. CIL과 같은 스택 기반 언어의 경우 여러 문장의 템플릿을 함께 연결하는 것이 매우 쉽습니다. 하나의 명령문 출력 스택은 다음 스택에 대한 입력 스택입니다.

CIL instruction set에 익숙해지고 싶습니다.

컴파일러가 비 관리 코드라는 사실은 중요하지 않습니다. 원하는 프로그램 종류에 상관없이 CIL 텍스트를 생성 할 수 있습니다. 준비가되면 ilasm을 통해 보내 어셈블리를 만듭니다.

+0

Rob, 3 년 전에 Serge Lidin이 "Expert .NET 2.0"뿐만 아니라 ECMA335도 읽었습니다. (그래서 ilAsm은 내 다른 친구입니다.) Rob, Barry Kelly에게 물어 보아도되고 Remobjects의 사람들이이 문제를 어떻게 풀 수 있을까요? 또는 그들은 모두 혼합 모드 C++을 사용하고있을 것입니다. –

+0

프리즘 컴파일러는 프리즘으로 제작되었으며 100 % .NET 응용 프로그램입니다. –

+0

고맙습니다, 로버트. –

관련 문제