Pascal Strings是什么?

时间:2014-07-31 21:03:45

标签: string data-structures pascal

它们是以编程语言还是数学家命名的?

Pascal字符串的定义特征是什么?在Wikipedia's article on strings中,似乎定义的特征是在第一个字节中存储字符串的长度。在另一篇文章中,我得到的结论是the memory layout of the strings也很重要。

在仔细阅读不相关的SO帖子时,有人提到Pascal strings make Excel fast。 Pascal字符串优于以null结尾的字符串有什么优势?或者更一般地说,Pascal字符串在什么情况下表现优异?

Pascal字符串是否以其他语言实现?

最后,我是否将两个词(" Pascal Strings")或仅第一个(" Pascal字符串")大写?我是技术作家......

2 个答案:

答案 0 :(得分:13)

Pascal字符串受到一个特定的,但具有巨大影响力的Pascal实现,名为UCSD。所以 UCSD Strings 是一个更好的术语。这与使字节码解释器流行的实现相同。

一般来说,它不是一种特定类型,而是将大小作为字符数据前缀的基本原则。这使得获取长度为恒定时间操作(O(1))而不是扫描空字符的字符数据。

并非所有帕斯卡都使用这个概念。 IIRC,最初的(七十年代)惯例是空间填充分配,并向后扫描非空格字符(使字符串不可能有终止空间)。此外,由于软件主要是孤立使用的,因此使用了各种方案,通常基于对实现/架构有利的方法。

来自Borland(Turbo Pascal,Delphi和Free Pascal)的最流行的方言通常基于UCSD方言,因此有pascal字符串,Delphi目前有5个这样的字符串。 (短/ ansi /宽/ unicode /开放)

另一方面,这意味着在循环中,您需要根据索引进行一些额外的检查以检查字符串的结尾。

因此,使用

复制字符串
while (p^) do begin P^=p2^; inc(p) inc(p2); end;

完全等同于

while (*s++ = *t++);
使用优化编译器时,在C中

你需要这样做。

while (len>0) do begin p^:=p2^; inc(p) inc(p2); dec(len); end;

甚至

i:=1;
while (i<=len) do begin p[i]:=p2[i]; inc(i); end;

这使得Pascal字符串循环中的指令数略大于等效的零终止字符串,并添加了一个实时值。另外,UCSD是一种字节码(p-code)解释器语言,后一种基于pascal字符串使用的代码是“安全的”#。

如果体系结构内置了后增量(++)运算符(就像最初开发的PDP-8,11&C),指针版本甚至更便宜,特别是没有优化。如今优化编译器可以轻松检测到这些结构中的任何一种,并将它们转换为最佳结构。

更重要的是,由于九十年代早期的安全性变得更加重要,并且通常仅依赖于空终止字符串属性,因为验证中的小错误可能导致潜在的可利用缓冲区溢出问题。因此,C及其标准不赞成使用旧字符串,现在使用&#34; -n - &#34;需要传递最大长度的旧字符串例程(strNcpy等)的版本。这会增加相同的额外实时值,类似于长度,就像手动管理的Pascal字符串原则一样,程序员必须注意传递长度(或C&#39s的-N-函数的最大缓冲区大小)。 Pascal字符串仍然具有在O(1)操作中获取最后一个被占用的字符的优点,以及没有禁止字符的事实。

长度前缀字符串也广泛用于文件格式,因为很明显,前面读取的字节数很有用。

答案 1 :(得分:7)

这是一个古老的名字,其历史可以追溯到C语言与Pascal语言的关系#34;实际上是人们的比较。根据您的要求,它要么专门存储第一个字节中的长度,要么指任何长度前缀(两个字节,四个字节)。其他内存管理细节不包括在内,它们与实现有关,而与C字符串没有根本区别。

Pascal字符串擅长......一切。 NUL终止字符串在短字符串上保存一到三个字节,这可能在1970年有用,但在几乎所有情况下都不值得一提。除了无法存储零字节(对文本来说太糟糕但排除任何类型的二进制数据)之外,您无法有效地确定字符串长度。这会对字符串算法的很大一部分产生负面影响。您链接到的注释中的一个示例是字符串比较:如果您有长度,则在比较不同长度的字符串时可以立即return false。还有许多other downsides与绩效无关。

由于这些原因,几乎每个比1980年更新的语言实现都使用字符串的长度前缀。这是&#34; pascal字符串&#34;的另一个原因。名字已过时。