2016-09-08 6 views
0

저는 실시간 임베디드 시스템을 테스트하기위한 간단한 해석 언어를 설계하고 있습니다. 제어 흐름은 스크립트가 수행 할 작업 + 실행 시간에 대한 강력한 정적 보장을 제공하기 위해 심각하게 제한됩니다. 예를 들어, 상수 조건으로 분기하거나 고정 범위로 반복 할 수 있습니다.하스켈에서 C++ interop을 사용하여 간단한 DSL 구현하기

관련 모델과 IO 라이브러리가있는 C++의 기존 코드베이스가 너무 커서이 언어는 C++을 호출 할 수 있어야합니다. 테스트중인 시스템에는 까다로운 타이밍 요구 사항이 있으므로 테스트 프레임 워크에서 많은 지터를 감당할 수 없습니다. 우리의 과거 솔루션은 C++ 런타임에 임베디드 된 맞춤형 DSL 이었지만 우리는 필요한 정적 인 보장을 달성하기 위해 너무 많은 바퀴 (파서, 린터, 인터프리터 인터프리터 등)를 다시 발명 해 냈습니다.

이러한 보증을 통해 임베디드 DSL을 제작하는 하스켈의 설비는 매우 매력적이지만 소프트 실시간 C++ 런타임에 임베드하는 방법을 결정하지 못했습니다. 어떤 아이디어? 라이브러리/기존 프로젝트에 대한 포인터가 크게 감사하겠습니다!

+1

[GHC RTS 임베디드] (https://downloads.haskell.org/~ghc/7.10-latest/docs/html/users_guide/ffi-ghc.html) - 간단히 요약하면 다음과 같습니다. 런타임에'hs_init()'을 사용하고 Haskell에서 Haskell 소스를로드 & 실행하거나 C++에서 미리 컴파일 된 Haskell 코드의 공유 라이브러리를로드하려면 [hint] (https://hackage.haskell.org/package/hint)를 사용하십시오. (후자는 Facebook에서 [Haxl] (https://github.com/facebook/Haxl) 코드를 사용하는 것입니다.) –

답변

2

최소 저항의 경로와 같은 소리는 C++을 생성하는 EDSL입니다. 이렇게하면 소프트 실시간과 GHC RTS 간의 잠재적 인 불일치에 대해 걱정할 필요가 없습니다.

당신은 어떻게 구현되는지 다른 치하를 생성 EDSLs 볼 수 있습니다

  • HJScript는 JS를 내장에 무료 모나드 접근 방식을 사용합니다.
  • JMacro은 더 많은 외부 DSL 접근 방식을 사용하지만 TH를 통해 포함됩니다. 내 선택이 아니 겠지.

C++ 코드 문자열을 생성하는 대신 데이터 구조를 사용하는 것이 좋습니다. 불행히도 C++에서 사용할 수있는 패키지가없는 것 같습니다. 그러나 language-c을 살펴 보거나 직접 확장하거나 직접 빌드 할 수 있습니다. C를 생성하고 해당 언어에서 제공하는 C to C++ interop을 사용하는 것을 고려할 수도 있습니다.

Cryptol 또는 Cogent의 디자인을 보지 못하게 할 수도 있습니다. 이러한 프로그래밍 언어는 본격적인 프로그래밍 언어이므로 (사용자가 멀리 떨어져서 조종하려는 경향이 있음을 나타냄).