2013-09-04 1 views
9

Lisp, Tcl, Perl 등과 같이 런타임 중에 코드 내에서 lambda/proc/sub를 쉽게 정의하고 평가할 수있는 해석 언어가 있습니다 그것은 같은 세션 내에서.필요에 따라 함수를 어셈블하고 빠르게 계산하기

해석 된 것보다 훨씬 빠르게 실행되는 C++와 같은 컴파일 된 언어가 있지만 런타임 중에 컴파일 된 프로그램 내에서 함수를 정의하고 실행하면 쉽지 않습니다.

  1. 런타임시 함수를 정의 : 예를 들어, 초기의 입력 데이터에 기초하여 데이터의 분석 모델을 도출

    여기서 문제는 다음과 같이한다.

  2. 예를 들어 들어오는 데이터를 분석하기 위해 파생 된 분석 모델을 적용하는 것과 같이 반복적으로 위 기능을 실행하십시오. 내가 본

하나의 해결책은 아주 예쁜하지 않았다 :

  1. 분석적 모델을 나타내는 절차는 초기 입력 데이터를 기반으로 임베디드 티클에서 파생되었다.

  2. 룩업 테이블은 낙천적으로 말하면 적용 범위를 포괄하는 샘플 포인트 배열에 대해 Tcl의 절차를 평가함으로써 만들어졌습니다.

  3. 조회 테이블이 Tcl 인터프리터에서 이진 (C++에서 개발 됨)으로 다시 전달되었습니다.

  4. 그런 다음 들어오는 데이터는 찾아보기 테이블의 "close enough"값 사이를 보간하여 분석되었습니다.

위의 해결 방법은 효과적이지만 개념적이며 계산적인 문제가 있습니다. 따라서 질문 : C++ 내에서 함수를 순전히 정의하고 동일한 런타임 세션 내에서 실행 가능하게 할 수 있습니까?

개념적으로 말하자면, 문자열로 함수를 만들고, 메모리에 컴파일하고, 실행중인 바이너리로 연결하는 등의 작업을 수행 할 수 있습니까?

+0

많은 효율적인 Lisp 컴파일러가 있습니다. .NET 및 JVM과 같은 JIT로 컴파일 된 VM이 있습니다. 임베딩 가능한 C 컴파일러 (tcc, clang)가 있습니다. 또한 강력한 최적화 컴파일러의 모든 이점을 통해 LLVM IR을 직접 생성하는 것이 매우 쉽습니다. –

+1

심지어 C++ 인터프리터도 널리 사용됩니다 (CINT 및 ROOT 참조). –

답변

12

박스에서 즉시 작동하는 것을 원하면 ExprTK을보십시오. 표현 파서를 작성하려면 Boost Spirit을 확인하십시오.

대안으로 C++ 코드를 컴파일하고 공유 라이브러리 (플러그인)로 컴파일 한 다음 런타임에로드 할 수도 있습니다. 이것은 아마도 가장 빠른 해결책 일 것입니다.

+0

감사합니다. 첫눈에 부스트 스피릿이 유망 해 보입니다. 얼마나 빨랐는지 아십니까? 충분히 빠른 루프에서 실행될 수있는 최적화 된 바이너리 코드를 생성합니까? – Michael

+0

Spirit로 작성된 구문 분석기는 일반적으로 AST (Abstract Syntax Tree)를 작성합니다. 이는 AST (Abstract Syntax Tree)를 단순히 작성하고 조작 및 값을 집계 한 것입니다. 다음은 그 예입니다 : [Boost Spirit AST 예제] (http : //www.boost.org/doc/libs/1_41_0/libs/spirit/example./qi/calc2_ast.cpp). 따라서 결과는 일반적으로 최적화 된 컴파일 된 코드보다 느립니다. 속도가 가장 중요한 문제라면 마지막 제안을 위해 가야합니다. – ToniBig

+13

@Michael Boost.Spirit은 파싱에는 문제가 없지만 AST를 평가하면 성능이 크게 저하 될 것입니다. 또한 Boost로 개발하십시오. Spirit은 많은 인내심이 필요하며 대부분의 컴파일러는 간단한 +/-/* 계산기 스타일 문법보다 더 복잡한 것에 거의 대처할 수 없습니다 - 컴파일 시간은 오래 가지 못하고 모든 종류의 트릭은 문법을 깨는 것처럼 끝내야합니다 여러 개의 파일 등으로 –

관련 문제