¿Por qué la documentación en algunos idiomas dice "equivalente a" en lugar de "es"?

23

¿Por qué la documentación en algunos idiomas dice "equivalente a" en lugar de "es"?

Por ejemplo, los documentos de Python dicen

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

O esta referencia de C ++ sobre find_if:

El comportamiento de esta plantilla de función es 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;
}

Si ese no es el código real, ¿no pueden publicarlo? Y si es el código real, ¿por qué tienen que decir que es "Equivalente" en lugar de simplemente "es"?

Jon McClung
fuente
2
Tenga en cuenta que lo que ve nofind_if es "la" documentación para C ++. Si lo fuera, entonces el elenco de (que se ve en la respuesta a continuación) estaría mal. bool
Mehrdad
3
En el caso de Python, si busca el código fuente, encontrará que chainestá implementado directamente en C, por lo tanto, es "equivalente" a ese código de Python porque produce el mismo resultado, pero evita un poco de sobrecarga al interpretarlo. bytecode
Bakuriu
@Mehrdad Sé que no es la documentación oficial, es solo el recurso que he encontrado más útil para descubrir los detalles de C ++
Jon McClung
Se verían obligados a usar cualquier enfoque establecido en el estándar, incluso si hubiera uno significativamente mejor disponible.
Kevin

Respuestas:

67

Porque los escritores estándar no quieren afirmar realmente una implementación. Quieren definir lo que hace , pero no necesariamente cómo lo hace. Entonces, por ejemplo, si observa la versión GNU C ++ defind_if , verá que la implementación es ligeramente diferente de lo que proporciona, que se basa en el estándar 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;
}

Esto es funcionalmente equivalente a lo que tiene el estándar, pero no es exactamente lo mismo. Esto le da flexibilidad a los escritores de compiladores. Puede haber una mejor manera de hacerlo para una plataforma en particular. El implementador puede desear usar un estilo de codificación diferente.

Esto es particularmente cierto para los lenguajes de secuencias de comandos como Python, ya que el implementador puede decidir implementar en un lenguaje completamente diferente por razones de rendimiento. Alguien que implementa Python puede, por ejemplo, escribir itertools.chain(*iterables)en C ++. Esto está perfectamente bien si el estándar dice "equivalente a" siempre que el código haga lo mismo que el python proporcionado. Si el estándar decía "es", entonces los implementadores tendrían que implementarlo en ese idioma o no cumplir con el estándar.

En resumen:

  1. Porque no quieren evitar que una implementación escriba un código mejor que el estándar proporcionado
  2. Porque no quieren evitar que una implementación use un lenguaje completamente diferente, para mejorar el rendimiento
Gort the Robot
fuente
¡Gracias por la respuesta esclarecedora! Sospeché que la respuesta era algo así.
Jon McClung
@lerenard, puede ser más esclarecedor leer la implementación completa de find_if desde el enlace de Steven. (Lo que tiene allí es realmente solo un extracto.)
Winston Ewert
@WinstonEwert, Desafortunadamente no estoy al nivel de comprender completamente un código como ese, ¡pero el uso liberal de los guiones bajos es ciertamente un punto de interés!
Jon McClung
99
@lerenard: esos guiones bajos adicionales están ahí para que las partes internas de la biblioteca estándar no interfieran con el código que podría escribir (los nombres con guiones bajos dobles están reservados para el uso del compilador / escritores de la biblioteca estándar).
Bart van Ingen Schenau
55
Bueno, en C y C ++, siempre existe la regla como si fuera así, incluso si el estándar dicho es en lugar de equivalente a, la implementación real puede diferir.
Deduplicador