一部の言語のドキュメントで「ある」ではなく「と同等」と表示されるのはなぜですか?


23

一部の言語のドキュメントで「ある」ではなく「と同等」と表示されるのはなぜですか?

たとえば、Python Docsは言う

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

非常に優れたものが利用可能であったとしても、標準で設定されているアプローチを使用することを余儀なくされます。
ケビン

回答:


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、スティーブンのリンクからfind_ifの完全な実装を読むと、さらに啓発されることがあります。(彼が持っているものは本当に抜粋です。)
ウィンストンユーバート

@WinstonEwert、残念ながら、私はそのようなコードを完全に理解するレベルではありませんが、アンダースコアのリベラルな使用は確かに興味深い点です!
ジョンマックルン

9
@lerenard:これらの追加の先頭アンダースコアは、標準ライブラリの内部があなたが書くコードに干渉しないように存在します(先頭に2つのアンダースコアを持つ名前は、コンパイラ/標準ライブラリライターが使用するために予約されています)。
バートヴァンインゲンシェナウ

5
まあ、CとC ++には常にas-if-ruleがあるので、たとえ標準が同等ではなくても、実際の実装は異なる場合があります。
デデュプリケーター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.