是否存在可以被正式证明是正确的数据结构的序列化方案(编组)?
我不知道特定的编程语言,可以是ocaml / haskell或cpp,java或其他语言,只要可以假定要序列化的数据类型正确即可。
也许作为重新表达/阐明我的问题的一种方式,我感兴趣的是是否存在已知的标准编码方案以将数据结构写入磁盘,在反序列化的数据完全相同的意义上,这种结构可以被证明具有100%的保真度。作为原始版本。
作为简化的假设,我可以假设没有指针/引用的复杂性。输入的是“纯数据”,缺乏更好的表达方式。
答案 0 :(得分:1)
这是一个模糊的问题,但是我去吧。
异构环境
序列化的工作是将数据存储在一个计算机程序的内存中,将其转换为某种标准化的表示形式,然后将其转换回完全不同类型的计算机上另一计算机程序的内存中的数据。这确实带来了一些有趣的可能性。
例如,在许多计算机上浮点值的表示形式是IEEE754。但这不是完全通用的。过去,像Cray和IBM这样的公司都使用替代格式,因此,在这些计算机上反序列化时,可能存在与最初序列化的值不完全相同的值的可能性。通常没有人关心,因为差异在数值上很小。
这在某些序列化技术中有所体现; ASN.1自己的float线格式可以是文本表示形式,也可以是不是IEEE754的二进制格式。文本表示形式的思想是,它可以无限制地传达任何浮点值。相反,二进制格式通常在精度,最大值等方面有限制。
文本是另一个潜在的问题区域;发送到另一台不支持unicode的计算机的序列化unicode字符串可能会导致反序列化的字符串与原始字符串不同。
与不支持64位整数的平台类似,Java也很烦人-历史上它没有无符号整数,因此处理从C ++程序接收的64位无符号值是很麻烦的。
结论-这是逻辑上的不可能
因此,从某种意义上讲,对于异构环境,由于目标机器具有不同的体系结构,并且其表示形式可能完全不同或受到某种程度的限制,因此没有正式证明能够再现相同值的序列化技术。
同质环境
用于将数据从一台计算机上的计算机程序传输到同一台计算机上完全相同的程序(即,同质环境)的序列化在反序列化时应产生完全相同的值。 AFAIK没有正式验证的序列化技术。如果Ada语言内置了序列化功能(我不知道),那么Greenhills Ada编译器将被正式证明。 Boost for C ++经过大量同行评审,因此非常接近,尤其是在Greenhill正式验证的C ++编译器上使用并且具有序列化库的情况下。一些商业化的ASN.1工具/库已经非常成熟并且受到高度信任。
正式证明是什么?
在最后一段中,我谈到了您的问题的困难;如果整个软件开发堆栈(库,编译器,CPU)和您的应用程序源代码本身都经过正式证明,则形式证明可能仅是有价值的。否则,对于在垃圾CPU上运行的垃圾库,您可能有一个完美的源代码,用于由垃圾编译器编译的序列化库;这是行不通的。
因此,当人们谈论“正式证明”时,通常是在谈论整个系统,而不仅仅是单个组件。本身已被正式证明符合其规格要求的组件,对于实现成熟的系统是非常有帮助的,但是它并不能神奇地赋予整个系统“正确性”。其他所有组件也需要满足其规格。
从历史上看,我们经常会发现,CPU并没有真正按照数据表中的说明去做。有些人会选择浮点运算的捷径,以便在单个周期内完成指令,而不是获得数值上理想的结果。
对不起,我很抱歉,但我希望这对您有所帮助。