Чому в документації на деяких мовах написано "еквівалентно", а не "є"?


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

Вони будуть змушені використовувати будь-який підхід, встановлений у стандарті, навіть якщо був доступний значно кращий.
Кевін

Відповіді:


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 ++. Це цілком чудово, якщо стандарт каже "еквівалент", якщо код робить те саме, що і наданий пітон. Якщо замість стандарту сказано "є", від виконавців вимагається або реалізувати цією мовою, або не відповідати стандарту.

Підсумовуючи:

  1. Оскільки вони не хочуть перешкоджати реалізації програми писати кращий код, ніж наданий стандарт
  2. Оскільки вони не хочуть перешкоджати застосуванню використовувати зовсім іншу мову для підвищення продуктивності

Дякую за освічуючу відповідь! Я підозрював, що відповідь є чимось у цьому напрямку.
Джон Макклунг

@lerenard, вам може бути додатково просвічуючи прочитати повну реалізацію find_if за посиланням Стівена. (Що там у нього насправді є лише уривок.)
Вінстон Еверт

@WinstonEwert, На жаль, я не зовсім на рівні повного розуміння такого коду, але ліберальне використання підкреслень, безумовно, цікавить!
Джон МакКлунг

9
@lerenard: Ці додаткові провідні підкреслення є, щоб стандартні внутрішні бібліотеки не заважали коду, який ви можете записати (імена з подвійними провідними підкресленнями зарезервовані для використання компілятором / стандартними письменниками бібліотеки).
Барт ван Іґен Шенау

5
Добре, що в C і C ++ завжди є правило "як-якщо", тож навіть якщо стандартне слово замість еквівалентне, реальна реалізація може відрізнятися.
Дедуплікатор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.