Warum steht in einigen Sprachen in der Dokumentation eher "gleich" als "ist"?

23

Warum wird in einigen Sprachen in der Dokumentation eher "gleich" als "ist" angegeben?

Zum Beispiel sagen die Python Docs

itertools.chain(*iterables)

...

Entspricht :

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

Oder diese C ++ Referenz auf find_if:

Das Verhalten dieser Funktionsvorlage entspricht :

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

Wenn das nicht der eigentliche Code ist, können sie ihn dann nicht posten? Und wenn es sich um den tatsächlichen Code handelt, warum müssen sie dann sagen, dass er "gleichwertig" und nicht einfach "gleichwertig" ist?

Jon McClung
quelle
2
Beachten Sie, dass , was Sie sehen , find_ifist nicht „die“ Dokumentation für C ++. Wenn ja, dann wäre die Besetzung bool(die Sie in der Antwort unten sehen) falsch.
Mehrdad
3
Im Falle von Python, wenn Sie nach dem Quellcode suchen, werden Sie feststellen, dass dieser chaindirekt in C implementiert ist. Daher ist er "äquivalent" zu diesem Python-Code, da er das gleiche Ergebnis liefert, aber es wird ein wenig Overhead bei der Interpretation vermieden Bytecode.
Bakuriu
@Mehrdad Mir ist bewusst, dass es nicht die offizielle Dokumentation ist, sondern nur die Ressource, die ich am hilfreichsten gefunden habe, um die Details von C ++
Jon McClung
Sie wären gezwungen, den im Standard festgelegten Ansatz zu verwenden, selbst wenn ein wesentlich besserer verfügbar wäre.
Kevin

Antworten:

67

Weil die Standardschreiber eine Implementierung nicht wirklich behaupten wollen. Sie wollen definieren, was es tut , aber nicht unbedingt, wie es es tut. Wenn Sie sich beispielsweise die GNU C ++ - Version vonfind_if ansehen , werden Sie feststellen, dass sich die Implementierung geringfügig von Ihren Angaben unterscheidet, die auf dem C ++ - Standard basieren:

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

Dies ist funktional äquivalent zu dem, was der Standard hat, aber nicht genau das gleiche. Dies gibt dem Compiler-Schreiber Flexibilität. Möglicherweise gibt es einen besseren Weg, dies für eine bestimmte Plattform zu tun. Der Implementierer möchte möglicherweise einen anderen Codierungsstil verwenden.

Dies gilt insbesondere für Skriptsprachen wie Python, da der Implementierer aus Leistungsgründen möglicherweise entschieden hat, diese in einer völlig anderen Sprache zu implementieren. Jemand, der Python implementiert, kann beispielsweise itertools.chain(*iterables)in C ++ schreiben . Dies ist vollkommen in Ordnung, wenn der Standard "äquivalent zu" sagt, solange der Code den gleichen Vorgang wie der bereitgestellte Python ausführt. Wenn der Standard stattdessen "is" lautet, müssten Implementierer entweder in dieser Sprache implementieren oder den Standard nicht erfüllen.

Zusammenfassend:

  1. Weil sie nicht verhindern wollen, dass eine Implementierung besseren Code als den bereitgestellten Standard schreibt
  2. Sie möchten nicht verhindern, dass eine Implementierung eine völlig andere Sprache verwendet, um die Leistung zu verbessern
Gort den Roboter
quelle
Vielen Dank für die aufschlussreiche Antwort! Ich vermutete, dass die Antwort in diese Richtung lautete.
Jon McClung
@lerenard, vielleicht ist es noch aufschlussreicher, die vollständige Implementierung von find_if über den Link von Steven zu lesen. (Was er dort hat, ist wirklich nur ein Auszug.)
Winston Ewert
@ WinstonEwert, Leider verstehe ich Code so nicht ganz, aber die großzügige Verwendung von Unterstrichen ist auf jeden Fall von Interesse!
Jon McClung
9
@lerenard: Diese zusätzlichen führenden Unterstriche sind vorhanden, damit die Interna der Standardbibliothek den Code, den Sie möglicherweise schreiben, nicht beeinträchtigen (Namen mit doppelt führenden Unterstrichen sind für die Compiler- / Standardbibliotheksschreiber reserviert).
Bart van Ingen Schenau
5
Nun, in C und C ++ gibt es immer die As-If-Regel, und selbst wenn der angegebene Standard nicht äquivalent zu ist, kann die tatsächliche Implementierung davon abweichen.
Deduplikator