![]() |
1
47
在Galois,我们用haskell做两件事:
所以要小心区分EDSL(copilot或atom)和宿主语言(haskell)。 一些关键系统的例子,在某些情况下,实时系统,不管是由Galois编写的还是由Haskell生成的。 EDSL
系统 |
![]() |
2
6
|
![]() |
3
6
安德鲁, 是的,通过生成的代码返回到原始源代码来调试问题可能很困难。Atom提供的一件事是探测内部表达式的方法,然后由用户决定如何处理这些探测。对于车辆测试,我们构建了一个发送器(在Atom中),并通过CAN总线将探针输出。然后,我们可以捕获这些数据,对其进行格式化,然后使用诸如gtkwave之类的工具在后处理或实时中查看这些数据。对于软件模拟,探针的处理方式不同。不是从CAN协议获取探针数据,而是对C代码进行钩子,以直接提升探针值。然后在单元测试框架(与Atom一起分发)中使用探针值来确定测试是通过还是失败,并计算模拟覆盖率。 |
![]() |
4
4
我不认为haskell或其他垃圾收集语言非常适合于硬实时系统,因为GC倾向于将它们的运行时间分解为短暂的停顿。 在Atom中编写并不完全是在Haskell中进行编程,因为这里的Haskell可以看作是您正在编写的实际程序的纯粹预处理器。 我认为哈斯克尔是一个 令人惊叹的 预处理器和使用类似于Atom的DSEL可能是创建大型硬实时系统的好方法,但我不知道Atom是否符合要求。如果没有,我很确定这是可能的(我鼓励任何人这样做!)实现一个这样的DSEL。 对于低级语言来说,拥有像haskell这样强大的预处理器,可以打开一个巨大的机会窗口,通过代码生成来实现抽象,这在作为C代码文本生成器实现时要笨拙得多。 |
![]() |
5
4
我一直在玩弄原子。它很酷,但我认为它最适合小型系统。是的,它在卡车和公共汽车上运行,并实现现实世界中的关键应用程序,但这并不意味着这些应用程序必然是大型的或复杂的。它确实适用于难实时的应用程序,并且会花大量的时间让每个操作占用完全相同的时间。例如,它有一个“mux”语句,它总是在有条件地选择两个计算值之一之前执行两个分支,而不是有条件地执行两个运行时间可能不同的代码分支之一的if/else语句(因此,总执行时间与选择的值相同)。除了内置类型(类似于C)之外,它没有任何重要的类型系统,这些类型系统是通过通过通过原子monad传递的gadt值强制实现的。作者正在开发一个静态验证工具,用于分析输出C代码,这非常酷(它使用SMT解算器),但我认为Atom将受益于更多的源代码级特性和检查。即使是在我的玩具大小的应用程序(LED手电筒控制器)中,我也犯了一些新手错误,有经验的人可能会避免这些错误,但这导致了错误的输出代码,我宁愿被编译器捕获而不是通过测试。另一方面,它仍然是0.1版,因此毫无疑问,改进正在到来。 |
![]() |
trpnd · 如何定义由两个任意单声道变压器组成的单声道变压器? 2 年前 |
![]() |
Fabus1184 · Haskell mapM_不打印 2 年前 |
![]() |
Gotthold · 基于范数约束向量的类型 2 年前 |
![]() |
jian · haskell将另一个函数用作输入参数 2 年前 |
![]() |
Jocafrei · 用Haskell函数实现最大公约数函数 6 年前 |