Data structures 通用数据结构描述语言

Data structures 通用数据结构描述语言,data-structures,programming-languages,declarative,Data Structures,Programming Languages,Declarative,我想知道是否存在任何用于任意描述数据结构的格式和语义的声明性语言,这些语言可以在任何一组目标语言中编译为该结构的特定实现。也就是说,类似于泛型,但面向描述任意数据结构,如向量、列表、树等,以及这些结构上操作的语义。我问这个问题是因为我有一个可行的想法来实现这个概念,我只是想知道它是否值得,因此,以前是否做过 另一个稍微抽象一点的问题:数据结构的规范性规范(它做什么)和它的实现(它如何做)之间有什么真正的区别吗?更具体地说,相同需求的单独实现是否应该被视为不同的结构?在动态逻辑中有这样的方法,试图

我想知道是否存在任何用于任意描述数据结构的格式和语义的声明性语言,这些语言可以在任何一组目标语言中编译为该结构的特定实现。也就是说,类似于泛型,但面向描述任意数据结构,如向量、列表、树等,以及这些结构上操作的语义。我问这个问题是因为我有一个可行的想法来实现这个概念,我只是想知道它是否值得,因此,以前是否做过


另一个稍微抽象一点的问题:数据结构的规范性规范(它做什么)和它的实现(它如何做)之间有什么真正的区别吗?更具体地说,相同需求的单独实现是否应该被视为不同的结构?

在动态逻辑中有这样的方法,试图捕获程序的语义。然而,动态逻辑的含义是先决条件和后决条件,对于列表的实际实现是不可知的

这些数据结构与实现有着内在的联系,因为链表和数组之间的唯一区别就是它们在内存中的布局方式


这是一个通用的数据定义语言---任何高级编程语言——C、C++、java——指定这一点。它们中的任何一个都和另一个一样通用,因为在此上下文中,它们中的任何一个都可以编译成另一个。

如果您愿意,XML与XSLT的组合可以描述数据结构,并提供基本上任何语言(如果您选择)的匹配定义。我从未尝试过正式证明它,但我的第一个猜测是S表达式是XML的超集(模语法差异)


至少在理论上,是的,对数据结构的描述和它如何实现之间存在(或至少可能存在)差异。举一个明显的例子,您可以描述从键到值的通用映射,它可以使用基于哈希表、跳过列表、二进制搜索树等的实现。这主要是一个在足够高的抽象级别上描述它以允许实现中的差异的问题。如果您包含太多的需求(复杂性、顺序等),您可以很快排除许多实现。

您可能对消息规范/数据序列化语言感兴趣,例如Google的协议缓冲区以及ASN.1。这是一个稍微不同的倾斜比你正在寻找,但在相同的静脉

这两种方法都是为通信声明通用消息的方法。协议缓冲区消息规范“编译”到不同的语言,但中心协议是一致的。ASN.1具有多个不同的编译实用程序以及不同的协议表示,它们在逻辑上与不同的文字实现保持一致。看看XER,例如PER和BER

我喜欢一种规范语言,它只关注简单的压缩二进制布局,而不是逻辑内存结构。可能普通的C结构是表达这一点的最简单的常用方式。我曾希望ASN.1有办法做到这一点,但在看了一会儿之后,ASN.1%已经接近了,但还不完全是这样

编辑:这可能也很有趣。

是“一种从非常高级的规范中综合数据结构实现的工具”,并且似乎本质上是我在问这个问题时实际寻找(或考虑编写)的语言

它可以自动生成一个实现(在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 ]

    // …
图形:
handletype节点={id:Int}
handletype Edge={src:Int,dst:Int}
状态节点:Bag
州:包
//不变:不允许自边。

不变(和)[1 | e感谢您的帮助。我不同意您的观点,只是因为任何高级语言都是真正通用的数据定义语言,因为即使逻辑细节相同,语言实现细节也必然不同。链表和数组公开不同的操作/接口。具体而言,数组eXpose是一种随机访问的方法,但链表不是。XSLT确实是一种有趣的方法。我将对此进行研究。我不是想问对于相同的需求是否可以有不同的实现;我的意思是问对于相同需求的两个不同实现是否应该被视为不同的数据结构作为暗示,w.r.t.这种元语言可以而且应该是多声明性的。