我想知道是否存在任意描述数据结构的格式和语义的声明性语言,可以在任何一组目标语言中编译成该结构的特定实现。也就是说,类似于通用data definition language,但是用于描述任意数据结构,例如向量,列表,树等,以及对这些结构的操作语义。我问,因为我有一个关于这个概念的可行实现的想法,我只是想知道它是否值得,因此,它是否已经完成。
另一个稍微抽象的问题:数据结构的规范性规范(它的作用)与其实现(它是如何实现的)之间是否存在真正的区别?更具体地说,应该将相同需求的实现分开 ?
答案 0 :(得分:3)
如果您愿意,XML和XSLT的组合可以描述数据结构,并且如果您愿意,可以提供基本上任何语言的匹配定义。我从来没有尝试过正式证明,但我的第一个猜测是S表达式是XML的超集(模数语法差异)。
至少在理论上,是的,数据结构的描述与其如何实现之间存在(或至少可能存在)差异。举一个明显的例子,您可以描述从键到值的通用映射,它可以使用基于哈希表,跳过列表,二进制搜索树等的实现。这主要是在足够高的抽象级别描述它的问题。允许实施中的差异。如果您包含太多要求(复杂性,排序等),您可以很快排除许多实现。
答案 1 :(得分:3)
您可能对消息规范/数据序列化语言感兴趣,例如Google的Protocol Buffers以及ASN.1。它与你正在寻找的略有不同,但同样如此。
两者都是为通信声明通用消息的方式。协议缓冲消息规范“编译”到不同的语言,但中央协议是一致的。 ASN.1具有多个不同的编译实用程序以及不同的协议表示,在逻辑上与不同的文字实现保持一致。例如,看看XER,PER与BER。
我喜欢一种规范语言,它只关注逻辑内存结构的简单压缩二进制布局。可能是普通C结构是表达这一点的最简单的常见方式。我曾希望ASN.1有某种方法可以达到这个目的,但在看了一下之后,ASN.1 PER很接近,但不是很好。
修改:Apache Thrift和Capn' Proto也可能很有趣。
答案 2 :(得分:2)
动态逻辑中存在类似事物的方法,它们试图捕获程序的语义。但是,动态逻辑方面的含义是前提条件和后置条件,对于列表的实际实现是不可知的。
这些数据结构本质上与实现有关,因为链表和数组之间的唯一区别在于它是如何在内存中布局的。
为此,有一种通用数据定义语言---任何高级编程语言 - C,C ++,java - 都指定了这一点。它们中的任何一个都是通用的,因为在这种情况下,它们中的任何一个都可以编译到另一个。
答案 3 :(得分:0)
Cozy是“从非常高级的规范中综合数据结构实现的工具”,当我问这个问题时,它似乎实际上是我实际上正在寻找(或考虑编写)的语言。
它可以根据以其专有语言编写的数据结构规范自动生成实现(在撰写本文时,使用Java或C ++)。规范描述了数据结构的抽象状态,更新操作和查询操作,以及必须维护的不变式和假设可以被求解器用来优化实现。例如,这是图形数据结构的部分规范:
Graph:
handletype Node = { id : Int }
handletype Edge = { src : Int, dst : Int }
state nodes : Bag<Node>
state edges : Bag<Edge>
// Invariant: disallow self-edges.
invariant (sum [ 1 | e <- edges, e.val.src == e.val.dst ]) == 0;
op addNode(n : Node)
nodes.add(n);
op addEdge(e : Edge)
assume e.val.src != e.val.dst;
edges.add(e);
query out_degree(nodeId : Int)
sum [ 1 | e <- edges, e.val.src == nodeId ]
// …
Calvin Loncaric,Emina Torlak和Michael D. Ernst在Fast Synthesis of Fast Collections和Generalized Data Structure Synthesis中描述了其实现。