LLVM을 통해 C ++ 애플리케이션에서 Java로 포트를 작성할 수 있습니까?


9

LLVM을 사용하여 C ++ 응용 프로그램을 Java 바이트 코드로 이식하는 것이 얼마나 실용적인가요?

문제는 현재 C ++로 작성된 프로세스를 가지고 있지만 새로운 클라이언트는 기본 코드가없는 Java Virtual Machine (JNI 없음)을 사용하여 멀티 플랫폼 방식으로 프로그램을 실행할 수 있어야한다는 것 입니다. 아이디어는 생성 된 jar를 가져 와서 다른 시스템 (Linux, Win, 32 비트-64 비트)으로 복사 한 다음 작동해야합니다.

둘러 보면 C ++을 LLVM IR 코드로 컴파일 한 다음 해당 코드를 java 바이트 코드로 컴파일 할 수있는 것처럼 보입니다. 생성 된 코드를 읽을 필요가 없습니다.

나는 emscripten을 사용하여 비슷한 것들을 약간 테스트했다. 이는 C ++ 코드를 사용하여 JavaScript로 컴파일한다. 결과는 유효한 JS이지만 완전히 읽을 수 없습니다 (아샘 블러처럼 보입니다).

  • 이 기술을 사용하여 C ++에서 Java 바이트 코드로 응용 프로그램 포트를 만든 사람이 있습니까?
  • 우리는 어떤 문제에 직면 할 수 있습니까?
  • 생산 코드에 대한 올바른 접근 방법입니까?

몇 가지 주석 후 내 요점을 더 명확하게하기 위해 아마도 포트가 잘 사용되지 않을 수 있습니다. 결과적으로 읽을 수있는 소스 코드를 기대하지 않습니다 .Java 바이트 코드이므로 더 이상 개발 될 '포트'가 아닙니다. 대상 플랫폼은 기본 assamblear가 아닌 Java JVM이어야합니다.

참고 : 현재 비표준 C ++ 및 가까운 소스 라이브러리가 있으며이 비표준 코드 및 모든 가까운 소스 라이브러리를 제거하고 Free Libre Open Source Software를 사용하려고하므로 모든 코드가 표준 C ++ 코드라고 가정 해 보겠습니다. 컴파일 타임에 모든 코드를 사용할 수 있습니다.

주 2 : 이식 가능한 C ++ 코드를 작성하고 원하는 대상 플랫폼으로 컴파일하는 옵션이 아니므로 컴파일 된 프로그램은 다중 플랫폼이어야하므로 JVM을 사용해야합니다.

Note3 : 지금 우리는 파이썬이나 다른 언어 기반에 적용되는 유사한 솔루션을 조사하지 않고 있지만 그것에 대해 듣고 싶습니다. 이것으로 우리의 대상 실행 파일은 Java 바이트 코드 여야하지만 유효한 파이썬 컴파일 코드로 C ++를 컴파일하는 옵션이 있으면 그것에 대해 듣고 싶습니다.


파이썬에 대한 마지막 문장에서 무슨 뜻인지 확실하지 않지만 자이 썬은 정확히 동일합니다. 파이썬 VM 대신 JVM을 사용하고 정확히 그 시나리오에서 사용하십시오 : 프로그래머는 파이썬을 사용하기를 원합니다.
Javier

우리는 몇 줄의 코드를 이야기하고 있습니까? 다시 쓸 가치가 있지만 간단한 결정은 아닙니다. 또한 코드에서 포인터 산술을 수행하면 JVM에서 작업 할 때 어떻게 처리되는지 알고 싶습니다.
Levi Morrison

1
그 O_O 재미를해야 디버깅
다니엘 Gratzer

@LeviMorrison. 글쎄, 코드는 상당히 광범위하지만 (통신에 대한 다양한 라이브러리 의존성, 유틸리티 기능) 컴파일 타임에 모든 코드를 사용할 수 있다고 가정합니다. 또한 다른 클라이언트가 필요하지 않은 경우에도 여전히 원시 바이너리를 생성합니다.
Javier Mr

@jozefg. 포인터 대수 및 디버깅 목적으로 디버깅 할 수 있다고는 생각하지 않습니다. 예를 들어 Emscripten은 동일한 작업을 수행하지만 대상 언어는 Javascript이므로 프로그램 카운터에 대한 힙 및 비트 단위 연산과 같은 큰 바이트 배열로 끝나고 객체, 문자열 또는 이와 유사한 것이없는 바이트가있는 연산 만 끝납니다. 자바 바이트 코드에서 assamblear와 비슷한 결과를 기대하며 디버깅 할 수없는 것으로 가정 할 수 있습니다.
Javier Mr

답변:


11

나는 이것이 효과가 있을지 정말로 의심한다. 코드를 Java 바이트 코드로 변환 할 수는 있지만 라이브러리 호출을 Java 런타임 및 라이브러리에 대한 동등한 호출로 마술로 변환하지는 않습니다. 동등한 Java 런타임 호출이 없을 수도 있습니다! 모든 독점 라이브러리를 제거하더라도 여전히 C ++ 표준 라이브러리가 남아 있습니다.

이를 구체화하려면 : C ++ 프로그램에 fprintf () 호출이 포함될 수 있습니다. 이 함수는 C 표준 라이브러리에서 구현되며 C ++ 프로그램이 호출하는 것이 합법입니다. LLVM에서 LLJVM 로의 번역기는 아마도 fprintf ()와 동등한 결과를 생성하고이를 대체 할 Java 런타임 호출 순서를 마술처럼 계산하지 않을 것입니다.이 기능을 제공하려면 Java에서 C 및 C ++ 런타임을 본질적으로 다시 구현해야합니다. 바이트 코드.

C ++에서 Java 로의 변환을 수행 하는 도구 가 있지만 몇 가지 간단한 런타임 라이브러리 호출 만 변환합니다. 나머지는 알아 내야 할 것입니다.


나는 당신의 요점을 보지만, 내가 emscripten이 이해하지 못하는 한 emscripten이 당신이 지적한 것을 피하기 위해 사용자 정의 표준 라이브러리를 제공한다는 것을 이해하지 못한다면 (그리고 SDL 라이브러리를 통한 webGL의 매핑조차도) 이해합니다 ). 그러나 Java와 동등한 것을 찾을 수 없습니다 (LLJVM은 버린 것 같습니다). 나는 플랫폼 독립적 인 빌드로 llvm 바이트 코드를 제안하려고 생각하고있다 (물론, 플랫폼에 따라, API 또는 데이터에 의해 컴파일 브랜치가 없거나 사용 apr또는 유사 함)
Javier Mr

3
lljvm은 부분적으로 C가 JVM 바이트 코드로 컴파일되고 부분적으로 Java 클래스로 C 런타임 라이브러리를 제공합니다. 꽤 완벽한 libc입니다. libstdc ++에 해당하는 항목을 작성해야합니다. 또한 lljvm 백엔드는 현재 C ++을 실제로 지원하지 않습니다. 최신 llvm 빌드와 작동하도록 lljvm을 수정하려고했습니다. llvm API 및 도구가 릴리스간에 계속 많이 변경되므로 속도가 느립니다. 여기를 따라 가면 거의 쓸모있는 모양입니다. github.com/hyc/lljvm/tree/llvm3.3
hyc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.