为什么某些语言的文档说“等于”而不是“是”?


23

为什么某些语言的文档说“等于”而不是“是”?

例如,Python文档

itertools.chain(*iterables)

...

等效于:

def chain(*iterables):
    # chain('ABC', 'DEF') --> A B C D E F
    for it in iterables:
        for element in it:
            yield element

或者,这个C ++参考find_if

该功能模板的行为等效于:

template<class InputIterator, class UnaryPredicate>
  InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred)
{
  while (first!=last) {
    if (pred(*first)) return first;
    ++first;
  }
  return last;
}

如果那不是实际的代码,他们不能发布吗?如果是实际代码,为什么他们不得不说它是“等效”而不是简单的“是”?


2
请注意,您看到了什么find_if为C“的”文档++。如果是这样,则强制转换为bool(您将在下面的答案中看到)是错误的。
Mehrdad

3
对于python,如果您查找源代码,您会发现它chain直接在C中实现,因此它与该python代码“等效”,因为它产生相同的结果,但避免了解释该代码的过多开销字节码。
巴库里

@Mehrdad我知道这不是官方文档,它只是我发现对发现C ++的详细信息最有帮助的资源
Jon McClung

即使有明显更好的方法,他们也将被迫使用标准中设置的任何方法。
凯文(Kevin)

Answers:


67

因为标准编写者并不想实际声明一个实现。他们想定义它的作用,但不一定要定义它的作用。因此,例如,如果您查看的GNU C ++版本find_if,您会发现实现与您提供的实现略有不同,后者基于C ++标准:

template<typename _InputIterator, typename _Predicate>
inline _InputIterator
__find_if(_InputIterator __first, _InputIterator __last,
    _Predicate __pred, input_iterator_tag)
{
    while (__first != __last && !bool(__pred(*__first)))
     ++__first;
       return __first;
}

这在功能上等同于标准所具有的功能,但并不完全相同。这为编译器作者提供了灵活性。对于特定平台,可能会有更好的方法。实现者可能希望使用其他编码样式。

对于像python这样的脚本语言而言,尤其如此,因为出于性能方面的考虑,实现者可能决定使用完全不同的语言来实现。例如,实现python的人可以itertools.chain(*iterables)用C ++ 编写。如果标准说“等效于”,这很好,只要代码与提供的python相同即可。如果标准改为“是”,则要求实现者以该语言实现或不符合该标准。

综上所述:

  1. 因为他们不想阻止实现编写比提供的标准更好的代码
  2. 因为他们不想阻止实现使用完全不同的语言,所以可以提高性能

谢谢您的启发!我怀疑答案是否正确。
乔恩·麦格伦

@lerenard,您可能会发现从Steven的链接中完整阅读find_if的实现对您很有启发。(他到那里来的东西确实只是摘录。)
温斯顿·埃韦特

@WinstonEwert,不幸的是,我还没有完全理解这样的代码,但是下划线的使用无疑是我们的关注点!
乔恩·麦格伦

9
@lerenard:那里有那些额外的前导下划线,以便标准库内部不干扰您可能编写的代码(带有双前导下划线的名称保留供编译器/标准库编写者使用)。
Bart van Ingen Schenau '16

5
好吧,在C和C ++中,总是存在按规则执行的规则,因此,即使所说的标准不是等效标准,实际的实现也可能会有所不同。
重复数据删除器2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.