일부 언어의 문서가 "is"가 아니라 "equivalent"와 같은 이유는 무엇입니까?


23

일부 언어의 문서가 "is"가 아니라 "equivalent"와 같은 이유는 무엇입니까?

예를 들어 파이썬 문서

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

실제 코드가 아닌 경우 게시 할 수 없습니까? 그리고 이것이 실제 코드라면 왜 단순히 "is"가 아니라 "Equivalent"라고 말해야합니까?


2
당신을 위해 무엇을 참조하는 것이 주 find_if입니다 하지 C에 대한 ""문서 ++. 그렇다면 bool(아래 답변에서 볼 수 있는) 캐스트 가 잘못되었을 것입니다.
Mehrdad

3
파이썬의 경우 소스 코드를 찾으면 chainC로 직접 구현되는 것을 알 수 있습니다. 따라서 동일한 결과를 생성하기 때문에 해당 파이썬 코드와 "동등합니다". 바이트 코드.
Bakuriu

그 단지 자원이 나는 C ++의 내역 알아 내기에 가장 도움이 발견했습니다, 그것은 공식 문서 아니라 내가 알고 있어요 @Mehrdad
존 McClung을

훨씬 더 나은 방법을 사용할 수 있더라도 표준에 설정된 모든 방법을 사용해야합니다.
Kevin

답변:


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

이것은 기능적으로 표준과 동일하지만 정확히 동일하지는 않습니다. 이는 컴파일러 작성자에게 유연성을 제공합니다. 특정 플랫폼에 대해 더 나은 방법이있을 수 있습니다. 구현자는 다른 코딩 스타일을 사용하고자 할 수 있습니다.

이것은 구현자가 성능상의 이유로 완전히 다른 언어로 구현하기로 결정할 수 있다는 점에서 파이썬과 같은 스크립팅 언어에 특히 해당됩니다. 파이썬을 구현하는 누군가가 예를 들어 itertools.chain(*iterables)C ++로 작성할 수 있습니다 . 코드가 제공된 python과 동일한 경우 표준에 "동등"이라고 표시하면 완벽하게 괜찮습니다. 표준이 대신 "is"라고 말하면 구현자는 해당 언어로 구현하거나 표준을 충족하지 않아야합니다.

요약해서 말하자면:

  1. 구현이 제공된 표준보다 더 나은 코드를 작성하는 것을 막고 싶지 않기 때문에
  2. 구현이 완전히 다른 언어를 사용하는 것을 막고 싶지 않기 때문에 성능 향상

깨달은 답변에 감사드립니다! 나는 그 대답이 그 선을 따른 것이라고 생각했다.
Jon McClung 2016 년

@lerenard, Steven의 링크에서 find_if의 전체 구현을 읽는 것이 더 깨달을 수 있습니다. (그가 가지고있는 것은 실제로 발췌 부분입니다.)
Winston Ewert

@WinstonEwert, 불행히도 나는 그런 코드를 완전히 이해하는 수준에 있지는 않지만 밑줄을 자유롭게 사용하는 것이 관심의 대상입니다.
Jon McClung 2016 년

9
@lerenard : 추가적인 선행 밑줄이 있으므로 표준 라이브러리 내부가 작성하는 코드를 방해하지 않습니다 (이중 밑줄이있는 이름은 컴파일러 / 표준 라이브러리 작성자가 사용하도록 예약되어 있음).
Bart van Ingen Schenau

5
C 및 C ++에는 항상 as-if-rule이 있으므로 표준이 동일하지 않더라도 실제 구현은 다를 수 있습니다.
중복 제거기
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.