可证明正确的编组?
Provably correct marshalling?
是否存在可以正式证明正确的数据结构序列化方案(编组)?
我不了解特定的编程语言,可以是 ocaml/haskell 或 cpp、java 或其他语言,只要可以假定要序列化的数据类型正确即可。
也许作为 reformulate/clarify 我的问题的一种方式,我感兴趣的是是否存在已知的标准编码方案来将数据结构写入磁盘,这可以证明在反序列化数据的意义上具有 100% 的保真度和原来的一模一样
作为简化假设,我可以假设 pointers/references 没有并发症。输入是“纯数据”,因为没有更好的表达方式。
这是一个有点模糊的问题,但我会试一试。
异构环境
序列化的工作是在一个计算机程序的内存中获取数据,将其转换为某种标准化表示,然后将其转换回内存中的数据,很可能是另一个完全不同类型的计算机程序的电脑。这确实开启了一些有趣的可能性。
例如,浮点值在许多计算机上的表示是 IEEE754。但这并不完全普遍;历史上像 Cray 和 IBM 这样的公司使用替代格式,因此存在这样一种可能性,即在这些机器上反序列化的值可能与最初序列化的值不完全相同。一般没人在意,因为数值上的差异非常小。
这出现在一些序列化技术中; ASN.1 自己的浮点线格式要么是文本表示,要么是它自己的不是 IEEE754 的二进制格式。文本表示背后的想法是它可以不受限制地传达任何浮点值。相反,二进制格式通常在精度、最大值等方面有限制。
文本是另一个潜在的问题领域;发送到另一台不支持 unicode 的计算机的序列化 unicode 字符串可能会导致反序列化字符串与原始字符串不同。
与不支持 64 位整数等的平台类似。Java 非常烦人 - 历史上它没有无符号整数,因此处理从 C++ 程序接收的 64 位无符号值是一件令人讨厌的事情.
结论——逻辑上不可能
所以在某种意义上,对于异构环境,没有正式证明可以重现相同值的序列化技术,因为目标机器具有不同的体系结构,并且它的表示很可能不同,或者在某种程度上受到限制。
同质环境
用于将数据从一台计算机上的计算机程序传输到同一台计算机(即同质环境)上完全相同的程序的序列化应该在反序列化时产生完全相同的值。 AFAIK 没有正式证明的序列化技术。如果 Ada 语言中内置了序列化功能(我不知道),那么 Greenhills Ada 编译器已得到正式证明。 Boost for C++ 经过了大量的同行评审,因此非常接近,特别是如果在 Greenhill 的正式验证的 C++ 编译器之上使用,并且具有序列化库。一些商业 ASN.1 工具/库非常成熟且值得信赖。
什么是正式证明?
在最后一段中,我谈到了你的问题的难点;正式证明可能只有在整个软件开发堆栈(库、编译器、CPU)和您的应用程序源代码本身都经过正式证明时才有价值。否则,您可能拥有由垃圾编译器编译的序列化库的完美源代码,链接到垃圾库,运行 在一个 shonky CPU 上;这是行不通的。
因此,当人们谈论 "formally proven" 时,通常是在谈论整个系统,而不仅仅是单个组件。一个组件本身被正式证明符合其规范是对实现一个经过验证的系统的一个很好的帮助,但它并不能神奇地赋予整个系统所有的 "correctness" 本身。每个其他组件也需要满足其规范。
我们从历史上看到的是,CPU 经常并不像他们的数据 sheet 所说的那样做。为了在单个周期内完成指令而不是获得完美的数值结果,有些人会在浮点运算中走捷径。
很抱歉回答的漫无边际,但我希望这会引起您的兴趣和帮助。
是否存在可以正式证明正确的数据结构序列化方案(编组)?
我不了解特定的编程语言,可以是 ocaml/haskell 或 cpp、java 或其他语言,只要可以假定要序列化的数据类型正确即可。
也许作为 reformulate/clarify 我的问题的一种方式,我感兴趣的是是否存在已知的标准编码方案来将数据结构写入磁盘,这可以证明在反序列化数据的意义上具有 100% 的保真度和原来的一模一样
作为简化假设,我可以假设 pointers/references 没有并发症。输入是“纯数据”,因为没有更好的表达方式。
这是一个有点模糊的问题,但我会试一试。
异构环境
序列化的工作是在一个计算机程序的内存中获取数据,将其转换为某种标准化表示,然后将其转换回内存中的数据,很可能是另一个完全不同类型的计算机程序的电脑。这确实开启了一些有趣的可能性。
例如,浮点值在许多计算机上的表示是 IEEE754。但这并不完全普遍;历史上像 Cray 和 IBM 这样的公司使用替代格式,因此存在这样一种可能性,即在这些机器上反序列化的值可能与最初序列化的值不完全相同。一般没人在意,因为数值上的差异非常小。
这出现在一些序列化技术中; ASN.1 自己的浮点线格式要么是文本表示,要么是它自己的不是 IEEE754 的二进制格式。文本表示背后的想法是它可以不受限制地传达任何浮点值。相反,二进制格式通常在精度、最大值等方面有限制。
文本是另一个潜在的问题领域;发送到另一台不支持 unicode 的计算机的序列化 unicode 字符串可能会导致反序列化字符串与原始字符串不同。
与不支持 64 位整数等的平台类似。Java 非常烦人 - 历史上它没有无符号整数,因此处理从 C++ 程序接收的 64 位无符号值是一件令人讨厌的事情.
结论——逻辑上不可能
所以在某种意义上,对于异构环境,没有正式证明可以重现相同值的序列化技术,因为目标机器具有不同的体系结构,并且它的表示很可能不同,或者在某种程度上受到限制。
同质环境
用于将数据从一台计算机上的计算机程序传输到同一台计算机(即同质环境)上完全相同的程序的序列化应该在反序列化时产生完全相同的值。 AFAIK 没有正式证明的序列化技术。如果 Ada 语言中内置了序列化功能(我不知道),那么 Greenhills Ada 编译器已得到正式证明。 Boost for C++ 经过了大量的同行评审,因此非常接近,特别是如果在 Greenhill 的正式验证的 C++ 编译器之上使用,并且具有序列化库。一些商业 ASN.1 工具/库非常成熟且值得信赖。
什么是正式证明?
在最后一段中,我谈到了你的问题的难点;正式证明可能只有在整个软件开发堆栈(库、编译器、CPU)和您的应用程序源代码本身都经过正式证明时才有价值。否则,您可能拥有由垃圾编译器编译的序列化库的完美源代码,链接到垃圾库,运行 在一个 shonky CPU 上;这是行不通的。
因此,当人们谈论 "formally proven" 时,通常是在谈论整个系统,而不仅仅是单个组件。一个组件本身被正式证明符合其规范是对实现一个经过验证的系统的一个很好的帮助,但它并不能神奇地赋予整个系统所有的 "correctness" 本身。每个其他组件也需要满足其规范。
我们从历史上看到的是,CPU 经常并不像他们的数据 sheet 所说的那样做。为了在单个周期内完成指令而不是获得完美的数值结果,有些人会在浮点运算中走捷径。
很抱歉回答的漫无边际,但我希望这会引起您的兴趣和帮助。