c++ - 使用 C++ 互操作在 Haskell 中构建简单的 DSL

标签 c++ haskell testing dsl soft-real-time

我正在设计一种用于测试实时嵌入式系统的简单解释型语言。控制流受到严格限制,以提供关于脚本将做什么以及它们将运行多长时间的强大静态保证。例如,您只能在常量条件上分支或在固定范围内循环。

C++ 中现有大量代码库以及相关模型和 IO 库,因此这种语言必须能够调用 C++。被测系统有严格的时序要求,所以我们不能容忍测试框架中有太多的抖动。我们过去的解决方案是在 C++ 运行时中嵌入自定义 DSL,但我们最终重新发明了太多轮子(解析器、linter、交互式解释器等)来实现我们需要的静态保证。

Haskell 制作具有这些保证的嵌入式 DSL 的工具对我来说极具吸引力,但我一直在决定如何将它嵌入软实时 C++ 运行时。有任何想法吗?非常感谢指向任何库/现有项目的指针!

最佳答案

听起来阻力最小的路径是生成 C++ 的 EDSL。这样,您就不必担心软实时和 GHC RTS 之间可能存在的不匹配。

您可能会查看其他生成 PL 的 EDSL 是如何实现的:

  • HJScript使用免费的 monad 方法嵌入 JS。
  • JMacro使用更多的外部 DSL 方法,但通过 TH 嵌入。这不是我的选择。

与其生成 C++ 代码字符串,不如拥有一个数据结构。不幸的是,似乎没有适用于 C++ 的包。但是,您可以看一下 language-c - 也许扩展它或构建你自己的。您甚至可以考虑生成 C 并使用这些语言提供的 C 到 C++ 互操作。

我可能会劝阻您不要查看 Cryptol 的设计或 Cogent,因为它们是完全成熟的编程语言(您已表示您倾向于避开)。

关于c++ - 使用 C++ 互操作在 Haskell 中构建简单的 DSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39399162/

相关文章:

java - play 2 如何在测试时覆盖全局设置

c++ - 声明和定义之间的冲突是否会导致未定义的行为?

c++ - Media Foundation 网络摄像头视频 H264 编码/解码在播放时产生伪像

haskell - GADT的Traversal怎么写?

haskell - 如何在haskell中使用以下方法获得无限的权力列表

haskell - 在 Haskell 中解析 HTTP 请求

visual-studio-2010 - 如何在 WebTest VS2010 中绑定(bind)提取的参数

c++ - 如何在Linux Mint 18上运行的Eclipse中使用Boost.Python?

c++ - 如何在 C++ 中读取由要读取的字符数定义的文件段?

安卓。 Mockito 使用真实对象而不是模拟对象