String 和 CharArray 应该是同一个东西吗?
Should String and CharArray be the same thing?
在设计编程语言时API有哪些优缺点:
- chars的类型String和Array(or linkedList)无法区分
如:Haskell、Erlang、C
- String 是它自己的类型和 Array(or linkedList) of chars 类型是不同的。
例如:Java、C#、Lisp、JavaScript、...
相同类型的原因:
- 简单。需要学习的类型更少
- 正交性。所有通用数组代码都适用于字符串
不同的原因:
可以通过类型强制执行不变量。如果您的字符串存储在并非所有可能的位模式都有效的编码中,例如 UTF8,那么如果 String 不是它自己的类型,那么可能会有无效的字符串。
可以消除同一个字符串的多个副本。有一种称为“实习”的技术,其中程序中使用的类型的每个不同值的一个副本一次在内存中。这通常由语言自动完成,包括您提到的具有单独字符串类型的语言(至少对于 Lisp 的某些实现)。对字符串执行此操作具有使字符串比较(包括哈希表中的字符串键更有效)的良好效果。您可以对 known-unique 指针而不是字符串值进行比较。
在设计编程语言时API有哪些优缺点:
- chars的类型String和Array(or linkedList)无法区分
如:Haskell、Erlang、C
- String 是它自己的类型和 Array(or linkedList) of chars 类型是不同的。
例如:Java、C#、Lisp、JavaScript、...
相同类型的原因:
- 简单。需要学习的类型更少
- 正交性。所有通用数组代码都适用于字符串
不同的原因:
可以通过类型强制执行不变量。如果您的字符串存储在并非所有可能的位模式都有效的编码中,例如 UTF8,那么如果 String 不是它自己的类型,那么可能会有无效的字符串。
可以消除同一个字符串的多个副本。有一种称为“实习”的技术,其中程序中使用的类型的每个不同值的一个副本一次在内存中。这通常由语言自动完成,包括您提到的具有单独字符串类型的语言(至少对于 Lisp 的某些实现)。对字符串执行此操作具有使字符串比较(包括哈希表中的字符串键更有效)的良好效果。您可以对 known-unique 指针而不是字符串值进行比较。