Mengapa dokumentasi pada beberapa bahasa mengatakan "setara dengan" daripada "adalah"?

23

Mengapa dokumentasi pada beberapa bahasa mengatakan "setara dengan" daripada "adalah"?

Sebagai contoh, Python Docs berkata

itertools.chain(*iterables)

...

Setara dengan:

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

Atau referensi C ++ ini pada find_if:

Perilaku templat fungsi ini setara dengan:

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

Jika itu bukan kode aktual, tidak bisakah mereka mempostingnya? Dan jika itu adalah kode aktual, mengapa mereka harus mengatakan itu "Setara" daripada hanya "adalah"?

Jon McClung
sumber
2
Perhatikan bahwa apa yang Anda lihat untuk find_ifyang tidak "yang" dokumentasi untuk C ++. Jika ya, maka pemeran bool(yang Anda lihat dalam jawaban di bawah) akan salah.
Mehrdad
3
Dalam kasus python jika Anda mencari kode sumber Anda akan menemukan bahwa chaindiimplementasikan langsung dalam C, sehingga "setara" dengan kode python karena menghasilkan hasil yang sama, tetapi menghindari sedikit overhead menafsirkan bahwa bytecode.
Bakuriu
@Mehrdad Saya sadar ini bukan dokumentasi resmi, ini hanya sumber daya yang saya temukan paling membantu dalam mengetahui rincian C ++
Jon McClung
Mereka akan dipaksa untuk menggunakan pendekatan apa pun yang ditetapkan dalam standar, bahkan jika pendekatan yang jauh lebih baik tersedia.
Kevin

Jawaban:

67

Karena penulis standar tidak ingin benar-benar menyatakan implementasi. Mereka ingin mendefinisikan apa yang dilakukannya , tetapi belum tentu bagaimana melakukannya. Jadi, misalnya, jika Anda melihat versi GNU C ++find_if , Anda akan melihat bahwa implementasinya sedikit berbeda dari yang Anda berikan, yang didasarkan pada standar 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;
}

Ini secara fungsional setara dengan apa yang dimiliki standar, tetapi tidak persis sama. Ini memberikan fleksibilitas kepada penulis kompiler. Mungkin ada cara yang lebih baik untuk melakukannya untuk platform tertentu. Implementor mungkin ingin menggunakan gaya pengkodean yang berbeda.

Ini terutama berlaku untuk bahasa scripting seperti python di mana implementor dapat memutuskan untuk menerapkan dalam bahasa yang sama sekali berbeda untuk alasan kinerja. Seseorang yang mengimplementasikan python dapat, misalnya, menulis itertools.chain(*iterables)dalam C ++. Ini sangat baik jika standar mengatakan "setara dengan" selama kode melakukan hal yang sama dengan python yang disediakan. Jika standar mengatakan "adalah" sebagai gantinya, maka implementor akan diminta untuk mengimplementasikan dalam bahasa itu, atau tidak memenuhi standar.

Singkatnya:

  1. Karena mereka tidak ingin mencegah implementasi dari menulis kode yang lebih baik daripada standar yang disediakan
  2. Karena mereka tidak ingin mencegah implementasi menggunakan bahasa yang sama sekali berbeda, untuk meningkatkan kinerja
Gort the Robot
sumber
Terima kasih atas jawaban yang mencerahkan! Saya curiga jawabannya adalah sesuatu di sepanjang garis itu.
Jon McClung
@lerenard, Anda mungkin menemukan lebih banyak pencerahan untuk membaca implementasi penuh find_if dari tautan Steven. (Apa yang dia dapat di sana benar-benar hanya sebuah kutipan.)
Winston Ewert
@ WinstonEwert, Sayangnya saya tidak cukup pada tingkat memahami kode seperti itu, tetapi penggunaan garis bawah liberal jelas merupakan suatu hal yang menarik!
Jon McClung
9
@lerenard: Ada beberapa garis bawah utama terkemuka sehingga internal perpustakaan standar tidak mengganggu kode yang Anda tulis (nama dengan garis bawah dua mengarah utama dicadangkan untuk digunakan oleh kompiler / penulis perpustakaan standar).
Bart van Ingen Schenau
5
Nah, di C dan C ++, selalu ada as-if-rule, jadi meskipun standar mengatakan bukan setara dengan, implementasi sebenarnya mungkin berbeda.
Deduplikator