2009-12-14 3 views
1

대학에서 컴파일러 규율을 수행하고 있으며 우리가 원하는 플랫폼에 대한 우리의 발명 언어 코드를 생성해야합니다. 가장 간단한 경우는 Java JVM 또는 .NET CLR 용 코드를 생성하는 것입니다. 선택할 수있는 모든 제안과 API가이 작업에 도움이 될 수 있습니까? 나는 이미 모든 의미 론적 분석을 완료했다. 단지 주어진 프로그램에 대한 코드를 생성 할 필요가있다.Java JVM/.NET 용 코드 생성 CLR

감사합니다.

+1

나는 프로젝트의 재미있는 부분이 스스로 코드를 생성하고 있다고 생각한다. 비슷한 프로젝트가 있었지만 중간 언어와 해당 언어의 가상 컴퓨터도 만들어야했습니다. "고어"를 컴파일하고 "바이너리"를 실행하여 프로그램이 실제로 작동하는지 확인하는 것은 매우 좋았습니다. –

+0

우리 수업에서 이미 일반적인 IL을 사용했기 때문에 처음 생각했습니다.하지만 실제 환경에서 실행되는 코드를 생성하는 것이 더 어려웠습니다. – Pedro

+0

단계별로 잘못하는 것은 없습니다. 예를 들어 JVM 바이트 코드에 컴파일러를 작성한 후 JVM 바이트 코드에서 원시 코드로 컴파일러를 작성할 수 있습니다. –

답변

4

, 더 높은 수준에서, 두 개의 VM은 실제로는 매우 유사하다 : 모두 크게 높은 수준의 운영과, 고전 스택 기반 기계입니다 (예를 들어 가상 메서드 파견 된 op 코드). CLR을 사용하면 산술, 원시 함수 포인터, 유니온 등이 포함 된 원시 데이터 포인터가 있기 때문에 원하는 경우 메탈로 이동할 수 있습니다. 또한 적절한 테일 코드가 있습니다. 따라서 언어 구현에서 위의 항목 중 하나가 필요한 경우 (예 : Scheme 사양에서 꼬리 호출을 요구함) 또는 이러한 기능을 사용함으로써 언어가 크게 도움이되는 경우 CLR 방식을 사용하는 것이 좋습니다.

또 다른 이점은 거기에 바이트 코드를 방출하는 주식 API를 얻을 수 있다는 것입니다. System.Reflection.Emit - 본격적인 컴파일러 시나리오에는 다소 제한적이지만, 여전히 일반적으로 간단한 컴파일러에 충분합니다.

JVM을 사용하면 더 나은 이식성과 바이트 코드 자체가 논란의 여지가 있지만 (기능이 적기 때문에) 두 가지 주요 이점을 얻을 수 있습니다.

+0

언어가 매우 간단하기 때문에 좋을지도 모릅니다. 기본 동작은 몇 가지입니다. Java에서 API를 사용하면 바이트 코드의 내부에서 '수동으로'생성해야한다는 것을 알 수 있습니다. – Pedro

+1

Apache BCEL (http://jakarta.apache.org/bcel/)은 인기있는 바이트 코드 조작 라이브러리 인 것 같습니다. ASM (http://asm.ow2.org/)도 재미있어합니다. –

+1

반면에 CLR 작업의 전체 집합을 사용할 필요는 없으며 기본 CLR 작업은 대부분 JVM의 작업과 동일합니다. 또한 CLR에는 MSIL 바이트 코드 (http://en.wikipedia.org/wiki/MSIL)를 나타내는 표준 텍스트 구문이 있으므로 다른 옵션은 MSIL을 출력 한 다음 'ilasm'을 컴파일하는 것입니다. 바이너리 바이트 코드를 직접 출력하는 것보다 디버깅이 다소 쉬울 수도 있습니다. –

1

내가 건너 온 또 다른 옵션은 무엇 발광을 사용하여 런타임에 MSIL 코드를 생성 할 수 날카로운 실행라는 라이브러리입니다. 하지만 C#과 더 비슷하게 사용자 친화적 인 방식으로 더 멋지게 보입니다. 최신 버전의 라이브러리는 여기에서 찾을 수 있습니다. 내가 아는 바로는 http://code.google.com/p/runsharp/