2010-07-11 5 views
14

저는 llvm이나 clang에 대한 경험이 없습니다. 내가 읽은 clang은 쉽게 임베디드 가능하다고합니다. 그러나 이것을 달성하는 방법에 대한 자습서를 찾지 못했습니다. Wikipedia-Clang. 그렇다면 런타임시 사용자 정의 코드를 컴파일하고 실행하는 JIT로 스크립팅 기능을 가진 C++ 응용 프로그램 사용자에게 제공 할 수 있습니까? 응용 프로그램을 호출하여 클래스와 메서드를 호출하고 객체를 공유 할 수 있습니까?Clang을 스크립트 인터프리터로 C++ 코드에 포함시키는 데 필요한 자습서가 있습니까?

편집 : 나는 어떤 튜토리얼 모르는 무슨 C-같은 스크립트 languge 구문 (또는 C++ 자체)

답변

10

을 선호하는 것,하지만 연타 소스의 예를 들어 C 인터프리터가 그건 도움이 될거야. 여기에서 찾을 수 있습니다 : http://llvm.org/viewvc/llvm-project/cfe/trunk/examples/clang-interpreter/

이 경로를 사용하면 스크립트 언어에 대한 구문을 선택할 필요가 없을 것입니다. Clang은 C, C++ 및 Objective C만을 구문 분석합니다. 어떤 변형이 필요한 경우 작업을 줄일 수 있습니다.

+0

감사합니다. 실행 및 실행을 위해 꽤 오래 걸렸습니다. 기본적으로 실행 파일을 찾지 못했기 때문입니다. 지금 살펴보면 절반 정도라고 말하고 싶습니다. 이제 지렛대가 아닌 부분에 정의 된 함수를 호출하는 방법을 알아야합니다. 그게 어떤 생각이야? – FFox

+0

무슨 뜻인지 모르겠다. 컴파일 한 함수에 대한 포인터를 얻을 수 있어야합니다. 어쩌면이 일반적인 LLVM 튜토리얼이 도움이 될 것입니다 : http://llvm.org/docs/tutorial/ (특히 4 장). 나는이 인터프리터를 그대로 사용할 수있을 것이라고 기대하지는 않지만, C/C++ 인터프리터를 응용 프로그램에 임베드하는 방법에 대한 아이디어를 제공해야합니다. (나는 그것을 직접 사용해 본적이 없으며 방금 그것을 본 것을 기억했다.) –

+1

좋아, 내가 한 일은 다음과 같다. http://lists.cs.uiuc.edu/pipermail/cfe-dev/2010-July/009836.html ... 실제로 cfe-dev 메일 링리스트의 멋진 사람들의 도움을 받아 작업했습니다. 왜이 통역사를 앱에서 사용할 수 없다고 생각하십니까? – FFox

0

나는 연타에 대해 알고하지 않습니다하지만 당신은 채널을보고 할 수 있습니다 :

http://www.softintegration.com/

이것은 임베디드으로 설명 또는 독립형 ++ 통역 C/C. 이 여기 내장의 예와 박사 돕 스는 기사입니다 : 나는 그것으로 연주보다 더하지 않은

http://www.drdobbs.com/architecture-and-design/212201774

는하지만 안정적이고 성숙한 제품이 될 것으로 보인다. 그것은 상업적인 폐쇄 소스지만, "표준"버전은 개인용 및 상업용 모두 무료로 설명됩니다. 그러나 라이센스를 살펴보면 "상업용"은 판매되거나 배포되는 제품에 내장되지 않고 내부 회사 사용 만 포함 할 수 있습니다. (저는 변호사가 아니므로 라이센스 조항의 일부가되도록 SoftIntegration을 확인해야합니다.)

5

clang을 라이브러리로 사용하여 다른 답변에서 설명한대로 JIT 컴파일을 구현할 수 있습니다. 그런 다음 컴파일 된 모듈 (예 : .so 라이브러리)을로드해야합니다.

이 작업을 수행하려면 표준 dlopen (unix) 또는 LoadLibrary (windows)를 사용하여로드 한 다음 dlsym (unix)을 사용하여 컴파일 된 함수를 동적으로 참조하고 "스크립트"main() 그의 이름은 알려져있다. C++의 경우 맹 글링 된 기호를 사용해야합니다. 휴대 가능한 대안은 예를 들어. GNU의 libltdl.

대안으로 "스크립트"는 모듈 초기화 함수를 구현하거나 정적 코드를 두어로드시 자동으로 실행될 수 있습니다 (C++ 전역 적으로 정의 된 객체의 생성자가 즉시 호출됩니다).

로드 된 모듈은 주 응용 프로그램의 모든 항목을 직접 호출 할 수 있습니다. 물론 심볼은 적절한 메인 어플리케이션의 헤더 파일을 사용하여 컴파일 타임에 알려집니다.

프로그램에 C++ "plugins"을 쉽게 추가하고 구성 요소 인터페이스를 이전에 알기를 원하면 (메인 응용 프로그램이 모듈이 메모리에로드되기 전에 .h에서로드 된 클래스의 이름과 인터페이스를 알고 있다고 가정하십시오.), 라이브러리를 동적으로로드 한 후에 클래스는 정적으로 링크 된 것처럼 사용할 수 있습니다. 모듈을 dlopen()하기 전에 클래스의 객체를 인스턴스화하지 않도록하십시오.

정적 코드를 사용하면 멋진 자동 플러그인 등록 메커니즘을 구현할 수 있습니다.

0

나는 C 또는 C++ 컴파일러를 포함하면 같은 Clang가 귀하의 경우 좋은 생각입니다 확실하지 않다. "스크립트", 즉 (C 또는 C++) 코드가 (런타임에!) 임의로 처리 될 수 있으므로 전체 응용 프로그램을 중단시킬 수 있습니다. 일반적으로 잘못된 사용자 입력으로 인해 응용 프로그램이 손상되는 것을 원하지 않습니다.

인터프리터를 포함하려면 Guile 또는 Lua과 같은 용도로 고안된 것을 선택하고 스크립트의 오류로 인해 전체 응용 프로그램이 중단되지 않도록주의하십시오. 해석자 삽입에 대한 자세한 내용은 this answer을 참조하십시오.