2010-11-20 6 views
1

대한 설명크로스 컴파일 대 가상 머신

나는 서로의 언어 (GWT 생각)보다는 대상 플랫폼으로 호스트 플랫폼에서에서 의미 컴파일 십자가를 언급합니다.

배경 내가 자바로 컴파일 교차 아랍어 프로그래밍 언어를 개발하고

이 나에게 플랫폼 관련 번거 로움을 저장. 이제는 이것을 잠시 보류하고 크로스 컴파일을 위해 C으로 다양한 이유로 전환했습니다.

컴파일 할 때 실행중인 시스템의 동일한 라이브러리로 대체 될 단일 라이브러리를 개발하고 싶습니다.

예를 들어 프로그래머가 아랍어 프로그래밍 언어로 GUI 그리기 기능을 작성하고 컴파일하면 Windows에서 컴파일 할 경우 win32 코드로, Gnome에서는 GTK +, KDE에서는 Qt 등으로 크로스 컴파일됩니다. 다른 라이브러리에도 사용할 수 있습니다. 질문

는 컴파일 된 실행 파일로 끝날 또는 내가 가상 머신의 접근 방식 나을 오전이 모든 문제를 통해 갈 가치가? 프로그래머가 언어를 사용하는 것보다는 언어 개발자 관점에서 선택하는 것의 장점과 단점? 고려해야 할 다른 요소가 있습니까?

추가 읽기에 대한 모든 참조 링크가 크게 감사하겠습니다 :) 가장 언어를 기본 가정 및 아이디어를 지원하는 언어로 교차 컴파일해야

+1

일반적으로 "크로스 컴파일"보다는 "대상을 지정하는 * java 또는 c"라는 FooLang 용 컴파일러를 개발한다고 말합니다. – dmckee

+0

게시물에서 "크로스 컴파일"을 언급 한 횟수를 감안할 때 내가 왜 더 짧은 선택을 선호하는지 알 수 있었고 Google과 다른 사람들이 같은 컨텍스트에서이 용어를 사용하고 있기 때문에 나는 그것이 유효하다고 생각했습니다. – Saif

+0

정상적인 의미가 상황에 부합하기 때문에 "컴파일"할 수 있으며 더 짧습니다. =) – rakslice

답변

2

. 귀하의 언어가 가비지 수집 된 경우, 모든 함수 호출은 메소드 호출이며 주소를 데이터로 사용하게하지 않으므로 Java는 컴파일 할 언어입니다.

Java 코드를 네이티브로 컴파일하는 컴파일러가 있습니다. 따라서 프로그램을 기본적으로 실행하려면 프로그램을 사용할 수 있습니다.

당신이 당신의 언어에 대한 자신의 전체 컴파일러를 만들 준비가되면, 당신은 자바 또는 당신이 선택하는 어떤 것과도 이혼 할 수 있습니다.

이 기본 접근 방식은 여러 언어에서 사용되었습니다. 일반적으로 대상 언어는 C로, 다른 언어로는 할 수없는 저급 수준의 작업을 수행 할 수 있고, 성숙한 최적화 컴파일러를 사용하며, 매우 빠르게 실행됩니다. C의 기호, 라이브러리 및 호출 규칙이 잘 작동하는 방식도 잘 알려져 있으며 특정 플랫폼에서 여러 언어로 엄격하게 정의되고 지원되는 경향이 있습니다. 이것은 새로운 언어가 C 언어로 작성된 라이브러리의 전체 호스트에 즉각적으로 액세스 할 수있게합니다.

C++이 이렇게 시작되었습니다 (원래 컴파일러는 cfront라고 불렀습니다). OCaml도이 방법을 시작한 것 같습니다. 나는 당신이 조금 파다 보면 이것이 사실 인 수많은 다른 언어들을 발견 할 수 있다고 생각합니다.

하지만 Cs 하위 수준 기능이 필요하지 않으면 이러한 인수가 Java에도 많이 적용됩니다. 많은 새로운 언어들 (예를 들면 스칼라)은 JVM을 이런 방식으로 사용합니다.

2

저는 @Omnifarious answer를 좋아하지만, 당신이 원하는 tradeoff를 고려해야한다는 점을 강조 할 것입니다.C 또는 C++로 크로스 컴파일하도록 선택할 수있는 고성능을 원한다면 라이브러리의 가용성을 원한다면 다시 C 또는 C++을 선택하는 것이 좋습니다. 언어 상호 운용성을 원하면 LLVM 어셈블러 또는 JVM 또는 .NET 어셈블러를 사용할 수 있습니다.

이제 실제 질문은 : 백엔드를 플러그 가능으로 설정해야합니까? 나는 이것이 실제로는 과 같이 어렵다고 경고해야합니다. 실제로 그것을하는 몇몇 제품을 보자 : 물론 examplar는 물론 gcc이다. 광범위한 입력 언어를 지원할뿐 아니라 광범위한 타겟 CPU에 대한 코드를 생성하도록 설계되었습니다. 다양한 어셈블러 언어를 생성하는 크로스 컴파일러라고 할 수 있습니다.

백엔드 플러그를 만들 수있는 비법은 입력 언어를 번역하기에 충분히 간단하고 다양한 백엔드 언어로 변환 할 수있을만큼 간단하면서도 입력을 인코딩 할만큼 충분히 강력한 중간 언어입니다.

기본적으로 문제는 다음과 같습니다. IL을 너무 추상적으로 만들면 너무 많이 가정에 고정되므로 쉽게 변경할 수 없습니다. 너무 구체화하면 여러 개의 백엔드로 변환하기가 너무 어렵습니다.

IL의 디자인을 안내하는 유스 케이스로 작동 할 잠재적 인 백엔드 대상 언어가 적어도 3 개 이상인 경우에만이 작업을 고려해야한다고 생각합니다.