Por que a documentação em alguns idiomas diz "equivalente a" em vez de "é"?


23

Por que a documentação em alguns idiomas diz "equivalente a" em vez de "é"?

Por exemplo, os documentos do Python dizem

itertools.chain(*iterables)

...

Equivalente a:

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

Ou esta referência C ++ em find_if:

O comportamento deste modelo de função é equivalente a:

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;
}

Se esse não é o código real, eles não podem publicá-lo? E se é o código real, por que eles têm que dizer que é "equivalente" ao invés de simplesmente "é"?


2
Observe que o que você vê nãofind_if é a documentação "para" o C ++. Se fosse, o elenco de (que você vê na resposta abaixo) estaria errado. bool
Mehrdad

3
No caso de python, se você procurar o código-fonte, verá que ele chainé implementado diretamente em C; portanto, é "equivalente" ao código python porque produz o mesmo resultado, mas evita um pouco de sobrecarga na interpretação desse código. bytecode.
Bakuriu 15/01/16

@Mehrdad Estou ciente de que não é a documentação oficial, é apenas o recurso que eu achei mais útil para descobrir os detalhes do C ++ #
913 Jon McClung

Eles seriam forçados a usar qualquer abordagem definida no padrão, mesmo se uma abordagem significativamente melhor estivesse disponível.
Kevin

Respostas:


67

Porque os escritores padrão não querem realmente afirmar uma implementação. Eles querem definir o que faz , mas não necessariamente como faz. Assim, por exemplo, se você olhar para a versão GNU C ++ defind_if , verá que a implementação é um pouco diferente do que você fornece, que é baseado no padrão 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;
}

Isso é funcionalmente equivalente ao que o padrão possui, mas não exatamente o mesmo. Isso fornece flexibilidade aos escritores do compilador. Pode haver uma maneira melhor de fazer isso para uma plataforma específica. O implementador pode querer usar um estilo de codificação diferente.

Isso é particularmente verdadeiro para linguagens de script como python, pois o implementador pode decidir implementar em uma linguagem completamente diferente por motivos de desempenho. Alguém implementando python pode, por exemplo, escrever itertools.chain(*iterables)em C ++. Isso é perfeitamente correto se o padrão diz "equivalente a", desde que o código faça o mesmo que o python fornecido. Se o padrão dito "é", os implementadores seriam obrigados a implementar nesse idioma ou a não atender ao padrão.

Em suma:

  1. Porque eles não querem impedir que uma implementação escreva um código melhor que o padrão fornecido
  2. Como eles não querem impedir que uma implementação use um idioma totalmente diferente, para melhorar o desempenho

Obrigado pela resposta esclarecedora! Eu suspeitava que a resposta fosse algo nesse sentido.
Jon McClung

@lerenard, você pode achar mais esclarecedor ler a implementação completa do find_if no link de Steven. (O que é que ele tem não é realmente apenas um trecho.)
Winston Ewert

@WinstonEwert, infelizmente não estou no nível de entender completamente esse código, mas o uso liberal de sublinhados é certamente um ponto de interesse!
precisa saber é o seguinte

9
@lerenard: Esses sublinhados iniciais adicionais estão lá para que os internos da biblioteca padrão não interfiram no código que você pode escrever (nomes com sublinhados iniciais duplos são reservados para uso pelos escritores do compilador / biblioteca padrão).
Bart van Ingen Schenau

5
Bem, em C e C ++, há sempre a regra como se, mesmo que o padrão dito seja em vez de equivalente a, a implementação real pode ser diferente.
Deduplicator
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.